Lucene 如何在 StandardAnalyzer 中关闭 "toLowerCase"?
Lucene how can i turn off "toLowerCase" in StandardAnalyzer?
我想标记我的文本,我使用 StandardAnalyzer 的 tokenStream,但它默认为“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();
}
如何在没有“toLowerCase”的情况下使用 StandardAnalyzer?我如何关闭此 StandardAnalyzer 中的“toLowerCase”?
您不能直接在 StandardAnalyzer
中关闭 toLowerCase
。
您可以创建一个与 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();
我想标记我的文本,我使用 StandardAnalyzer 的 tokenStream,但它默认为“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();
}
如何在没有“toLowerCase”的情况下使用 StandardAnalyzer?我如何关闭此 StandardAnalyzer 中的“toLowerCase”?
您不能直接在 StandardAnalyzer
中关闭 toLowerCase
。
您可以创建一个与 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();