【发布时间】:2021-01-27 00:08:23
【问题描述】:
我正在使用 Apache 的 Lucene (8.6.3) 和以下 Java 8 代码从字符串中删除停用词:
private static final String CONTENTS = "contents";
final String text = "This is a short test! Bla!";
final List<String> stopWords = Arrays.asList("short","test");
final CharArraySet stopSet = new CharArraySet(stopWords, true);
try {
Analyzer analyzer = new StandardAnalyzer(stopSet);
TokenStream tokenStream = analyzer.tokenStream(CONTENTS, new StringReader(text));
CharTermAttribute term = tokenStream.addAttribute(CharTermAttribute.class);
tokenStream.reset();
while(tokenStream.incrementToken()) {
System.out.print("[" + term.toString() + "] ");
}
tokenStream.close();
analyzer.close();
} catch (IOException e) {
System.out.println("Exception:\n");
e.printStackTrace();
}
这会输出期望的结果:
[这个] [是] [a] [bla]
现在我想同时使用默认的英文停止设置,它还应该删除“this”、“is”和“a”(根据github)和上面的自定义停止设置(我实际是会使用更长的时间),所以我尝试了这个:
Analyzer analyzer = new EnglishAnalyzer(stopSet);
输出是:
[thi] [是] [a] [bla]
是的,“this”中的“s”不见了。这是什么原因造成的?它也没有使用默认的停止设置。
以下更改同时删除了默认和自定义停用词:
Analyzer analyzer = new EnglishAnalyzer();
TokenStream tokenStream = analyzer.tokenStream(CONTENTS, new StringReader(text));
tokenStream = new StopFilter(tokenStream, stopSet);
问题:执行此操作的“正确”方法是什么?在自身内部使用tokenStream(参见上面的代码)会导致问题吗?
额外问题:我如何以正确的大写/小写输出剩余的单词,因此它们在原始文本中使用什么?
【问题讨论】:
标签: java lucene stop-words