1

我正在用Python的scikit-learn对Livejournal的博客进行情感分类。我有大约40000个职位,我使用其中的4/5作为训练集,剩余部分作为测试集。有监督学习的情感分类

有6种情绪:['joy','sadness','anger','surprise','love','fear']

我experiented几个分类(包括朴素贝叶斯,SVM,SGD ..)但问题是,预测是非常非常不准确的。其实这几乎是微不足道的,因为几乎测试集中的每个博客都被预测为“喜悦”,这是火车集中最常见的情绪(45%)。

该功能集基本上包括一袋文字功能(我试过unigrams和bigrams),对于unigram,总共有613822个功能。

Besiedes,我添加了一些使用SentiWordnet分数的基于词典的特征:计算名词,形容词,形容词,动词和总词的正面和负面分数的总和。在博客中。所以每个博客都会有613822 + 5个功能。

我也应用了一些特征选择方法,如chi2来减少特征数量,但没有任何明显的改进。

scikit-learn的CountVectorizerDictVectorizer用于向量化特征,Pipeline.FeatureUnion用于连接它们。

我猜这个糟糕的结果是由于过大的单词功能集 - 可能是文本中有太多拼错的单词? (我已经删除了停用词并完成了一些词形化作业) 我还认为基于词典的功能并不真正起作用,因为BOW功能太大。

我希望在我的方法中找到任何明显的错误,或者我可以做些什么来提高准确性。

感谢您的任何建议!

+0

原谅潜在的无知问题,但你的任何技术解释句子长度和标点符号?如果没有,并且你在乎回答,为什么不呢? –

回答

1

你是对的,问题是在这个过于大量的功能和你过拟合到它..

考虑以下几点:

1-规范化每个博客,删除号码,标点符号,链接,html标签(如果有的话)。

2-思考Stemming而不是Lemmatization,Stemmers比lemmatizers更简单,更小,通常更快,对于许多应用来说,它们的结果足够好。

http://nlp.stanford.edu/IR-book/html/htmledition/stemming-and-lemmatization-1.html

词根通常指的是一种粗略的过程,砍掉的话两端正确地实现这一目标的大部分时间的希望,并且通常包括去除派生词缀。词形还原通常是指在使用单词的词汇量和形态分析,正确的做事,通常旨在除去变化词尾只有

3-我在之前类似的问题的工作,我没有什么特点的提取,是对于6种情绪中的每一种情绪,我最常见的500个单词(每个班级),然后删除它们之间的共同词干。 结果列表包含大约2000个字,然后用作功能列表。 然后我使用朴素贝叶斯分类器。