2012-02-14 3 views
0

私のデータは既に外部リソースでトークン化されていますので、そのデータをlucene内で使用したいと思います。私の最初のアイデアは、\x01でそれらの文字列を結合し、WhiteSpaceTokenizerを使ってそれらを再び分割することです。良いアイデアはありますか? (入力はXML形式)luceneでpretokenizedテキストを使用する

この注釈付きデータには、同義語が含まれています。どのようにそれらを挿入するのですか(XMLタグとして表されます)。

答えて

0

WhitespaceTokenizerは、0x01で結合された文字列に対しては不適切です。代わりにCharTokenizerから派生し、isTokenCharを上書きします。

このアプローチの主な問題は、参加して再び分割することは高価になることです。値段が高す​​ぎる場合は、TokenStreamを実装して、入力からトークンをただ排出することができます。

"プログラマー"のような用語が用語の集合、例えば{"プログラマー"、 "開発者"、 "ハッカー"}に展開されていることを同義語で表している場合は、同じ位置に表示することをおすすめします。これを制御するにはPositionIncrementAttributeを使用できます。

PositionIncrementAttributeの使用例については、my lemmatizing TokenStreamを参照してください。フルテキストの見出し語とその補題の両方を同じ位置に出力します。

+0

しかし、どのように私はWhitespaceTokenizerは分割文字を設定するのですか? – Reactormonk

+0

@タス:私の間違い; 'WhitespaceTokenizer'ではなく' CharTokenizer'のカスタム子クラスを使うべきです。答えを更新しました。 –

3

Luceneでは、トークン化ステップをバイパスして、フィールドに独自のトークンストリームを提供できます。あなたがincrementTokenを()の実装TokenStreamの独自のサブクラスを作成することができませんし、その後field.setTokenStream(新しいMyTokenStream(yourTokens))を呼び出すには:

public class MyTokenStream extends TokenStream { 
    CharTermAttribute charTermAtt; 
    OffsetAttribute offsetAtt; 

    final Iterator<MyToken> listOfTokens; 

    MyTokenStream(Iterator<MyToken> tokenList) { 
     listOfTokens = tokenList; 
     charTermAtt = addAttribute(CharTermAttribute.class); 
     offsetAtt = addAttribute(OffsetAttribute.class); 

    } 

    @Override 
    public boolean incrementToken() throws IOException { 
     if(listOfTokens.hasNext()) { 
      super.clearAttributes(); 
      MyToken myToken = listOfTokens.next(); 
      charTermAtt.setLength(0); 
      charTermAtt.append(myToken.getText()); 
      offsetAtt.setOffset(myToken.begin(), myToken.end()); 
      return true; 
     } 
     return false; 
    } 
} 
+0

シノニムについては、別のフィールドを作成することをお勧めします。後でクエリーを作成するときにフィールドを正しく指定することを忘れないでください。 –

関連する問題