词预测算法

时间:2013-09-10 20:35:12

标签: algorithm machine-learning

我确定有一个帖子,但我找不到一个问这个确切的问题。请考虑以下事项:

  1. 我们有一个单词词典
  2. 我们收到很多段的单词,我希望能够根据这个输入预测句子中的下一个单词。
  3. 假设我们有一些句子,例如“你好我的名字是汤姆”,“他的名字是杰里”,“他去没有水的地方”。如果单词存在,我们检查哈希表。如果没有,我们为它分配一个唯一的id并将其放在哈希表中。这样,我们可以只有一个uniqueID列表,而不是将一串“单词”存储为一串字符串。

    上面,我们将有例如(0,1,2,3,4),(5,2,3,6)和(7,8,9,10,3,11,12)。请注意,3是“is”,我们在发现新单词时添加了新的唯一ID。所以说我们得到一个句子“她的名字是”,这将是(13,2,3)。在这个背景下,我们想知道下一个词应该是什么。这是我想到的算法,但我认为它没有效率:

    1. 我们有一个N链(观察句子)列表,其中一个链可能是ex。 3,6,2,7,8。
    2. 每条链的平均大小为M,其中M是平均句子长度
    3. 我们获得了一个大小为S的新链条,例如。 13,2,3,我们想知道最有可能的下一个词是什么?
    4. 算法:

      1. 首先扫描包含完整S输入的链的整个链表(在此示例中为13,2,3)。由于我们必须扫描N个链,每个长度为M,并且一次比较S个字母,其O(N * M * S)。

      2. 如果我们的扫描中没有链条具有完整的S,则通过删除最不重要的单词(即第一个单词,然后删除13)进行下一次扫描。现在,扫描(2,3),如在最坏的情况下为1(O * N * M * S),这是真正的S-1。

      3. 继续扫描,直到我们得到结果> 0(如果有的话)。

      4. 记下我们收集的所有剩余链中的下一个字。我们可以使用哈希表,每次添加时都会对其进行计数,并跟踪最多添加的单词。 O(N)最坏情况构建,O(1)找到最大字。

      5. 找到的最大单词是最有可能的,所以请将其返回。
      6. 每次扫描都采用O(M * N * S)最差情况。这是因为有N个链,每个链都有M个数字,我们必须检查S个数字以覆盖匹配。我们扫描最坏情况的S次(13,2,3,然后是2,3,然后3次扫描= S)。因此,总复杂度为O(S ^ 2 * M * N)。

        因此,如果我们有100,000个链并且平均句子长度为10个单词,那么我们正在寻找1,000,000 * S ^ 2来获得最佳单词。显然,N>> M,因为句子长度一般不随着观察句子的数量而缩放,所以M可以是常数。然后我们可以将复杂度降低到O(S ^ 2 * N)。然而,O(S ^ 2 * M * N)可能对分析更有帮助,因为M可以是相当大的“常数”。

        对于这类问题,这可能是完全错误的方法,但我想分享我的想法而不是公然要求协助。我扫描我的方式的原因是因为我只想尽可能多地扫描。如果没有完整的S,只需保持修剪S直到某些链匹配。如果他们永远不匹配,我们不知道下一个词会预测什么!关于更少时间/空间复杂解决方案的任何建议?谢谢!

2 个答案:

答案 0 :(得分:19)

这是language modeling的问题。对于基线方法,您唯一需要的是一个哈希表,将长度为 k 的固定长度的词链映射到最可能的后续单词。(*)

在训练时,您使用滑动窗口将输入分解为(k+1)-grams。所以,如果遇到

The wrath sing, goddess, of Peleus' son, Achilles

k = 2生成

START START the
START the wrath
the wrath sing
wrath sing goddess
goddess of peleus
of peleus son
peleus son achilles

这可以在线性时间内完成。对于每个3-gram,计数(在哈希表中),第三个单词跟随前两个单词的频率是多少。

最后,循环遍历哈希表,并为每个键(2克)保留最常出现的第三个单词。线性时间。

在预测时,只查看 k (2)最后一个单词并预测下一个单词。这只需要一个恒定的时间,因为它只是一个哈希表查找。

如果你想知道为什么你应该只保留短链而不是完整链,那么请研究Markov windows的理论。如果你的模型要记住它在输入中看到的所有单词链,那么它将严重overfit其训练数据并且仅在预测时再现其输入。多大程度上取决于训练集(更多数据更好),但对于 k > 4,你的模型中确实需要smoothing

(*)或概率分布,但您的简单示例用例不需要这样做。

答案 1 :(得分:4)

Yeh Whye Teh最近还有一些有趣的工作可以解决这个问题。 “序列记忆器”扩展了传统的部分匹配预测方案,以考虑任意长的历史。

以下是原始论文的链接:http://www.stats.ox.ac.uk/~teh/research/compling/WooGasArc2011a.pdf

还值得一读背景工作,可以在论文"A Bayesian Interpretation of Interpolated Kneser-Ney"

中找到。