2012-11-17 10 views
12

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

Reader reader = new StringReader("This is a test string"); 
NGramTokenizer gramTokenizer = new NGramTokenizer(reader, 1, 3); 
  1. :ここ

    は、私が持っているコードですか?

  2. 文字列/単語で出力を取得するにはどうすればよいですか?

私は次のように出力します:これは、a、テスト、文字列です。これは、テスト、テスト文字列です。これは、テスト、テスト文字列です。

答えて

18

文字列を返すメソッドを見つけようと思っているとは思わないでしょう。 Attributeを処理する必要があります。

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(); 

は必ずリセットしてください()トークナイザそれそれはしかし、その後再利用する必要がある場合:

は次のように動作するはずです。むしろ文字よりも、コメントあたりの単語の


トークン化のグループ化、:

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 
} 
+0

私は属性の用語で文字列の代わりの文字で何ができますか?ですから、私の出力は次のようになります:This is、a、test、string、This is、a test、... test string。 – CodeKingPlusPlus

+1

これは、LuceneのNGramTokenizerが扱うように設計されたものではありません。あなたが使いたいと思うのは、StandardTokenizerと組み合わされたShingleFilterです。私は私の答えを更新し、そこに表現するのをより簡単にするでしょう... – femtoRgon

+0

私はトークン化プロセスで使用できるストップワードフィルターを知っていますか? – CodeKingPlusPlus

0

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

たとえば、文字列 'B CはD' と1-3のnグラム長を使用して、NGramTokenizerを返すことができ:

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

ここで 'A'、 'B'、等は、得られるngramsあります。

[編集]

それはトークンストリーム覗くについて話すようあなたはまた、Querying lucene tokens without indexingで見たいと思うかもしれません。

+1

問題はincrementToken()はブール値を返しますが... – CodeKingPlusPlus

1

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

  • のLuceneコア-4.2.1.jar
  • のLucene-analuzers共通-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); 
} 
0

パッケージngramalgoimpl; import java.util。*;

パブリッククラスNGR {

public static List<String> n_grams(int n, String str) { 
    List<String> n_grams = new ArrayList<String>(); 
    String[] words = str.split(" "); 
    for (int i = 0; i < words.length - n + 1; i++) 
     n_grams.add(concatination(words, i, i+n)); 
    return n_grams; 
} 
/*stringBuilder is used to cancatinate mutable sequence of characters*/ 
public static String concatination(String[] words, int start, int end) { 
    StringBuilder sb = new StringBuilder(); 
    for (int i = start; i < end; i++) 
     sb.append((i > start ? " " : "") + words[i]); 
    return sb.toString(); 
} 

public static void main(String[] args) { 
    for (int n = 1; n <= 3; n++) { 
     for (String ngram : n_grams(n, "This is my car.")) 
      System.out.println(ngram); 
     System.out.println(); 
    } 
} 

}

+0

文脈を提供してください。このコードは何を行いますか?質問に答えをどのように提供しますか? –

+0

@KevinKloet質問と回答 –