首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于情感分析的Mahout

用于情感分析的Mahout
EN

Stack Overflow用户
提问于 2013-03-07 19:36:30
回答 2查看 4.7K关注 0票数 6

使用mahout,我能够对数据的情感进行分类。但是我被困在了一个混乱的矩阵中。

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

样本正训练集

代码语言:javascript
运行
复制
      'positive','i love my i phone'
      'positive' , it's pleasure to have i phone'  

同样,我也准备了负性和中性的训练样本,这是一个巨大的数据集。

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

代码语言:javascript
运行
复制
  'it is nice model'
  'simply fantastic ' 

我能够运行mahout分类算法,它以混淆矩阵的形式给出了分类实例的输出。

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

代码语言:javascript
运行
复制
       'negative','very bad btr life time'
      'positive' , 'i phone has excellent design features' 

在mahout中,我需要实现哪种算法才能得到上述格式的输出。或者任何自定义源代码实现都是必需的。

为了“友好地”显示数据,建议apache mahout提供的算法,它将适用于我的twitter数据情感分析。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-07 22:01:32

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

书中的This excerpt有一些例子。请参见清单2:

代码语言:javascript
运行
复制
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);

这里的结果应该有“正面”或“负面”标签。

票数 3
EN

Stack Overflow用户

发布于 2013-03-13 21:58:22

我不确定我是否能完全帮助你,但我希望我能给你一些切入点。一般来说,我的建议是下载Mahout的源代码,看看示例和目标类是如何实现的。这并不容易,但您应该做好准备,因为Mahout没有容易进入的门。但一旦你进入它们,学习曲线就会很快。

首先,这取决于您使用的Mahout版本。我自己使用的是0.7,所以我的解释是关于0.7。

代码语言:javascript
运行
复制
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)创建map reduce作业,该作业遍历要分类的所有数据

2)对于你调用的每个实例,都要使用分类方法(不要忘了做一些修改,不是为每个实例都创建StandardNaiveBayesClassifier )

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

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

同样,这一切都适用于Mahout 0.7。不能保证它会按原样为您工作。不过,这对我来说很有效。

一般来说,我从来没有在命令行中使用过Mahout,对我来说,使用Java中的Mahout是可行的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15270145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档