Spark 中情绪分析的中立性
Neutrality for sentiment analysis in spark
我已经在 apache spark 上构建了一个非常基本的朴素贝叶斯,当然还使用了 mllib。但我对中立的确切含义有一些澄清。
据我了解,在给定的数据集中有预先标记的句子,其中包含必要的 classes,下面以 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.xml中可以实现这种映射吗?我四处搜寻但找不到任何东西。 RDD API 中的 NaiveBayesModel
class 有一个 predict
方法,它只是 return 一个根据训练集映射的双精度数,即如果只有 0,1是否会 return 只有 0,1 而不是按比例缩放的方式,例如上面的 0.0 - 1.0。
关于此的任何 pointers/advice 都将非常有帮助。
编辑 - 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 是负数还是正数?具有三个特征,即负面、正面、中性,那么该方法 return 预测的顺序是什么?
我不确定我是否理解问题但是:
- 朴素贝叶斯中的先验是根据数据计算得出的,不能手动设置。
- 在 MLLib 中,您可以使用
predictProbabilities
获得 class 概率。
- 在 ML 中,您可以使用
setThresholds
为每个 class 设置预测阈值。
拥有构建模型的代码会很有帮助(为了让您的示例工作,数据集中的 0.0 必须转换为 0.0 作为模型中的 Double,或者在使用 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 处的概率是 labelIndexer.labels 在索引 0 处的概率。
现在关于你的其他问题。
- 中立可能意味着两种不同的含义。类型 1:评论包含尽可能多的正面和负面词语 类型 2:(几乎)没有表达任何情绪。
- 如果您想管理类型 2,中性类别会非常有用。如果是这种情况,您的数据集中需要中性示例。朴素贝叶斯不是一个很好的 class 算法来对概率应用阈值以确定类型 2 中立性。
- 选项 1:构建数据集(如果您认为您将不得不处理大量 Type 2 中性文本)。好消息是,构建中性数据集并不难。例如,您可以选择不是电影评论的随机文本,并假设它们是中性的。如果你能选择与电影密切相关(但中性)的内容,那就更好了,比如电影简介的数据集。然后,您可以创建一个多 class 朴素贝叶斯 class 运算符(在中性、正和负之间)或分层 class 运算符(第一步是二进制 class 运算符判断一段文字是否为影评,第二步判断整体情绪)。
- 选项2(可用于处理类型1和类型2)。正如我所说,朴素贝叶斯在处理概率阈值方面不是很好,但您可以尝试一下。但是,如果没有数据集,将很难确定要使用的阈值。另一种方法是确定具有显着极性的单词或词干的数量。实现这一目标的一种快速而肮脏的方法是用每个单独的单词查询 classifier 并计算它 returns "positive" 的概率明显高于否定 class(如果概率彼此太接近则丢弃,例如在 25% 以内 - 这里需要进行一些实验)。最后,你可能会说出 20 个正面词和 15 个负面词,并确定它是中性的,因为它是平衡的,或者如果你有 0 个正面词和 1 个负面词,return 中性,因为极化词的数量太多了低。
祝您好运,希望对您有所帮助。
我已经在 apache spark 上构建了一个非常基本的朴素贝叶斯,当然还使用了 mllib。但我对中立的确切含义有一些澄清。
据我了解,在给定的数据集中有预先标记的句子,其中包含必要的 classes,下面以 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.xml中可以实现这种映射吗?我四处搜寻但找不到任何东西。 RDD API 中的 NaiveBayesModel
class 有一个 predict
方法,它只是 return 一个根据训练集映射的双精度数,即如果只有 0,1是否会 return 只有 0,1 而不是按比例缩放的方式,例如上面的 0.0 - 1.0。
关于此的任何 pointers/advice 都将非常有帮助。
编辑 - 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 是负数还是正数?具有三个特征,即负面、正面、中性,那么该方法 return 预测的顺序是什么?
我不确定我是否理解问题但是:
- 朴素贝叶斯中的先验是根据数据计算得出的,不能手动设置。
- 在 MLLib 中,您可以使用
predictProbabilities
获得 class 概率。 - 在 ML 中,您可以使用
setThresholds
为每个 class 设置预测阈值。
拥有构建模型的代码会很有帮助(为了让您的示例工作,数据集中的 0.0 必须转换为 0.0 作为模型中的 Double,或者在使用 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 处的概率是 labelIndexer.labels 在索引 0 处的概率。
现在关于你的其他问题。
- 中立可能意味着两种不同的含义。类型 1:评论包含尽可能多的正面和负面词语 类型 2:(几乎)没有表达任何情绪。
- 如果您想管理类型 2,中性类别会非常有用。如果是这种情况,您的数据集中需要中性示例。朴素贝叶斯不是一个很好的 class 算法来对概率应用阈值以确定类型 2 中立性。
- 选项 1:构建数据集(如果您认为您将不得不处理大量 Type 2 中性文本)。好消息是,构建中性数据集并不难。例如,您可以选择不是电影评论的随机文本,并假设它们是中性的。如果你能选择与电影密切相关(但中性)的内容,那就更好了,比如电影简介的数据集。然后,您可以创建一个多 class 朴素贝叶斯 class 运算符(在中性、正和负之间)或分层 class 运算符(第一步是二进制 class 运算符判断一段文字是否为影评,第二步判断整体情绪)。
- 选项2(可用于处理类型1和类型2)。正如我所说,朴素贝叶斯在处理概率阈值方面不是很好,但您可以尝试一下。但是,如果没有数据集,将很难确定要使用的阈值。另一种方法是确定具有显着极性的单词或词干的数量。实现这一目标的一种快速而肮脏的方法是用每个单独的单词查询 classifier 并计算它 returns "positive" 的概率明显高于否定 class(如果概率彼此太接近则丢弃,例如在 25% 以内 - 这里需要进行一些实验)。最后,你可能会说出 20 个正面词和 15 个负面词,并确定它是中性的,因为它是平衡的,或者如果你有 0 个正面词和 1 个负面词,return 中性,因为极化词的数量太多了低。
祝您好运,希望对您有所帮助。