问题描述
我在Windows 10上将Lucene 8.6.2(当前最新可用)与AdoptOpenJDK 11配合使用,葡萄牙语和巴西葡萄牙语分析器在处理令牌化时遇到了奇怪的问题。
让我们举一个简单的例子:乔治·阿拉贡(Jorgearagão)著名的桑巴舞歌曲“ Já É”中的合唱的第一行,首先使用org.apache.lucene.analysis.standard.StandardAnalyzer
作为参考。
Pra ondevocêfor
String text = "Pra onde você for";
try (Analyzer analyzer = new StandardAnalyzer()) {
try (final TokenStream tokenStream = analyzer.tokenStream("text",text)) {
CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);
tokenStream.reset();
while(tokenStream.incrementToken()) {
System.out.println("term: charTermAttribute.toString());
}
tokenStream.end();
}
}
这给了我以下几个术语(为便于阅读,折叠成一行):
pra ondevocêfor
好的,这几乎是我对任何分析仪所期望的。但是,如果我使用org.apache.lucene.analysis.pt.PortugueseAnalyzer
而不是使用no-args构造函数,则会得到以下结果:
pra onde
嗯?也许它认为“você”(“ you”)和“ for”(“ may go”)是停用词,并将其删除。
但是现在让我们再次尝试使用org.apache.lucene.analysis.br.BrazilianAnalyzer
,再次使用no-args构造函数:
pra ond voc
现在,它已经被破坏了。它将“ onde”(“ where”)更改为“ ond”,据我所知,这甚至不是葡萄牙语。对于“você”,它只是删除了“ê”。
其他行同样糟糕或更糟:
- 文本:“ Saudadeédor,volta meu amor”
-
StandardAnalyzer
:a saudade é dor volta meu amor
-
PortugueseAnalyzer
:saudad é dor volt amor
-
BrazilianAnalyzer
:saudad é dor volt amor
在这里您可以看到葡萄牙语和巴西葡萄牙语的分析仪产生了相同的输出,但是输出却是相同的,因为如果我非常“肯定”的话,“伏特”肯定需要保持“伏特”(而不是“伏特”)会得到我的爱回到我身边。
我在Lucene核心库和语言分析器上犯了一些严重的错误吗?输出没有意义,让我感到惊讶的是,使用这种通用语言的分析器会像这样破坏令牌。
解决方法
看一下PortugueseAnalyzer
和BrazilianAnalyzer
的代码,看来这些分析器正在执行词干分析。 (我对编码Lucene有点陌生,所以这不是我期望的。)因此对于索引,也许这就是作者想要的。也许“você”是“você”和“vocês”的词干。我猜“ volt”是动词(不定式)“ voltar”的词干。 (但是,“ saudad”不是我期望的“ saudade”的词根,但同样,文本分析的这一方面对我来说有点新。)
对于我的特定用例,我只想标记单词并跳过停用词。我找不到关闭PortugueseAnalyzer
和BrazilianAnalyzer
的词干的方法,所以我想我只会使用StandardAnalyzer
,而是使用特定于语言的停用词分析器,像这样:
final Analyzer analyzer;
try (BrazilianAnalyzer ptBRAnalyzer = new BrazilianAnalyzer()) {
analyzer = new StandardAnalyzer(ptBRAnalyzer.getStopwordSet());
}
那是一个环形交叉路口,但至少这给了我更多我想要的东西:
- 文本:“ Saudadeédor,volta meu amor”
-
StandardAnalyzer
:a saudade é dor volta meu amor
-
StandardAnalyzer
和PortugueseAnalyzer
停用词:saudade é dor volta amor
-
StandardAnalyzer
和BrazilianAnalyzer
停用词:saudade é dor volta meu amor
那更好。但是,显然葡萄牙分析仪认为“ meu”是一个停用词,即使巴西分析仪并非如此。我想在葡萄牙葡萄牙语和巴西葡萄牙语中“我的”一词的含义几乎相同。这两个分析器在默认情况下是否应该是一个停用词上似乎意见不一致。