作者丨苏剑林

单位丨广州火焰信息科技有限公司

研究方向丨NLP,神经网络

个人主页丨kexue.fm

缘起

前几天看到了这个脑洞清奇的对联AI,大家都玩疯了一文,觉得挺有意思,难得的是作者还整理并公开了数据集,所以决定自己尝试一下。

动手

“对对联”,我们可以看成是一个句子生成任务,可以用 Seq2Seq 完成,跟我之前写的玩转Keras之Seq2Seq自动生成标题一样,稍微修改一下输入即可。上面提到的文章所用的方法也是 Seq2Seq,可见这算是标准做法了。

分析

然而,我们再细想一下就会发现,相对于一般的句子生成任务,“对对联”有规律得多:1)上联和下联的字数一样;2)上联和下联的每一个字几乎都有对应关系。

如此一来,其实对对联可以直接看成一个序列标注任务,跟分词、命名实体识别等一样的做法即可。这便是本文的出发点。

说到这,其实本文就没有什么技术含量了,序列标注已经是再普通不过的任务了,远比一般的 Seq2Seq来得简单。

所谓序列标注,就是指输入一个向量序列,然后输出另外一个通常长度的向量序列,最后对这个序列的“每一帧”进行分类。相关概念来可以在简明条件随机场CRF介绍 | 附带纯Keras实现一文进一步了解。

模型

本文直接边写代码边介绍模型。如果需要进一步了解背后的基础知识的读者,还可以参考《中文分词系列:基于双向LSTM的Seq2Seq字标注》[1]《中文分词系列:基于全卷积网络的中文分词》[2]《基于CNN和VAE的作诗机器人:随机成诗》[3]

我们所用的模型代码如下:

x_in = Input(shape=(None,))x = x_inx = Embedding(len(chars)+1, char_size)(x)x = Dropout(0.25)(x)

x = gated_resnet(x)x = gated_resnet(x)x = gated_resnet(x)x = gated_resnet(x)x = gated_resnet(x)x = gated_resnet(x)

x = Dense(len(chars)+1, activation='softmax')(x)

model = Model(x_in, x)model.compile(loss='sparse_categorical_crossentropy',              optimizer='adam')

其中gated_resnet是我定义的门卷积模块:

def gated_resnet(x, ksize=3):    # 门卷积 + 残差    x_dim = K.int_shape(x)[-1]    xo = Conv1D(x_dim*2, ksize, padding='same')(x)    return Lambda(lambda x: x[0] * K.sigmoid(x[1][..., :x_dim]) \                            + x[1][..., x_dim:] * K.sigmoid(-x[1][..., :x_dim]))([x, xo])

仅此而已,就这样完了,剩下的都是数据预处理的事情了。当然,读者也可以尝试也可以把gated_resnet换成普通的层叠双向 LSTM,但我实验中发现层叠双向 LSTM 并没有层叠gated_resnet效果好,而且 LSTM 相对来说也很慢。

效果

训练的数据集来自以下链接,感谢作者的整理。

https://github.com/wb14123/couplet-dataset

完整代码:

https://github.com/bojone/seq2seq/blob/master/couplet_by_seq_tagging.py

训练过程:

 对联机器人训练过程

部分效果:

看起来还是有点味道的。注意“晚风摇树树还挺”是训练集的上联,标准下联是“晨露润花花更红”,而模型给出来的是“夜雨敲花花更香”,说明模型并不是单纯地记住训练集的,还是有一定的理解能力;甚至我觉得模型对出来的下联更生动一些。

总的来说,基本的字的对应似乎都能做到,就缺乏一个整体感。总体效果没有下面两个好,但作为一个小玩具,应该能让人满意了。

王斌版AI对联:https://ai.binwang.me/couplet/

微软对联:https://duilian.msra.cn/default.htm

结语

最后,也没有什么好总结的。我就是觉得这个对对联应该算是一个序列标注任务,所以就想着用一个序列标注的模型来试试看,结果感觉还行。

当然,要做得更好,需要在模型上做些调整,还可以考虑引入 Attention 等,然后解码的时候,还需要引入更多的先验知识,保证结果符合我们对对联的要求。这些就留给有兴趣做下去的读者继续了。

相关链接

[1] https://kexue.fm/archives/3924

[2] https://kexue.fm/archives/4195

[3] https://kexue.fm/archives/5332

点击以下标题查看作者其他文章:

  • 变分自编码器VAE:原来是这么一回事 | 附开源代码

  • 再谈变分自编码器VAE:从贝叶斯观点出发

  • 变分自编码器VAE:这样做为什么能成?

  • 从变分编码、信息瓶颈到正态分布:论遗忘的重要性

  • 深度学习中的互信息:无监督提取特征

  • 全新视角:用变分推断统一理解生成模型

  • 细水长flow之NICE:流模型的基本概念与实现

  • 细水长flow之f-VAEs:Glow与VAEs的联姻

  • 深度学习中的Lipschitz约束:泛化与生成模型

#投 稿 通 道#

让你的论文被更多人看到

如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢? 答案就是:你不认识的人。

总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。

PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学习心得技术干货。我们的目的只有一个,让知识真正流动起来。

来稿标准:

• 稿件确系个人原创作品,来稿需注明作者个人信息(姓名+学校/工作单位+学历/职位+研究方向)

• 如果文章并非首发,请在投稿时提醒并附上所有已发布链接

• PaperWeekly 默认每篇文章都是首发,均会添加“原创”标志

? 投稿邮箱:

• 投稿邮箱:hr@paperweekly.site

• 所有文章配图,请单独在附件中发送

• 请留下即时联系方式(微信或手机),以便我们在编辑发布时和作者沟通

?

现在,在「知乎」也能找到我们了

进入知乎首页搜索「PaperWeekly」

点击「关注」订阅我们的专栏吧

关于PaperWeekly

PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。

▽ 点击 |阅读原文 | 查看作者博客

基于CNN和序列标注的对联机器人 | 附数据集 开源代码相关推荐

  1. python关键词对联_keras基于CNN和序列标注的对联机器人

    动手 # "对对联",我们可以看成是一个句子生成任务,可以用seq2seq完成 分析 # 然而,我们再细想一下就会发现,相对于一般的句子生成任务,"对对联"有规 ...

  2. keras基于CNN和序列标注的对联机器人

    动手 # "对对联",我们可以看成是一个句子生成任务,可以用seq2seq完成 分析 # 然而,我们再细想一下就会发现,相对于一般的句子生成任务,"对对联"有规 ...

  3. 基于卷积神经网络的手写数字识别(附数据集+完整代码+操作说明)

    基于卷积神经网络的手写数字识别(附数据集+完整代码+操作说明) 配置环境 1.前言 2.问题描述 3.解决方案 4.实现步骤 4.1数据集选择 4.2构建网络 4.3训练网络 4.4测试网络 4.5图 ...

  4. 开源四足机器人 附设计图及代码

    斯坦福学生机器人俱乐部(Stanford Student Robotics club)Extreme Mobility 团队最近迎来了一名新成员--一个名为 Stanford Doggo 的四足机器人 ...

  5. 基于PyTorch+YOLOv4的口罩佩戴检测,附数据集

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 本项目是利用YOLOv4进行口罩佩戴检测,使用PyTorch实现.虽然现在国内疫情基本得到有效 ...

  6. 【通信】基于OFDMA系统的多用户资源分配求解论附文和MATLAB代码

    1 简介 随着生活质量的不断提高,人们对通信业务的要求日益增长,现有的通信系统已经无法满足人们的多样化需求.因此,研究人员正在致力于新型通信技术的研究.协作中继通信技术充分利用了无线媒介的广播特性,在 ...

  7. python车牌识别系统开源代码_HyperLPR 基于keras-tensorflow的车牌识别

    HyperLPR 高性能开源中文车牌识别框架 一键安装 python -m pip install hyperlpr 支持python3,支持Windows Mac Linux 树莓派等. 720p ...

  8. 中文分句java_基于CRF序列标注的中文依存句法分析器的Java实现

    这是一个基于CRF的中文依存句法分析器,内部CRF模型的特征函数采用 双数组Trie树(DoubleArrayTrie)储存,解码采用特化的维特比后向算法.相较于<最大熵依存句法分析器的实现&g ...

  9. 依存分析:基于序列标注的中文依存句法分析模型实现

    一.前言 1.中文依存句法分析 二.实战 1.数据源 数据采用清华大学语义依存网络语料作为训练集,同时在开发集上进行测试. (1)语料预处理 原语料库如下: 1 坚决 坚决 a ad _ 2 方式 2 ...

最新文章

  1. Qt中文手册 之 QTableWidgetItem
  2. 程序员正在消失!90%的人都不知道,写不出好代码,是输在了这点上!
  3. 液体冷却将在数据中心重现
  4. 场效应管的判别、检测及使用时的注意事项!
  5. 【STM32】STM32f4学习之路--嘀嗒定时器
  6. [SpringBoot2]文件上传_单文件与多文件上传的使用
  7. post postman 传递数组对象_如何使用postman做接口测试
  8. 一个42KB的文件,解压完其实是个4.5PB的“炸弹”
  9. C语言 extern - C语言零基础入门教程
  10. C++ 二进制文件读操作
  11. node连接--MySQL
  12. php yield 个人小解_PHP中的性能优化利器:生成器 yield 理解
  13. Office 2007:另存为PDF或XPS
  14. 集训队论文之经典数学题【收藏】
  15. 世界坐标系、相机坐标系和图像坐标系的转换
  16. 论文投稿排版时,Word首页插入连续分节符,后面的内容自动到下一页
  17. 射频识别技术漫谈(4)——数据编码
  18. 微信小程序设置了合法请求域名,小程序一直提示不在合法域名列别中
  19. 优秀的PPT模板网站
  20. 配准带尺度点云的方法汇总

热门文章

  1. Quartus II -Warning (169177): 68 pins must meet Altera requirements for 3.3-, 3.0-, and 2.5-V
  2. Nginx配置的那些七七八八事
  3. H5手绘地图(自定义栅格图层)踩坑
  4. 常见的几个非关系型数据库(NoSQL)、非关系型和关系型的区别
  5. 药品搜索开发API接口-查询药品信息
  6. 因BIOS设定导致GPU无法使用问题
  7. IIS的404页面乱码:鏃犳硶鏄剧ず椤甸潰锛屽洜涓哄彂鐢熷唴閮ㄦ湇鍔″櫒閿欒銆�的解决方法
  8. 用 chrome + excel + VBA + XMLHTTP 爬视频网站 video 标签中的 blob:http m3u8 视频资源,ffmpeg 拼接资源
  9. 树莓派使用红外收发(一):设备安装
  10. sql查询数据库中所有表名