本文以项目readme.md训练逻辑的顺序解读

1.下载BERT预训练模型

更多bert模型参考github地址
      本文用的是BERT-Base, Cased(12-layer, 768-hidden, 12-heads , 110M parameters)下载地址。其中Cased表示保留真实的大小写和重音标记符,uncased表示文本在单词标记之前就已经变为小写,也去掉了任何重音标记例如,John Smith变成john smith。通常,Uncased模型会更好,除非大小写信息对于我们的任务很重要,如命名实体识别或词性标记。

2.以三元组的形式构造数据集

以NYT数据集为例:NYT数据集是关于远程监督关系抽取任务的广泛使用的数据集。该数据集是通过将freebase中的关系与纽约时报(NYT)语料库对齐而生成的。纽约时报New York Times数据集包含150篇来自纽约时报的商业文章。抓取了从2009年11月到2010年1月纽约时报网站上的所有文章。在句子拆分和标记化之后,使用斯坦福NER标记器来标识PER和ORG从每个句子中的命名实体。对于包含多个标记的命名实体,我们将它们连接成单个标记。然后,我们将同一句子中出现的每一对(PER,ORG)实体作为单个候选关系实例,PER实体被视为ARG-1,ORG实体被视为ARG-2。

2.1运行过程

  1. NYT数据集下载地址
  2. 运行CasRel/data/NYT/raw_NYT/generate.py将数字编码形式的nyt数据集转换为字符形式的数据集,并根据三元组将数据集分类为normal,epo,spo几种类型。运行结果为CasRel/data/NYT/new_train.json,new_train_epo.json,new_train_normal.json,new_train_seo.json。将产生的新文件移至NYT/目录下,将new_train.json改名为train.json,test与valid同理。
  3. 运行CasRel/data/NYT/build_data.py处理数据得到三元组,按train,dev,test分类。
  4. 将test.json移至test_split_by_num目录中,运行split_by_num.py将test集按每个句子含有的三元组数量分类;将test_epo.json,test_normal.json,test_seo.json移至test_split_by_type目录中,将test集按类型分类得到三元组文件。

2.2重要的代码

generate.py

# 将raw_NYT\train.json中的数字形式生成训练集的文本形式
def load_data(in_file, word_dict, rel_dict, out_file, normal_file, epo_file, seo_file):with open(in_file, 'r') as f1, open(out_file, 'w') as f2, open(normal_file, 'w') as f3, \open(epo_file,'w') as f4, open(seo_file, 'w') as f5:seo_file, 'w') as f5:cnt_normal = 0cnt_epo = 0cnt_seo = 0lines = f1.readlines()  # readlines()方法用于读取所有行(直到结束符EOF)并返回列表for line in lines:line = json.loads(line)print(len(line))lengths, sents, spos = line[0], line[1], line[2] print(len(spos))print(len(sents))for i in range(len(sents)):new_line = dict()# print(sents[i])# print(spos[i])tokens = [word_dict[i] for i in sents[i]]  # tokens为sents对应数字形式的字符串数组sent = ' '.join(tokens)  # 以空格形式连接字符串数组生成一个新的字符串new_line['sentText'] = sent # new_line为包含三元组的字典triples = np.reshape(spos[i], (-1, 3))  # 将spo[i]关系三元组的维度变为3列relationMentions = []for triple in triples:rel = dict()rel['em1Text'] = tokens[triple[0]]rel['em2Text'] = tokens[triple[1]]rel['label'] = rel_dict[triple[2]]relationMentions.append(rel)new_line['relationMentions'] = relationMentionsf2.write(json.dumps(new_line) + '\n')if is_normal_triple(spos[i]):f3.write(json.dumps(new_line) + '\n')if is_multi_label(spos[i]):f4.write(json.dumps(new_line) + '\n')if is_over_lapping(spos[i]):f5.write(json.dumps(new_line) + '\n')

build_data.py

# 读取数据集文件,将文本、三元组分类存储
with open('train.json') as f:for l in tqdm(f):  # tqdm是可扩展的Python进度条,可以在 Python 长循环中添加一个进度提示信息,用户只需要封装任意的迭代器tqdm(iterator)a = json.loads(l)if not a['relationMentions']:  # 若某个句子a中关系'relationMentions'为空,跳过之continue# 提取出每个句子及其三元组line = {'text': a['sentText'].lstrip('\"').strip('\r\n').rstrip('\"'), #去除'sentText'中的\r(回车)、\n(换行)、两头的'\''triple_list': [(i['em1Text'], i['label'], i['em2Text']) for i in a['relationMentions'] ifi['label'] != 'None']}if not line['triple_list']:continue# 将提取出来的句子及其三元组信息加入到训练集数据train_data中,将三元组中的关系加入到集合rel_set中(无序不重复元素序列)train_data.append(line)for rm in a['relationMentions']:if rm['label'] != 'None':rel_set.add(rm['label'])

3.指定实验设置

run.py中的默认参数:

{"bert_model": "cased_L-12_H-768_A-12","max_len": 100,"learning_rate": 1e-5,"batch_size": 6,"epoch_num": 100,
}

根据自己的设置修改

4.训练模型并评估

确定运行方式,使用的数据集

python run.py ---train=True --dataset=NYT

在测试集上评估

python run.py --dataset=NYT

哈工大关系抽取模型CasRel代码解读相关推荐

  1. ACL 2018论文解读 | 基于路径的实体图关系抽取模型

    在碎片化阅读充斥眼球的时代,越来越少的人会去关注每篇论文背后的探索和思考. 在这个栏目里,你会快速 get 每篇精选论文的亮点和痛点,时刻紧跟 AI 前沿成果. 点击本文底部的「阅读原文」即刻加入社区 ...

  2. AGGCN | 基于图神经网络的关系抽取模型

    今天给大家介绍2019年6月发表在ACL上的论文"Attention Guided Graph Convolutional Networks for Relation Extraction& ...

  3. 关系抽取模型介绍和实践

    关系抽取预知识和发展介绍 事实知识: 三元组表示实体间关系 关系抽取: 文本中蕴藏含着大量事实知识 一个完整关系抽取系统通常包含以下模块: NER Entity Linking(避免重复添加到知识图谱 ...

  4. 超级超级详细的实体关系抽取数据预处理代码详解

    超级超级详细的实体关系抽取数据预处理代码详解 由于本人是代码小白,在学习代码过程中会出现很多的问题,所以需要一直记录自己出现的问题以及解决办法. 废话不多说,直接上代码!!! 一.data_proce ...

  5. 信息抽取(二)花了一个星期走了无数条弯路终于用TF复现了苏神的《Bert三元关系抽取模型》,我到底悟到了什么?

    信息抽取(二)花了一个星期走了无数条弯路终于用TF复现了苏神的<Bert三元关系抽取>模型,我到底悟到了什么? 前言 数据格式与任务目标 模型整体思路 复现代码 数据处理 数据读取 训练数 ...

  6. 基于Bert的实体关系抽取模型

    关注微信公众号:NLP分享汇.[喜欢的扫波关注,每天都在更新自己之前的积累] 文章链接:https://mp.weixin.qq.com/s/OebxnvwjQiVbBZZFL2Un3A 前言 信息抽 ...

  7. C.5 Paddlenlp之UIE关系抽取模型【高管关系抽取为例】

    NLP专栏简介:数据增强.智能标注.意图识别算法|多分类算法.文本信息抽取.多模态信息抽取.可解释性分析.性能调优.模型压缩算法等 专栏详细介绍:NLP专栏简介:数据增强.智能标注.意图识别算法|多分 ...

  8. 论文学习18-Relation extraction and the influence of automatic named-entity recognition(联合实体关系抽取模型,2007)

    文章目录 abstract 1.introduction 3.问题形式化 4.系统架构 5. 命名实体识别 6.关系抽取(核方法) 6.1global context kernel 6.2 local ...

  9. 论文学习15-Table Filling Multi-Task Recurrent Neural Network(联合实体关系抽取模型)

    文章目录 abstract 1 introduction 2.方 法 2.1实体关系表(Figure-2) 2.2 The Table Filling Multi-Task RNN Model 2.3 ...

最新文章

  1. 【亲测可用→防止入坑Routes】设置angular10项目异步加载、惰性加载、懒加载路由
  2. C# richtextbox 自动下拉到最后 方法 RichTextBox读取txt中文后出现乱码
  3. Spring Cloud Alibaba 升级改造:老项目升级到微服务的重构策略
  4. Chrome web 开发用到的插件
  5. 手把手带你入门 Spring Security!
  6. java的jdk和jre_Java的JDK和JRE
  7. 文件标识符无效。使用 fopen 生成有效的文件标识符。_「存储架构」块存储、文件存储和对象存储(第1节)...
  8. ios 消息服务器,关于IOS APNS推送消息(iphone端+服务端)
  9. java调用python脚本并向python脚本传递参数
  10. Officescan防毒墙安装部署手册
  11. bupt2021秋季计算导论第十三次实验
  12. [dlang](二)用vibe.d+thrift做网络编程
  13. java 条形码_Java 生成、识别条形码
  14. linux apt 更新软件,apt get 更新软件
  15. 编程实现顺序表的基本操作
  16. m-audio keystation 88/61 midi键盘的走带控制器在cubase里面怎么用
  17. 死磕 java线程系列之线程池深入解析——未来任务执行流程
  18. ajax 实现关键字搜索,jQuery实现搜索页面关键字的功能
  19. Cross-sell and Up-sell
  20. 160809310袁韬淳

热门文章

  1. IEEE论文免费下载
  2. Sql - EXISTS 用于子查询
  3. 利用Max ,Break,AO贴图
  4. 【操作系统篇】第五篇——调度(概念,层次,调度时机,切换与过程,方式,评价指标)
  5. Win7系统提示“内置管理员无法激活此应用”的原因和解决方法
  6. WiFi_Display_Spec
  7. MSHR(Miss Status Handling Register)
  8. 初识DataTable
  9. python用循环打出阶梯图形,matplotlib阶梯图的实现(step())
  10. 联盟链系列 - RootCA颁发证书