我一直在开发一个投资组合管理工具的内部网站。有很多文本数据,公司名称等。我对一些搜索引擎能够快速回复“你的意思是:xxxx”的查询感到非常满意。
我需要能够智能地进行用户查询并不仅回应原始搜索结果,还回答“你的意思是?”当有极有可能的替代答案等时作出回应
[我正在ASP.NET开发(VB - 不要反对我!)
更新: 好吧,如果没有数百万“无偿用户”,我怎么能模仿这个?
答案 0 :(得分:355)
这是直接来自源(几乎)的解释
分钟22:03
值得一看!根据谷歌前任首席技术官Douglas Merrill的说法,基本上是这样的:
1)你在谷歌写了一个(拼写错误的)单词
2)你找不到你想要的东西(不要点击任何结果)
3)你意识到你拼错了这个词,所以你在搜索框中重写了这个词。
4)你找到你想要的东西(你点击第一个链接)
这种模式增加了数百万次,显示了最常见的拼写错误以及最“常见”的更正。
这样谷歌几乎可以瞬间完成各种语言的拼写纠正。
这也意味着,如果一夜之间每个人都开始拼写晚上,因为“nigth”谷歌会建议这个词。
修改强>
他们知道谁更正了查询,因为他们知道哪个查询来自哪个用户(使用cookie)
如果用户执行查询,并且只有10%的用户点击结果,90%返回并输入另一个查询(带有更正后的单词),这次90%点击结果,那么他们知道他们发现了一个纠正。
他们还可以知道这些是两个不同的“相关”查询,因为它们具有所显示的所有链接的信息。
此外,它们现在将语境包含在拼写检查中,因此它们甚至可以根据上下文建议不同的单词。
请参阅此demo of google wave(@ 44m 06s),其中显示了如何自动更正拼写的上下文。
Here解释了自然语言处理的工作原理。
最后,这是一个很棒的演示,可以做些什么来添加自动machine translation(@ 1h 12m 47s)。
<子> 我已经为视频添加了分钟和秒钟的锚点以直接跳到内容,如果它们不起作用,请尝试重新加载页面或手动滚动到标记。 子>
答案 1 :(得分:102)
我前段时间发现了这篇文章:How to Write a Spelling Corrector,由Peter Norvig(谷歌公司研究总监)撰写。
这是关于“拼写纠正”主题的有趣读物。这些示例是在Python中,但它清晰易懂,我认为算法很容易 翻译成其他语言。
下面是该算法的简短描述。 该算法包括两个步骤,准备和单词检查。
第1步:准备 - 设置单词数据库
最好是你可以使用实际搜索词及其出现。 如果您没有,可以使用大量文本。 计算每个单词的出现次数(流行度)。
步骤2.单词检查 - 查找与检查的单词类似的单词
类似意味着编辑距离较低(通常为0-1或0-2)。编辑距离是将一个单词转换为另一个单词所需的最小插入/删除/更改/交换次数。
选择上一步中最受欢迎的单词并将其建议为更正(如果不是单词本身)。
答案 2 :(得分:54)
对于“你是说”算法的理论,你可以参考信息检索简介的第3章。免费提供online。 Section 3.3(第52页)完全回答了您的问题。并且要专门回答您的更新,您只需要一个单词词典而不需要其他内容(包括数百万用户)。
答案 3 :(得分:10)
例如,他们拥有来自整个互联网的大量数据,他们可以计算三字序列发生的次数(称为 trigram )。因此,如果他们看到像“粉红色的frugr音乐会”这样的句子,他们可以看到它几乎没有点击,然后在他们的语料库中找到最可能的“粉红色*音乐会”。
他们显然只是改变了Davide Gualano所说的内容,所以肯定会读到这个链接。谷歌当然会使用它所知道的所有网页作为语料库,因此这使得它的算法特别有效。
答案 4 :(得分:7)
我的猜测是他们使用Levenshtein distance算法和他们收集的有关运行搜索的大量数据的组合。他们可以从输入的搜索字符串中拉出一组与Levenshtein距离最短的搜索,然后选择结果最多的搜索。
答案 5 :(得分:6)
通常,生产拼写纠正器会使用多种方法来提供拼写建议。有些是:
决定确定是否需要拼写纠正的方法。这些可能包括结果不充分,结果不够具体或不够准确(根据某些措施)等。然后:
使用大量文本或字典,其中所有或大多数已知拼写正确。这些很容易在网上找到,例如LingPipe。然后,为了确定最佳建议,您需要根据多个度量查找最接近匹配的单词。最直观的是类似的角色。通过研究和实验证明,两个或三个字符的序列匹配效果更好。 (双胞胎和三卦)为了进一步改善结果,在比赛的开头或结尾处加一个较高的分数。出于性能原因,将所有这些单词索引为三元组或双字母组,以便在执行查找时,转换为n-gram,并通过哈希表或trie进行查找。
根据字符位置使用与潜在键盘错误相关的启发式方法。所以“hwllo”应该是“你好”,因为'w'接近'e'。
使用语音键(Soundex,Metaphone)索引单词并查找可能的更正。实际上,这通常会比使用n-gram索引返回更糟糕的结果,如上所述。
在每种情况下,您都必须从列表中选择最佳校正。这可能是距离度量,例如levenshtein,键盘度量等。
对于多字短语,只有一个单词可能拼写错误,在这种情况下,您可以将剩余的单词用作确定最佳匹配的上下文。
答案 6 :(得分:6)
使用Levenshtein distance,然后创建度量树(或修剪树)来索引单词。 然后运行1-Nearest Neighbor查询,得到结果。
答案 7 :(得分:4)
所以,
您需要一本字典(英文或基于您的数据)
生成一个单词格子并使用您的字典计算过渡的概率。
添加解码器以使用您的格子计算最小误差距离。当然,在计算距离时,您应该注意插入和删除。有趣的是QWERTY键盘最大化距离,如果你碰到彼此靠近的键。(cae会转车,cay会变成猫)
返回距离最小的单词。
然后您可以将其与查询数据库进行比较,并检查其他近距离匹配是否有更好的结果。
答案 8 :(得分:4)
以下是Google的研究总监Peter Norvig实施和描述的best answer I found拼写纠正器。
如果您想了解更多有关此背后理论的信息,请阅读his book chapter。
该算法的思想基于统计机器学习。
答案 9 :(得分:3)
猜测......可能
可能是像Hopfield网络或反向传播网络这样的AI,或其他“识别指纹”,恢复损坏数据或拼写更正的内容,正如Davide所提到的那样......
答案 10 :(得分:2)
几年前我看到了这个,所以可能已经改变了,但显然他们通过分析他们的日志来启动它,以便在短时间内提交非常相似的查询的相同用户,并根据如何使用机器学习用户已经纠正了自己。
答案 11 :(得分:2)
简单。他们有吨的数据。他们根据查询的频率对每个可能的术语进行统计,并且它通常会产生用户点击的结果... ...因此,当他们看到您为搜索词输入频繁拼写错误时,他们会继续提议更常见的答案。
实际上,如果拼写错误实际上是最频繁的搜索词,那么algorythm将把它作为正确的词。
答案 12 :(得分:2)
关于如何在没有大量数据的情况下模仿行为的问题 - 为什么不使用谷歌收集的大量数据?下载misspelled word的google sarch结果,并在HTML中搜索“您的意思是:”。
我想现在称为mashup: - )
答案 13 :(得分:1)
除了上述答案之外,如果你想快速实施一些事情,这里有一个建议 -
您可以在 GitHub上找到此算法的实施和详细文档。
答案 14 :(得分:1)
这是一个老问题,我很惊讶没有人建议使用Apache Solr进行OP。
Apache Solr是一个全文搜索引擎,除了许多其他功能外,还提供拼写检查或查询建议。来自documentation:
默认情况下,Lucene Spell检查器首先按照排序建议 从字符串距离计算中得分,然后按频率得分 (如果有的话)索引中的建议。
答案 15 :(得分:1)
你的意思是说拼写检查?如果它是拼写检查而不是整个短语,那么我有一个关于拼写检查的链接,在python中开发算法。查看this link
与此同时,我也在开展包括使用文本搜索数据库的项目。我想这可以解决你的问题
答案 16 :(得分:0)
有一个特定的数据结构 - 三元搜索树 - 自然支持部分匹配和近邻匹配。
答案 17 :(得分:-1)
最简单的解决方法是Google动态编程。
这是一种借鉴信息检索的算法,在现代生物信息学中被大量使用,以了解两种基因序列是如何相似的。
最佳解决方案使用动态编程和递归。
这是一个有很多解决方案的问题。只需谷歌,直到找到一些开源代码。