6

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 データのセンチメント分析に適しています。

4

2 に答える 2

3

一般に、いくつかのテキストを分類するには、さまざまな事前確率 (この場合は正と負) を使用して Naive Bayes を実行し、より大きな値が得られるものを選択する必要があります。

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

ここで、結果は「正」または「負」のいずれかのラベルを保持する必要があります。

于 2013-03-07T14:01:32.487 に答える
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) ベクターを分類子に渡す - マジック。

これが最初の部分です。これで、分類子は、確率を持つクラス (あなたの場合は感情) を含むベクトルを返します。特定の出力が必要です。最も簡単に実装できるのは (ただし、最も効率的でスタイリッシュなものではないと思います)、次に行うことです。

1) 分類したいすべてのデータを処理する map reduce ジョブを作成します

2) 各インスタンスに対して、classify メソッドを呼び出します (すべてのインスタンスに対して StandardNaiveBayesClassifier を作成しないように、いくつかの変更を行うことを忘れないでください)。

3)分類結果ベクトルを使用すると、マップ削減ジョブで希望する形式でデータを出力できます

4) ここで便利な設定は jC.set("mapreduce.textoutputformat.separator", " "); です。ここで、jC は JobConf です。これにより、mapreduce ジョブからの出力ファイルのセパレーターを選択できます。あなたの場合、これは「、」です。

繰り返しますが、これはすべて Mahout 0.7 に当てはまります。そのままで動作することを保証するものではありません。それは私のために働いた。

一般に、コマンドラインから Mahout を使用したことはありません。私にとっては、Java の Mahout が最適です。

于 2013-03-13T13:58:22.450 に答える