4

如果 lucene 文档包含单词cheeseburger并且用户搜索burger以找到该文档,我希望这样。我看到我可能需要一个自定义分析器来将这个复合词分解为cheeseburger。但是,破口大骂也可能带来不相干的结果。

例如:如果在索引生产时我们同时索引产品离子,那么当用户搜索包含生产的离子文档时会出现,这是不相关的。

所以一个简单的断词器不会削减它。我需要一种方法来知道芝士汉堡汉堡奶酪有关,但生产ion无关。

是否有更智能的过程来实现这一目标?

这是否有一个名字,就像词干是将单词简化为词根形式一样?

4

5 回答 5

1

Depending on how accurate you want your synonymy to be, you might need to look into approaches such as Latent Semantic Analysis (LSA) and its variants such as LDA etc. A simpler approach would be to use an Ontology such as Wordnet to augment your searches. A wordnet Lucene index is available. However if your scenario includes domain-specific vocab then you might need to generate a "mapping" Ontology.

于 2012-04-26T03:48:39.643 回答
1

您应该查看DictionaryCompoundWordTokenFilter,它使用蛮力算法根据字典拆分复合名词。

于 2012-04-24T16:12:05.533 回答
0

通过查看单词获得关联不会扩展到其他单词。例如,您无法仅通过查看单词就知道“whopper”与汉堡相关联,而“巨无霸”与奶酪相关联。为了使搜索了解关联,您可能需要一个关联数据库,例如“A 是 B”或“A 包含 B”。(正如 Mikos 所提到的,我认为 WordNet 提供了这样一个数据库。)然后,当您在查询中看到 B 时,您翻译该查询,以便它也搜索 A。

于 2012-04-26T06:24:24.283 回答
0

我认为根本的问题是——你要索引的集合有多大?如果您要为所有同义词和相关词都已知的集合建立索引,则索引可以直接包含同义词和相关词,例如“cheeseburger”包括相关词“cheese”和“burger”。(一种在 LOINC 标准医学术语 Lucene 索引中成功使用的方法。)

如果您试图解决整个人类语言(英语、中文等)的一般问题,那么您必须进行上述某种语义分析。

与您正在索引的领域的主题专家交谈可能会很有用,以了解他们如何搜索术语 - 他们使用哪些同义词/相关词,他们是否定义了同义词/相关词列表,他们是否需要/使用词干等。这应该让您了解您需要采用哪种方法(直接同义词/相关词包含或语义分析)。

于 2012-04-26T12:19:41.660 回答
0

在大多数情况下,您可以简单地使用带有前导通配符 *burger 的通配符查询。您只需在查询解析器上启用对前导通配符的支持:

parser = new QueryParser(LuceneVersion.getVersion(), searchedAttributes, analyzer);
parser.setAllowLeadingWildcard(true);

注意:前导通配符可能会减慢您的搜索速度。

如果您需要更具体的解决方案,我建议您使用词干。如果真的是找到合适的分析仪的问题。有几种语言的词干实现,例如 SnowballAnalyzer (http://lucene.apache.org/core/3_6_0/api/all/org/apache/lucene/analysis/snowball/SnowballAnalyzer.html)。

此致,

克里斯

于 2012-04-24T15:56:49.860 回答