2013-03-07 97 views
5

使用mahout我能够分类数据的情绪。但是我陷入了一个混淆矩阵。Mahout的情绪分析

我使用象夫0.7朴素贝叶斯算法进行分类鸣叫的情绪。 我使用trainnbtestnb朴素贝叶斯分类器来训练分类器,并将推文的情感分为“正面”,“负面”或“中性”。

样品阳性训练集

 'positive','i love my i phone' 
     'positive' , it's pleasure to have i phone' 

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

我提供的样本测试数据tweets没有包含情绪。

'it is nice model' 
    'simply fantastic ' 

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

下一步,我需要找出哪些鸣叫都出现了积极的情绪和为负。 使用分类的预期输出:用情绪标记文本。

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

在mahout中,我需要实现哪种算法以获得上述格式的输出。或者需要任何自定义源实现。

要显示的数据“好心”提示我说,阿帕奇象夫提供的算法,这将是适合我的Twitter数据的情感分析。

回答

3

一般到一些文字,您需要用不同的先验(正和你的情况为负),然后运行朴素贝叶斯分类只是选择导致更大的价值之一。

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

我不知道我将能够帮助您全面,但我希望我能够给你一些切入点。一般来说,我对你的建议是下载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)现在需要被编码为亨利马乌的载体,因为分类输入仅在矢量

5)传递载体分类的特征字符串 - 魔术。

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

1)创建映射精简工作,这能看穿你想

2分类的所有数据)对于每个比如你调用分类方法(不要忘记做一些改变不是创造StandardNaiveBayesClassifier为每个实例)

3)有可以输出数据的任何格式,你在你的地图哗哗减少职业分类结果向量

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

同样,这一切都适用于Mahout 0.7。没有保证它会为你工作。它虽然为我工作。

总的来说,我从来没有从命令行与Mahout一起工作,对我来说,Mahout是来自Java的。