基于CNN和序列标注的对联机器人 | 附数据集 开源代码
作者丨苏剑林
单位丨广州火焰信息科技有限公司
研究方向丨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:这样做为什么能成?
从变分编码、信息瓶颈到正态分布:论遗忘的重要性
深度学习中的互信息:无监督提取特征
全新视角:用变分推断统一理解生成模型
细水长flow之NICE:流模型的基本概念与实现
细水长flow之f-VAEs:Glow与VAEs的联姻
深度学习中的Lipschitz约束:泛化与生成模型
#投 稿 通 道#
让你的论文被更多人看到
如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢? 答案就是:你不认识的人。
总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。
PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学习心得或技术干货。我们的目的只有一个,让知识真正流动起来。
? 来稿标准:
• 稿件确系个人原创作品,来稿需注明作者个人信息(姓名+学校/工作单位+学历/职位+研究方向)
• 如果文章并非首发,请在投稿时提醒并附上所有已发布链接
• PaperWeekly 默认每篇文章都是首发,均会添加“原创”标志
? 投稿邮箱:
• 投稿邮箱:hr@paperweekly.site
• 所有文章配图,请单独在附件中发送
• 请留下即时联系方式(微信或手机),以便我们在编辑发布时和作者沟通
?
现在,在「知乎」也能找到我们了
进入知乎首页搜索「PaperWeekly」
点击「关注」订阅我们的专栏吧
关于PaperWeekly
PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。
▽ 点击 |阅读原文 | 查看作者博客
基于CNN和序列标注的对联机器人 | 附数据集 开源代码相关推荐
- python关键词对联_keras基于CNN和序列标注的对联机器人
动手 # "对对联",我们可以看成是一个句子生成任务,可以用seq2seq完成 分析 # 然而,我们再细想一下就会发现,相对于一般的句子生成任务,"对对联"有规 ...
- keras基于CNN和序列标注的对联机器人
动手 # "对对联",我们可以看成是一个句子生成任务,可以用seq2seq完成 分析 # 然而,我们再细想一下就会发现,相对于一般的句子生成任务,"对对联"有规 ...
- 基于卷积神经网络的手写数字识别(附数据集+完整代码+操作说明)
基于卷积神经网络的手写数字识别(附数据集+完整代码+操作说明) 配置环境 1.前言 2.问题描述 3.解决方案 4.实现步骤 4.1数据集选择 4.2构建网络 4.3训练网络 4.4测试网络 4.5图 ...
- 开源四足机器人 附设计图及代码
斯坦福学生机器人俱乐部(Stanford Student Robotics club)Extreme Mobility 团队最近迎来了一名新成员--一个名为 Stanford Doggo 的四足机器人 ...
- 基于PyTorch+YOLOv4的口罩佩戴检测,附数据集
向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程 公众号:datayx 本项目是利用YOLOv4进行口罩佩戴检测,使用PyTorch实现.虽然现在国内疫情基本得到有效 ...
- 【通信】基于OFDMA系统的多用户资源分配求解论附文和MATLAB代码
1 简介 随着生活质量的不断提高,人们对通信业务的要求日益增长,现有的通信系统已经无法满足人们的多样化需求.因此,研究人员正在致力于新型通信技术的研究.协作中继通信技术充分利用了无线媒介的广播特性,在 ...
- python车牌识别系统开源代码_HyperLPR 基于keras-tensorflow的车牌识别
HyperLPR 高性能开源中文车牌识别框架 一键安装 python -m pip install hyperlpr 支持python3,支持Windows Mac Linux 树莓派等. 720p ...
- 中文分句java_基于CRF序列标注的中文依存句法分析器的Java实现
这是一个基于CRF的中文依存句法分析器,内部CRF模型的特征函数采用 双数组Trie树(DoubleArrayTrie)储存,解码采用特化的维特比后向算法.相较于<最大熵依存句法分析器的实现&g ...
- 依存分析:基于序列标注的中文依存句法分析模型实现
一.前言 1.中文依存句法分析 二.实战 1.数据源 数据采用清华大学语义依存网络语料作为训练集,同时在开发集上进行测试. (1)语料预处理 原语料库如下: 1 坚决 坚决 a ad _ 2 方式 2 ...
最新文章
- Qt中文手册 之 QTableWidgetItem
- 程序员正在消失!90%的人都不知道,写不出好代码,是输在了这点上!
- 液体冷却将在数据中心重现
- 场效应管的判别、检测及使用时的注意事项!
- 【STM32】STM32f4学习之路--嘀嗒定时器
- [SpringBoot2]文件上传_单文件与多文件上传的使用
- post postman 传递数组对象_如何使用postman做接口测试
- 一个42KB的文件,解压完其实是个4.5PB的“炸弹”
- C语言 extern - C语言零基础入门教程
- C++ 二进制文件读操作
- node连接--MySQL
- php yield 个人小解_PHP中的性能优化利器:生成器 yield 理解
- Office 2007:另存为PDF或XPS
- 集训队论文之经典数学题【收藏】
- 世界坐标系、相机坐标系和图像坐标系的转换
- 论文投稿排版时,Word首页插入连续分节符,后面的内容自动到下一页
- 射频识别技术漫谈(4)——数据编码
- 微信小程序设置了合法请求域名,小程序一直提示不在合法域名列别中
- 优秀的PPT模板网站
- 配准带尺度点云的方法汇总
热门文章
- Quartus II -Warning (169177): 68 pins must meet Altera requirements for 3.3-, 3.0-, and 2.5-V
- Nginx配置的那些七七八八事
- H5手绘地图(自定义栅格图层)踩坑
- 常见的几个非关系型数据库(NoSQL)、非关系型和关系型的区别
- 药品搜索开发API接口-查询药品信息
- 因BIOS设定导致GPU无法使用问题
- IIS的404页面乱码:鏃犳硶鏄剧ず椤甸潰锛屽洜涓哄彂鐢熷唴閮ㄦ湇鍔″櫒閿欒銆�的解决方法
- 用 chrome + excel + VBA + XMLHTTP 爬视频网站 video 标签中的 blob:http m3u8 视频资源,ffmpeg 拼接资源
- 树莓派使用红外收发(一):设备安装
- sql查询数据库中所有表名