我是一名 Java 初学者,正在尝试编写一个将输入与预定义字符串列表匹配的程序。我看过 Levenshtein 距离,但我遇到了这样的问题:
如果我有诸如“牛肉片”之类的输入,我希望它与“牛肉片”相匹配。问题在于,根据 Levenshtein 距离,“牛肉片”更接近于“金枪鱼片”之类的东西,这当然是错误的。
我应该为此使用像 Lucene 这样的东西吗?是否有人在 Java 类中使用 Lucene 方法?
谢谢!
我是一名 Java 初学者,正在尝试编写一个将输入与预定义字符串列表匹配的程序。我看过 Levenshtein 距离,但我遇到了这样的问题:
如果我有诸如“牛肉片”之类的输入,我希望它与“牛肉片”相匹配。问题在于,根据 Levenshtein 距离,“牛肉片”更接近于“金枪鱼片”之类的东西,这当然是错误的。
我应该为此使用像 Lucene 这样的东西吗?是否有人在 Java 类中使用 Lucene 方法?
谢谢!
您需要计算搜索词与输入字符串的相关性。Lucene 确实内置了相关性计算,这篇文章可能是理解它们的一个很好的开始(我只是扫描了它,但它似乎相当权威)。
基本流程是这样的:
HashSet
s 中,每个词一个。或者,如果您想为每个单词赋予不同的权重,请HashMap
在单词是关键的地方使用。处理拼写错误有一个简单的技巧:在初始化期间,您创建包含搜索词潜在拼写错误的集合。Peter Norvig 关于“如何编写拼写校正器”的帖子描述了这个过程(它使用 Python 代码,但 Java 实现当然是可能的)。
Lucene 确实支持基于 Levenshtein 距离的模糊搜索。
https://lucene.apache.org/java/2_4_0/queryparsersyntax.html#Fuzzy%20Searches
但是 lucene 旨在搜索文档集而不是字符串搜索,因此 lucene 对您来说可能是一种过度杀伤力。还有其他可用的 Java 实现。看看http://www.merriampark.com/ldjava.htm
应该可以将 Levenshtein 距离应用于单词,而不是字符。然后,为了匹配单词,您可以再次在字符级别应用 Levenshtein,这样“filet of beef”中的“filet”应该与“beef fillet”中的“fillet”匹配。