介绍

在参与的项目和产品中,涉及到模型和算法的需求,主要以自然语言处理(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如何解析你的梦境?【转】的更多相关文章

  1. C# NetCore使用AngleSharp爬取周公解梦数据 起因和页面数据拆解

    起因 最近突然心血来潮想做个小程序,学习一下小程序开发流程,然后新手就想做个查询的就可以了,少点交互能力,这种思来想去还是周公解梦比较靠谱, 网上一搜,还真有小程序源码,但是这里面似乎数据都是取第三方 ...

  2. 几句简单的python代码完成周公解梦功能

    <周公解梦>是靠人的梦来卜吉凶的一本于民间流传的解梦书籍,共有七类梦境的解述.这是非常传统的中国文化体系的一部分,但是如何用代码来获取并搜索周公解梦的数据呢?一般情况下,要通过爬虫获取数据 ...

  3. APISpace 周公解梦API接口 免费好用

    <周公解梦>,是根据人的梦来卜吉凶的一本解梦书籍,它对人的七类梦境进行解述.   周公解梦API,周公解梦大全,周公解梦查询,免费周公解梦.   APISpace 有很多免费通用的API接 ...

  4. C# NetCore使用AngleSharp爬取周公解梦数据

    这一章详细讲解编码过程 那么接下来就是码代码了,GO 新建NetCore WebApi项目 空的就可以 NuGet安装 Install-Package AngleSharp 或者界面安装 using. ...

  5. 一个AI产品经理怎么看AI的发展

    一个AI产品经理怎么看AI的发展 https://www.jianshu.com/p/bed6b22ae837 最近一直在思考这个问题,人工智能接下来的几年会有什么样的发展,是否真的能够在很多工作岗位 ...

  6. 从强制解包看 Swift 的设计

    从强制解包看 Swift 的设计 不知道大家有没有发现,在一个 Objective-C 和 Swift 混编的 App 中,当把一个 OC 中的参数转到 Swift 时,Swift 会自动把这个变量进 ...

  7. 从互联网进化的角度看AI+时代的巨头竞争

    今天几乎所有的互联网公司在谈论和布局人工智能,收购相关企业.人工智能和AI+成为当今科技领域最灸手可热的名词,关于什么是AI+,其概念就是用以表达将"人工智能"作为当前行业科技化发 ...

  8. SpringBoot Profile使用详解及配置源码解析

    在实践的过程中我们经常会遇到不同的环境需要不同配置文件的情况,如果每换一个环境重新修改配置文件或重新打包一次会比较麻烦,Spring Boot为此提供了Profile配置来解决此问题. Profile ...

  9. 解密优酷智能生产技术,看 AI 赋能内容数字化

    2021 年,随着社会节奏的加快,用户碎片化消费时间不断增加,当前短视频的消费用户规模已超 7.73 亿人,短视频的市场规模超过 2000 亿元.短视频行业发展迅速,但也存在低质内容泛滥,精品内容稀缺 ...

随机推荐

  1. Spring Boot项目中如何定制PropertyEditors

    本文首发于个人网站:Spring Boot项目中如何定制PropertyEditors 在Spring Boot: 定制HTTP消息转换器一文中我们学习了如何配置消息转换器用于HTTP请求和响应数据, ...

  2. 使用 pdf.js 在网页中加载 pdf 文件

    在网页中加载并显示PDF文件是最常见的业务需求.例如以下应用场景:(1)在电商网站上购物之后,下载电子发票之前先预览发票.(2)电子商务管理系统中查看发布的公文,公文文件一般是PDF格式的文件. 目前 ...

  3. logistic回归 python代码实现

    本代码参考自:https://github.com/lawlite19/MachineLearning_Python/blob/master/LogisticRegression/LogisticRe ...

  4. Python之路(第四十篇)进程池

    一.进程池 进程池也是通过事先划分一块系统资源区域,这组资源区域在服务器启动时就已经创建和初始化,用户如果想创建新的进程,可以直接取得资源,从而避免了动态分配资源(这是很耗时的). 线程池内子进程的数 ...

  5. 雷子聊并发编程(001):基础知识之串行&并行&并发

    前言 编写正确的程序很难,而编写正确的并发程序则难上加难.与串行程序相比,在并发程序中存在更多容易出错的地方.那么,为什么还要编写并发程序?原因很简单,能充分发挥与利用多处理器系统的强大计算能力. 在 ...

  6. scp -本地文件上传服务器,指定端口

    scp 命令可以将本地文件上传服务器,或者将服务器上的文件下载到本地, 1.  上传服务器: scp [本地文件目录]  [服务器用户名]@[服务器名]:/[服务器上文件路径] 比如 scp /Doc ...

  7. 游图邦YOTUBANG是如何搭建生态系统的?

    现在的我们最关心的一个问题就是任何一个行业,如果没有办法很好的落地,就算描绘的非常美好,那也只是空中楼阁.昙花一现而已,它无法实现长久的一个发展.互联网时代呢,就是一个流量为王的一个时代,谁拥有庞大的 ...

  8. 设计模式C++描述----01.单例(Singleton)模式

    一.概念 单例模式:其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享. class CSingleton { //公有的静态方法,来获取该实例 public: s ...

  9. 使用float设置经典的网站前端结构(深入探讨)

    .要是DIV的子元素宽度大于它自己的宽度,不管子元素有没有脱离文档流,子元素会在横向向右溢出. 关于高度:1.要是DIV的高度没有设定,其高度受“没有脱离文档流”的子元素影响.以下是DIV宽度为0的情 ...

  10. JVM性能调优详解

    前面我们学习了整个JVM系列,最终目标的不仅仅是了解JVM的基础知识,也是为了进行JVM性能调优做准备.这篇文章带领大家学习JVM性能调优的知识. 性能调优 性能调优包含多个层次,比如:架构调优.代码 ...