Language agnostic 如何更正用户输入(有点像谷歌“你是说什么?”

Language agnostic 如何更正用户输入(有点像谷歌“你是说什么?”,language-agnostic,nlp,spell-checking,information-retrieval,autosuggest,Language Agnostic,Nlp,Spell Checking,Information Retrieval,Autosuggest,我有以下要求:- 我有很多(比如一百万)值(名字)。 用户将键入搜索字符串 我不希望用户正确拼写名称 所以,我想做一种谷歌“你的意思是什么?”。这将列出我的数据存储中所有可能的值。有一个类似但不相同的问题。这并没有回答我的问题 我的问题:- 1) 我认为不建议将这些数据存储在RDBMS中。因为这样我就不会对SQL查询进行筛选。我要做全表扫描。因此,在这种情况下,数据应该如何存储? 2) 第二个问题与第二个问题相同。但是,我的问题是:如何搜索大型数据集? 假设数据集中有一个名字Franky。 如果

我有以下要求:-

我有很多(比如一百万)值(名字)。 用户将键入搜索字符串

我不希望用户正确拼写名称

所以,我想做一种谷歌“你的意思是什么?”。这将列出我的数据存储中所有可能的值。有一个类似但不相同的问题。这并没有回答我的问题

我的问题:- 1) 我认为不建议将这些数据存储在RDBMS中。因为这样我就不会对SQL查询进行筛选。我要做全表扫描。因此,在这种情况下,数据应该如何存储?

2) 第二个问题与第二个问题相同。但是,我的问题是:如何搜索大型数据集? 假设数据集中有一个名字Franky。 如果用户键入Phranky,如何匹配Franky?我必须循环所有的名字吗

我遇到了,这将是一个很好的技术,以找到可能的字符串。但我的问题是,我是否必须对数据存储中的所有100万个值进行操作

3) 我知道,谷歌是通过观察用户的行为来做到这一点的。但我想在不观察用户行为的情况下,也就是说,使用距离算法,我还不知道。因为前一种方法需要大量的搜索

4) 正如回答中指出的,有两种可能的情况:-

  • 用户错误键入单词(编辑错误) 距离算法)
  • 用户不知道一个单词,并且在猜测 (语音匹配算法)

我对这两个都感兴趣。它们实际上是两个不同的东西;e、 g.肖恩和肖恩的声音相同,但编辑距离为3-太高,不能被视为打字错误。

Soundex算法可能会帮助您解决这一问题

您可以为每个名称预先生成soundex值,并将其存储在数据库中,然后对其进行索引,以避免扫描表。

这是一个老问题(按我的意思做),Warren Teitelman在Xerox Alto上著名地实现了这个问题。如果你的问题是基于发音,以下是一份调查报告,可能会有所帮助:

J.Zobel和p.Dart,“语音字符串匹配:信息重新评估的教训”,Proc。第19届国际米兰年会。ACM SIGIR信息检索研究与开发会议(SIGIR'96),1996年8月,第166-172页


我的信息检索工作的朋友告诉我,Knuth所描述的Soundex现在被认为已经过时了。

< P>我会考虑使用一个预先存在的解决方案。 有很多名字可能很适合这个。生成字典文件将预先计算快速给出建议所需的所有信息

设计用于在正文中查找近似匹配项。也许你可以用它来计算可能的匹配。(这是基于

(更新:阅读后(使用现有的解决方案,可能是
aspell
)是一种方法)


正如其他人所说,谷歌通过观察用户自我纠正来进行自动纠正。如果我搜索“
someting
”(原文如此),然后立即搜索“
something
”,很可能第一个查询不正确。检测这种情况的一种可能的启发式方法是:

  • 如果用户在短时间内进行了两次搜索,以及
  • 第一个查询没有产生任何结果(或者用户没有单击任何内容)
  • 第二个查询确实产生了有用的结果
  • 这两个查询相似(有一个小的Levenshtein距离)
然后,第二个查询可能是第一个查询的细化,您可以将其存储并呈现给其他用户

请注意,您可能需要大量的查询来收集足够的数据,以使这些建议有用。

只需使用或类似的搜索服务器,您就不必是这方面的专家。使用拼写建议列表,对每个建议的结果运行搜索,如果有比当前搜索查询更多的结果,则将其添加为“Doyou mean”结果。(这可以防止虚假的拼写建议,而这些建议实际上不会返回更多相关的点击量。)这样,您就不需要收集大量数据来制作初始的“您的意思是什么”产品,尽管Solr有一些机制,您可以通过这些机制手动调整某些查询的结果

通常,您不会使用RDBMS进行这种类型的搜索,而是依赖于用于此目的的只读、稍微陈旧的数据库。(Solr为底层Lucene引擎和数据库添加了友好的编程界面和配置。)在我工作的公司的网站上,一项夜间服务从RDBMS中选择修改过的记录,并将它们作为文档推送到Solr中。我们有一个系统,在这个系统中,搜索框可以非常高效地搜索产品、客户评论、网站页面和博客条目,并在搜索结果中提供拼写建议,以及分面浏览,如您在NewEgg、Netflix或Home Depot看到的,而对服务器的附加压力非常小(特别是RDBMS)。(我相信Zappo的[新网站]和Netflix都在内部使用Solr,但不要引用我的话。)


在您的场景中,您将使用名称列表填充Solr索引,并在配置文件中选择适当的匹配算法。

正如在您引用的问题的一个答案中一样,Peter Norvig的方法可以实现这一点,并使用Python代码完成。Google可能通过多种方式提供查询建议,但他们需要的是大量的数据。当然,他们可以用大量的查询日志来模拟用户行为,但他们也可以只使用文本数据,通过查看哪种更正更常见来查找最可能正确的拼写。单词
someting
不会出现在字典中,即使这是一种常见的拼写错误,T