我是一名Java初学者,试图编写一个程序,将输入与预定义字符串列表相匹配。我看过Levenshtein距离,但我遇到了这样的问题:
如果我有“牛肉片”等输入,我希望它与“牛肉片”相匹配。问题在于,根据Levenshtein的距离,“牛肉圆角”更接近“金枪鱼鱼片”,这当然是错误的。
我应该使用像Lucene这样的东西吗?是否在Java类中使用Lucene方法?
谢谢!
答案 0 :(得分:2)
您需要将搜索字词的relevance计算为输入字符串。 Lucene确实内置了相关性计算,而this article可能是理解它们的一个良好开端(我只是扫描它,但它似乎具有相当的权威性)。
基本流程如下:
HashSet
s中,每个字词一个。或者,如果您想为每个单词赋予不同的权重,请使用HashMap
,其中单词是关键。处理拼写错误很容易:在初始化过程中,您会创建包含搜索字词潜在拼写错误的集合。 Peter Norvig的帖子" How to Write a Spelling Corrector"描述了这个过程(它使用Python代码,但Java实现肯定是可能的)。
答案 1 :(得分:1)
Lucene确实支持基于Levenshtein距离的模糊搜索。
https://lucene.apache.org/java/2_4_0/queryparsersyntax.html#Fuzzy%20Searches
但是lucene意味着搜索一组文档而不是字符串搜索,所以lucene可能对你来说太过分了。还有其他Java实现可用。看看http://www.merriampark.com/ldjava.htm
答案 2 :(得分:1)
应该可以将Levenshtein距离应用于单词,而不是字符。然后,为了匹配单词,你可以再次在字符级别上应用Levenshtein,这样“牛肉里的文件”中的“filet”应该匹配“牛肉圆角”中的“圆角”。