我正在使用python的scikit-learn对来自Livejournal的博客进行情感分类。我有大约40000个帖子,我使用其中的4/5作为训练集,其余的作为测试集。
有6种情绪:['joy','sadness','anger','surprise','love','fear']
我体验过几种分类器(包括naive bayes,svm,sgd..)但问题是预测是非常非常不准确的。实际上,这几乎是微不足道的,因为测试集中几乎每个博客都被预测为“快乐”,这是训练集中最常见的情绪(45%)。
特征集基本上包括词袋特征(我尝试了unigram和二元语法),对于unigram,总共有613822个特征。
此外,我还使用SentiWordnet分数添加了一些基于词典的功能:计算名词、形容词、副词、动词和总词的正负分数之和。在博客里。因此,对于每个博客,将有613822 +5个功能。
我还应用了一些特征选择方法,如chi2,以减少特征数量,但没有任何明显的改进。
scikit learn的CountVectorizer和DictVectorizer用于特征的矢量化,Pipeline.FeatureUnion用于连接它们。
我猜糟糕的结果是由于单词特征集过大--也许文本中有太多拼写错误的单词?(我已经删除了停止词并做了一些词汇化工作)我还认为基于词典的功能并不能真正起作用,因为弓特征太大了。
我希望在我的方法中发现任何明显的错误,或者我可以做些什么来提高准确性。
谢谢你的建议!!
发布于 2015-10-18 19:18:15
你说得对,问题出在这些过多的特性中,而你对它过于适应了。
请考虑以下几点:
规范每个博客,删除数字,标点符号,链接,html标签。
2-考虑词干而不是词干,词干分析器比词干分析器更简单,更小,通常更快,对于许多应用程序来说,他们的结果已经足够好了。
http://nlp.stanford.edu/IR-book/html/htmledition/stemming-and-lemmatization-1.html
词干通常指的是一种粗糙的启发式过程,它砍掉单词的末尾,希望在大多数情况下正确地实现这一目标,并且通常包括删除派生词缀。词形分析通常指的是使用词汇和词法分析正确地处理事情,通常只是为了消除屈折词尾。
3-我之前做过一个类似的问题,我做的是特征提取,是针对6种情绪的每一种情绪,我得到了最频繁的500个单词(针对每个类别),然后删除了它们之间的共同点。得到的列表包含大约2000个单词,然后将其用作特征列表。然后我使用朴素贝叶斯分类器。
https://stackoverflow.com/questions/33196390
复制相似问题