2013-12-23 17 views
5

document classification, as described in NLTK Chapter 6を実行しようとしていますが、ストップワードを削除できません。私はNLTKストップワード削除問題

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

を追加すると、それは私は、彼らが()関数は無用.KEYレンダリング、ストップワードのコードは「all_words」のために使用されるオブジェクトの種類を変更することを推測している

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' 

を返します。どのようにタイプを変更せずにキー機能を使用する前にストップワードを削除できますか?下記の全コード:

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')) 

答えて

4

私が最初の場所で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')) 

それはあなたの状況に適していないなら、それはあなたがFAを活用することができますように見えますctはFreqDistを継承します。dict

for stopword in nltk.corpus.stopwords.words('english'): 
    if stopword in all_words: 
     del all_words[stopword] 
+0

パーフェクトです。ありがとうございました! – user3128184

関連する問題