Java中的模糊字符串搜索,包括单词交换

时间:2011-04-07 12:36:57

标签: java fuzzy-search fuzzy-comparison

我是一名Java初学者,试图编写一个程序,将输入与预定义字符串列表相匹配。我看过Levenshtein距离,但我遇到了这样的问题:

如果我有“牛肉片”等输入,我希望它与“牛肉片”相匹配。问题在于,根据Levenshtein的距离,“牛肉圆角”更接近“金枪鱼鱼片”,这当然是错误的。

我应该使用像Lucene这样的东西吗?是否在Java类中使用Lucene方法?

谢谢!

3 个答案:

答案 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”应该匹配“牛肉圆角”中的“圆角”。