我正在用NLTK实现朴素贝叶斯分类器。但是,当我使用提取的功能训练分类器时,它会给出错误“解压缩的值太多”。我只是python的初学者。这是代码。程序正在从文件中读取文本并从这些文件中提取功能。
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();
答案 0 :(得分:2)
查看NLTK书页http://www.nltk.org/book/ch06.html,似乎给NaiveBayesClassifier
的数据的类型为list(tuple(dict,str))
,而传递给分类器的数据属于该类型list(dict)
。
如果您以类似方式表示数据,您将得到不同的结果。基本上,它是(feature dict, label)
的列表。
您的代码中存在多个错误:
True
布尔值似乎没有用于第12行trainFeatList
和testFeatList
应为列表value
应为tuple(dict,str)
NaiveBayesClassifier
开始,以及使用classifier
从负面功能循环中获取如果您修复了以前的错误,分类器将会起作用,但除非我知道您要实现的目标,否则它会让您感到困惑并且无法预测。
您需要注意的主线是当您为变量value
分配内容时。
例如:
value = {items[0]:items[1]}
应该是这样的:
value = ({feature_name:feature}, label)
然后,您可以在列表中调用.append()
来添加每个值,而不是.update()
。
您可以在http://pastebin.com/91Zu59Cm查看有关错误工作状态的更新代码示例,但我建议您考虑以下事项:
NaiveBayesClassifier
类表示数据?