Мне кажется, что вы пытаетесь найти '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()