2

このガイドに従って、計算を行うためにmahoutを使用して(テキストファイルとして)一連のドキュメントに対してTFIDFを実行しようとしています。

辞書とベクトルの重みを正常に作成し、出力にアクセスしようとしています。ガイドには、「たとえば、生成された辞書ファイルのコンテンツを、トークンインデックスをキーとして、トークンを値としてマップに簡単にロードできる」と記載されています。

彼が提案しているように、このファイルをマップにロードする方法がわかりません。誰かがそれがどのように行われるか知っていますか?

テキストファイルのディレクトリからベクターを作成しました。「。/mahoutseq2sparse...」を実行しているときに発生した問題の1つは、アナライザーを制御するフラグでした。これはluceneのStandardAnalyzerである必要があります。このフラグを使用して実行しようとすると、ClassNotFoundExceptionが発生しましたが、フラグを削除すると問題が解決し、デフォルトのアナライザーもこれであると思います。したがって、出力は例と同じである必要があります。

この辞書を地図にロードする方法を誰かが知っているなら、私は永遠に感謝します!

ジェームズ

4

3 に答える 3

6

私はそれを解決したので、グーグルでこれに出くわす人のためにこれを上げています。

        SequenceFile.Reader read = new SequenceFile.Reader(fs, new Path("<path do dictionary>"), conf);
        IntWritable dicKey = new IntWritable();
        Text text = new Text();
        Map<Integer, String> dictionaryMap = new HashMap();
        while (read.next(text, dicKey)) {
            dictionaryMap.put(Integer.parseInt(dicKey.toString()), text.toString());
        }
        read.close();

これは私にとってはうまくいき、mahoutから辞書ファイル内のテキストへのidのマッピングを読み取ることができました。

于 2012-03-14T21:06:35.997 に答える
1

Mahout は、StandardAnalyzerに基づいて構築されたorg.apache.mahout.vectorizer.DefaultAnalyzerを作成したため、これを-aフラグで使用できます。StandardAnalyzerには引数のないコンストラクターがないため、使用できません。これがエラーの原因です。

于 2012-03-23T21:29:51.217 に答える
1

上記のコードには、コンパイルに必要なインポートステートメントなどが欠落しているため、ここでは、コマンドラインから動作してdictファイルの出力を読み取ってダンプする完全なバージョンです。

dumpdict.java:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;

class DumpDict {
  public static void main(String[] args) {
    try {
      Configuration conf = new Configuration();
      FileSystem fs = FileSystem.get(conf);
      SequenceFile.Reader read = new SequenceFile.Reader(fs, new Path(args[0]), conf);
      IntWritable dicKey = new IntWritable();
      Text text = new Text();
      // HashMap dictionaryMap = new HashMap();
      while (read.next(text, dicKey)) {
        // dictionaryMap.put(Integer.parseInt(dicKey.toString()), text.toString());
        System.out.println(dicKey.toString()+" "+text.toString());
      }
      read.close();
    } catch (IOException e) {
      System.out.println(e.toString());
    }
  }
}

すべてのjarファイルがどこにあるかをJavaに明示的に伝える必要があることがわかりました。

export CLASSPATH=`find /path/to/mahout /usr/share/java -name '*.jar' | perl -ne 'chomp; push @jars, $_; END { print "\".:",(join ":",@jars),"\$CLASSPATH\"\n"; }'`

このようにコンパイルします。

javac dumpdict.java

このように実行します:

java -cp .:$CLASSPATH DumpDict {path to dict}

(これは、Javaを使用する人にとってはやり過ぎかもしれませんが、Javaをそれほど頻繁に使用しない人にとっては時間を節約できる可能性があります。)

于 2015-06-12T20:48:42.450 に答える