Где я ошибся в получении пропорций POS с помощью анализа с помощью spaCy?

#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. А, хорошо. Тем не менее, вы все равно должны быть в состоянии принять с помощью флажка.