我正在尝试开发适用于Android的键盘,我不了解如何通过在键盘上滑动(跟踪)它们来实现单词预测的背景理论/算法,因为它们是在Swype,SwiftKeys和Android Built中实现的-in键盘。
赞赏任何文件或示例。
答案 0 :(得分:1)
我们可以将输入过程分解为更易于管理的块。
结果是一些混乱的字母,其中顺序和接近度是他们试图输入的实际单词的最重要指标。所以现在,任务是获取这个排序的字母列表,并在我们的字典中找到最接近的匹配。
这里简单,强力的方法是通过删除字母来查询数据库中的单词。例如,“DSRTYUIOKNBVFRE”可以合法地包含“DRY”,“我”,“DO”,“RUN”,“SUN”,“SON”,“STOVE”,“DRIVE”,“STOKE”,可能还有几十个或者所以其他人。突然之间,我们已经将搜索空间从数千字典中减少到几十个字。
但我们可以做得更好。我们知道用户可能在正确的字母附近开始并且在正确的字母附近结束,因此“干”,“我”,“DO”,“运行”和“SON”之类的单词不太可能是正确的,因为他们错过了很多在输入的开头和/或结尾处的字母。所以我们可以将列表细化到我发现的最后三个:“STOVE”,“DRIVE”和“STOKE”(可能还有十几个)
假设我们还根据用户手指靠近它们的位置对字母进行称重,我们可以进一步优化此列表,然后按顺序将它们呈现给用户。
显然,我已经跳过了这里棘手的细节 - 比如将“DSRTYUIOKNBVFRE”的混乱转换为可能的单词列表,并根据输入和找到的字符串执行匹配。但我希望我已经概述了这些键盘是如何工作的(我相信它们现在比我的描述更先进了。)
答案 1 :(得分:1)
我有一些建议。
首先,看一下AnySoftKeyboard源代码。这是基本但功能齐全的文本预测和词典。代码很干净,可以成为扩展的良好平台。查看建议, WordComposer 和 BinaryDictionary 类,了解与单词预测相关的功能。它有一个带有词频的字典,可以告诉你在“现实生活”中找到一个单词的频率。
其次是滑动算法。当用户滑动时,您确切知道的是他们开始和完成的字符。这是预测的一个很好的开始。我玩了一下Swype,似乎总是尊重开始和结束角色。
在开始和结束字符之间,您有滑动传递的字符。这些是填写空白的可能字符。现在你可以通过组合这些字符并检查字典中的可能单词来开始猜测。你总是用起始角色开始猜测,从滑动中填入一些候选人,然后以完成角色结束。从字典中向用户显示最佳(最高频率)匹配。
这可能是很多组合尝试,比如2 ^(n-2),其中n是滑动下的字符数。所以我建议使用'贪婪'搜索并从头开始连续添加字符,如果它们与字典中的单词匹配则保留它们,否则丢弃它们。可能需要对这种方法进行一些改进。
您可以使用的另一个信息来源是滑动减慢或更改特定角色的方向。您可以通过计算触摸手势的速度(或加速度)来检测这一点。速度较低(或高减速度)的点可能是用户想要的字符。
举个例子,有人刷了'the'。他们从 t 开始,在 h 上改变方向,并在 e 上结束。这些是你已知的观点。然后你开始猜测:the,tyhe,thge,thgfe等等,然后从字典中选出频率最高的单词,在这种情况下显然是“the”。
采用该算法并将其与AnySoftKeyboard中内置的预测相结合,可以产生有效的方法。
希望有帮助...告诉我们你是否建立它!
答案 2 :(得分:0)
单词algo的预测将会是这样的。
你可以在apk中提供自己的静态字典。当用户安装它时,您可以在安装和首次使用后开始提供单词预测。
为了改善用户体验,您可以使用算法来查找用户键入的常用词。
并且考虑到标准英语(美国)键盘作为示例,您可以看到滑动用户已完成的字母键的接近度并相应地显示建议。
即。如果用户想要键入(滑动)单词“SUN”,他会从字母 S 开始滑动并继续 Y 而不是 U ,最后是 N 。因此,您可以使用字母 Y 上的接近来查找最接近的字母集。这表明 T,G,H,J和U 。单词 STN,SGN,SJN,SHN,SUN 。这样您就可以在文本框中显示 SUN 或 TYPE - “SUN”。 或者如果用户更频繁地使用“SGN”或“SVN”,您可以向用户建议“SGN”,“SUN”并让用户选择正确的话。
走得很远。用句子预测单词
继续使用“SUN”一词的相同例子
如果用户想要输入的句子是
我今晚将在SVN上承诺
所以你可以在单词周围有句子的上下文(比如单词commit等..) SVN 并纠正错过类型(错过刷新) SYN 到< strong> SVN 直接。
或者如果用户想要输入句子
SUN今天将在北方升起
您可以根据句子上下文应用相同的内容(如单词上升等...)并让 S-Y-N 错误自动更正为 SUN 。
注意:
这是我设计算法的想法。如果我必须实现同样的事情,我将使用像这样的算法。