2017-01-04 1 views
0

NLTK를 사용하여 Naive Bayesian 분류자를 구현 중입니다. 그러나 추출 된 특징을 가진 분류자를 훈련 시키면 "너무 많은 값을 풀어야한다"라는 오류가 발생합니다. 나는 단지 파이썬 초보자이다. 여기에 코드가 있습니다. 프로그램은 파일에서 텍스트를 읽고 이러한 파일에서 기능을 추출합니다.NLTK가있는 감정 분류 Naive Baysian 분류 자 ​​

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

는 NLTK 책 페이지 http://www.nltk.org/book/ch06.html보고 당신이 분류에 전달하는 데이터 유형 list(dict)입니다 반면 NaiveBayesClassifier에 주어진 데이터 유형 list(tuple(dict,str))이다 보인다.

비슷한 방식으로 데이터를 나타내면 다른 결과가 나옵니다. 기본적으로 (feature dict, label)의 목록입니다.

  1. 파이썬은
  2. True 부울 라인 (12)
  3. trainFeatListtestFeatList에 목적을 제공하지 않는 것 끝나는 선으로 세미콜론을 사용하지 않습니다

    코드에서 여러 오류가 있습니다 목록이어야 함

  4. 각 항목 항목 목록에있는 valuetuple(dict,str)
  5. 목록의 기능에 ssign 라벨 ((4))
  6. NaiveBayesClassifier을, 당신은 이전의 오류를 수정하는 경우

는, 분류가 작동합니다 부정적인 특징 루프 밖으로 classifier의 사용하지만,하지 않는 한 나는 당신이 그것을 성취하고자하는 것이 혼란스럽고 잘 예측하지 않는다는 것을 압니다.

주의해야 할 주된 라인은 변수 value에 할당 할 때입니다. 예를 들어

:

value = ({feature_name:feature}, label) 

그리고 나중에 당신이 .update() 대신 각 값을 추가 할 목록에 .append()를 부를 것이다 :

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

같은 무언가가 있어야한다.

당신은 http://pastebin.com/91Zu59Cm에서 버그가 작동 상태에 업데이트 된 코드의 예를 볼 수 있지만, 나는 다음과 같은 생각 제안 :

  • 어떻게 데이터가 NaiveBayesClassifier 클래스 표현 될 예정이다?
  • 캡처하려는 기능은 무엇입니까?
  • 해당 기능과 관련된 라벨은 무엇입니까?
+0

귀하의 세부 답변을 주셔서 감사합니다; 모든 오류를 수정하고 있습니다.나는 긍정적이고 부정적인 텍스트 파일을 가지고 있고이 파일들로부터 단어 특징들을 추출하고 긍정적이거나 부정적인 텍스트 파일에 따라 각 단어 특징에 라벨을 붙인다. –

+0

각 라벨과 관련된 기능에 대해 생각하고 잠재적으로 여러 기능을 만들 수 있습니다. –

+0

긍정적 인 파일에서 단어 기능을 추출한 다음 각 단어를 제외 파일과 같이 양수로 라벨을 지정하고 싶습니다. –