1

我有一张带有标签(单词)的表格。每次我想在表格中添加一个新项目(单词)时,我想首先看到与我输入的单词最相似的单词,这样我才能意识到我已经在表格中找到了一个看起来像它的单词.

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

所以像: select * from tags order by look_a_like_score(@newword)

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

例如,我已经在表中:

餐厅

电梯

游泳池

无线上网

现在我想补充:

免费游泳设施

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

你能帮我做这件事吗?

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

4

3 回答 3

3

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

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

你也可以使用:

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

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

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

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

于 2013-05-27T13:34:55.023 回答
0

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

其他可能对您有用的事情是使用 soundex 或可能的双变音来进行“听起来像”匹配。

于 2013-05-27T13:41:02.750 回答
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 */

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

于 2013-05-27T13:42:56.453 回答