首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于NLTK朴素贝叶斯分类器的情感分类

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

Stack Overflow用户
提问于 2017-01-04 16:39:42
回答 1查看 385关注 0票数 0

我正在用NLTK实现朴素贝叶斯分类器。但是,当我用提取出来的特征训练分类器时,它会产生“太多的值而无法解压”的错误。我只是刚开始学习蟒蛇。这是密码。程序是从文件中读取文本,并从这些文件中提取功能。

代码语言:javascript
复制
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();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-04 17:58:49

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

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

代码中有多个错误:

  1. Python不使用分号作为行的结尾。
  2. 在第12行中,True布尔值似乎不起作用。
  3. trainFeatListtestFeatList应该是列表
  4. 功能项列表中的每个value都应该是tuple(dict,str)
  5. 为列表中的特性分配标签(在(4)中)
  6. NaiveBayesClassifierclassifier的任何使用从负面特性循环中提取出来

如果您修复了前面的错误,分类器就会正常工作,但是除非我知道您正在尝试实现什么,否则它是令人困惑的,不能很好地预测。

您需要注意的主线是当您向变量value分配某些内容时。

例如:

代码语言:javascript
复制
value = {items[0]:items[1]}

应该是这样的:

代码语言:javascript
复制
value = ({feature_name:feature}, label)

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

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

  • 如何为NaiveBayesClassifier类表示数据?
  • 你想捕捉什么特征?
  • 哪些标签与这些特征相关?
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41468975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档