Algorithm 我该如何估计;你是说;不使用谷歌?

Algorithm 我该如何估计;你是说;不使用谷歌?,algorithm,language-agnostic,nlp,machine-learning,Algorithm,Language Agnostic,Nlp,Machine Learning,我知道这个问题有重复的地方: 。。。还有很多其他的 这些问题对算法的实际工作方式感兴趣。我的问题更像是:假设谷歌不存在,或者这个功能不存在,我们没有用户输入。如何实现该算法的近似版本 为什么这很有趣? 嗯。尝试在Google中键入“”,它会告诉您: 你的意思是:合格吗 很公平。它利用从数十亿用户收集的数据进行统计机器学习。但现在尝试在Google中键入以下内容:“它会告诉您: 您的意思是:尝试重新连接您吗 现在这是更有趣的部分。谷歌如何确定这一点?手边有一本字典,用用户输入再次猜测最可能

我知道这个问题有重复的地方:

  • 。。。还有很多其他的
这些问题对算法的实际工作方式感兴趣。我的问题更像是:假设谷歌不存在,或者这个功能不存在,我们没有用户输入。如何实现该算法的近似版本

为什么这很有趣?

嗯。尝试在Google中键入“”,它会告诉您:

你的意思是:合格吗

很公平。它利用从数十亿用户收集的数据进行统计机器学习。但现在尝试在Google中键入以下内容:“它会告诉您:

您的意思是:尝试重新连接您吗

现在这是更有趣的部分。谷歌如何确定这一点?手边有一本字典,用用户输入再次猜测最可能的单词?它如何区分拼写错误的单词和句子


现在考虑到大多数程序员无法访问数十亿用户的输入,我正在寻找实现该算法的最佳近似方法以及可用的资源(数据集、库等)。有什么建议吗?

看看这个:

假设您有一个单词词典(最坏情况下出现在词典中的所有单词,最好情况下出现在系统数据中的所有短语),并且您知道各种单词的相对频率,您应该能够合理地猜测用户的意思,通过一些组合和相似单词的点击次数。权重显然需要一点尝试和错误,但一般来说,用户更感兴趣的是一个流行的结果,它在语言上离他们输入的字符串有点远,而不是一个有效的单词,它在语言上更接近,但在您的系统中只有一到两次点击


第二种情况应该更简单一些。找到字符串开头的所有有效单词(“T”无效,“Tr”无效,“Try”是一个单词,“Tryt”不是一个单词,等等),对于每个有效单词,重复剩余字符串的算法。假设你的字典被编入索引,这应该很快。如果您发现一个结果,可以将长字符串分解为一组没有剩余字符的有效单词,这就是您的建议。当然,如果你是Google,你可能会修改算法来寻找与实际单词拼写相当接近的子字符串,并且你有一些逻辑来处理这样的情况:一个字符串可以通过足够宽松的拼写检查以多种方式读取(可能使用结果的数量来打破僵局).

我认为这可以通过使用
拼写检查器
N-grams
来完成

对于
Trytoreconnectyou
,我们首先检查所有1-gram(所有字典单词)并找到一个非常糟糕的最接近匹配项。所以我们尝试2克(可以通过删除长度为2的短语中的空格来构建),然后是3克,依此类推。当我们尝试4克时,我们发现有一个短语与搜索词的距离为0。既然我们做得再好不过了,我们就把这个答案作为建议返回


我知道这是非常低效的,但Peter Norvig的帖子清楚地表明,谷歌使用拼写纠正器来生成建议。由于谷歌拥有强大的并行化能力,他们可以很快完成这项任务

令人印象深刻的tutroail one,您可以在这里找到它的工作

在很少的单词中,它是查询修改(字符或单词级别)与增加搜索文档覆盖率之间的折衷。例如,“aple”导致2mln文档,但“apple”导致60mln文档,并且修改仅为一个字符,因此很明显,您指的是apple

从马的嘴里:


这里有趣的是,您不需要一堆查询日志来近似算法。你可以使用一个主要是正确文本的语料库(就像古腾堡项目中的一堆书)。

@传奇——考虑使用其中的一个变体。它有一些已知的缺陷,但在大多数需要近似拼写错误的单词的应用程序中,它运行良好


编辑(2011-03-16):

我突然想起了几年前遇到的另一个类似Soundex的算法。年,劳伦斯·菲利普斯(Lawrence Philips)讨论了他的变音算法(称为双变音)的改进

您可以在同一站点上找到该算法的Python实现,以及更多实现


再说一次,这些算法将与谷歌使用的不同,但对于英语单词,它们应该让你非常接近。您还可以在wikipedia页面上查看其他类似算法的列表。

可能有用的数据集/工具:

  • WordNet
  • 语料库,如
您可以将WordNet用作一个简单的术语词典,您可以使用从语料库中提取的频繁术语来增强这一功能

您可以使用前面提到的Peter Norvig链接作为第一次尝试,但是对于大型词典,这不是一个好的解决方案

相反,我建议您使用类似于位置敏感哈希(LSH)的方法。这通常用于检测重复文档,但也适用于拼写更正。您需要一个从您的数据中提取的术语和术语字符串列表,您认为人们可能会搜索这些术语-您必须为这些字符串选择一个截止长度。或者,如果你有一些人们实际搜索的数据,你可以使用它。对于每个术语字符串,您生成一个向量(可能是字符bigrams或trigrams就可以了),并将其存储在LSH中

给定任何查询,您都可以在中描述的LSH上使用近似最近邻搜索来从中查找最近邻