【问题标题】:How to create Custom Analyzer in Lucene, with custom stop/common words from file如何在 Lucene 中创建自定义分析器,使用文件中的自定义停止/常用词
【发布时间】:2020-02-17 15:30:56
【问题描述】:

我正在尝试在 Lucene 8.3.0 中创建一个自定义分析器,该分析器使用词干提取并使用文件中的自定义停用词过滤给定的文本。 更清楚地说,我不想使用默认的停用词过滤器并在其上添加一些单词,我只想使用 stopWords.txt 文件中的一组停用词进行过滤。 我怎样才能做到这一点?

这是我一直写到现在,但我不确定它是否正确

public class MyAnalyzer extends Analyzer{
    //public class MyAnalyzer extends Analyzer {
    @Override
    protected TokenStreamComponents createComponents(String fieldName) {
       // public TokenStream tokenStream(String fieldName, Reader reader) {
        Tokenizer tokenizer = new StandardTokenizer();
        TokenStream tokenStream = new StandardFilter(tokenizer);
        tokenStream = new LowerCaseFilter(tokenStream);
        tokenStream = new StopFilter(tokenStream,StopAnalyzer.ENGLISH_STOP_WORDS_SET);
        //Adding Porter Stemming filtering
        tokenStream = new PorterStemFilter(tokenStream);
        //return tokenStream;
        return new TokenStreamComponents(tokenizer, tokenStream);
    }
}

首先我不确定结构是否正确,现在我正在使用 StopAnalyzer 的 StopFilter 来测试它(但是它不起作用)。

【问题讨论】:

  • 你能提供一些你已经尝试过的代码吗?
  • 这就是我写的。我需要的是分析器只返回一个处理过的令牌流。我阅读了 Lucene 文档,但我很困惑

标签: java lucene analyzer


【解决方案1】:

您需要读取文件并将其解析为 CharArraySet 以传递给过滤器。 StopFilter 有一些内置方法可用于将字符串列表转换为 CharArraySet,例如:

...
CharArraySet stopset = StopFilter.makeStopSet(myStopwordList);
tokenStream = new StopFilter(tokenStream, stopset);
...

它被列为供内部使用,所以关于依赖这个类的公平警告,但如果你不想将文件解析为列表,你可以使用WordListLoader将您的停用词文件解析为 CharArraySet,例如:

...
CharArraySet stopset = WordlistLoader.getWordSet(myStopfileReader);
tokenStream = new StopFilter(tokenStream, stopset);
...

【讨论】:

    猜你喜欢
    • 2015-08-29
    • 1970-01-01
    • 2013-08-03
    • 2013-10-05
    • 1970-01-01
    • 2020-07-03
    • 2016-09-25
    • 1970-01-01
    • 2021-03-12
    相关资源
    最近更新 更多