寻找最匹配的单词

时间:2013-05-27 13:23:50

标签: php mysql comparison

我有一个带有标签(单词)的表格。每当我想在表格中添加一个新项目(单词)时,我想首先看到的单词看起来最像我正在输入的单词,所以我可以意识到我已经在表格中看到了一个看起来像这样的单词

有点像在Mysql中使用match()函数,但我不想要对应多少单词的分数。但是在一个单词中得分,有多少个字符对应。

类似于:select * from tags order by look_a_like_score(@newword)

但是有没有像look_a_like_score()这样的函数?

示例,我已经在表中:

  

餐厅

     

电梯

     

游泳池

     

无线上网的

现在我要添加:

  

免费游泳设施

我现在想要的是一个带有“游泳池”的列表,因为“游泳”部分最匹配。

你能帮我这么做吗?

PS。我将整个表收集到PHP中,然后将它们放入一个数组中。因此,欢迎使用PHP方法。

3 个答案:

答案 0 :(得分:3)

在MySQL方面,你有soundex,并不像我喜欢的那样工作得很好。 你可能想要实现一个MySQL模块来使用levenshtein(你需要在C中编译)。

在PHP方面你有levenshtein()可用,这是相当不错的相似性得分

您也可以使用:

soundex() - 计算字符串的soundex键

similar_text() - 计算两个字符串之间的相似性

metaphone() - 计算字符串的metaphone键

查看手册以了解如何使用它们

答案 1 :(得分:0)

您可以在here查看levenshtein distance公式的实现,这有助于找到字符串之间的编辑距离。

可能对你有用的其他事情是使用soundex或可能double metaphone来做“听起来像”匹配。

答案 2 :(得分:0)

没有任何功能。但是,你可以用一些SQL来做到这一点。我假设@newtag包含您的新标记,并且您有一个numbers表。你可以这样做:

select t.tag, max(len) as biggestmatch
from (select concat('%', substr(@newtag, n1.n, n2.n), '%') as pat,
             n1.n as start, n2.n as len
      from numbers n1 cross join
           numbers n2
      where n1.n <= length(@newtag) and n1+n2 <= length(@newtag)
     ) patterns join
     tags t
     on t.tag like patterns.pat
group by t.tag
order by max(len)
limit 1  /* you only need this if you want the best one */

我不承诺这会表现得特别好。但是对于一些不太长的标签和字符串,它可能适合您的目的。