我一直在为一个投资组合管理工具开发一个内部网站。有很多文本数据,公司名称等。我对一些搜索引擎的能力印象深刻,它们可以非常快速地回答“你的意思是:xxxx”。
我需要能够智能地接受用户的查询,并不仅响应原始搜索结果,而且还响应“您的意思是?”当有一个极有可能的替代答案等
我正在开发ASP。NET (VB -别跟我过不去!)]
更新: 好吧,在没有数百万“付费用户”的情况下,我该如何模仿这种模式?
为每个“已知”或“正确”的术语生成拼写错误并执行查找? 还有其他更优雅的方法吗?
我一直在为一个投资组合管理工具开发一个内部网站。有很多文本数据,公司名称等。我对一些搜索引擎的能力印象深刻,它们可以非常快速地回答“你的意思是:xxxx”。
我需要能够智能地接受用户的查询,并不仅响应原始搜索结果,而且还响应“您的意思是?”当有一个极有可能的替代答案等
我正在开发ASP。NET (VB -别跟我过不去!)]
更新: 好吧,在没有数百万“付费用户”的情况下,我该如何模仿这种模式?
为每个“已知”或“正确”的术语生成拼写错误并执行查找? 还有其他更优雅的方法吗?
当前回答
嗯…我认为谷歌使用他们庞大的数据语料库(互联网)来做一些严肃的NLP(自然语言处理)。
例如,他们拥有来自整个互联网的大量数据,以至于他们可以计算出三个单词序列出现的次数(称为三元组)。因此,如果他们看到一个句子:“pink frugr concert”,他们可以看到它的点击率很少,然后在语料库中找到最有可能的“pink * concert”。
他们显然只是做了Davide Gualano所说的一种变化,所以一定要阅读那个链接。谷歌当然使用它所知道的所有网页作为一个语料库,这使得它的算法特别有效。
其他回答
前段时间我发现了一篇文章:《如何编写拼写更正》,作者是Peter Norvig(谷歌公司的研究总监)。
这是一本关于“拼写纠正”主题的有趣读物。例子是用Python写的,但是很清楚,很容易理解,而且我认为算法可以很容易 翻译成其他语言。
下面是该算法的简短描述。 该算法包括两个步骤,准备和单词检查。
步骤1:准备-设置word数据库
最好是你能使用实际的搜索词和它们的出现。 如果你没有,你可以用大量的文本来代替。 计算每个单词的出现次数(流行度)。
步骤2。单词检查-找到与被检查的单词相似的单词
相似意味着编辑距离很低(通常是0-1或0-2)。编辑距离是将一个单词转换为另一个单词所需的插入/删除/更改/交换的最小数量。
从上一步中选择一个最流行的词,并建议它作为更正(如果不是这个词本身的话)。
最简单的方法是动态规划。
这是一种从信息检索中借来的算法,在现代生物信息学中大量使用,以查看两个基因序列有多相似。
最优解采用动态规划和递归。
这是一个已经解决的问题,有很多解决方案。在你找到一些开源代码之前,一直在你的周围打转。
我猜…它可以
寻找词语 如果没有找到,使用一些算法来尝试“猜测”这个词。
可能是来自人工智能的东西,比如Hopfield网络或反向传播网络,或者其他“识别指纹”,恢复损坏的数据,或者Davide已经提到的拼写纠正……
简单。他们有大量的数据。他们有每一个可能的术语的统计数据,基于它被查询的频率,以及它的什么变化通常会产生用户点击的结果……因此,当他们看到你在搜索词中经常拼写错误时,他们会提出更常见的答案。
实际上,如果拼写错误实际上是搜索频率最高的词,算法就会把它当成正确的词。
谷歌显然建议搜索结果最好的问题,而不是拼写正确的问题。但在这种情况下,可能拼写纠正器会更可行。当然,您可以为每个查询存储一些值,基于它返回的结果有多好。
So,
You need a dictionary (english or based on your data) Generate a word trellis and calculate probabilities for the transitions using your dictionary. Add a decoder to calculate minimum error distance using your trellis. Of course you should take care of insertions and deletions when calculating distances. Fun thing is that QWERTY keyboard maximizes the distance if you hit keys close to each other.(cae would turn car, cay would turn cat) Return the word which has the minimum distance. Then you could compare that to your query database and check if there is better results for other close matches.