介绍

在参与的项目和产品中,涉及到模型和算法的需求,主要以自然语言处理(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. IDE安装完成无法打开,报错Fail load JVM DLL 问题与解决方案

    安装完成pycharm 在打开pycharm的时候出现报错 Fail load JVM DLL xxxx xxx. 解决方案 安装Microsoft Visual C++ 2010 Redistrib ...

  2. 玩转u8g2 OLED库 MAX7219_32X8点阵模块

    u8g2 OLED库 + MAX7219_32X8点阵模块 理论基础 玩转u8g2 OLED库,一篇就够 玩转u8g2 OLED库,一篇就够(字数太多 要分篇) 实验内容 Full screen bu ...

  3. Leetcode刷题记录(python3)

    Leetcode刷题记录(python3) 顺序刷题 1~5 ---1.两数之和 ---2.两数相加 ---3. 无重复字符的最长子串 ---4.寻找两个有序数组的中位数 ---5.最长回文子串 6- ...

  4. 基于STM32F103和Cube的输入捕获例程

    1.开发环境 (1)Cube5.24 (2)Keil5 (3)STM32F103 2.Cube配置 Cube配置很简单,只要打开TIM4通道1的引脚,设置为输入捕获模式,在配置是高或低电平沿触发 TI ...

  5. 基于SEER的区块链版赛亚麻将游戏Pre alpha版本内测啦!

    游戏基于SEER测试网络文体平台模块(Culture and Sports Platform,CSP),正在进行数据调试等工作,大家可以尝鲜体验. 此游戏账户和资金等核心系统完全基于区块链,但目前运行 ...

  6. 数据结构(二十七)Huffman树和Huffman编码

    Huffman树是一种在编码技术方面得到广泛应用的二叉树,它也是一种最优二叉树. 一.霍夫曼树的基本概念 1.结点的路径和结点的路径长度:结点间的路径是指从一个结点到另一个结点所经历的结点和分支序列. ...

  7. MySQL学习之路(1):SQL脚本语言

    使用MySQL数据库,首先安装MySQL数据库,本文所有SQL脚本在MySQL上测试和执行. 安装Mysql服务器:安装Mysql workbench客户端,可以以图形化界面管理mysql:安装php ...

  8. SVM详细笔记及总结

    本文精品,如有疑问欢迎留言or微信咨询:523331232

  9. mui iOS云打包修改权限提示语

    打包提交appstore如果用到了如下权限需要修改提示语,详细描述使用这个权限的原因,如不修改提示语appstore审核可能会被拒绝 设置方法如下: 使用视图方式打开manifest.json文件, ...

  10. 第二十六章 system v消息队列(二)

    msgsnd int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); 作用: 把一条消息添加到消息队列中 参数: msqi ...