我正在开发一个 Java 程序(分类器),它读取给定的文本文件并输出相关的情绪(正面或负面或中性)。
程序计算三个类别(正面或负面或中性)的三个概率。鉴于这三个概率,我想给这篇文章打分(最高 10)。
示例 -
如果假设,
P(Positive) = 0.0006
P(Negative) = 0.0001
P(Neutral) = 0.0002
那么很明显,这篇文章是高度积极的,因此评级应该很高,即 8 或更高。
PS - 概率加起来不等于 1,而且是非常非常小的数字(在 ~ 10^-(100) 的范围内)
谁能指出任何可以帮助我对文章进行评分的算法?
谢谢
编辑
我不能简单地计算比率。例如
P(Positive) = 1.2*E(-117)
P(Negative) = 4.7*E(-112)
P(Neutral) = 9.3*E(-110)
上面显示的概率差异很大。因此,采用比率将毫无意义。
大约 6 个月前,我对亚马逊评论做了类似的事情(估计准确性的基本事实是星级)。
您可以使用 Bag of Words model对于此任务 - 即每个“单词”都是一个特征。这会导致维度非常高的问题 - 这可能会影响学习时间。
从原始数据中提取特征后,您可以使用 classification algorithms 之一这是具有高维问题的下降。我测试了 SVM (线性和高斯内核)和 Naive-Bayes .当我在 Amazon 上测试时,我发现 SVM 的得分要好得多 - 两个内核之间没有统计显着性。
我的学习算法使用了具有 3 个可能值(类别)的名义分类器 - 赞成/中立/反对。
我还发现使用 feature selection (以降低维度)对朴素贝叶斯非常有帮助,但对 SVM 却没有太大帮助。
一些更重要的注意事项:
- 词干提取也有帮助。
- 除了单词之外,还使用二元语法(单词对)也有帮助(尽管进一步增加了问题的维度)。
- 对于我使用的任务 Weka和 lib-svm库来实现
学习算法。
- 我建议拆分数据进行测试和训练以估计数据的准确性,并使用 cross-validation用于查找算法的参数(例如,SVM 所需的参数)
我的结果:使用支持 vector 机,我们获得了 85% 的正面评论准确率和约 80% 的负面评论准确率。真正的问题是中立的,我们得到了 70%,而赞成和反对的错误也主要是因为分类器将其分类为“中立”,几乎没有(少于 5%)被分类为赞成/反对,而他们是恰恰相反。