我想标记我的文本,我使用来自StandardAnalyzer的StandardAnalyzer,但默认情况下它有"toLowerCase“。
我的代码:
ArrayList<String> toTextWord = new ArrayList<>();
Analyzer analyzer = new StandardAnalyzer();
try (TokenStream stream = analyzer.tokenStream("tags", new StringReader(iterStr))) {
stream.addAttribute(CharTermAttribute.class);
stream.reset();
while (stream.incrementToken()) {
CharTermAttribute token = stream.getAttribute(CharTermAttribute.class);
System.out.println(token.toString());
toTextWord.add(token.toString());
}
} catch (Exception e) {
e.printStackTrace();
}如果没有“StandardAnalyzer”,我如何使用toLowerCase?如何在这个toLowerCase中关闭“StandardAnalyzer”?
发布于 2021-07-03 14:30:13
不能在toLowerCase中直接关闭StandardAnalyzer。
您可以创建一个自定义分析器,它的行为方式与StandardAnalyzer相同,然后定制它以满足您的需要:
使用org.apache.lucene.analysis.custom.CustomAnalyzer的示例
Analyzer analyzer = CustomAnalyzer.builder()
.withTokenizer("standard")
.addTokenFilter("lowercase")
.addTokenFilter("stop")
.build();现在您可以注释掉(或删除)小写令牌过滤器:
Analyzer analyzer = CustomAnalyzer.builder()
.withTokenizer("standard")
.addTokenFilter("stop")
.build();注意,如果您想要与默认的标准分析器完全匹配,那么您也应该注释掉或删除停止词筛选器,因为在默认情况下,除非您提供了一个显式列表,否则不会从标准分析器中删除停止词。
这给了我们这样的机会:
Analyzer analyzer = CustomAnalyzer.builder()
.withTokenizer("standard")
.build();如果我在自定义分析器中使用以下输入:
String iterStr = "Eric the quick brown fox jumps over Freddy the lazy dog, LOL.";然后,代码的输出如下:
Eric
the
quick
brown
fox
jumps
over
Freddy
the
lazy
dog
LOL更新
在使用CustomAnalyzer时,您可以使用字符串值来标识不同的令牌器和筛选对象--如上面示例中使用的“标准”和“小写”。
如果要避免使用这些标识符,可以在NAME字段中使用相关的工厂对象:
Analyzer analyzer = CustomAnalyzer.builder()
.withTokenizer(StandardTokenizerFactory.NAME)
.addTokenFilter(LowerCaseFilterFactory.NAME)
.addTokenFilter(StopFilterFactory.NAME)
.build();https://stackoverflow.com/questions/68235840
复制相似问题