PHP - 如何建议搜索术语,“你的意思是......?”

时间:2009-12-11 14:58:31

标签: php search

使用不检索结果的条件搜索数据库时,我想允许“你的意思是......”建议(如谷歌)。 例如,如果有人寻找“jquyer” “,它会输出”did you mean jquery?

当然,建议结果必须与db内的值匹配(我使用的是mysql)。

你知道一个可以做到这一点的图书馆吗?我用谷歌搜索了这个,但没有找到任何好结果。 或者您可能知道如何自己构建它?

8 个答案:

答案 0 :(得分:8)

快速简便的解决方案涉及SOUNDEX或类似SOUNDEX的功能。

简而言之,SOUNDEX函数最初用于处理常见的拼写错误和姓氏的替代拼写,而且这个函数很好地包含了许多常见的拼写错误(英语)。由于它专注于姓氏,原始的soundex函数可能是有限的(例如编码在第三或第四个非重复辅音字母后停止),但很容易花费算法。

这种类型的功能的兴趣在于它允许提前计算 单个值 ,它可以与单词相关联。这与字符串距离函数不同,例如 edit distance 函数(例如 Levenshtein 汉明或甚至 Ratcliff / Obershelp < / strong>)提供相对于字符串的的值

通过预先计算索引字典中所有单词的SOUNDEX值,可以在运行时快速搜索字典/数据库[run-time]计算用户提供的搜索词的SOUNDEX值。 Soundex搜索可以系统地完成,作为普通关键字搜索的补充,或者仅在关键字搜索没有产生令人满意的记录数时执行,因此提供可能是用户提供的关键字的提示(是拼写错误。


完全不同的方法,仅适用于包含多个单词的用户查询,基于对字典/数据库运行多个查询,不包括一个(或几个)用户提供的关键字。这些备用查询的结果列表提供了不同单词的列表;这个[缩小的]单词列表通常足够小,以至于可以应用基于对的距离函数来在列表内选择更接近于所谓的拼写错误的单词的单词。单词频率(在结果列表中)可用于限制单词的数量(仅评估发现超过x次的单词的相似性),以及提供权重,以略微偏斜相似性度量(即赞成在数据库中“数量上”发现的单词,即使它们的相似性测量值略低)。

答案 1 :(得分:7)

levenshtein函数或similar_text函数怎么样?

答案 2 :(得分:3)

实际上,我认为谷歌的“你的意思”功能是由用户输入后输入错误而生成的。然而,这对他们来说显然要容易得多,因为他们拥有令人难以置信的数据量。

您可以使用Levenshtein距离作为mgroves建议(或Soundex),但将结果存储在数据库中。或者,根据常见的拼写错误和最受欢迎的拼写错误的搜索字词运行单独的脚本。

答案 3 :(得分:3)

http://www.phpclasses.org/browse/package/4859.html

这是一个现成的类,它很容易实现,它采用最小的编辑距离。您需要做的就是拥有一个令牌(不是类型)列表,列出您想要使用的所有单词。我的建议是确保它是搜索索引中的完整单词列表,并且只在搜索索引中。这有两个方面:

  • 域名特异性有助于避免误导概率超越您的实施
    • 例如:对于大多数现成的词典,“Memoize”可能会被拼写为“Memorize”,但这对于计算机科学页面来说是一个非常好的搜索词。
  • 现在考虑搜索索引中可用的专有名词。
    • 例如:如果你是戴尔,并且有人搜索'inspiran',那么拼写正确的功能绝对不可能知道你的意思是'灵感'。它可能会拼写为'鼓舞人心'或更常见的东西,而且,更少的特定领域。

答案 4 :(得分:1)

您应该跟踪搜索中出现的常见拼写错误(或使用typo generator生成一些错误拼写)并将拼写错误及其匹配的单词存储在数据库中。然后,当您没有任何匹配任何搜索结果时,您可以检查拼写错误表,并使用建议的单词。

答案 5 :(得分:1)

编写自己的自定义解决方案需要相当长的时间,并且如果您的数据集不够大,则不能保证能够正常工作,因此我建议使用来自搜索巨头的API,例如YahooYahoo's results不如Google's那么好,但我不确定Google是否应该公开。

答案 6 :(得分:1)

你可以简单地使用这样的Api https://www.mashape.com/marrouchi/did-you-mean

答案 7 :(得分:0)

几年前,当我这样做时,我已经有了一个自定义构建的搜索引擎使用的单词索引。我研究了人们最常犯的错误(基于日志),并根据错误的常见程度对建议进行了分类。

如果有人搜索了jQuery,我会构建一个

的select语句
SELECT Word, 1 AS Relevance 
FROM keywords 
WHERE Word IN ('qjuery','juqery','jqeury' etc)  

UNION 

SELECT Word, 2 AS Relevance 
FROM keywords 
WHERE Word LIKE 'j_query' OR Word LIKE 'jq_uery' etc etc 
ORDER BY Relevance, Word  

结果是我的建议,而且效果很好。