我一直在为一个投资组合管理工具开发一个内部网站。有很多文本数据,公司名称等。我对一些搜索引擎的能力印象深刻,它们可以非常快速地回答“你的意思是:xxxx”。

我需要能够智能地接受用户的查询,并不仅响应原始搜索结果,而且还响应“您的意思是?”当有一个极有可能的替代答案等

我正在开发ASP。NET (VB -别跟我过不去!)]

更新: 好吧,在没有数百万“付费用户”的情况下,我该如何模仿这种模式?

为每个“已知”或“正确”的术语生成拼写错误并执行查找? 还有其他更优雅的方法吗?


当前回答

嗯…我认为谷歌使用他们庞大的数据语料库(互联网)来做一些严肃的NLP(自然语言处理)。

例如,他们拥有来自整个互联网的大量数据,以至于他们可以计算出三个单词序列出现的次数(称为三元组)。因此,如果他们看到一个句子:“pink frugr concert”,他们可以看到它的点击率很少,然后在语料库中找到最有可能的“pink * concert”。

他们显然只是做了Davide Gualano所说的一种变化,所以一定要阅读那个链接。谷歌当然使用它所知道的所有网页作为一个语料库,这使得它的算法特别有效。

其他回答

简单。他们有大量的数据。他们有每一个可能的术语的统计数据,基于它被查询的频率,以及它的什么变化通常会产生用户点击的结果……因此,当他们看到你在搜索词中经常拼写错误时,他们会提出更常见的答案。

实际上,如果拼写错误实际上是搜索频率最高的词,算法就会把它当成正确的词。

通常,产品拼写纠正器会使用几种方法来提供拼写建议。一些人:

Decide on a way to determine whether spelling correction is required. These may include insufficient results, results which are not specific or accurate enough (according to some measure), etc. Then: Use a large body of text or a dictionary, where all, or most are known to be correctly spelled. These are easily found online, in places such as LingPipe. Then to determine the best suggestion you look for a word which is the closest match based on several measures. The most intuitive one is similar characters. What has been shown through research and experimentation is that two or three character sequence matches work better. (bigrams and trigrams). To further improve results, weigh a higher score upon a match at the beginning, or end of the word. For performance reasons, index all these words as trigrams or bigrams, so that when you are performing a lookup, you convert to n-gram, and lookup via hashtable or trie. Use heuristics related to potential keyboard mistakes based on character location. So that "hwllo" should be "hello" because 'w' is close to 'e'. Use a phonetic key (Soundex, Metaphone) to index the words and lookup possible corrections. In practice this normally returns worse results than using n-gram indexing, as described above. In each case you must select the best correction from a list. This may be a distance metric such as levenshtein, the keyboard metric, etc. For a multi-word phrase, only one word may be misspelled, in which case you can use the remaining words as context in determining a best match.

这是一个老问题,我很惊讶没有人建议OP使用Apache Solr。

Apache Solr是一个全文搜索引擎,除了许多其他功能,还提供拼写检查或查询建议。从文档中可以看到:

默认情况下,Lucene拼写检查器首先根据 分由弦距计算和秒由频 (如有)在索引内的建议。

前段时间我发现了一篇文章:《如何编写拼写更正》,作者是Peter Norvig(谷歌公司的研究总监)。

这是一本关于“拼写纠正”主题的有趣读物。例子是用Python写的,但是很清楚,很容易理解,而且我认为算法可以很容易 翻译成其他语言。

下面是该算法的简短描述。 该算法包括两个步骤,准备和单词检查。

步骤1:准备-设置word数据库

最好是你能使用实际的搜索词和它们的出现。 如果你没有,你可以用大量的文本来代替。 计算每个单词的出现次数(流行度)。

步骤2。单词检查-找到与被检查的单词相似的单词

相似意味着编辑距离很低(通常是0-1或0-2)。编辑距离是将一个单词转换为另一个单词所需的插入/删除/更改/交换的最小数量。

从上一步中选择一个最流行的词,并建议它作为更正(如果不是这个词本身的话)。

以下是直接来自来源的解释(几乎)

搜索101 !

在分钟 22:03

值得一看!

基本上,根据谷歌前CTO Douglas Merrill的说法,它是这样的:

1)你在谷歌里写了一个(拼错的)单词

2)你找不到你想要的(不要点击任何结果)

3)你意识到你拼错了这个词,所以你在搜索框里重写了这个词。

4)你找到你想要的(你点击第一个链接)

这个模式乘以数百万次,显示了什么是最常见的拼写错误,什么是最“常见”的更正。

这样谷歌几乎可以立即提供每种语言的拼写纠正。

这也意味着如果一夜之间每个人都开始把night拼成“nigth”,谷歌会建议用这个词来代替。

EDIT

道格拉斯将其描述为“统计机器学习”。

他们知道谁更正了查询,因为他们知道哪个查询来自哪个用户(使用cookie)

如果用户执行查询,只有10%的用户点击了结果,而90%的用户返回并输入了另一个查询(带有更正的单词),这一次90%的用户点击了结果,那么他们知道他们已经找到了更正。

它们还可以知道这些是否是两个不同的“相关”查询,因为它们拥有它们所显示的所有链接的信息。

此外,他们现在将上下文纳入拼写检查,因此他们甚至可以根据上下文建议不同的单词。

请看谷歌wave (@ 44m06 s)的演示,它展示了如何考虑上下文来自动纠正拼写。

这里将解释自然语言处理是如何工作的。

最后,这里有一个很棒的演示,可以添加自动机器翻译(@ 1h 12m 47s)到混合。

我已经在视频中添加了分钟和秒的锚,可以直接跳到内容,如果它们不起作用,可以尝试重新加载页面或手动滚动到标记处。