Python 基于NLTK朴素贝叶斯分类器的情感分类
我正在用NLTK实现朴素贝叶斯分类器。但当我用提取的特征训练分类器时,会出现错误“太多的值无法解包”。我只是python的初学者。这是代码。程序从文件中读取文本并从这些文件中提取特征Python 基于NLTK朴素贝叶斯分类器的情感分类,python,nltk,Python,Nltk,我正在用NLTK实现朴素贝叶斯分类器。但当我用提取的特征训练分类器时,会出现错误“太多的值无法解包”。我只是python的初学者。这是代码。程序从文件中读取文本并从这些文件中提取特征 import nltk.classify.util,os,sys; from nltk.classify import NaiveBayesClassifier; from nltk.corpus import stopwords; from nltk.tokenize import word_tokenize,
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();
导入nltk.classify.util、os、sys;
从nltk.classify导入bayesclassifier;
从nltk.corpus导入停止词;
从nltk.tokenize导入单词\u tokenize,RegexpTokenizer;
进口稀土;
TAG_RE=RE.compile(r']+>')
def移除_标签(文本):
返回标签子项(“”,文本)
def word_专长(单词):
返回dict([(word,True)表示单词中的单词])
def功能_提取器(情绪):
path=“train/”+情绪+“/”
files=os.listdir(路径);
专长={};
i=0;
对于文件中的文件:
f=打开(路径+文件,“r”,编码为='utf-8');
review=f.read();
审查=删除标签(审查);
stopWords=(stopWords.words(“英语”))
标记器=RegexpTokenizer(r“\w+”);
tokens=标记器。标记化(审查);
特征=单词专长(代币);
专长。更新(功能)
回归功绩;
posative_feat=特征提取器(“pos”);
p=打开(“posFeat.txt”,“w”,编码='utf-8');
p、 写(str(posative_feat));
负功能=特征提取器(“负”);
n=打开(“negFeat.txt”,“w”,编码为utf-8”);
n、 写(str(否定壮举));
正压=int(正压)*3/4;
长度=整数(长度(负专长)*3/4)
总长度=正压+N长度;
trainFeatList={}
testFeatList={}
i=0
对于posative_feat.items()中的项目:
i+=1;
值={items[0]:items[1]}
如果(i查看NLTK图书页面,则提供给NaiveBayesClassifier
的数据类型为列表(tuple(dict,str))
,而传递给分类器的数据类型为列表(dict)
如果以类似的方式表示数据,则会得到不同的结果。基本上,它是一个(功能目录,标签)
列表
您的代码中有多个错误:
Python不使用分号作为行尾
True
布尔值在第12行似乎没有作用
trainFeatList
和testFeatList
应为列表
功能项列表中的每个值都应该是元组(dict,str)
为列表中的要素指定标签(在(4)中)
将NaiveBayesClassifier
,以及分类器的任何使用从否定特征循环中移除
如果您修复了前面的错误,分类器将工作,但除非我知道您试图实现的是什么,否则它会令人困惑,并且无法很好地预测
您需要注意的主要一点是,当您为变量值
赋值时
例如:
value = {items[0]:items[1]}
应该是这样的:
value = ({feature_name:feature}, label)
然后在列表上调用.append()
,以添加每个值,而不是.update()
您可以在查看一个更新代码在错误工作状态下的示例,但我建议您考虑以下几点:
NaiveBayesClassifier
类的数据应该如何表示
- 您试图捕获哪些功能
- 哪些标签与这些功能关联
查看NLTK图书页面,似乎提供给NaiveBayesClassifier
的数据属于列表(tuple(dict,str))
类型,而传递给分类器的数据属于列表(dict)
如果以类似的方式表示数据,则会得到不同的结果。基本上,它是一个(功能目录,标签)
列表
您的代码中有多个错误:
Python不使用分号作为行尾
True
布尔值在第12行似乎没有作用
trainFeatList
和testFeatList
应为列表
功能项列表中的每个值都应该是元组(dict,str)
为列表中的要素指定标签(在(4)中)
将NaiveBayesClassifier
,以及分类器的任何使用从否定特征循环中移除
如果您修复了前面的错误,分类器将工作,但除非我知道您试图实现的是什么,否则它会令人困惑,并且无法很好地预测
您需要注意的主要一点是,当您为变量值
赋值时
例如:
value = {items[0]:items[1]}
应该是这样的:
value = ({feature_name:feature}, label)
然后在列表上调用.append()
,以添加每个值,而不是.update()
您可以在查看一个更新代码在错误工作状态下的示例,但我建议您考虑以下几点:
NaiveBayesClassifier
类的数据应该如何表示
- 您试图捕获哪些功能
- 哪些标签与这些功能关联
可能重复的可能重复的可能重复的感谢您的详细回答;我正在更正所有错误。我有正文本文件和负文本文件,从这些文件中提取单词特征,并根据正文本文件或负文本文件标记每个单词特征。您可能需要考虑与每个标签相关的特征,例如制作多个功能我想从正片文件中提取单词功能,然后将每个单词标记为正片,就像负片文件一样。我认为你混淆了标签和功能。标签是分配给数据样本的类。功能描述用于训练分类器的数据。我对类标签和功能有清晰的概念。我是giv正在将从正面文件提取的类标签转换为单词特征,负面文件也是如此。我有正面和负面情绪电影评论文件。感谢您的详细回答;我是corr