【问题标题】:Neutrality for sentiment analysis in sparkspark中情绪分析的中立性
【发布时间】:2017-05-11 18:01:58
【问题描述】:

我已经在 apache spark 上构建了一个非常基本的朴素贝叶斯,当然还使用了 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

这种映射在 Spark 中是否可行?我四处寻找,但找不到任何东西。 RDD API 中的NaiveBayesModel 类有一个predict 方法,它只返回一个根据训练集映射的双精度,即如果只有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 是负数还是正数?具有三个特征,即负、正、中性,那么该方法将以什么顺序返回预测?

【问题讨论】:

  • 我们需要在这里查看您的代码以提供帮助。根据您构建 ml 管道的方式(如果您确实使用了管道),标签可能通过您的 stringIndexer 阶段可用。
  • @PascalSoucy : 我添加了代码示例和更详细的解释

标签: scala apache-spark sentiment-analysis naivebayes


【解决方案1】:

拥有构建模型的代码会很有帮助(为了使您的示例正常工作,数据集中的 0.0 必须在模型中作为 Double 转换为 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:构建数据集(如果您认为必须处理大量类型 2 中性文本)。好消息是,构建中性数据集并不太难。例如,您可以选择不是电影评论的随机文本并假设它们是中性的。如果您可以选择与电影密切相关(但中性)的内容,例如电影概要数据集,那就更好了。然后,您可以创建一个多类朴素贝叶斯分类器(在中性、正面和负面之间)或分层分类器(第一步是确定文本是否为电影评论的二元分类器,第二步是确定整体情绪) .
  4. 选项 2(可用于处理类型 1 和 2)。正如我所说,朴素贝叶斯在处理概率阈值方面并不是很好,但你可以尝试一下。但是,如果没有数据集,将很难确定要使用的阈值。另一种方法是识别具有显着极性的单词或词干的数量。一种快速而肮脏的方法是用每个单词查询你的分类器,并计算它返回“肯定”的次数,概率显着高于否定类(如果概率彼此太接近,则丢弃,因为25% 以内的实例——这里需要进行一些实验)。最后,你可能会说 20 个肯定词对 15 个否定词,并确定它是中性的,因为它是平衡的,或者如果你有 0 个肯定词和 1 个否定词,则返回中性,因为极化词的数量太少。李>

祝你好运,希望这会有所帮助。

【讨论】:

  • 谢谢..帮助。我正在使用val model : NaiveBayesModel = new NaiveBayes().fit(finalDF),其中 finalDF 是在标记化-> ngrams 过滤后获得的,然后使用 hashingTF 进行转换。当数据集中没有中立性时尝试预测中立性时,我得到了奇怪的结果,正如你所说,朴素贝叶斯似乎不适合它。
【解决方案2】:

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

  • 朴素贝叶斯中的先验是根据数据计算得出的,不能手动设置。
  • 在 MLLib 中,您可以使用 predictProbabilities 获取类概率。
  • 在 ML 中,您可以使用 setThresholds 为每个类设置预测阈值。

【讨论】:

  • 是的,我看到了那个方法,但是对代码的注释相当高级。它返回一个包含两个元素的数组,但我无法理解哪个与正相关,哪个与负相关?
  • [P(c = 0), P(c = 1), ..., P(c = n)]
  • 好的,那么它是按这个顺序编号的吗?因此,如果我在训练集中有 0,1(0-负,1-正)并且 predictProbabilities 返回 [0.86777,0.012344] 是否保证 0 即负概率为 0.86/86%
猜你喜欢
  • 2016-03-15
  • 2019-10-06
  • 1970-01-01
  • 2018-08-11
  • 2014-05-16
  • 2013-02-02
  • 1970-01-01
  • 2012-12-07
  • 2014-12-11
相关资源
最近更新 更多