我正在使用lucene 4.3.0,并希望用英文和日文字符标记文档。
An example is like "LEICA S2 カタログ (新品)"
The StandardAnalyzer "[leica] [s2] [カタログ] [新] [品]"
The JapaneseAnalyzer "[leica] [s] [2] [カタログ] [新品]"
在我的项目的应用中,StandardAnalyzer的英文字符更好,例如[s2]比[s] [2]好。 JapaneseAnalyzer对日语更好,例如[新品]到[新] [品]。另外,JapaneseAnalyzer具有将全角字符“2”转换为“2”的良好功能。
If I want the tokens to be [leica] [s2] [カタログ] [新品], it means:
1) English and numbers are tokenized by StandardAnalyzer. [leica] [s2]
2) Japanese are tokenized by JapaneseAnalyzer. [カタログ] [新品]
3) fullwidth character are converted to halfwidth by a filter. [s2]=>[s2]
how to implement this custom analyzer?
最佳答案
我要尝试的第一件事是弄乱传递给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这样的事情就不必担心大小写)。