如何在lucene中结合两个标记器(japaneseanalyzer和standardanalyzer)

时间:2013-06-24 12:29:37

标签: lucene

我正在使用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? 

1 个答案:

答案 0 :(得分:3)

我要尝试的第一件事是弄乱传递给JapaneseAnalyzer的论据,特别是Tokenizer.Mode(我对日语的结构一无所知,所以没有我对意图的帮助那些选项)。


除非

您需要为此创建自己的分析器。除非您愿意编写自己的Tokenizer,否则最终结果可能是最好的。创建一个分析器非常简单,创建一个tokenizer意味着定义你自己的语法,这不会那么简单。

请查看JapaneseAnalyzerStandardAnalyzer的代码,特别是对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);
}

这是一个完全随机的实现,来自不了解问题的人,但希望它指出了实现更有意义的Analyzer的方法。您在该过滤器链中应用过滤器的顺序非常重要,因此请注意(即英语中,LowerCaseFilter通常会提前应用,因此像Stemmers这样的事情不必担心案例)。