私のデータは既に外部リソースでトークン化されていますので、そのデータをlucene内で使用したいと思います。私の最初のアイデアは、\x01
でそれらの文字列を結合し、WhiteSpaceTokenizer
を使ってそれらを再び分割することです。良いアイデアはありますか? (入力はXML形式)luceneでpretokenizedテキストを使用する
この注釈付きデータには、同義語が含まれています。どのようにそれらを挿入するのですか(XMLタグとして表されます)。
私のデータは既に外部リソースでトークン化されていますので、そのデータをlucene内で使用したいと思います。私の最初のアイデアは、\x01
でそれらの文字列を結合し、WhiteSpaceTokenizer
を使ってそれらを再び分割することです。良いアイデアはありますか? (入力はXML形式)luceneでpretokenizedテキストを使用する
この注釈付きデータには、同義語が含まれています。どのようにそれらを挿入するのですか(XMLタグとして表されます)。
WhitespaceTokenizer
は、0x01
で結合された文字列に対しては不適切です。代わりにCharTokenizer
から派生し、isTokenChar
を上書きします。
このアプローチの主な問題は、参加して再び分割することは高価になることです。値段が高すぎる場合は、TokenStream
を実装して、入力からトークンをただ排出することができます。
"プログラマー"のような用語が用語の集合、例えば{"プログラマー"、 "開発者"、 "ハッカー"}に展開されていることを同義語で表している場合は、同じ位置に表示することをおすすめします。これを制御するにはPositionIncrementAttribute
を使用できます。
PositionIncrementAttribute
の使用例については、my lemmatizing TokenStream
を参照してください。フルテキストの見出し語とその補題の両方を同じ位置に出力します。
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;
}
}
シノニムについては、別のフィールドを作成することをお勧めします。後でクエリーを作成するときにフィールドを正しく指定することを忘れないでください。 –
しかし、どのように私はWhitespaceTokenizerは分割文字を設定するのですか? – Reactormonk
@タス:私の間違い; 'WhitespaceTokenizer'ではなく' CharTokenizer'のカスタム子クラスを使うべきです。答えを更新しました。 –