elasticsearch-analyzers,Java,Lucene,elasticsearch Analyzers" /> elasticsearch-analyzers,Java,Lucene,elasticsearch Analyzers" />

Java Lucene 8巴西葡萄牙语分析器中的奇怪标记化

Java Lucene 8巴西葡萄牙语分析器中的奇怪标记化,java,lucene,elasticsearch-analyzers,Java,Lucene,elasticsearch Analyzers,我在Windows 10上使用Lucene 8.6.2(目前最新的可用版本)和AdoptOpenJDK 11,我在葡萄牙语和巴西葡萄牙语分析器破坏标记化时遇到了一些奇怪的问题 让我们举一个简单的例子:Jorge Aragão著名的samba歌曲“合唱”的第一行,首先使用org.apache.lucene.analysis.standard.StandardAnalyzer作为参考 这是我的梦想 String text=“Pra onde vocêfor”; 尝试(Analyzer=new Sta

我在Windows 10上使用Lucene 8.6.2(目前最新的可用版本)和AdoptOpenJDK 11,我在葡萄牙语和巴西葡萄牙语分析器破坏标记化时遇到了一些奇怪的问题

让我们举一个简单的例子:Jorge Aragão著名的samba歌曲“合唱”的第一行,首先使用
org.apache.lucene.analysis.standard.StandardAnalyzer
作为参考

这是我的梦想

String text=“Pra onde vocêfor”;
尝试(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(“术语:chartermatAttribute.toString());
}
tokenStream.end();
}
}
这给了我以下术语(为了可读性,折叠成一行):

这是我的梦想

好的,这正是我对任何分析器的期望。但是如果我使用
org.apache.lucene.analysis.pt.PortugueseAnalyzer
而不是使用无参数构造函数,我会得到以下结果:

普拉昂德

哈?也许它认为“você”(“你”)和“for”(“可能去”)是停止词,并将它们删除

但是现在让我们尝试一下
org.apache.lucene.analysis.br.BrazilianAnalyzer
,再次使用无参数构造函数:

预处理挥发性有机化合物

现在这个词已经被弄坏了。它把“onde”(“where”)改成了“ond”,据我所知,这甚至不是一个葡萄牙语单词。而对于“você”,它只是去掉了“ond”

其他线路同样糟糕或更糟:

  • 文字:“一个沙特人,沃尔塔·缪·阿莫尔”
  • StandardAnalyzer
    saudadeédor volta meu amor
  • PortugueseAnalyzer
    saudadédor volt amor
  • 巴西分析仪
    索达多伏特阿莫尔
在这里你可以看到葡萄牙和巴西葡萄牙语分析器产生了相同的输出,但它是相同的中断输出,因为“volta”肯定需要保持“volta”(而不是“volt”),如果我想让我的爱回到我身边


我是否在Lucene核心库和语言分析器上犯了一些严重错误?输出毫无意义,而且我很惊讶这样一种通用语言的分析器会像那样损坏标记。

查看
葡萄牙语分析器
巴西语分析器
的代码,它看起来像这些分析器正在执行词干分析。(我对Lucene编码有点陌生,所以这不是我所期望的。)所以对于索引,也许这就是作者的意图。也许“você”是“você”和“vocês”的词干。我猜“volt”是动词(不定式)“voltar”的词干。(但“saudad”不是我所期望的“saudade”的词干。)“,但同样,文本分析的这一方面对我来说有点陌生。)

对于我的特定用例,我只想标记这些词并跳过停止词。我找不到一种方法来关闭
葡萄牙分析器
巴西分析器
的词干分析,因此我想我将只使用
标准分析器
,但使用特定语言分析器中的停止词,如下所示:

最终分析仪;
try(巴西利亚分析仪ptBRAnalyzer=新巴西利亚分析仪()){
analyzer=新的StandardAnalyzer(ptBRAnalyzer.getStopwordSet());
}
这有点迂回,但至少这给了我更多我想要的:

  • 文字:“一个沙特人,沃尔塔·缪·阿莫尔”
  • StandardAnalyzer
    saudadeédor volta meu amor
  • StandardAnalyzer
    with
    PortugueseAnalyzer
    stop words:
    saudadeédor volta amor
  • StandardAnalyzer
    with
    BrazilianAnalyzer
    stop words:
    saudadeédor volta meu amor
那更好。但显然,葡萄牙语分析员认为“meu”是一个停止词,尽管巴西分析员不这么认为。我猜“我的”这个词在葡萄牙葡萄牙语和巴西葡萄牙语中的意思差不多;奇怪的是,两位分析人士在默认情况下是否应该将其作为停止词的问题上存在分歧