use*_*279 19 algorithm machine-learning
我确定有一个帖子,但我找不到一个问这个确切的问题.考虑以下:
假设我们有一些句子,例如"你好我的名字是汤姆","他的名字是杰里","他去没有水的地方".如果单词存在,我们检查哈希表.如果没有,我们为它分配一个唯一的id并将其放在哈希表中.这样,我们可以只有一个uniqueID列表,而不是将一串"单词"存储为一串字符串.
在上面,我们将具有例如(0,1,2,3,4),(5,2,3,6)和(7,8,9,10,3,11,12).请注意,3是"is",我们在发现新单词时添加了新的唯一ID.所以说我们得到一个句子"她的名字是",这将是(13,2,3).在这个背景下,我们想知道下一个词应该是什么.这是我想到的算法,但我认为它没有效率:
算法:
首先扫描包含完整S输入的链的整个链表(在本例中为13,2,3).由于我们必须扫描N个链,每个长度为M,并且每次比较S个字母,其O(N*M*S).
如果我们的扫描中没有链条具有完整的S,则通过删除最不重要的单词(即第一个单词,然后删除13)进行下一次扫描.现在,扫描(2,3),如在最坏情况下为1(O*N*M*S),这实际上是S-1.
继续扫描,直到我们得到结果> 0(如果有的话).
记下我们收集的所有剩余链中的下一个词.我们可以使用哈希表,每次添加时都会对其进行计数,并跟踪最多添加的单词.O(N)最坏情况构建,O(1)找到最大字.
每次扫描都采用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直到某些链匹配.如果他们永远不匹配,我们不知道下一个词会预测什么!关于更少时间/空间复杂解决方案的任何建议?谢谢!
Fre*_*Foo 19
这是语言建模的问题.对于基线方法,您唯一需要的是一个哈希表,它将固定长度的单词链(例如长度为k)映射到最可能的后续单词.(*)
在训练时,您使用滑动窗口将输入分解为(k +1) - 图表.所以,如果你遇到
The wrath sing, goddess, of Peleus' son, Achilles
Run Code Online (Sandbox Code Playgroud)
你为k = 2 生成
START START the
START the wrath
the wrath sing
wrath sing goddess
goddess of peleus
of peleus son
peleus son achilles
Run Code Online (Sandbox Code Playgroud)
这可以在线性时间内完成.对于每个3-gram,计数(在哈希表中)第三个单词跟随前两个单词的频率.
最后,循环遍历哈希表,并为每个键(2克)保留最常出现的第三个单词.线性时间.
在预测时,仅查看k(2)个最后一个单词并预测下一个单词.这只需要一个恒定的时间,因为它只是一个哈希表查找.
如果你想知道为什么你应该只保留短链而不是全链,那么请研究马尔可夫窗口的理论.如果你的模型要记住它在输入中看到的所有单词链,那么它会严重过度训练数据,并且只能在预测时重现其输入.多么严重依赖于训练集(更多数据更好),但是对于k > 4,你真的需要在你的模型中进行平滑.
(*)或概率分布,但您的简单示例用例不需要这样做.
Yeh Whye Teh最近也做了一些有趣的工作来解决这个问题。“序列记忆器”扩展了传统的按部分匹配的预测方案,以考虑任意长的历史。
这是原始论文的链接:http : //www.stats.ox.ac.uk/~teh/research/compling/WooGasArc2011a.pdf
还值得阅读一些背景工作,这些工作可以在论文“内插Kneser-Ney的贝叶斯解释”中找到。
| 归档时间: |
|
| 查看次数: |
14357 次 |
| 最近记录: |