部分匹配

时间:2012-02-10 06:43:54

标签: php matching

是否有内置函数或某个人已编写的函数可以匹配名称而不是精确匹配?

例如,我有:

Marry
John
Steve
Steven
Stewie

如果有人输入“炖”,该功能将返回Stewie 或者如果有人输入“ry”,该功能将返回Marry 或者,如果某人拼错“Marries”,该功能仍会返回Marry。 (因为它们中最相似所有)
如果提供“Ste”,它可以返回false,但对我来说并不重要。

有谁知道如何写这种功能或知道已经写过的功能?看来这可能是常见的事情,我会这么认为。

感谢。

2 个答案:

答案 0 :(得分:2)

实际上有一些方法可以达到这个目的:

内置方法

非内置方法

  • LCS最常见的子序列
  • 字母N-Grams(有时用于拼写检查)
  • Levensthein automaton
  • 单词列表(仅为完整性)

其中一个应该可以帮助您解决问题。

每种算法的问题都在于它们不准确。因此,您将有一个解决问题的启发式解决方案。

通常在距离和声音算法之间存在利弊。声音特定的算法不太准确(精度约为33%)。但很快。 Levensthein更精确但更慢。至少php实现。还有其他系统Levensthein的速度更快(参见例如Levensthein Automata。但这种自动机算法并非内置在php中)。

可能作为一个基本提示:

  • 如果您有许多独特的术语可以比较,请不要使用Similar_text或Levensthein坚持使用声音算法
  • 如果你有一个非常小的集使用Levensthein。

答案 1 :(得分:1)

听起来像soundex()metaphone()就是您正在寻找的。使用这些,你可以计算出一个表示单词发声方式的“键” - 如果两个单词听起来相同(针对英语进行了优化),则可以对所有字符串执行此操作。

另一种可能性是levenshtein()直接计算两个字符串之间的差异,因此您可以比较所有字符串并显示5个最佳匹配或类似的内容。