13

文字列を ngram にトークン化しようとしています。不思議なことに、NGramTokenizerのドキュメントには、トークン化された個々の ngram を返すメソッドがありません。実際、NGramTokenizer クラスには、String オブジェクトを返すメソッドが 2 つしかありません。

これが私が持っているコードです:

Reader reader = new StringReader("This is a test string");
NGramTokenizer gramTokenizer = new NGramTokenizer(reader, 1, 3);
  1. トークン化された ngram はどこにありますか?
  2. 文字列/単語で出力を取得するにはどうすればよいですか?

出力を次のようにしたい: This, is, a, test, string, This is, is a, a test, test string, This is a, is a test, a test string.

4

4 に答える 4

19

Stringを返すメソッドを見つけようとして探しているものが見つからないと思います。属性を処理する必要があります。

次のように動作するはずです:

Reader reader = new StringReader("This is a test string");
NGramTokenizer gramTokenizer = new NGramTokenizer(reader, 1, 3);
CharTermAttribute charTermAttribute = gramTokenizer.addAttribute(CharTermAttribute.class);
gramTokenizer.reset();

while (gramTokenizer.incrementToken()) {
    String token = charTermAttribute.toString();
    //Do something
}
gramTokenizer.end();
gramTokenizer.close();

ただし、後で再利用する必要がある場合は、必ずTokenizerをreset()してください。


コメントごとに、文字ではなく単語のトークン化グループ化:

Reader reader = new StringReader("This is a test string");
TokenStream tokenizer = new StandardTokenizer(Version.LUCENE_36, reader);
tokenizer = new ShingleFilter(tokenizer, 1, 3);
CharTermAttribute charTermAttribute = tokenizer.addAttribute(CharTermAttribute.class);

while (tokenizer.incrementToken()) {
    String token = charTermAttribute.toString();
    //Do something
}
于 2012-11-20T23:06:32.220 に答える
1

Lucene (4.2.1) の最近のバージョンでは、これは動作するクリーンなコードです。このコードを実行する前に、2 つの jar ファイルをインポートする必要があります。

  • ルセンコア-4.2.1.jar
  • lucene-analuzers-common-4.2.1.jar

これらのファイルはhttp://www.apache.org/dyn/closer.cgi/lucene/java/4.2.1にあります。

//LUCENE 4.2.1
Reader reader = new StringReader("This is a test string");      
NGramTokenizer gramTokenizer = new NGramTokenizer(reader, 1, 3);

CharTermAttribute charTermAttribute = gramTokenizer.addAttribute(CharTermAttribute.class);

while (gramTokenizer.incrementToken()) {
    String token = charTermAttribute.toString();
    System.out.println(token);
}
于 2013-04-25T05:12:48.367 に答える
0

テスト プログラムを作成せずに、incrementToken() が ngram の 1 つである次のトークンを返すと推測します。

たとえば、文字列 'abc d' で 1 ~ 3 の ngram の長さを使用すると、NGramTokenizer は次を返すことができます。

a
a b
a b c
b
b c
b c d
c
c d
d

ここで、「a」、「a b」などは結果の ngram です。

[編集]

また、トークン ストリームの覗き見について説明しているため、インデックスを作成せずに Lucene トークンをクエリする も参照することをお勧めします。

于 2012-11-20T22:33:04.557 に答える