前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用Bi-GRU+Attention和字向量做端到端的中文关系抽取

用Bi-GRU+Attention和字向量做端到端的中文关系抽取

作者头像
机器学习AI算法工程
发布2019-10-28 17:04:54
1.3K0
发布2019-10-28 17:04:54
举报
实体识别和关系抽取是例如构建知识图谱等上层自然语言处理应用的基础。关系抽取可以简单理解为一个分类问题:给定两个实体和两个实体共同出现的句子文本,判别两个实体之间的关系。

使用CNN或者双向RNN加Attention的深度学习方法被认为是现在关系抽取state of art的解决方案。已有的文献和代码,大都是针对英文语料,使用词向量作为输入进行训练。这里以实践为目的,介绍一个用双向GRU、字与句子的双重Attention模型,以天然适配中文特性的字向量(character embedding)作为输入,网络爬取数据作为训练语料构建的中文关系抽取模型。

代码主要是基于清华的开源项目thunlp/TensorFlow-NRE开发,感谢!

双向GRU加Dual Attention模型

双向GRU加字级别attention的模型想法来自文章 “Attention-Based Bidirectional Long Short-Term Memory Networks for Relation Classification” [Zhou et al.,2016]。这里将原文的模型结构中的LSTM改为GRU,且对句子中的每一个中文字符输入为character embedding。这样的模型对每一个句子输入做训练,加入字级别的attention。

句子级别attention的想法来自文章 “Neural Relation Extraction with Selective Attention over Instances” [Lin et al.,2016]。原文模型结构图如下,这里将其中对每个句子进行encoding的CNN模块换成上面的双向GRU模型。这样的模型对每一种类别的句子输入做共同训练,加入句子级别的attention。

语料获取

中文关系抽取的公开语料比较少。我们从distant supervision的方法中获取灵感,希望可以首先找到具有确定关系的实体对,然后再去获取该实体对共同出现的语句作为正样本。负样本则从实体库中随机产生没有关系的实体对,再去获取这样实体对共同出现的语句。

一个小问题是,相同的关系label在复旦知识工厂中可能对应着不同的标注,比如“夫妻”,抓取到的数据里有的是“丈夫”,有的是“妻子”,有的是“伉俪”等等,需要手动对齐。

得到实体对,获取实体对共同出现的语句,我们直接借助百度、搜狐、360等的新闻搜素功能,抓取实体对共同出现的新闻在搜索列表中的摘要。

我们还从一个开源项目Roshanson/TextInfoExp中获取了不少关系抽取语料。

模型训练

AI项目体验地址 https://loveai.tech

系统要求:

  • Python (>=3.5) 一定要用Python 3。因为编码问题,Python 2对中文太不友好。
  • TensorFlow (>=r1.0) Tensorflow几个月一个大变样,对<1.0暂不支持。不过清华Thunlp的原始代码是旧版的Tensorflow,对旧版TF仍然执迷不悟念念不忘的朋友们可以去参考。
  • scikit-learn (>=0.18)

训练:

1.所有数据准备在 origin_data/ 中, 包括了关系种类 (relation2id.txt), 训练数据 (train.txt), 测试数据 (test.txt) and 中文字向量 (vec.txt). 中文字向量是在中文wikipedia上训练的。训练数据和测试数据是将原始数据随机排序,然后按大概80%做训练,20%做测试的方法分开。更好的方法是再加入验证数据,但是训练一个epoch已经好长时间,就偷个懒不搞k-fold什么的了。。。

代码语言:javascript
复制
unknown, 父母, 夫妻, 师生, 兄弟姐妹, 合作, 情侣, 祖孙, 好友, 亲戚,

2.将所有数据通过字向量整理成numpy的形式,存储在 data/

代码语言:javascript
复制
python initial.py

3.进行训练,模型会存储在 model/。并没有怎么仔细调节超参数,模型结构除了字向量的输入以外,也是完全照搬英文版的模型。感兴趣的朋友们以这个结果为baseline可以尝试调出更好的模型参数。

代码语言:javascript
复制
python train_GRU.py

预测:

代码语言:javascript
复制
python test_GRU.py

代码中有两个main函数。第一个main函数是用测试数据来测试准确率的(我的实验大概70%左右),第二个则是供用户输入数据进行inference。程序会在command line中提示输入”name1 name2 sentence”格式的测试数据。

一些结果

我们请来王大牛和李晓华两位同学来做角色扮演,测试了一些例子。

可以看到模型给出的结果还是蛮有趣的,有一些错误,但也是“情有可原”的合理。

回顾整个过程,对于中文关系提取这个比较复杂的任务,我们的方法完全没有构造n-gram、词性、依存句法等复杂特征,使用深度学习模型,甚至不需要中文分词,只依靠字向量和大量训练语料就得到了一个效果不错的端到端模型。


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习AI算法工程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 双向GRU加Dual Attention模型
  • 语料获取
  • 模型训练
    • 系统要求:
      • 训练:
        • 预测:
        • 一些结果
        相关产品与服务
        NLP 服务
        NLP 服务(Natural Language Process,NLP)深度整合了腾讯内部的 NLP 技术,提供多项智能文本处理和文本生成能力,包括词法分析、相似词召回、词相似度、句子相似度、文本润色、句子纠错、文本补全、句子生成等。满足各行业的文本智能需求。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档