NTLK nltk.ConditionalFreqDist - график - PullRequest
       3

NTLK nltk.ConditionalFreqDist - график

0 голосов
/ 28 февраля 2020

Вот два примера: один работает и является производным от https://www.nltk.org/book/ch02.html, а другой - нет. В первых примерах приведены частоты отдельных слов, здесь ['america', 'citizen']. Второй - модифицированная версия (очевидно, некорректная), которая пытается построить частоты биграммы ['america citizen']. Я хотел бы построить частоты ngram, например, для биграммы, например ['america citizen'].

Пример печати 1 Пример печати 2 - ошибка

import nltk
from nltk.book import *
import matplotlib.pyplot as plt
from nltk.corpus import inaugural
inaugural.fileids()
plt.ion() # turns interactive mode on
[fileid[:4] for fileid in inaugural.fileids()]



############- this works ####
cfd = nltk.ConditionalFreqDist(
     (target, fileid[:4])
     for fileid in inaugural.fileids()
     for w in inaugural.words(fileid)
     for target in ['america', 'citizen']
     if w.lower().startswith(target)) 
ax = plt.axes()
cfd.plot()

############- this does not work ####

cfd = nltk.ConditionalFreqDist(
     (target, fileid[:4])
     for fileid in inaugural.fileids()
     for w in inaugural.words(fileid)
     for target in ['american citizen']
     if w.lower().startswith(target)) 
ax = plt.axes()
cfd.plot()

1 Ответ

0 голосов
/ 29 февраля 2020

Мне кажется, что вы пытаетесь найти 'american citizen', который представляет собой словосочетание, состоящее из двух слов, ищущих среди отдельных слов. Это обязательно потерпит неудачу. Вам нужно проверить наличие такого биграмма среди пар последовательных слов, для этого вам нужно сжать списки слов, сдвинув секунду на 1 слово.

Ключевое различие в вашем коде (вы можете добавить больше словосочетания в виде пар слов к списку последних for):

def zip2(lst):
   ilst = iter(lst)
   _ = next(ilst)  # drop the first element
   return zip(lst, ilst)


cfd = nltk.ConditionalFreqDist(
     (t1 + ' ' + t2, fileid[:4])
        for fileid in inaugural.fileids()
            for w1, w2 in zip2(inaugural.words(fileid))
                for t1, t2 in [('american', 'citizen',)]
                    if w1.lower().startswith(t1) and w2.lower().startswith(t2)
     )
ax = plt.axes()
cfd.plot()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...