Language agnostic 如何更正用户输入(有点像谷歌“你是说什么?”
我有以下要求:- 我有很多(比如一百万)值(名字)。 用户将键入搜索字符串 我不希望用户正确拼写名称 所以,我想做一种谷歌“你的意思是什么?”。这将列出我的数据存储中所有可能的值。有一个类似但不相同的问题。这并没有回答我的问题 我的问题:- 1) 我认为不建议将这些数据存储在RDBMS中。因为这样我就不会对SQL查询进行筛选。我要做全表扫描。因此,在这种情况下,数据应该如何存储? 2) 第二个问题与第二个问题相同。但是,我的问题是:如何搜索大型数据集? 假设数据集中有一个名字Franky。 如果用户键入Phranky,如何匹配Franky?我必须循环所有的名字吗 我遇到了,这将是一个很好的技术,以找到可能的字符串。但我的问题是,我是否必须对数据存储中的所有100万个值进行操作 3) 我知道,谷歌是通过观察用户的行为来做到这一点的。但我想在不观察用户行为的情况下,也就是说,使用距离算法,我还不知道。因为前一种方法需要大量的搜索 4) 正如回答中指出的,有两种可能的情况:-Language agnostic 如何更正用户输入(有点像谷歌“你是说什么?”,language-agnostic,nlp,spell-checking,information-retrieval,autosuggest,Language Agnostic,Nlp,Spell Checking,Information Retrieval,Autosuggest,我有以下要求:- 我有很多(比如一百万)值(名字)。 用户将键入搜索字符串 我不希望用户正确拼写名称 所以,我想做一种谷歌“你的意思是什么?”。这将列出我的数据存储中所有可能的值。有一个类似但不相同的问题。这并没有回答我的问题 我的问题:- 1) 我认为不建议将这些数据存储在RDBMS中。因为这样我就不会对SQL查询进行筛选。我要做全表扫描。因此,在这种情况下,数据应该如何存储? 2) 第二个问题与第二个问题相同。但是,我的问题是:如何搜索大型数据集? 假设数据集中有一个名字Franky。 如果
- 用户错误键入单词(编辑错误) 距离算法)
- 用户不知道一个单词,并且在猜测 (语音匹配算法)
我对这两个都感兴趣。它们实际上是两个不同的东西;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距离)
在您的场景中,您将使用名称列表填充Solr索引,并在配置文件中选择适当的匹配算法。正如在您引用的问题的一个答案中一样,Peter Norvig的方法可以实现这一点,并使用Python代码完成。Google可能通过多种方式提供查询建议,但他们需要的是大量的数据。当然,他们可以用大量的查询日志来模拟用户行为,但他们也可以只使用文本数据,通过查看哪种更正更常见来查找最可能正确的拼写。单词
someting
不会出现在字典中,即使这是一种常见的拼写错误,T