我要尝试的第一件事是弄乱传递给JapaneseAnalyzer的参数,特别是Tokenizer.Mode(我对日语的结构一无所知,所以我对这些选项的意图没有帮助)。
除非这样
您需要为此创建自己的分析器。除非您愿意编写自己的 Tokenizer,否则最终结果可能是尽力而为。创建一个分析器非常简单,创建一个分词器就意味着定义你自己的语法,这不会那么简单。
查看JapaneseAnalyzer和StandardAnalyzer的代码,特别是对 的调用createComponents
,这是创建自定义分析器所需的全部内容。
假设您得出的结论对StandardTokenizer
您来说是正确的,但否则我们将主要使用日本过滤器集,它可能看起来像:
@Override
protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
//For your Tokenizer, you might consider StandardTokenizer, JapaneseTokenizer, or CharTokenizer
Tokenizer tokenizer = new StandardTokenizer(version, reader);
TokenStream stream = new StandardFilter(version, tokenizer);
stream = new JapaneseBaseFormFilter(stream);
stream = new LowerCaseFilter(matchVersion, stream); //In JapaneseAnalyzer, a lowercasefilter comes at the end, further proving I don't know Japanese.
stream = new JapanesePartOfSpeechStopFilter(true, stream, stoptags);
stream = new CJKWidthFilter(stream); //Note this WidthFilter! I believe this does the char width transform you are looking for.
stream = new StopFilter(matchVersion, stream, stopwords);
stream = new JapaneseKatakanaStemFilter(stream);
stream = new PorterStemFilter(stream); //Nothing stopping you using a second stemmer, really.
return new TokenStreamComponents(tokenizer, stream);
}
这是一个完全随机的实现,来自不了解这些问题的人,但希望它为实现更有意义的分析器指明了方向。您在该过滤器链中应用过滤器的顺序很重要,因此在此处要小心(即,在英语中,LowerCaseFilter 通常会尽早应用,这样 Stemmers 之类的东西就不必担心大小写)。