Mahout进行情绪分析

时间:2013-03-07 11:36:30

标签: machine-learning mahout sentiment-analysis

使用mahout我能够对数据情绪进行分类。但我陷入困惑矩阵。

我正在使用mahout 0.7朴素贝叶斯算法来对推文的情绪进行分类。 我使用trainnbtestnb朴素的贝叶斯分类器来训练分类器,并将推文的情绪分类为“正面”,“负面”或“中立”。

样本积极训练集

      '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中,我需要实现哪种算法以上述格式获得输出。或者需要任何自定义源实现。

要显示数据'亲切',建议使用apache mahout提供的算法,这将适合我的Twitter数据情绪分析。

2 个答案:

答案 0 :(得分:3)

一般来说,要对某些文本进行分类,你需要运行具有不同先验的朴素贝叶斯(在你的情况下为正面和负面),然后选择一个能带来更大价值的文本。

来自Mahout书的

This excerpt有一些例子。参见清单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);

此结果应该包含“正面”或“负面”标签。

答案 1 :(得分: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的Vector,因为分类器输入仅在Vector

5)将矢量传递给分类器 - 魔术。

这是第一部分。现在,分类器返回包含具有概率的类(在您的情况下为情绪)的Vector。你想要特定的输出。最直接的实现(但我认为不是最有效和最时尚)将是下一步:

1)您创建地图缩减作业,该作业将遍历您要分类的所有数据

2)对于每个实例,您调用classify方法(不要忘记进行一些更改,不要为每个实例创建StandardNaiveBayesClassifier)

3)拥有分类结果向量,您可以以地图缩减作业中的任何格式输出数据

4)这里有用的设置是jC.set(“mapreduce.textoutputformat.separator”,“”);其中jC是JobConf。这允许您从mapreduce作业中为输出文件选择分隔符。在你的情况下,这是“,”。

同样,这一切都适用于Mahout 0.7。不保证它会对你有用。虽然它对我有用。

总的来说,我从未在命令行中使用过Mahout,而对于我来说,使用Java的Mahout是可行的。