1

我得到了用户从智能手机、哑机或电脑键盘上缩短的文本实体。这使得他们对“jstn”的搜索无法检索到“Justin Roberts”。如果他们输入“csr”,则“caesar”必须出现在自动建议中。

在预期中,我想将正确拼写的单词编码为一个或多个可能的“文本说话”术语,以便当用户输入它们时,我们可以检索、匹配和建议正确的术语。

以下是我必须考虑的一些变体拼写:

justin -> jst, jstn, jtn
april -> apr, aprl
swedish -> swed swd
banglore -> blore
katrina -> kat

有哪些好的方案可以对术语进行编码,以便它们的文字和缩短的单词也可以匹配它们?我能想到:

删除元音:april -> aprl

删除元音并跳过一些辅音:banglore -> bnglr, bglr

Metaphone为发音相似的单词生成相同的哈希

4

1 回答 1

1

我不确定为这项任务拥有一个静态数据库是否是一种好方法。可能有数百万个可能的“文本说”术语,当每周可能“发明”数百个新术语时,您真的认为您可以将它们全部收集并让您的数据库保持最新吗?

我宁愿考虑使用评分系统来实现它。首先,您需要一个“已知单词”列表。如果您想手动管理此列表,则可以限制为几百个单词。另一方面,它也可能很大,例如,您可以从英语词典中获取所有单词,包括几个包含常见名字和姓氏的列表,以及常见的公司和产品名称(例如,注册商标列表将涵盖大多数公司和产品名称)。当然,这也是一个可能需要定期更新的数据库,但至少您只需要更新已知单词,而不是所有“文本说”术语。请注意,在某些系统上,您可以使用内置的拼写检查词典,这些词典已经为您提供了大量已知单词。

除了保留大量的“文本说”术语,您还尝试按照一组规则将用户输入的任何内容与您的已知单词列表相匹配:

  1. “text-speak”一词的所有字母都必须出现在单词中。
  2. 所有字母的出现顺序必须与“text-speak”术语中的顺序相同。

仅这些规则就已经消除了许多不可能的单词。现在对于剩余的单词,您需要一种方法来确定这是用户所指单词的可能性。这就是评分系统发挥作用的地方。您尝试使用某种启发式方法来猜测哪个词更有可能。

例如,所有剩余的单词得分为 0。对于每两个连续的“text-speak”字母在剩余的单词中也是连续的(中间没有其他字母被遗漏),你将分数增加 2,因为这使得词的可能性更大。对于在剩余单词中不连续但中间只有元音的每两个连续的“文本说话”字母,您将分数增加 1,因为这仍然使命中的可能性更大,但可能性不如在之前的情况下。等等。您可能还会想到导致负分的条件,再次降低单词的分数。例如,单词根据它们的长度与“text-speak”术语的长度之间的比率获得负分。

这种启发式永远不会有完美的结果,但如果你调整好你的得分,它可以有很好的结果。例如apr匹配april,但它也匹配aprilfool,根据上述规则april获胜,因为它更短且更接近 的长度aprjst会匹配just但也justin。在那种情况下just会赢,这可能是不正确的,但它也可能是正确的,因为我已经看过很多次了jstjust当然,just在您的情况下可能没有意义,所以不要将它添加到已知单词列表中。要获得一个好的评分系统,只需实施它,然后通过添加或删除评分规则以及在规则匹配的情况下更改添加或减去的分数来开始对其进行微调。你玩得越多,它就会越好。

另请记住,如果有疑问,您可以询问用户。例如,如果用户键入jst,您会显示一个带有Justin,的命中列表,Justine并且该列表上的第一个命中始终显示为自动建议,但用户也可以指向第二个列表条目以完成该条目。作为奖励,您可以使评分系统成为学习评分系统。jst如果用户到目前为止搜索了十次,并且每次Justine从列表中选择,never Justin,看起来用户宁愿搜索而不是Justine搜索Justin。在这种情况下,您可能会记住该选择并给予Justine一些额外的奖励积分,这样它就会永远获胜Justin在将来。用户采用这种学习评分系统,因为它会随着时间的推移了解用户在输入特定“文本说”术语时的确切含义。

顺便说一句,例如评分系统是大多数垃圾邮件过滤器在服务器和客户端软件中的工作方式。如果用户自己将某些内容标记为垃圾邮件或取消标记被错误标记为垃圾邮件的内容,则包括“学习能力”。一开始,大多数垃圾邮件过滤系统都可以,但不是很好。如果您继续使用并“训练”它们更长的时间,它们会变得越来越好,最终,它们在 99% 的情况下都是正确的。

于 2013-01-18T16:23:48.417 回答