NLTK проблема удаления стоп-слов

Я пытаюсь выполнить классификацию документов, как описано в главе 6 NLTK, и у меня возникают проблемы с удалением стоп-слов. Когда я добавлю

all_words = (w for w in all_words if w not in nltk.corpus.stopwords.words('english'))

это возвращается

Traceback (most recent call last):
  File "fiction.py", line 8, in <module>
    word_features = all_words.keys()[:100]
AttributeError: 'generator' object has no attribute 'keys'

Я предполагаю, что код стоп-слова изменил тип объекта, используемого для 'all_words', сделав их функцию.key() бесполезной. Как удалить стоп-слова перед использованием ключевой функции, не меняя ее тип? Полный код ниже:

import nltk 
from nltk.corpus import PlaintextCorpusReader

corpus_root = './nltk_data/corpora/fiction'
fiction = PlaintextCorpusReader(corpus_root, '.*')
all_words=nltk.FreqDist(w.lower() for w in fiction.words())
all_words = (w for w in all_words if w not in nltk.corpus.stopwords.words('english'))
word_features = all_words.keys()[:100]

def document_features(document): # [_document-classify-extractor]
    document_words = set(document) # [_document-classify-set]
    features = {}
    for word in word_features:
        features['contains(%s)' % word] = (word in document_words)
    return features

print document_features(fiction.words('fic/11.txt'))

1 ответ

Решение

Я бы сделал это, избегая добавления их в FreqDist экземпляр в первую очередь:

all_words=nltk.FreqDist(w.lower() for w in fiction.words() if w.lower() not in nltk.corpus.stopwords.words('english'))

В зависимости от размера вашего корпуса, я думаю, что вы, вероятно, получите повышение производительности от создания набора для ключевых слов, прежде чем сделать это:

stopword_set = frozenset(ntlk.corpus.stopwords.words('english'))

Если это не подходит для вашей ситуации, похоже, вы можете воспользоваться тем, что FreqDist наследуется от dict:

for stopword in nltk.corpus.stopwords.words('english'):
    if stopword in all_words:
        del all_words[stopword]
Другие вопросы по тегам