火花中情绪分析的中立性

时间:2016-12-27 12:36:55

标签: scala apache-spark sentiment-analysis naivebayes

我已经在apache spark上构建了一个非常基本的朴素bayes,当然还使用了mllib。但我对中性究竟意味着什么有一些澄清。

根据我的理解,在给定的数据集中,有预先标记的句子,其中包含必要的类,例如,下面的例子为3。

0-> Negative sentiment
1-> Positive sentiment
2-> Neutral sentiment

此中性线在训练集本身中预先标记。

是否有其他形式的中立性处理。假设数据集中没有可用的中性句子,那么我是否可以从概率范围计算出来,如

0.0 - 0.4 => Negative
0.4- - 0.6 => Neutral
0.6 - 1.0 => Positive

这样的映射是否可能在火花中。我四处搜索但找不到任何东西。 RDD API中的NaiveBayesModel类有一个predict方法,它只返回根据训练集映射的double,即如果只有0,1那么它将只返回0,1而不是缩放方式,如上面的0.0 - 1.0。

任何关于此的指示/建议都会非常有帮助。

编辑 - 1

示例代码

//Performs tokenization,pos tagging and then lemmatization
//Returns a array of string
val tokenizedString = Util.tokenizeData(text)
val hashingTF = new HashingTF()
//Returns a double 
//According to the training set 1.0 => Positive, 0.0 => Negative
val status = model.predict(hashingTF.transform(tokenizedString.toSeq))
if(status == 1.0) "Positive" else "Negative"

示例数据集内容

1,Awesome movie
0,This movie sucks

当然原始数据集包含更长的句子,但这应该足以解释我猜

使用上面的代码我正在计算。我的问题是一样的

1)数据集中的中立性处理 在上面的数据集中,如果我要添加另一个类别,如 2,这部电影可以由孩子们享受

为了论证,我们假设它是一个中立的评论,然后model.predict方法将根据传入的句子给出1.0,0.0,2.0。

2)使用model.predictProbabilities它给出了一系列双精度数,但我不确定它给出的结果是什么顺序,即索引0是负数还是正数?有三个特征,即否定,正面,中立,那么该方法将以什么顺序返回预测?

2 个答案:

答案 0 :(得分:1)

我不确定我是否理解这个问题但是:

  • Naive Bayes中的先验是根据数据计算的,不能手动设置。
  • 在MLLib中,您可以使用predictProbabilities来获取课程概率。
  • 在ML中,您可以使用setThresholds为每个班级设置预测阈值。

答案 1 :(得分:1)

使用构建模型的代码会很有帮助(为了使您的示例正常工作,数据集中的0.0必须在模型中将其转换为0.0,或者在使用StringIndexer阶段对其进行索引之后,或者如果您从文件中转换了它,但假设此代码有效:

val status = model.predict(hashingTF.transform(tokenizedString.toSeq))
if(status == 1.0) "Positive" else "Negative"

然后是的,这意味着索引0的概率是负的概率,而1的概率是积极的概率(它有点奇怪且必须有原因,但ML中的一切都是双重的,甚至是特征和类别索引)。如果你的代码中有这样的东西:

val labelIndexer = new StringIndexer()
  .setInputCol("sentiment")
  .setOutputCol("indexedsentiment")
  .fit(trainingData) 

然后你可以使用labelIndexer.labels来识别标签(索引0处的概率是指数0处的labelIndexer.labels。

现在关于你的其他问题。

  1. 中立可能意味着两件事。类型1:评论包含尽可能多的正面和负面单词类型2:(几乎)没有表达任何情绪。
  2. 如果要管理类型2,中性类别可能非常有用。如果是这种情况,则需要在数据集中使用中性示例。朴素贝叶斯不是一个很好的分类器,可以对概率进行阈值处理,以确定第2类中性。
  3. 选项1:构建数据集(如果您认为必须处理大量的Type 2中性文本)。好消息是,构建中性数据集并不太难。例如,您可以选择不是电影评论的随机文本,并假设它们是中立的。如果你能选择与电影密切相关的内容(但是中性),就像电影概要的数据集一样,那就更好了。然后,您可以创建一个多类Naive Bayes分类器(中性,正和负之间)或分层分类器(第一步是确定文本是否是电影评论的二元分类器,第二步确定整体情绪)
  4. 选项2(可用于处理类型1和2)。正如我所说,朴素贝叶斯处理概率的阈值并不是很好,但你可以试试。但是,如果没有数据集,则很难确定要使用的阈值。另一种方法是识别具有显着极性的单词或词干的数量。实现这一目标的一种快速而肮脏的方法是使用每个单词查询分类器并计算它返回的次数"肯定"概率显着高于负类(如果概率彼此太接近则丢弃,例如在25%以内 - 这里需要进行一些实验)。最后,你可能会说20个正面词而不是15个正面词,并确定它是中性的,因为它是平衡的,或者如果你有0个正面和1个负面,则返回中性,因为极化词的数量太低。
  5. 祝你好运,希望这有所帮助。