代码之家  ›  专栏  ›  技术社区  ›  Vanitha Reddy

情绪分析的Mahout

  •  6
  • Vanitha Reddy  · 技术社区  · 11 年前

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

    我使用mahout 0.7 naive bayes算法对推特的情绪进行分类。 我使用 trainnb testnb naive bayes分类器来训练分类器,并将推文的情绪分类为“积极”、“消极”或“中性”。

    样本正向训练集

          '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 回复  |  直到 11 年前
        1
  •  3
  •   Ivan Koblik    11 年前

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

    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);
    

    这里的结果应该有“阳性”或“阴性”的标签。

        2
  •  1
  •   Jan Domozilov    11 年前

    我不确定我能否完全帮助你,但我希望我能给你一些切入点。一般来说,我给你的建议是下载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) StandardNaiveBayes分类器是使用您的模型创建的

    3) RawEntry是我的自定义类,它只是我数据的原始字符串的包装器。toNaiveBayesTrainingFormar获取我想要分类的字符串,根据我的需要从中去除噪声,并简单地返回一个字符串“word1 word2 word3 word4”。因此,我的未分类原始字符串被转换为适用的格式进行分类。

    4) 现在,由于分类器输入仅在Vector中,因此需要将特征字符串编码为Mahout的Vector

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

    这是第一部分。现在,分类器返回Vector,其中包含具有概率的类(在您的情况下是情感)。您需要特定的输出。最简单的实现方式(但我认为不是最高效和最时尚的)是下一步:

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

    2) 对于您调用分类方法的每个实例(不要忘记做一些更改,不要为每个实例创建StandardNaiveBayesClassifier)

    3) 有了分类结果向量,你可以在地图reduce作业中以任何格式输出数据

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

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

    总的来说,我从来没有从命令行使用过Mahout,对我来说,从Java使用Mahout是最好的选择。