【问题标题】:Sentiment Classification with NLTK Naive Baysian classifier使用 NLTK 朴素贝叶斯分类器进行情感分类
【发布时间】:2017-05-19 01:09:40
【问题描述】:

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

【问题讨论】:

标签: python nltk


【解决方案1】:

查看 NLTK 书籍页面 http://www.nltk.org/book/ch06.html 似乎提供给 NaiveBayesClassifier 的数据属于 list(tuple(dict,str)) 类型,而您传递给分类器的数据属于 list(dict) 类型。

如果你以类似的方式表示数据,你会得到不同的结果。基本上就是(feature dict, label)的列表。

您的代码中有多个错误:

  1. Python 不使用分号作为行尾
  2. True 布尔值在第 12 行似乎不起作用
  3. trainFeatListtestFeatList 应该是列表
  4. 您的功能项目列表中的每个value 应该是tuple(dict,str)
  5. 为列表中的特征分配标签(在 (4) 中)
  6. NaiveBayesClassifierclassifier 的任何使用都排除在负面特征循环之外

如果你修复了之前的错误,分类器就会工作,但除非我知道你想要实现什么,否则它会令人困惑并且不能很好地预测。

你需要注意的主线是当你给你的变量value赋值时。

例如:

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

应该是这样的:

value = ({feature_name:feature}, label)

然后,您将在列表中调用 .append() 来添加每个值,而不是 .update()

您可以在 http://pastebin.com/91Zu59Cm 查看处于错误工作状态的更新代码示例,但我建议您考虑以下几点:

  • NaiveBayesClassifier 类的数据应该如何表示?
  • 您要捕捉哪些特征?
  • 哪些标签与这些功能相关联?

【讨论】:

  • 感谢您的详细回答;我正在纠正所有错误。我有正负文本文件,并从这些文件中提取单词特征,并根据正负文本文件标记每个单词特征。
  • 您可能需要考虑与每个标签关联的功能,可能会产生多个功能
  • 我想从正面文件中提取单词特征,然后想将每个单词标记为正面,就像负面文件一样。
  • 我认为您混淆了标签和功能。标签是分配给数据样本的类。特征描述用于训练分类器的数据。
  • 我对类标签和特性有清晰的概念。我正在为从正面文件中提取的单词特征提供类标签,对于负面文件也是如此。我有正面和负面情绪电影评论文件。
猜你喜欢
  • 2017-04-19
  • 2016-09-28
  • 2012-07-15
  • 2012-12-05
  • 2015-12-20
  • 2020-04-26
  • 2017-01-10
  • 2012-07-02
相关资源
最近更新 更多