首页 / 知识

关于nlp:您如何实现“您的意思”?

2023-04-14 01:24:00

关于nlp:您如何实现“您的意思”?

How do you implement a “Did you mean”?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How does the Google"Did you mean?" Algorithm work?

假设您的网站中已经有一个搜索系统。 在某些搜索查询中,您如何像Google那样实现"您的意思是:"?


实际上,Google所做的工作非常重要,而且乍一看是违反直觉的。他们没有像检查字典那样做任何事情,但是他们利用统计信息来识别返回比您的查询更多结果的"相似"查询,确切的算法当然是未知的。

这里有不同的子问题需要解决,作为所有自然语言处理统计数据的基础,必须有一本书:统计自然语言处理基础。

具体地,为了解决单词/查询相似性的问题,我使用Edit Distance获得了很好的结果,Edit Distance是一种字符串相似性的数学测量方法,效果非常好。我曾经使用Levenshtein,但其他人可能值得研究。

根据我的经验,Soundex很糟糕。

实际上有效地存储和搜索大的拼写错误的词典,并且具有亚秒级的检索功能也是不容易的,最好的选择是利用现有的全文索引和检索引擎(即不是数据库的那个),Lucene当前是其中的一种最好的之一,巧合地移植到许多平台上。


Google的Dr Norvig概述了它的工作方式。他甚至给出了20行的Python实现:

http://googlesystem.blogspot.com/2007/04/simplified-version-of-googles-spell.html

http://www.norvig.com/spell-correct.html

诺维格博士在这个精彩的演讲中还讨论了"您的意思"。 Norvig博士是Google的研究负责人-当被问及"您的意思"是如何实现的时,他的回答是权威性的。

因此,它的拼写检查(大概是根据其他搜索甚至是实际的互联网短语等)构建的动态词典。但这仍然是拼写检查。

大家快来看看SOUNDEX和其他猜测吧!


在Wikipedia上查看有关Levenshtein距离的文章。确保您仔细看一下可能的改进。


有人问到如何为搜索引擎创建最先进的拼写建议系统,我感到非常惊讶。我在一家搜索引擎公司从事这一主题的工作已经一年多了,我可以指出有关该主题的公共领域信息。

如前一篇文章所述,Google(以及Microsoft和Yahoo!)既不使用任何预定义的字典,也不使用成群的语言学家来思考可能的拼写错误的查询。由于问题的严重性,这将是不可能的,而且还因为不清楚人们是否可以正确识别查询的时间和是否拼错。

相反,有一个简单而有效的原则也适用于所有欧洲语言。假设参考查询是计数最高的查询,请在搜索日志中获取所有唯一查询,并计算所有查询对之间的编辑距离。

这个简单的算法非常适合许多类型的查询。如果您想将其提高到一个新的水平,那么我建议您阅读Microsoft Research关于该主题的论文。你可以在这里找到它

本文有很好的介绍,但之后您将需要了解诸如隐马尔可夫模型的概念。


我相信Google会记录所有查询并确定何时有人进行拼写更正。然后,当其他人提供相同的第一个查询时,可以建议此更正。这适用于任何语言,实际上是任何字符的任何字符串。


我建议您查看SOUNDEX以在您的数据库中找到类似的单词。

您还可以使用Google API拼写建议请求来访问Google自己的词典。


您可能想看看Peter Norvig的"如何编写拼写校正器"文章。


http://en.wikipedia.org/wiki/N-gram#Google_use_of_N-gram


我认为这取决于您的网站大小。在我们大约500名员工使用的本地Intranet上,我仅查看返回零结果的搜索短语,然后将该搜索短语和新建议的搜索短语输入到SQL表中。

如果没有返回任何搜索结果,他们将在该表上进行调用,但是,这仅在站点相对较小的情况下才有效,并且我仅对最常见的搜索短语进行操作。

您可能还想看看我对类似问题的回答:

  • 喜欢使用MS SQL Server的"类似帖子"吗?

如果您具有行业特定的翻译,则可能需要一个同义词库。例如,我在珠宝业工作过,在我们的描述中有缩写,例如kt-karat,rd-round,cwt-克拉重量... Endeca(该职位的搜索引擎)有一个词库,该词库可以从通用拼写错误,但确实需要人工干预。


我用Lucene的拼写检查器做到这一点。


为什么不在代码中使用Google的意思呢?
http://narenonit.blogspot.com/2012/08/trick-for-using-googles-did-you-mean.html


有一种叫做aspell的东西可能会有所帮助:
http://blog.evanweaver.com/files/doc/fauna/raspell/classes/Aspell.html

有一个红宝石宝石,但我不知道如何从python与它交谈
http://blog.evanweaver.com/files/doc/fauna/raspell/files/README.html

这是来自ruby实现的报价

Usage

Aspell lets you check words and suggest corrections. For example:

1
2
3
4
5
6
7
8
9
  string ="my haert wil go on"

  string.gsub(/[\w\']+/) do |word|
    if !speller.check(word)
      # word is wrong
      puts"Possible correction for #{word}:"
      puts speller.suggest(word).first
    end
  end

输出:

可能的纠正措施:

可能的更正:


以有效的方式为搜索引擎实施拼写校正并非易事(您不能仅计算每个可能单词的编辑/删除距离)。 《信息检索简介》(在线提供全文)中介绍了一种基于k-gram索引的解决方案。


您可以使用ngram进行比较:http://en.wikipedia.org/wiki/N-gram

使用python ngram模块:http://packages.python.org/ngram/index.html

1
2
3
4
5
6
7
8
9
import ngram

G2 = ngram.NGram([ "iis7 configure ftp 7.5",
                   "ubunto configre 8.5",
                   "mac configure ftp"])

print"String","\t","Similarity"
for i in G2.search("iis7 configurftp 7.5", threshold=0.1):
    print i[1],"\t", i[0]

你得到:

1
2
3
4
5
>>>
String  Similarity
0.76   "iis7 configure ftp 7.5"    
0.24   "mac configure ftp"
0.19   "ubunto configre 8.5"

Soundex和" Porter阻止"(Soundex是微不足道的,不确定Porter阻止)。


Soundex适用于语音匹配,但最适合与人的名字配合使用(最初是为人口普查数据开发的)

还要检查全文索引,该语法与Google逻辑不同,但是它非常快速并且可以处理类似的语言元素。


搜索系统网站查询

最新内容

相关内容

热门文章

推荐文章

标签云

猜你喜欢