Java ApacheLucene没有';尽管使用了StopAnalyzer和StopFilter,但仍不能过滤停止字
我有一个基于ApacheLucene5.5/6.0的模块,用于检索关键字。除了一件事外,一切都很好——Lucene不过滤停止词 我尝试使用两种不同的方法启用停止字过滤 方法#1: 方法#2: 此处提供完整代码:Java ApacheLucene没有';尽管使用了StopAnalyzer和StopFilter,但仍不能过滤停止字,java,apache,lucene,information-retrieval,stop-words,Java,Apache,Lucene,Information Retrieval,Stop Words,我有一个基于ApacheLucene5.5/6.0的模块,用于检索关键字。除了一件事外,一切都很好——Lucene不过滤停止词 我尝试使用两种不同的方法启用停止字过滤 方法#1: 方法#2: 此处提供完整代码: 我的问题: 为什么Lucene不过滤停止词 如何在Lucene 5.5/6.0中启用停止字过滤 刚刚测试了方法1和方法2,它们似乎都能很好地过滤掉停止词。下面是我如何测试它的: public static void main(String[] args) throws IOExcept
我的问题:
刚刚测试了方法1和方法2,它们似乎都能很好地过滤掉停止词。下面是我如何测试它的:
public static void main(String[] args) throws IOException, ParseException, org.apache.lucene.queryparser.surround.parser.ParseException
{
StandardTokenizer stdToken = new StandardTokenizer();
stdToken.setReader(new StringReader("Some stuff that is in need of analysis"));
TokenStream tokenStream;
//You're code starts here
tokenStream = new StopFilter(new ASCIIFoldingFilter(new ClassicFilter(new LowerCaseFilter(stdToken))), EnglishAnalyzer.getDefaultStopSet());
tokenStream.reset();
//And ends here
CharTermAttribute token = tokenStream.getAttribute(CharTermAttribute.class);
while (tokenStream.incrementToken()) {
System.out.println(token.toString());
}
tokenStream.close();
}
结果:
一些东西
需要
分析
这消除了我的样本中的四个停止词。陷阱在默认Lucene的停止词列表中,我预计,它的范围更广 以下是默认情况下尝试加载自定义停止词列表的代码,如果失败,则使用标准代码:
字符集stopWordsSet;
试一试{
//使用自定义的停止词列表
String stopWordsDictionary=FileUtils.readFileToString(新文件(%PATH_TO_File%));
stopWordsSet=WordlistLoader.getWordSet(新的StringReader(stopWordsDictionary));
}catch(filenotfounde异常){
//使用标准的停止词列表
stopWordsSet=ChararlySet.copy(StandardAnalyzer.STOP\u WORDS\u SET);
}
tokenStream=new StopFilter(新的ASCIIFoldingFilter(新的ClassicFilter(新的小写过滤器(stdToken))),stopWordsSet);
tokenStream.reset();
问题在于Lucene
没有过滤掉we
、I
和其他常见的英语单词。我应该附加其他扩展停止词词典吗?Lucene
是否提供其他停止词词典?EnglishAnalyzer
和StandardAnalyzer
使用相同的停止词集,因此我认为Lucene中没有更广泛的停止词列表。因此,是的,您可能需要创建自己的。如果您使用的是StandardAnalyzer,则可以轻松地将停止字存储在纯文本文件中,并将读取器传递给构造函数。您是指StandardAnalyzer
还是StandardTokenizer
?我使用StandardAnalyzer。停止单词设置
,但未使用StandardAnalyzer
的构造函数。相反,我有stdToken.setReader(newstringreader(全文))代码>。我应该将停止词列表放在哪里?您需要将停止词的字符集
传递到您的停止过滤器
StandardAnalyzer
只是有一个方便的ctor。要从文件生成,您需要使用。或者你可以自己创建一个,这真的很好用。非常好,特别感谢WordlistLoader.getWordSet
。
tokenStream = new StopFilter(new ClassicFilter(new LowerCaseFilter(stdToken)), StopAnalyzer.ENGLISH_STOP_WORDS_SET);
tokenStream.reset();
public static void main(String[] args) throws IOException, ParseException, org.apache.lucene.queryparser.surround.parser.ParseException
{
StandardTokenizer stdToken = new StandardTokenizer();
stdToken.setReader(new StringReader("Some stuff that is in need of analysis"));
TokenStream tokenStream;
//You're code starts here
tokenStream = new StopFilter(new ASCIIFoldingFilter(new ClassicFilter(new LowerCaseFilter(stdToken))), EnglishAnalyzer.getDefaultStopSet());
tokenStream.reset();
//And ends here
CharTermAttribute token = tokenStream.getAttribute(CharTermAttribute.class);
while (tokenStream.incrementToken()) {
System.out.println(token.toString());
}
tokenStream.close();
}