利用Transformer生成弹幕

1.前言

最近研究了Transformer模型,主要参考了github里面对Transformer的实现,其代码为:
https://github.com/Kyubyong/transformer

而我自己实现的弹幕生成代码的github地址为:
https://github.com/llq20133100095/transformer_barrages

2.模型原理

2.1 Transformer模型

Transformer模型已经有很多大佬介绍了,这里我只是简单贴出常见的模型图:
Transformer
这里如果要使用transformer生成弹幕,则需要有效构建数据集。

2.2 数据集构建

这里用到了弹幕的数据集,同时利用sentencepiece对句子进行分词。分词之后的句子如下所示:

▁仙女 有盒子
▁怎么不开车 去捡 啊

sentencepiece分词有一个好处就是,词语前面有“▁”代表的是独立的词语,而没有这个前缀的,则代表的是可以进行前后组合的词语,比如“去捡”+“啊”,这两个词语可以组成一个词语。

接下来则构建输入和输出句子的形式。

  • encode中输入句子:句子 + </s>
  • decode中输入句子:<s> + 句子
  • decode中输出句子:<s> + 句子 + </s>

具体例子如下:

原始句子:▁仙女 有盒子
encode中输入句子:▁仙女 有盒子 \</s>
decode中输入句子:\<s> ▁仙女 有盒子
decode中输出句子:\<s> ▁仙女 有盒子 \</s>

2.3 弹幕生成时的操作

最后训练好模型时,在测试的时候不断拼接生成的新向量输入到encode和decode中,形成循环生成,代码中的写法如下:

for _ in tqdm(range(3)):
    memory, sents1, src_masks = self.encode(xs, False)

    logits, y_hat, y, sents2 = self.decode(ys, memory, src_masks, False)
    if tf.reduce_sum(y_hat, 1) == self.token2idx["<pad>"]: break

    # concat input
    _x = tf.concat((x, random_id(logits)), 1)
    xs = (_x, seqlens, sents1)

    _decoder_inputs = tf.concat((decoder_inputs, random_id(logits)), 1)
    ys = (_decoder_inputs, y, y_seqlen, sents2)

其中重新构造了_x进行输入,同时也重新构造_decoder_inputs输入。

3.执行过程

3.1 Train

  • STEP 1. 运行下面的命令,生成预处理的弹幕语料
python pretreatment/prepro.py

如果你想调整默认的词典大小(default:32000),可以进行下面的命令:

python pretreatment/prepro.py --vocab_size 8000

它会创建两个文件 barrages_data/prepro and barrages_data/segmented.

  • STEP 2. 训练模型
python train.py

参数设置放在 hparams.py ,可以根据里面的参数进行对应设置,比如:

python train.py --logdir myLog --batch_size 256 --dropout_rate 0.5
  • STEP 3. 根据输入的句子,生成弹幕
python barrrages_generate.py

3.2 Result

当输入:

老司机

输出句子:

输出句子

3.3 运行在微信界面上

运行代码:

python ichat_robot.py

结果:
结果

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

洛克-李

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

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

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

打赏作者

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

抵扣说明:

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

余额充值