gpt4 book ai didi

lucene - 如何在 lucene 中组合两个分词器(japaneseanalyzer 和 standardanalyzer)

转载 作者:行者123 更新时间:2023-12-02 00:07:49 25 4
gpt4 key购买 nike

我正在使用 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 这样的东西就不必担心大小写)。

关于lucene - 如何在 lucene 中组合两个分词器(japaneseanalyzer 和 standardanalyzer),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17275510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com