Luceneに統合する方法はありPorterStemFilter
ますか、または最終クラスとして定義されているため、ソース コードStandardAnalyzer
をコピーして貼り付けStandardAnalyzers
、フィルターを追加する必要がありますか。StandardAnalyzer
よりスマートな方法はありますか?
また、数字を考慮したくない場合は、どうすればそれを達成できますか?
ありがとう
Luceneに統合する方法はありPorterStemFilter
ますか、または最終クラスとして定義されているため、ソース コードStandardAnalyzer
をコピーして貼り付けStandardAnalyzers
、フィルターを追加する必要がありますか。StandardAnalyzer
よりスマートな方法はありますか?
また、数字を考慮したくない場合は、どうすればそれを達成できますか?
ありがとう
この組み合わせを英語のテキスト分析に使用する場合は、Lucene のEnglishAnalyzer
. それ以外の場合は、以下に示すようにAnalyzer
を拡張する新しい を作成できます。AnalyzerWraper
import java.io.IOException;
import java.io.StringReader;
import java.util.HashSet;
import java.util.Set;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.AnalyzerWrapper;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.core.TypeTokenFilter;
import org.apache.lucene.analysis.en.PorterStemFilter;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.util.Version;
public class PorterAnalyzer extends AnalyzerWrapper {
private Analyzer baseAnalyzer;
public PorterAnalyzer(Analyzer baseAnalyzer) {
this.baseAnalyzer = baseAnalyzer;
}
@Override
public void close() {
baseAnalyzer.close();
super.close();
}
@Override
protected Analyzer getWrappedAnalyzer(String fieldName)
{
return baseAnalyzer;
}
@Override
protected TokenStreamComponents wrapComponents(String fieldName, TokenStreamComponents components)
{
TokenStream ts = components.getTokenStream();
Set<String> filteredTypes = new HashSet<>();
filteredTypes.add("<NUM>");
TypeTokenFilter numberFilter = new TypeTokenFilter(Version.LUCENE_46,ts, filteredTypes);
PorterStemFilter porterStem = new PorterStemFilter(numberFilter);
return new TokenStreamComponents(components.getTokenizer(), porterStem);
}
public static void main(String[] args) throws IOException
{
//Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_46);
PorterAnalyzer analyzer = new PorterAnalyzer(new StandardAnalyzer(Version.LUCENE_46));
String text = "This is a testing example. It should tests the Porter stemmer version 111";
TokenStream ts = analyzer.tokenStream("fieldName", new StringReader(text));
ts.reset();
while (ts.incrementToken()){
CharTermAttribute ca = ts.getAttribute(CharTermAttribute.class);
System.out.println(ca.toString());
}
analyzer.close();
}
}
上記のコードは、このlucene フォーラム スレッドの. 主な作業は、wrapComponents メソッドによって実装されます。最初にラップされたアナライザーから TokenStream オブジェクトを取得し、次に型フィルターを適用して数値トークンを無視する必要があります。最後に、ポーター ステマー フィルターを適用します。明確であることを願っています。