2

我正在尝试为 Android 开发键盘,但我不了解有关如何通过在键盘上滑动(跟踪)它们来实现单词预测的背景理论/算法,因为它们是在 Swype、SwiftKeys 和 Android 内置键盘中实现的.

任何文档或示例都会受到赞赏。

4

3 回答 3

1

我们可以将输入过程分解成更易于管理的块。

  1. 用户将手指放在/靠近起始字母。
  2. 用户将手指拖过/靠近 X 多个字母。
  3. 用户在最后一个字母上/附近松开手指。

这样做的结果是一些混乱的字母,其中顺序接近度是他们试图输入的实际单词的最重要指标。所以现在,任务是获取这个排序的字母列表并在我们的字典中找到最接近的匹配项。

这里简单的蛮力方法是通过删除字母来查询数据库中的单词。例如,“DSRTYUIOKNBVFRE”可以合法地包含“DRY”、I”、“DO”、“RUN”、“SUN”、“SON”、“STOVE”、“DRIVE”、“STOKE”,可能还有几十个或其他人也是如此。突然间,我们已经将搜索空间从数千个字典中减少到几十个单词。

但我们可以做得更好。我们知道用户可能在正确的字母附近开始并在正确的字母附近结束,所以像“DRY”、“I”、“DO”、“RUN”和“SON”这样的词不太可能是正确的,因为它们错过了很多输入开头和/或结尾处的字母数。所以我们可以将列表细化为我找到的最后三个:“STOVE”、“DRIVE”和“STOKE”(可能还有十几个)

假设我们还根据用户的手指靠近它们的距离来衡量字母,我们可以进一步细化这个列表,然后按顺序将它们呈现给用户。

显然,我在这里跳过了棘手的细节——比如将“DSRTYUIOKNBVFRE”的混乱转换为可能的单词列表,并根据输入和找到的字符串执行匹配。但我希望我已经概述了这种键盘的工作原理(而且我确信它们现在比我的描述先进得多)。

于 2013-10-22T08:06:32.537 回答
1

我有一些建议。

首先,看一下AnySoftKeyboard源代码。这是基本但功能齐全的文本预测和字典。代码很干净,可以为扩展提供一个很好的平台。查看SuggestWordComposerBinaryDictionary类,了解与单词预测相关的功能。它有一个词频词典,告诉你一个词在“现实生活”中出现的频率。

其次是滑动算法。当用户滑动时,您可以确定的是他们开始和结束的字符。这是预测的一个很好的开始。我用 Swype 玩了一下,它似乎总是尊重开始和结束字符。

在开始字符和结束字符之间,您有滑动通过的字符。这些是填补空白的可能字符。现在,您可以通过组合这些字符并在字典中查找可能的单词来开始猜测。您总是从起始字符开始猜测,从滑动中填写一些候选人,并以结束字符结束。向用户显示字典中的最佳(最高频率)匹配项。

可以尝试很多组合,比如 2^(n-2) 其中 n 是滑动下的字符数。所以我建议使用“贪婪”搜索并从头开始连续添加字符,如果它们与字典中的单词匹配则保留它们,否则丢弃它们。可能需要对这种方法进行一些改进。

您可以使用的另一个信息来源是当滑动减慢或改变特定角色的方向时。您可以通过计算触摸手势的速度(或加速度)来检测这一点。速度低(或高减速)的点很可能是用户想要的字符。

例如,有人刷了“the”。他们从t开始,在h改变方向,并在e结束。这些是你的已知点。然后你开始猜测:the、tyhe、thge、thgfe 等等,并从字典中挑选频率最高的单词,在这种情况下显然是 'the'。

采用该算法并将其与 AnySoftKeyboard 中内置的预测相结合应该会产生一些有效的东西。

希望对您有所帮助...如果您构建它,请告诉我们!

于 2013-10-25T15:12:19.293 回答
0

单词算法的预测会像这样。
您可以在 apk 中提供自己的静态字典。当用户安装它时,您可以在安装和首次使用后提供单词预测。
为了改善用户体验,您可以使用一种算法来查找用户输入的常用词。
并以标准英语(美国)键盘为例,您可以看到与滑动用户所做的字母键的接近程度,并相应地显示建议。
IE。如果用户想要输入(滑动)单词"SUN",他从字母S开始滑动并继续到Y而不是U,最后到N。所以你可以使用PROXIMITY在字母Y上找到最近的一组字母。建议的T、G、H、J 和 U。STN、SGN、SJN、SHN、SUN。因此您可以在文本框中显示SUNTYPE - "SUN"或者如果用户使用“SGN”或“SVN”的频率更高,您可以向用户建议“SGN”、“SUN”,让用户选择正确的词。
走向广阔。使用句子预测单词
继续单词“SUN”的相同示例


SVN并直接将未键入(miss-swiped)的SYN更正为SVN
或者如果用户想输入一个句子
The SUN will rise in north today,
您可以根据句子上下文(如单词rise等)应用相同的内容,并让SYN错误自动更正为SUN

注:
这是我设计算法的想法。如果我必须实现同样的事情,我将使用这样的算法

于 2013-10-24T15:32:15.030 回答