2

我正在使用随机森林将情绪应用于字符串。所以基本上在清理评论之后,这本质上意味着停用词(nltk.corpus -> stopwords我从中删除单词为no、not、nor、won、was、 weren)以及非字母字符,并且所有内容都是小写的。CountVectorizerwith 参数(analyzer = "word", tokenizer = None, preprocessor = None, ngram_range=(1, 3), stop_words = None, max_features = 5500)构建词汇表并将其添加到数组numpy中。我也在使用 100 棵树。

用分类器分割数据后,test_size = .1进行训练、拟合和评分。

score = forest.score(X_test, y_test): 0.882180882181

混淆矩阵,没有归一化:

[[2256  503]
 [ 519 5269]]

归一化混淆矩阵:

[[ 0.82  0.18]
 [ 0.09  0.91]]

ROC 曲线显示 RandomForest (RF) 和具有 LinearRegression(RF + LR) 的 RandomForest:

在此处输入图像描述

在此处输入图像描述

所以问题是,即使结果看起来非常好,我也会得到错误的结果,例如:

“这部电影不好” ->否定

“这部电影还不错” ->否定

“音乐和画面不好” ->正面

“这部电影没有意义” ->积极

所以以上只是一些有问题的案例,但你可以大致了解我目前面临的问题是什么(即使使用 3-gram 分类器也无法正确预测否定)。我认为它也可能是训练集,没有足够的否定案例,所以它无法学习。

你有什么建议可以改进或改变,以便正确分类否定吗?

4

1 回答 1

2

我相信这个问题更适合交叉验证堆栈交换,但无论如何。

有几件事可能会改善您的结果:

  1. 对于情感分析,删除否定停用词(如“no”、“not”等)感觉不对,因为它们可以在构建 n-gram 时完全改变句子的正面/负面情绪。在您的示例中,“不错”、“不好”等将转换为“坏”、“好”等。

  2. 如果您认为负类在您的训练集中的代表性不足,您可以通过对正类进行欠采样来平衡它。

  3. 不要直接使用predict,而是使用predict_proba并尝试设置不同的概率阈值来区分正例和负例。

  4. 尝试像 AdaBoost 或 Gradient Boosted Trees 这样的提升方法,它们更适合学习异常。例如,对于学习带有单词“bad”的句子通常是否定的,但如果“not bad”也存在,它是肯定的。

于 2016-08-05T07:02:25.663 回答