循环神经网络多元语法实现(以二元语法为例)

(参考:李沐:动手学深度学习第8章第3节)       

在自回归模型的近似法中, 我们使用最后tau个值来预测下一个,而不是全部。 只要这种是近似精确的,我们就说序列满足马尔可夫条件。 特别是,如果tau=1,得到一个一阶马尔可夫模型。

P\left (x _{1},x _{2}...x _{T} \right )=\prod_{t=1}^{T}P\left ( x _{t}| x _{t-1}\right )​​​​​​​

       现在我们把它应用于语言建模。 如果

​​​​​​​P\left (x _{t+1}|x _{1},x _{2}...x _{t} \right )=P\left ( x _{t+1}| x _{t}\right )

       则序列上的分布满足一阶马尔可夫性质,在语言建模中这就是二元语法。翻译成人话就是:我认为预测值只和前一个已知的值有关。阶数越高,对应的依赖关系就越长。 这种性质推导出了许多可以应用于序列建模的近似公式:

一元语法(相互独立):P\left (x _{1},x _{2},x _{3},x _{4} \right )=P\left (x _{1} \right )P\left (x _{2} \right )P\left (x _{3} \right )P\left (x _{4} \right )

二元语法(只和前一个有关):P\left (x _{1},x _{2},x _{3},x _{4} \right )=P\left (x _{1} \right )P\left (x _{2}| x _{1}\right )P\left (x _{3}| x _{2} \right )P\left (x _{4}| x _{3} \right )

三元语法(只和前两个有关):P\left (x _{1},x _{2},x _{3},x _{4} \right )=P\left (x _{1} \right )P\left (x _{2}| x _{1}\right )P\left (x _{3}| x _{1}, x _{2} \right )P\left (x _{4}| x _{2}, x _{3} \right )

代码实现解析:

(1)首先导入数据集并构建词表

import random
import torch
from d2l import torch as d2l

tokens = d2l.tokenize(d2l.read_time_machine())
# 因为每个文本行不一定是一个句子或一个段落,因此我们把所有文本行拼接到一起
corpus = [token for line in tokens for token in line] # 二重循环把文本生成list
vocab = d2l.Vocab(corpus) #生成词表
print(vocab.token_freqs[:10]) #调用.token_freqs类方法

(2)二元语法实现

bigram_tokens = [pair for pair in zip(corpus[:-1], corpus[1:])]
bigram_vocab = d2l.Vocab(bigram_tokens)
print(bigram_vocab.token_freqs[:10])

这里zip的过程解析如下:

corpus=['a','b','c','d','e','f']
print(corpus[:-1]) # 打印从索引0到最后一个(不含),也就是去掉最后一个
print(corpus[1:]) # 打印从索引1到最后,也就是去掉第一个
print(list(zip(corpus[:-1], corpus[1:]))) # 打包
['a', 'b', 'c', 'd', 'e']
['b', 'c', 'd', 'e', 'f']
[('a', 'b'), ('b', 'c'), ('c', 'd'), ('d', 'e'), ('e', 'f')]

到此我们生成了二元词表。那么最后的运行结果打印频率最高的前10位:

[(('of', 'the'), 309),
 (('in', 'the'), 169),
 (('i', 'had'), 130),
 (('i', 'was'), 112),
 (('and', 'the'), 109),
 (('the', 'time'), 102),
 (('it', 'was'), 99),
 (('to', 'the'), 85),
 (('as', 'i'), 78),
 (('of', 'a'), 73)]

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北京地铁1号线

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值