#python #nlp #spacy
#python #nlp #spacy
Вопрос:
Итак, в последнее время я очень хотел получить некоторую статистику относительно словарного запаса некоторых книг, которые мне нравятся. Ничего продвинутого — просто такие вещи, как, какова средняя длина предложения? Сколько прилагательных используется пропорционально общему количеству слов?
Проблема в том, что spaCy, инструмент, который я выбрал для простоты использования, похоже, указывает на то, что: В каждом ТЕКСТЕ, который я анализирую, кажется, РОВНО 5,88235% прилагательных по сравнению с общим количеством слов. РОВНО 2,94118% вспомогательных средств. РОВНО 14,7059% существительных. РОВНО 34 слова в предложении (!).
Теперь я почти уверен, что допустил какую-то ошибку в коде, который я использую — просто я этого не вижу!
Вот пример кода. Я разделил книгу по главам (всего 34) и распечатал таблицу с некоторыми статистическими данными. Цифры кажутся законными — но эти пропорции, не МОЖЕТ БЫТЬ, чтобы каждая глава в каждом тексте, который я анализирую, имела точно такую же структуру.
headers = ['chapter', 'num_sents', 'num_words', 'num_verbs', 'prop_verbs', 'num_adjs',
'prop_adjs', 'num_adv', 'prop_adv', 'num_aux', 'prop_aux', 'num_intj',
'prop_intj', 'num_non', 'prop_non', 'num_pron', 'prop_pron', 'num_propn',
'prop_propn', 'words/sentences']
stats = list()
count_chpt = 1
for chapter in kf_spc:
num_sents = 0
num_words = 0
num_verbs = 0
num_adjs = 0
num_adv = 0
num_aux = 0
num_intj = 0
num_non = 0
num_pron = 0
num_propn = 0
for sentence in chapter.sents:
num_sents = 1
for token in sent:
num_words = 1
if token.pos_ == 'VERB':
num_verbs = 1
elif token.pos_ == 'ADJ':
num_adjs = 1
elif token.pos_ == 'ADV':
num_adv = 1
elif token.pos_ == 'AUX':
num_aux = 1
elif token.pos_ == 'INTJ':
num_intj = 1
elif token.pos_ == 'NOUN':
num_non = 1
elif token.pos_ == 'PRON':
num_pron = 1
elif token.pos_ == 'PROPN':
num_propn = 1
stats.append([count_chpt, num_sents, num_words, num_verbs, num_verbs/num_words,
num_adjs, num_adjs/num_words, num_adv, num_adv/num_words,
num_aux, num_aux/num_words, num_intj, num_intj/num_words, num_non,
num_non/num_words, num_pron, num_pron/num_words, num_propn,
num_propn/num_words, num_words/num_sents])
count_chpt = 1
print(tabulate(stats, headers=headers))
ВЫВОД:
chapter num_sents num_words num_verbs prop_verbs num_adjs prop_adjs num_adv prop_adv num_aux prop_aux num_intj prop_intj num_non prop_non num_pron prop_pron num_propn prop_propn words/sentences
--------- ----------- ----------- ----------- ------------ ---------- ----------- --------- ---------- --------- ---------- ---------- ----------- --------- ---------- ---------- ----------- ----------- ------------ -----------------
1 251 8534 1255 0.147059 251 0.0294118 502 0.0588235 251 0.0294118 0 0 1255 0.147059 502 0.0588235 753 0.0882353 34
2 155 5270 775 0.147059 155 0.0294118 310 0.0588235 155 0.0294118 0 0 775 0.147059 310 0.0588235 465 0.0882353 34
3 235 7990 1175 0.147059 235 0.0294118 470 0.0588235 235 0.0294118 0 0 1175 0.147059 470 0.0588235 705 0.0882353 34
4 226 7684 1130 0.147059 226 0.0294118 452 0.0588235 226 0.0294118 0 0 1130 0.147059 452 0.0588235 678 0.0882353 34
5 80 2720 400 0.147059 80 0.0294118 160 0.0588235 80 0.0294118 0 0 400 0.147059 160 0.0588235 240 0.0882353 34
6 276 9384 1380 0.147059 276 0.0294118 552 0.0588235 276 0.0294118 0 0 1380 0.147059 552 0.0588235 828 0.0882353 34
7 276 9384 1380 0.147059 276 0.0294118 552 0.0588235 276 0.0294118 0 0 1380 0.147059 552 0.0588235 828 0.0882353 34
8 412 14008 2060 0.147059 412 0.0294118 824 0.0588235 412 0.0294118 0 0 2060 0.147059 824 0.0588235 1236 0.0882353 34
9 123 4182 615 0.147059 123 0.0294118 246 0.0588235 123 0.0294118 0 0 615 0.147059 246 0.0588235 369 0.0882353 34
10 475 16150 2375 0.147059 475 0.0294118 950 0.0588235 475 0.0294118 0 0 2375 0.147059 950 0.0588235 1425 0.0882353 34
11 80 2720 400 0.147059 80 0.0294118 160 0.0588235 80 0.0294118 0 0 400 0.147059 160 0.0588235 240 0.0882353 34
12 169 5746 845 0.147059 169 0.0294118 338 0.0588235 169 0.0294118 0 0 845 0.147059 338 0.0588235 507 0.0882353 34
13 358 12172 1790 0.147059 358 0.0294118 716 0.0588235 358 0.0294118 0 0 1790 0.147059 716 0.0588235 1074 0.0882353 34
14 415 14110 2075 0.147059 415 0.0294118 830 0.0588235 415 0.0294118 0 0 2075 0.147059 830 0.0588235 1245 0.0882353 34
15 146 4964 730 0.147059 146 0.0294118 292 0.0588235 146 0.0294118 0 0 730 0.147059 292 0.0588235 438 0.0882353 34
16 275 9350 1375 0.147059 275 0.0294118 550 0.0588235 275 0.0294118 0 0 1375 0.147059 550 0.0588235 825 0.0882353 34
17 332 11288 1660 0.147059 332 0.0294118 664 0.0588235 332 0.0294118 0 0 1660 0.147059 664 0.0588235 996 0.0882353 34
18 172 5848 860 0.147059 172 0.0294118 344 0.0588235 172 0.0294118 0 0 860 0.147059 344 0.0588235 516 0.0882353 34
19 268 9112 1340 0.147059 268 0.0294118 536 0.0588235 268 0.0294118 0 0 1340 0.147059 536 0.0588235 804 0.0882353 34
20 740 25160 3700 0.147059 740 0.0294118 1480 0.0588235 740 0.0294118 0 0 3700 0.147059 1480 0.0588235 2220 0.0882353 34
21 301 10234 1505 0.147059 301 0.0294118 602 0.0588235 301 0.0294118 0 0 1505 0.147059 602 0.0588235 903 0.0882353 34
22 172 5848 860 0.147059 172 0.0294118 344 0.0588235 172 0.0294118 0 0 860 0.147059 344 0.0588235 516 0.0882353 34
23 223 7582 1115 0.147059 223 0.0294118 446 0.0588235 223 0.0294118 0 0 1115 0.147059 446 0.0588235 669 0.0882353 34
24 791 26894 3955 0.147059 791 0.0294118 1582 0.0588235 791 0.0294118 0 0 3955 0.147059 1582 0.0588235 2373 0.0882353 34
25 181 6154 905 0.147059 181 0.0294118 362 0.0588235 181 0.0294118 0 0 905 0.147059 362 0.0588235 543 0.0882353 34
26 357 12138 1785 0.147059 357 0.0294118 714 0.0588235 357 0.0294118 0 0 1785 0.147059 714 0.0588235 1071 0.0882353 34
27 253 8602 1265 0.147059 253 0.0294118 506 0.0588235 253 0.0294118 0 0 1265 0.147059 506 0.0588235 759 0.0882353 34
28 82 2788 410 0.147059 82 0.0294118 164 0.0588235 82 0.0294118 0 0 410 0.147059 164 0.0588235 246 0.0882353 34
29 213 7242 1065 0.147059 213 0.0294118 426 0.0588235 213 0.0294118 0 0 1065 0.147059 426 0.0588235 639 0.0882353 34
30 416 14144 2080 0.147059 416 0.0294118 832 0.0588235 416 0.0294118 0 0 2080 0.147059 832 0.0588235 1248 0.0882353 34
31 280 9520 1400 0.147059 280 0.0294118 560 0.0588235 280 0.0294118 0 0 1400 0.147059 560 0.0588235 840 0.0882353 34
32 306 10404 1530 0.147059 306 0.0294118 612 0.0588235 306 0.0294118 0 0 1530 0.147059 612 0.0588235 918 0.0882353 34
33 322 10948 1610 0.147059 322 0.0294118 644 0.0588235 322 0.0294118 0 0 1610 0.147059 644 0.0588235 966 0.0882353 34
34 312 10608 1560 0.147059 312 0.0294118 624 0.0588235 312 0.0294118 0 0 1560 0.147059 624 0.0588235 936 0.0882353 34
Я использую большой корпус английского языка. Я не вижу, где я ошибаюсь…
Ответ №1:
Вы многократно повторяете одно и то же предложение. Обратите sentence
внимание на vs sent
.
for sentence in chapter.sents:
num_sents = 1
for token in sent:
В качестве дополнительного совета, вместо обширного if / else, используйте Counter
объект из таких коллекций:
poscount = Counter()
for word in sent:
poscount[word.pos_] = 1
Комментарии:
1. Спасибо. Вскоре после написания сообщения я запустил цикл через сокращенный документ, печатая каждое отдельное предложение — такая глупая ошибка <facepalm> . Это только доказывает, что я должен больше тестировать код на небольших документах, прежде чем начинать с полных книг. Кроме того, большое спасибо за совет по использованию Counter — ты спасатель!!!
2. Спасибо, рад, что смог помочь. Если вы нашли мой ответ полезным, вам следует щелкнуть стрелку вверх слева от него и флажок, чтобы принять его.
3. Я пытался это сделать, но оказалось, что моя репутация недостаточно высока, чтобы голосовать за публикации (для голосования требуется репутация не менее 15). Давний наблюдатель за SO, но я еще ничего не писал здесь.
4. А, хорошо. Тем не менее, вы все равно должны быть в состоянии принять с помощью флажка.