我得到用户从智能手机、哑铃或电脑键盘上截取的文本实体。这使得他们对“jstn”的搜索无法检索到“justin roberts”。如果他们输入“csr”,“caesar”必须出现在auto suggest中。
在预期中,我希望将拼写正确的单词编码成一个或多个可能的“文本说话”术语,这样当用户输入时,我们可以检索、匹配和建议正确的术语。
以下是一些我必须解释的变体拼写:
justin -> jst, jstn, jtn
april -> apr, aprl
swedish -> swed swd
banglore -> blore
katrina -> kat
有什么好的方案来编码术语,以便它们的文本说话和缩短的单词也可以匹配它们?我能想到:
删除元音:april->aprl
去掉元音并跳过一些辅音:banglore->bnglr,bglr
Metaphone它为发音相似的单词生成相同的散列
最佳答案
我不确定是否有一个静态数据库来完成这项任务。可能有数以百万计的“文本说话”术语,你真的认为你可以收集所有这些术语并保持你的数据库的最新,当每周可能有数以百计的新术语被“发明”时?
我宁愿考虑使用评分系统来实现这一点。首先你需要一个“已知单词”列表。如果你想手工管理,这个列表可以限制在几百字以内。另一方面,它也可能是巨大的,例如,你可以从一本英语词典中提取所有单词,包括两个包含通用名和姓的列表,以及通用公司名和产品名(例如,注册商标列表将涵盖大多数公司名和产品名)当然,这也是一个可能需要定期更新的数据库,但至少你只需要更新已知的单词,而不是所有的“文本说话”术语。请注意,在某些系统上,您可能可以使用内置的拼写检查词典,这些词典已经为您提供了大量已知单词。
您不必保留大量的“文本说话”术语,而是尝试按照一组规则将用户输入到已知单词列表中的任何内容进行匹配:
“文本说话”一词的所有字母都必须出现在单词中。
所有字母的出现顺序必须与“文本说话”术语中的顺序相同。
光是这些规则就已经消除了很多不可能的词汇现在对于剩下的单词,你需要一种方法来确定这个单词是用户的意思这就是得分系统发挥作用的地方你试着用某种启发式的方法猜测哪个词更可能。
所有剩下的单词都得0分。对于每两个连续的“文本说话”字母,在剩余的单词中也是连续的(中间没有其他字母被遗漏),您将分数增加2,因为这使单词更可能。对于每两个连续的“文本说话”字母,如果它们在剩余的单词中不是连续的,但中间只有被省略的元音,则将分数增加1,因为这仍然会使命中率更高,但不像以前那样可能。等等。你也可以考虑导致负分的情况,再次降低单词的分数。根据单词的长度与“文本说话”术语的长度之比,单词会得到负分。
这样的启发式永远不会有完美的结果,但如果你调整好你的得分,它可以有相当好的结果。例如,apr
匹配april
,但它也匹配aprilfool
,根据上述规则,它获胜,因为它更短,更接近april
的长度apr
将匹配jst
但也匹配just
在这种情况下justin
会赢,这可能是不正确的,但它也可能是正确的,因为我已经多次看到just
了当然,jst
在您的情况下可能没有意义,所以不要将其添加到已知单词列表中。为了得到一个好的评分系统,人们只需简单地实现它,然后开始微调它,通过添加或删除评分规则,以及在规则匹配的情况下更改添加或减去的分数。你玩得越多越好。
还要记住,如果有疑问,你可以问用户。例如,如果用户键入just
,则显示一个带有just
、后跟jst
的命中列表,并且该列表上的第一个命中始终显示为自动建议,但用户也可以指向第二个列表条目以完成该项。作为奖励,你可以让评分系统成为一个学习评分系统如果用户到目前为止搜索了10次Justin
,并且每次从列表中选择Justine
,则从不jst
,则用户似乎更希望搜索Justine
,而不是Justin
。在这种情况下,您可能会记住这个选择,并给予Justine
一些额外的加分,以便它在未来总是会战胜Justin
这样的学习评分系统采用给用户,因为随着时间的推移,当用户输入一个特定的“文本说话”术语时,它将学习用户的确切含义。
顺便说一句,评分系统是大多数垃圾邮件过滤服务器和客户端软件的工作方式。包括“学习能力”,如果用户自己标记为垃圾邮件或取消标记为垃圾邮件的错误的东西一开始大多数垃圾邮件过滤系统都是好的,不是很好。如果你继续使用和这样的“训练”他们更长的时间,他们会越来越好,最终,他们将在99%的情况下是正确的。
关于algorithm - 如何进行实用的文字编码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14400688/