bert+seq2seq 周公解梦,看AI如何解析你的梦境?【转】
介绍
在参与的项目和产品中,涉及到模型和算法的需求,主要以自然语言处理(NLP)和知识图谱(KG)为主。NLP涉及面太广,而聚焦在具体场景下,想要生产落地的还需要花很多功夫。
作为NLP的主要方向,情感分析,文本多分类,实体识别等已经在项目中得到应用。例如
通过实体识别,抽取文本中提及到的公司、个人以及金融产品等。
通过情感分析,判别新闻资讯,对其提到的公司和个人是否利好?
通过文本多分类,判断资讯是否是高质量?判断资讯的行业和主题?
具体详情再找时间分享。而文本生成、序列到序列(Sequence to Sequence)在机器翻译、问答系统、聊天机器人中有较广的应用,在参与的项目中暂无涉及,本文主要通过tensorflow+bert+seq2seq实现一个简单的问答模型,旨在对seq2seq的了解和熟悉。
数据
关于seq2seq的demo数据有很多,例如小黄鸡聊天语料库,影视语料库,翻译语料库等等。由于最近总是做些奇怪的梦,便想着,做一个AI解梦的应用玩玩,just for fun。
通过采集从网上采集周公解梦数据,通过清洗,形成
dream:梦境;
decode:梦境解析结果。
这样的序列对,总计33000+ 条记录。数据集下载地址:后台回复“解梦”
{
"dream": "梦见商人或富翁",
"decode": "是个幸运的预兆,未来自己的事业很有机会成功,不过如果梦中的富翁是自己,则是一个凶兆。。"
}
模型准备
#下载 bert
$ git clone https://github.com/google-research/bert.git
#下载中文预训练模型
$ wget -c https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip
$ unzip chinese_L-12_H-768_A-12.zip
bert 的input:
self.input_ids = tf.placeholder(
dtype=tf.int32,
shape=[None, None],
name="input_ids"
)
self.input_mask = tf.placeholder(
dtype=tf.int32,
shape=[None, None],
name="input_mask"
)
self.segment_ids = tf.placeholder(
dtype=tf.int32,
shape=[None, None],
name="segment_ids"
)
self.dropout = tf.placeholder(
dtype=tf.float32,
shape=None,
name="dropout"
)
bert 的model :
self.bert_config = modeling.BertConfig.from_json_file(bert_config)
model = modeling.BertModel(
config=self.bert_config,
is_training=self.is_training,
input_ids=self.input_ids,
input_mask=self.input_mask,
token_type_ids=self.segment_ids,
use_one_hot_embeddings=False
)
seq2seq 的encoder_embedding 替换:
# 默认seq2seq model_inputs
# self.encoder_embedding = tf.Variable(tf.random_uniform([from_dict_size, embedded_size], -1, 1),name ="encoder_embedding")
# self.model_inputs = tf.nn.embedding_lookup(self.encoder_embedding, self.X),
# 替换成bert
self.embedded = model.get_sequence_output()
self.model_inputs = tf.nn.dropout(self.embedded, self.dropout)
seq2seq 的decoder_embedding 替换:
# 默认seq2seq decoder_embedding
# self.decoder_embedding = tf.Variable(tf.random_uniform([to_dict_size, embedded_size], -1, 1),name="decoder_embedding")
# 替换成bert
self.decoder_embedding = model.get_embedding_table()
self.decoder_input = tf.nn.embedding_lookup(self.decoder_embedding, decoder_input),
数据预处理
for i in range(len(inputs)):
tokens = inputs[i]
inputs_ids = model.tokenizer.convert_tokens_to_ids(inputs[i])
segment_ids = [0] * len(inputs_ids)
input_mask = [1] * len(inputs_ids)
tag_ids = model.tokenizer.convert_tokens_to_ids(outputs[i])
data.append([tokens, tag_ids, inputs_ids, segment_ids, input_mask])
def pad_data(data):
c_data = copy.deepcopy(data)
max_x_length = max([len(i[0]) for i in c_data])
max_y_length = max([len(i[1]) for i in c_data])
# 这里生成的序列的tag-id 和 input-id 长度要分开
# print("max_x_length : {} ,max_y_length : {}".format( max_x_length,max_y_length))
padded_data = []
for i in c_data:
tokens, tag_ids, inputs_ids, segment_ids, input_mask = i
tag_ids = tag_ids + (max_y_length - len(tag_ids)) * [0]
# 注意tag-ids 的长度补充,和预测的序列长度一致。
inputs_ids = inputs_ids + (max_x_length - len(inputs_ids)) * [0]
segment_ids = segment_ids + (max_x_length - len(segment_ids)) * [0]
input_mask = input_mask + (max_x_length - len(input_mask)) * [0]
assert len(inputs_ids) == len(segment_ids) == len(input_mask)
padded_data.append(
[tokens, tag_ids, inputs_ids, segment_ids, input_mask]
)
return padded_data
训练
$ python3 model.py --task=train \
--is_training=True \
--epoch=100 \
--size_layer=256 \
--bert_config=chinese_L-12_H-768_A-12/bert_config.json \
--vocab_file=chinese_L-12_H-768_A-12/vocab.txt \
--num_layers=2 \
--learning_rate=0.001 \
--batch_size=16 \
--checkpoint_dir=result
预测
$ python3 model.py --task=predict \
--is_training=False \
--epoch=100 \
--size_layer=256 \
--bert_config=chinese_L-12_H-768_A-12/bert_config.json \
--vocab_file=chinese_L-12_H-768_A-12/vocab.txt \
--num_layers=2 \
--learning_rate=0.001 \
--batch_size=16 \
--checkpoint_dir=result
Just For Fun _
本文代码: https://github.com/saiwaiyanyu/tensorflow-bert-seq2seq-dream-decoder
作者:saiwaiyanyu
链接:https://juejin.im/post/5dd9e07b51882572f00c4523
来源:掘金
本文由博客一文多发平台 OpenWrite 发布!
bert+seq2seq 周公解梦,看AI如何解析你的梦境?【转】的更多相关文章
- C# NetCore使用AngleSharp爬取周公解梦数据 起因和页面数据拆解
起因 最近突然心血来潮想做个小程序,学习一下小程序开发流程,然后新手就想做个查询的就可以了,少点交互能力,这种思来想去还是周公解梦比较靠谱, 网上一搜,还真有小程序源码,但是这里面似乎数据都是取第三方 ...
- 几句简单的python代码完成周公解梦功能
<周公解梦>是靠人的梦来卜吉凶的一本于民间流传的解梦书籍,共有七类梦境的解述.这是非常传统的中国文化体系的一部分,但是如何用代码来获取并搜索周公解梦的数据呢?一般情况下,要通过爬虫获取数据 ...
- APISpace 周公解梦API接口 免费好用
<周公解梦>,是根据人的梦来卜吉凶的一本解梦书籍,它对人的七类梦境进行解述. 周公解梦API,周公解梦大全,周公解梦查询,免费周公解梦. APISpace 有很多免费通用的API接 ...
- C# NetCore使用AngleSharp爬取周公解梦数据
这一章详细讲解编码过程 那么接下来就是码代码了,GO 新建NetCore WebApi项目 空的就可以 NuGet安装 Install-Package AngleSharp 或者界面安装 using. ...
- 一个AI产品经理怎么看AI的发展
一个AI产品经理怎么看AI的发展 https://www.jianshu.com/p/bed6b22ae837 最近一直在思考这个问题,人工智能接下来的几年会有什么样的发展,是否真的能够在很多工作岗位 ...
- 从强制解包看 Swift 的设计
从强制解包看 Swift 的设计 不知道大家有没有发现,在一个 Objective-C 和 Swift 混编的 App 中,当把一个 OC 中的参数转到 Swift 时,Swift 会自动把这个变量进 ...
- 从互联网进化的角度看AI+时代的巨头竞争
今天几乎所有的互联网公司在谈论和布局人工智能,收购相关企业.人工智能和AI+成为当今科技领域最灸手可热的名词,关于什么是AI+,其概念就是用以表达将"人工智能"作为当前行业科技化发 ...
- SpringBoot Profile使用详解及配置源码解析
在实践的过程中我们经常会遇到不同的环境需要不同配置文件的情况,如果每换一个环境重新修改配置文件或重新打包一次会比较麻烦,Spring Boot为此提供了Profile配置来解决此问题. Profile ...
- 解密优酷智能生产技术,看 AI 赋能内容数字化
2021 年,随着社会节奏的加快,用户碎片化消费时间不断增加,当前短视频的消费用户规模已超 7.73 亿人,短视频的市场规模超过 2000 亿元.短视频行业发展迅速,但也存在低质内容泛滥,精品内容稀缺 ...
随机推荐
- python类中的self
class User: def walk(self): print(self,"正在慢慢走") # User.walk() # 会报错 TypeError: walk() miss ...
- @RequestParam设置默认可以传空值
设置如下:@RequestParam(value="CbqkJson[]",required=false)String[] CbqkJson required=false 如果不设 ...
- 使用FastReport报表工具生成标签打印文档
在我们实际开发报表的时候,我们需要按一定的业务规则组织好报表的模板设计,让报表尽可能的贴近实际的需求,在之前的随笔中<使用FastReport报表工具生成报表PDF文档>介绍了FastRe ...
- 修改springfox-swagger源码,使example中时间格式默认为“yyyy-MM-dd HH:mm:ss”
修改swagger源码,使example中时间格式默认为"yyyy-MM-dd HH:mm:ss" 前言 简单点说,在swagger中,怎么能针对以下vo中的java.util.D ...
- 你真的了解 volatile 关键字吗?
今天,让我们一起来探讨 Java 并发编程中的知识点:volatile 关键字 本文主要从以下三点讲解 volatile 关键字: volatile 关键字是什么? volatile 关键字能解决什么 ...
- Java并发编程之线程池的使用
1. 为什么要使用多线程? 随着科技的进步,现在的电脑及服务器的处理器数量都比较多,以后可能会越来越多,比如我的工作电脑的处理器有8个,怎么查看呢? 计算机右键--属性--设备管理器,打开属性窗口,然 ...
- unity 内置shader
几个有用的Unity 内置shader: (一)Standard RenderingMode:Opaque为实体渲染,更改Color的透明通道不会有影响:Cutout会把图片的透明通道显示出来,非严格 ...
- django-表单之新增字段和设置css属性(四)
要注意是模板元素 和 表单元素的对应.
- ThinkCMF X1.6.0-X2.2.3框架任意内容包含漏洞分析复现
ThinkCMF X1.6.0-X2.2.3框架任意内容包含漏洞分析复现 一.ThinkCMF简介 ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理系统框架,底层采用ThinkPHP3. ...
- python str的一些操作及处理
一.str的定义:Python中凡是用引号引起来的数据可以称为字符串类型,组成字符串的每个元素称之为字符,将这些字符一个一个连接起来,然后在用引号起来就是字符串. 二.str的简单操作方法: conu ...