Python 基于NLTK朴素贝叶斯分类器的情感分类

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,

我正在用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();
导入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