如何做实用的文字说话编码

时间:2013-01-18 14:11:48

标签: algorithm language-agnostic

我获得了用户从智能手机,哑铃或电脑键盘缩短的文本实体。这使得他们对'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为类似发音的单词生成相同的哈希值

1 个答案:

答案 0 :(得分:1)

我不确定为此任务创建静态数据库是一种好方法。可能有数百万种可能的“文字说话”术语,你真的认为你可以收集它们并使数据库保持最新状态,而每周可以“发明”数百种新数据库吗?

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

您可以尝试根据一组规则将用户输入的内容与已知字词列表进行匹配,而不是保留大量“文字说话”字词:

  1. “文字说话”一词的所有字母都必须出现在单词中。
  2. 所有字母必须与“text-speak”字词中的顺序相同。
  3. 仅这些规则已经消除了许多不可能的单词。现在,对于剩余的单词,您需要一种方法来确定这是用户所指的单词的可能性。这就是评分系统发挥作用的地方。您尝试使用某种启发式方法猜测哪个词更有可能。

    E.g。所有剩余的单词得分为0.对于每两个连续的“文本说话”字母在其余单词中也是连续的(之间没有其他字母被遗漏),你将得分增加2,因为这使得单词更有可能。对于在剩余单词中不连续的每两个连续的“文本说话”字母,但在它们之间只有被忽略的元音,你将分数增加1,因为这仍然更有可能但是不太可能在之前的情况下。等等。您也可以考虑导致负分数的条件,再次降低单词的分数。例如。根据长度和“文本说话”术语的长度之间的比例,单词得分为负。

    这样的启发式方法从来都没有完美的结果,但如果你能很好地调整得分,它可以获得相当不错的效果。例如。 apr匹配april,但它也匹配aprilfool,符合上述april次胜利的规则,因为它更短,更接近apr的长度。 jst会匹配just,但也会匹配justin。在这种情况下,just会胜出,这可能是不正确的,但它也可能是正确的,因为我已经多次看到jst just。当然,just在您的情况下可能没有意义,所以只是不要将其添加到已知单词列表中。要获得一个好的评分系统,只需要实现它,然后通过添加或删除评分规则以及在规则匹配时更改添加或减少的分数来开始微调它。你玩的越多,它就会越好。

    另请注意,如果有疑问,您可以询问用户。例如。如果用户输入jst,则会显示包含Justin的匹配列表,然后显示Justine,该列表中的第一个匹配始终显示为自动建议,但用户也可以指向在第二个列表条目上完成那个。作为奖励,您可以将评分系统作为学习评分系统。如果用户到目前为止搜索了jst十次,并且每次从列表中选择Justine,则永远不会Justin,看起来用户想要搜索Justine而不是Justin。在这种情况下,你可能会记住这个选择并给予Justine几个额外的奖励积分,这样它将来总会胜过Justin。这样的学习评分系统对用户采用,因为它将随时了解用户在进入特定的“文本说话”术语时究竟是什么意思。

    BTW,例如评分系统是服务器和客户端软件中大多数垃圾邮件过滤器的工作方式。包括“学习能力”,如果用户将某事标记为垃圾邮件,或者取消标记错误标记为垃圾邮件的内容。一开始大多数垃圾邮件过滤系统都没问题,也不是很好。如果你继续使用这种“训练”它们的时间更长,它们会变得越来越好,最后,它们在99%的情况下都是正确的。