2017-01-04 14 views
0

NLTKを使用したNaive Bayesianクラシファイアを実装しています。しかし、抽出された特徴を持つ分類器を訓練すると、「解凍するには値が大きすぎます」というエラーが発生します。私はちょうどパイソンの初心者です。ここにコードがあります。プログラムはファイルからテキストを読み取り、これらのファイルから機能を抽出しています。 NLTKブックページhttp://www.nltk.org/book/ch06.html見てNLTKによるセンチメント分類ナイーブベイズ分類器

import nltk.classify.util,os,sys; 
from nltk.classify import NaiveBayesClassifier; 
from nltk.corpus import stopwords; 
from nltk.tokenize import word_tokenize,RegexpTokenizer; 
import re; 
TAG_RE = re.compile(r'<[^>]+>') 
def remove_tags(text): 
return TAG_RE.sub('', text) 

def word_feats(words): 
return dict([(word,True) for word in words]) 

def feature_extractor(sentiment): 
path = "train/"+sentiment+"/" 
files = os.listdir(path); 
feats = {}; 
i = 0; 
for file in files: 
    f = open(path+file,"r", encoding='utf-8'); 
    review = f.read(); 
    review = remove_tags(review); 
    stopWords = (stopwords.words("english")) 
    tokenizer = RegexpTokenizer(r"\w+"); 
    tokens = tokenizer.tokenize(review);  
    features = word_feats(tokens); 
    feats.update(features) 
    return feats; 

posative_feat = feature_extractor("pos"); 
p = open("posFeat.txt","w", encoding='utf-8'); 
p.write(str(posative_feat)); 
negative_feat = feature_extractor("neg"); 
n = open("negFeat.txt","w", encoding='utf-8'); 
n.write(str(negative_feat)); 
plength = int(len(posative_feat)*3/4); 
nlength = int(len(negative_feat)*3/4) 
totalLength = plength+nlength; 
trainFeatList = {} 
testFeatList = {} 
i = 0 
for items in posative_feat.items(): 
i +=1; 
value = {items[0]:items[1]} 
if(i<plength): 
    trainFeatList.update(value); 
else: 
    testFeatList.update(value);  

j = 0 
for items in negative_feat.items(): 
    j +=1; 
    value = {items[0]:items[1]} 
    if(j<plength): 
    trainFeatList.update(value); 
    else: 
    testFeatList.update(value); 
classifier = NaiveBayesClassifier.train(trainFeatList) 
print(nltk.classify.util.accuracy(classifier,testFeatList)); 
classifier.show_most_informative_features(); 
+1

[NLTK精度:「ValueError:アンパックする値が多すぎます」](http://stackoverflow.com/questions/31920199/nltk-accuracy-valueerror-to-many-values-to-unpack ) – Pierre

答えて

1

あなたが分類子に渡しているデータは、タイプlist(dict)であるのに対しNaiveBayesClassifierに与えられたデータは、タイプlist(tuple(dict,str))であるようです。

同様の方法でデータを表現すると、異なる結果が得られます。基本的には(feature dict, label)のリストです。

あなたのコード内の複数のエラーがあります。

  1. PythonはTrueブール値がライン12
  2. trainFeatListtestFeatList上の目的を果たすようには見えない
  3. を行末としてセミコロンを使用していませんリストである必要があります
  4. 各機能項目リストのvalueは、tuple(dict,str)
  5. ((4))で、リスト内の機能へのSSIGNラベルが
  6. は、前のエラーを修正する場合は、分類器は動作しますが、場合を除きますNaiveBayesClassifierを取り、負の機能ループのうちclassifierのいずれかを使用

私はあなたがそれを達成しようとしていることが分かり、混乱していて、よく予測しません。

あなたが注意する必要があるメインラインは、変数valueに何かを割り当てるときです。例えば

:その後、後であなたの代わりに.update()の各値を追加するために、あなたのリストに.append()を呼ぶだろう

value = ({feature_name:feature}, label) 

value = {items[0]:items[1]} 

のようなものでなければなりません。

あなたはhttp://pastebin.com/91Zu59Cmでバギー作業状態であなたの更新されたコードの例を見ることができますが、私は次のことを考えを示唆している:

  • は、どのようにデータがNaiveBayesClassifierクラスに表現することになっていますか?
  • キャプチャしようとしている機能は何ですか?
  • これらの機能にはどのようなラベルが関連付けられていますか?
+0

詳細な回答ありがとうございます。私はすべてのエラーを訂正しています。私は、正と負のテキストファイルを持っていて、これらのファイルから単語の特徴を抽出し、正または負のテキストファイルに従って各単語の特徴にラベルを付けます。 –

+0

あなたは、各ラベルに関連付けられている機能について考えることができます。複数の機能を作成する可能性があります。 –

+0

ポジティブなファイルから単語の特徴を抽出し、ネガティブなファイルのようにポジティブなものとしてラベル付けします。 –

関連する問題