Вызов согласования NLTK - как получить текст до/после слова, которое было использовано?

Я хотел бы узнать, какой текст появляется после экземпляра, возвращаемого конкордацей. Например, если вы посмотрите на пример, который они приводят в разделе "Поиск текста" , они получают соответствие слова "чудовищный". Как вы получите слова, которые появляются сразу после случая чудовищного?

Ответ 1

import nltk
import nltk.book as book
text1 = book.text1
c = nltk.ConcordanceIndex(text1.tokens, key = lambda s: s.lower())
print([text1.tokens[offset+1] for offset in c.offsets('monstrous')])

дает

['size', 'bulk', 'clubs', 'cannibal', 'and', 'fable', 'Pictures', 'pictures', 'stories', 'cabinet', 'size']

Я нашел это, посмотрев, как определяется метод concordance.

Это показывает, что text1.concordance определяется в /usr/lib/python2.7/dist-packages/nltk/text.py:

In [107]: text1.concordance?
Type:       instancemethod
Base Class: <type 'instancemethod'>
String Form:    <bound method Text.concordance of <Text: Moby Dick by Herman Melville 1851>>
Namespace:  Interactive
File:       /usr/lib/python2.7/dist-packages/nltk/text.py

В этом файле вы найдете

def concordance(self, word, width=79, lines=25):
    ... 
        self._concordance_index = ConcordanceIndex(self.tokens,
                                                   key=lambda s:s.lower())
    ...            
    self._concordance_index.print_concordance(word, width, lines)

Это показывает, как создавать объекты ConcordanceIndex.

И в том же файле вы также найдете:

class ConcordanceIndex(object):
    def __init__(self, tokens, key=lambda x:x):
        ...
    def print_concordance(self, word, width=75, lines=25):
        ...
        offsets = self.offsets(word)
        ...
        right = ' '.join(self._tokens[i+1:i+context])

При некоторых экспериментах в интерпретаторе IPython это показывает, что self.offsets('monstrous') содержит список чисел (смещений), где можно найти слово monstrous. Вы можете получить доступ к фактическим словам с помощью self._tokens[offset], который совпадает с text1.tokens[offset].

Итак, следующее слово после monstrous задается text1.tokens[offset+1].