Mahout用于情感分析

6
使用mahout,我能够对数据进行情感分类。但是我卡在了混淆矩阵上。
我正在使用mahout 0.7朴素贝叶斯算法来对推文的情感进行分类。我使用trainnb和testnb朴素贝叶斯分类器来训练分类器,并将推文的情感分类为“积极”,“消极”或“中性”。
样本积极训练集
      'positive','i love my i phone'
      'positive' , it's pleasure to have i phone'  

同样地,我已经准备了负面和中性的训练样本,这是一个庞大的数据集。

我提供的样本测试数据推文没有包含情感。

  'it is nice model'
  'simply fantastic ' 

我能够运行Mahout分类算法,并将分类实例的输出作为混淆矩阵给出。

下一步,我需要找出哪些推文展示了积极情绪,哪些是消极的。 使用分类预期输出:标记带有情感的文本。

       'negative','very bad btr life time'
      'positive' , 'i phone has excellent design features' 

在Mahout中,我需要实施哪种算法才能以上述格式获得输出?还是需要自定义源实现。

请“友善地”建议我使用适合于我的Twitter数据情感分析的Apache Mahout提供的算法来显示数据。

2个回答

3
通常,为了对一些文本进行分类,您需要使用不同的先验(在您的情况下为正和负),运行朴素贝叶斯,然后选择结果值更大的那个。
Mahout 书中的这一节摘录提供了一些示例。请参见清单2:
Parameters p = new Parameters();
p.set("basePath", modelDir.getCanonicalPath());9
Datastore ds = new InMemoryBayesDatastore(p);
Algorithm a = new BayesAlgorithm();
ClassifierContext ctx = new ClassifierContext(a,ds);
ctx.initialize();

....

ClassifierResult result = ctx.classifyDocument(tokens, defaultCategory);

这里的结果应该包含“positive”或“negative”标签。


1
我不确定我能完全帮助你,但我希望我能给你一些入门的建议。总的来说,我的建议是下载Mahout的源代码并查看示例和目标类的实现方式。这并不容易,但你应该准备好Mahout没有简单的入口。但一旦你进入了学习曲线会很快。
首先,它取决于你使用的Mahout版本。我自己使用的是0.7,所以我的解释将针对0.7版本。
public void classify(String modelLocation, RawEntry unclassifiedInstanceRaw) throws IOException {

    Configuration conf = new Configuration();

    NaiveBayesModel model = NaiveBayesModel.materialize(new Path(modelLocation), conf);
    AbstractNaiveBayesClassifier classifier = new StandardNaiveBayesClassifier(model);

    String unclassifiedInstanceFeatures = RawEntry.toNaiveBayesTrainingFormat(unclassifiedInstanceRaw);

    FeatureVectorEncoder vectorEncoder = new AdaptiveWordValueEncoder("features");
    vectorEncoder.setProbes(1); // my features vectors are tiny

    Vector unclassifiedInstanceVector = new RandomAccessSparseVector(unclassifiedInstanceFeatures.split(" ").length());

    for (String feature: unclassifiedInstanceFeatures) {
        vectorEncoder.addToVector(feature, unclassifiedInstanceVector);
    }

    Vector classificationResult = classifier.classifyFull(unclassifiedInstanceVector);

    System.out.println(classificationResult.asFormatString());

}

这里会发生什么:
1)首先,您需要通过trainnb进行训练并加载模型。在调用trainnb时,使用-o参数指定保存位置。模型是.bin文件。
2)使用您的模型创建StandardNaiveBayesClassifier。
3)RawEntry是我的自定义类,只是围绕着我的数据的原始字符串的包装器。toNaiveBayesTrainingFormar接受我想要分类的字符串,根据我的需求去除噪声,并简单地返回一个特征字符串“word1 word2 word3 word4”。因此,我的未分类的原始字符串被转换为可应用于分类的格式。
4)现在,需要将特征字符串编码为Mahout的向量,因为分类器的输入仅为向量。
5)将向量传递给分类器-神奇。
这是第一部分。现在,分类器会返回包含类别(在您的情况下为情感)和概率的向量。您需要具体的输出。最直接的实现方式(但我认为不是最有效和最时尚的)是执行以下操作:
1)创建MapReduce作业,遍历要分类的所有数据
2)对于每个实例,调用classify方法(不要忘记做一些更改,以免为每个实例创建StandardNaiveBayesClassifier)

3) 有了分类结果向量,您可以在MapReduce作业中以任何格式输出数据。

4) 在此处有一个有用的设置:jC.set("mapreduce.textoutputformat.separator", " ");其中jC是JobConf。这允许您选择来自MapReduce作业的输出文件的分隔符。在您的情况下,这是“,”。

同样,这适用于Mahout 0.7。不能保证它会原样工作。不过对我而言,它是有效的。

总的来说,我从未使用过命令行中的Mahout,对我而言,从Java中的Mahout是最好的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接