基于Bert-NER构建特定领域的中文信息抽取框架(上)

2019 年 8 月 08 日

基于Bert-NER构建特定领域的中文信息抽取框架(上)

知识图谱(Knowledge Graph)主要由实体、关系和属性构成,而信息抽取(Information Extraction) 作为构建知识图谱最重要的一个环节,目的就是从文本当中抽取出三元组信息,包括“实体-关系-实体”以及“实体-属性-实体”两类。然后将抽取后的多个三元组信息储存到关系型数据库(neo4j)中,便可得到一个简单的知识图谱。

本文通过多个实验的对比发现,结合Bert-NER和特定的分词、词性标注等中文语言处理方式,获得更高的准确率和更好的效果,能在特定领域的中文信息抽取任务中取得优异的效果。


信息抽取和知识图谱


信息抽取和知识图谱


1 命名实体识别


综述


命名实体识别(Name Entity Recognition)是获取三元组中的实体的关键。命名实体指的是文本中具有特定意义或者指代性强的实体,常见的包括人名、地名、组织名、时间、专有名词等。就目前来说,使用序列标注的方法能够在 NER 任务中获得比较优异的效果,相对来说比较成熟。


NER发展趋势图


NER 发展趋势图


序列标注任务,即在给定的文本序列上预测序列中需要作出标注的标签。处理方式可简单概括为:先将 token 从离散 one-hot 表示映射到低维空间中成为稠密的 embedding,随后将句子的 embedding 序列输入到 RNN 中,使用神经网络自动提取特征以及 Softmax 来预测每个 token 的标签。


本文对比了基于 Bert 的命名实体识别框架和普通的序列标注框架在模型训练、实体预测等方面的效果,并对基于小数据集的训练效果做出实验验证。


模型


Word Embedding-BiLSTM-CRF


众多实验表明,该结构属于命名实体识别中最主流的模型,代表的工具有:NeuroNER。它主要由 Embedding 层(主要有词向量,字向量以及一些额外特征)、双向 LSTM 层、以及最后的 CRF 层构成,而本文将分析该模型在中文 NER 任务中的表现。


“词向量+BiLSTM+CRF”三层模型构造图


“词向量+BiLSTM+CRF”三层模型构造图


注:NER 任务需要得到实体词的输出,所以使用字向量作为输入。


Bert-BiLSTM-CRF


随着 Bert 语言模型在 NLP 领域横扫了 11 项任务的最优结果,将其在中文命名实体识别中 Fine-tune 必然成为趋势。它主要是使用 bert 模型替换了原来网络的 word2vec 部分,从而构成 Embedding 层,同样使用双向 LSTM 层以及最后的 CRF 层来完成序列预测。


NeuroNER 和 BertNER 的中文 NER 实验


实验数据


数据来源: 本文的 NER 实验数据是来自于人民网的将近 7 万句(250 万字)中文新闻语料。


CSV格式的原始数据


CSV 格式的原始数据


数据样式:


本文选用 BIO 标注法,其中”B“表示实体起始位置,”I“表示实体内容位置,”O“表示非实体。将 7 万条数据样本经过清洗后,按字进行分割,使用 BIO 标注形式标注四类命名实体,包括人名(PERSON)、地名(LOCATION)、组织机构名(ORGANIAZATION)以及时间(TIME),构成中文命名实体识别语料库。



数据标注样式图


数据标注样式图


数据划分:


训练集、验证集、测试集以“7:1:2”的比例划分。其中训练集达到 49600 条的样本数,标注实体共 88192 个;验证集为 7000 条,包含 12420 个标注实体;测试集为 14000 条,标注实体共 25780 个。



命名实体识别结果展示


  • 展示用例:屠呦呦,女,汉族,中共党员,药学家。1930年12月30日生于浙江宁波,1951年考入北京大学,在医学院药学系生药专业学习。1955年,毕业于北京医学院(今北京大学医学部)。

  • 展示用例抽取结果:[[‘PERSON’, ‘屠呦呦’], [‘TIME’, ‘1930年12月30日’], [‘LOCATION’, ‘浙江宁波’], [‘TIME’, ‘1951年’], [‘ORGANIZATION’, ‘北京大学’], [‘ORGANIZATION’, ‘医学院药学系’], [‘TIME’, ‘1955年’], [‘ORGANIZATION’, ‘北京医学院’], [‘ORGANIZATION’, ‘北京大学医学部’]]


实验结果


工具分类epoch训练时长测试集F1值模型加载速度预测速度
BertNER305h 49m96.182.8s80ms
NeuroNER3014h 19m91.9323s2s
NeuroNER1002d 7h 10m92.3323s2s


注:实验配置为 11G Nvidia RTX2080Ti、Intel® Core™ i7-8700K CPU @ 3.70GHz、16G 内存、2T 硬盘


结论


  1. 实验表明,两者在相同的迭代次数训练后,测试集的F1值上BertNER比NeuroNER高出超过4个百分点。即使NeuroNER迭代epoch增加到100,仍然是BertNER的识别效果更优。

  2. Bert NER在训练时长、模型加载速度、预测速度上都占据了很大的优势,达到工业级的水平,更适合应用在生产环境当中。

  3. 综上所述,Bert-BiLSTM-CRF模型在中文命名实体识别的任务中完成度更高。


Bert-NER 在小数据集下训练的表现


实验数据


从 5 万句(250 万字)的中文新闻语料中按文本数据的字数(万字为单位)划分出 10W、30W、50W 的小数据集,同样以“7:1:2”的比例得到对应的训练集、验证集、测试集。


命名实体识别结果展示


  • 展示用例:屠呦呦,女,汉族,中共党员,药学家。1930年12月30日生于浙江宁波,1951年考入北京大学,在医学院药学系生药专业学习。1955年,毕业于北京医学院(今北京大学医学部)。

  • 展示用例抽取结果:[[‘PERSON’, ‘屠呦呦’], [‘TIME’, ‘1930年12月30日’], [‘LOCATION’, ‘浙江宁波’], [‘TIME’, ‘1951年’], [‘ORGANIZATION’, ‘北京大学’], [‘ORGANIZATION’, ‘医学院药学’], [‘TIME’, ‘1955年’], [‘ORGANIZATION’, ‘北京医学院’], [‘ORGANIZATION’, ‘北京大学医学部’]]


实验结果


  • 在相同实验配置下,四种数据集经过30个epoch的迭代训练,将句子数、训练市场、测试集F1值三个维度的实验结果进行归一化处理后,最终得到以下实验结果图表:


实验结果图


实验结果图


  • 效能分析:本文将以10W的数据集实验结果作为基础,探讨在30W、50W和250W三种数据集训练,每当数据量增长一倍(即每增长10W的数据量),所带来的训练时长增长和模型提升比例:


效能对比表


效能对比表


结论


  1. BertNER在小数据集甚至极小数据集的情况下,测试集F1值均能达到92以上的水平,证明其也能在常见的文本命名实体识别任务中达到同样优秀的效果。

  2. 实验结果证明,利用小数据集训练,可以大大降低人工标注成本的同时,训练时长也越少,也将极大地提高模型迭代的能力,有利于更多实体类型的NER模型构建。

  3. 经过效能分析可以看出,数据量往上增加的同时,训练时长以相同的比例增加,而F1值提升的幅度在逐渐下降。因此,我们在扩充实体类别的时候,可以参考此效能比例,从而衡量所要投入的资源以及所能达到的模型效果。


2 中文分词和词性标注


综述


分词:语言通常是需要用词来描述事物、表达情感、阐述观点等,可是在词法结构上中文与英文有较大的区别。其中最大的不同是英文将词组以空格的形式区分开来,较为容易被自动化抽取出来,而中文的词组往往需要由两个以上的字来组成,则需要通过分词工具来将语句拆分,以便进一步分析内容和意图。


词性标注:对分词后的单词在用法上进行分类,为句法分析、信息抽取等工作打下基础。常见的词性包括名词、动词、形容词、代词、副词等。


分词和词性标注工具对比


分词和词性标注往往是一同完成的。本文选取了主流的四款中文自然语言处理工具包括:JiebaPyltpPkuSegTHULAC



对比测试了它们分词和词性标注上的效果、速度、功能以及集成程度等。其中速度方面的测试,使用了百度百科上 100 位科技人物的首句人物介绍,经过预测得到每句文本的平均计算。


注:实验配置为 11G Nvidia RTX2080Ti、Intel® Core™ i7-8700K CPU @ 3.70GHz、16G 内存、2T 硬盘


测试文本:



效果对比:


  • Jieba:



注:v(动词)、e(叹词)、b(区别词)、n(名词)、ns(地名)、nz(其他专名)、q(量词)、m(数词)、x(非语素字)


  • Pyltp:



注:nh(人名)、n(名词)、ns(地名)、nt(时间名词)、nz(其他专名)、b(区别词)、wp(标点符号)


  • PkuSeg:



注:nr(人名)、ns(地名)、nz(其他专名)、t(时间词)、b(区别词)、j(简称)、w(标点符号)


  • THULAC:



注:g(语素词根)、ns(地名)、nz(其他专名)、t(时间词)、a(形容词)、j(简称)、w(标点符号)


  • Jieba分词 + Bert-NER + Pyltp词性标注:



注:nh(人名)、n(名词)、ns(地名)、nt(时间名词)、nz(其他专名)、b(区别词)、wp(标点符号)


结论


  1. 经过NER、分词、词性标注的对比测试后发现,Jieba分词同时具有速度快和支持用户自定义词典的两大优点,Pyltp具有单独使用词性标注的灵活性。因此,使用 “Jieba分词 + BertNER作自定义词典 + Pyltp词性标注” 的组合策略后,可以弥补Jieba分词在实体识别的缺点,保证较高的准确率和产品速度。

  2. PkuSeg和THULAC: 初始化模型就需要很长时间,导致分词和词性标注的模型预测速度慢,同时部分人名的命名实体识别有所缺失。

  3. Pyltp:分词效果太过于细化,而且实际上是无法用到用户自定义词典的。因为LTP的分词模块并非采用词典匹配的策略,而是外部词典以特征方式加入机器学习算法当中,并不能保证所有的词都是按照词典里的方式进行切分。


3 中文指代消解


综述


指代消解(Coreference Resolution),即在文本中确定代词指向哪个名词短语,解决多个指称对应同一实体对象的问题。


常见用于实现指代消解的工具包:NeuralCorefStanford coreNLPAllenNLP等。


大部分工具包都是基于语义结构中的词和句的规则来实现指代消解,而且都是在英文的语言结构当中实现了不错的效果,NeuralCoref AllenNLP 不支持中文,而 Stanford coreNLP 是具有多种语言模型,其中包括了中文模型,但 Stanford coreNLP 的指代消解在中文的表现并不理想。目前而言,基于深度学习的端到端指代消解模型还达不到生产应用的要求。


基于 Stanford coreNLP 的指代消解模型


系统架构:


运用 Stanford coreNLP 中文模型的词性标注实体识别句法依存功能模块+规则来构成一个中文指代消解系统。


输入:



结果:



主语"屠呦呦"被拆分为两个元素,这也直接导致了主语识别成了呦呦。最后的结果为:



基于 BertNER 的中文指代消解框架


本文选取 Pyltp 中文工具包中的依存句法分析模块,结合“Jieba 分词 + BertNER 作自定义词典 + Pyltp 词性标注”的词性标注和 BertNER 实体识别模块,以确定输入文本段落的主语和实体,从而将文本中出现的代词指代到对应的实体上。并且还实现了对缺失主语的部分文本进行主语补齐。


实验结果:



经过反复的实验表明,基于 BertNER 的中文指代消解框架比基于 Stanford coreNLP 的指代消解模型在中文上获得更高的准确率和更好的效果,同时实现了主语补齐的功能,有助于抽取更多的有用三元组信息。


4 中文信息抽取系统


以下是基于 Bert-NER 的中文信息抽取系统的最终实验结果,模型细节请关注我们下一篇:《基于 Bert-NER 构建特定领域的中文信息抽取框架(下)》。


中文信息抽取框架测试结果


目前的规则配置文档定义了五类关系:出生于,配偶,毕业于,工作在,父(母)子。


基于 80 条百度百科人物介绍,使用 StanfordCoreNLP 提取三元组的效果如下图所示。五类的关系抽取三元组准确率为 0.89,抽取率达到 0.69。



基于 80 条百度百科人物介绍,使用本文中文抽取模型,取得较为明显的改进,五类的关系抽取三元组准确率达到 0.99,抽取率达到 0.96。



测试用例结果展示



本文实验代码:


中文命名实体识别:https://github.com/EOA-AILab/NER-Chinese


中文分词与词性标注:https://github.com/EOA-AILab/Seg_Pos


原文地址:https://zhuanlan.zhihu.com/p/74803327


2019 年 8 月 08 日 08:004521

评论

发布
暂无评论
发现更多内容

技术实践丨PostgreSQL开启Huge Page场景分析

华为云开发者社区

数据库 管理 内存

一个有趣的问题——孙庞猜数

小七

Python 数学

架构师第一期作业(第 6 周)

Cheer

真香!天天996进不去阿里?看5年苦逼程序猿怎么逆袭阿里P7

小Q

Java 学习 架构 面试 程序猿

Vidyo独特的互联网适应性

dwqcmo

音视频会议 集成架构 解决方案 智能硬件

LeetCode题解:78. 子集,迭代+位运算,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

与其思考公司该为员工提供什么福利,不如思考有哪些 “福利” 不应该提供!

非著名程序员

个人成长 管理 福利

数字货币交易所源码,币币交易系统搭建

135深圳3055源中瑞8032

合约自动跟单软件开发,API合约跟单系统

135深圳3055源中瑞8032

USDT支付系统源码,承兑支付系统平台开发搭建

135深圳3055源中瑞8032

【高并发】导致并发编程频繁出问题的“幕后黑手”

冰河

并发编程 多线程 高并发 高性能 异步

刚从蚂蚁金服Java研发岗面试回来(三轮游),我总结的面试经历(附面试题+答案)

Java架构追梦

Java 架构 面试 蚂蚁金服 面试题总结

Java程序员必须人手一本的《码出高效:Java 开发手册》,免费分享PDF文档

Java架构之路

Java 程序员 架构 面试 编程语言

JAVA稳定底层,快速开发首选,XJR智能化客户关系管理

Marilyn

敏捷开发 快速开发 软件架构 客户关系管理

问题篇:附源码询问Pageable实现分页无法使用原生sql

小Q

Java 学习 架构 面试 springboot

十八般武艺玩转GaussDB(DWS)性能调优:总体调优策略

华为云开发者社区

数据库 性能 调试

在阿里内部,做Java到金字塔顶端的人平时都如何学习源码?

小Q

Java 学习 架构 面试 程序猿

如何获取变量token的值

测试人生路

软件测试 接口测试

面试官问我:看过sharding-jdbc的源码吗?我吧啦吧啦说了一通!!

冰河

分布式事务 微服务 分布式数据库 系统架构 中间件

深度对比Apache CarbonData、Hudi和Open Delta三大开源数据湖方案

华为云开发者社区

hadoop 开源 数据处理

《Linux学习笔记》从常用命令、常用操作到网络管理、性能优化,无论是Java开发或是运维都可以学习!

Java架构之路

Java 程序员 架构 面试 编程语言

区块链钱包应用开发,数字货币钱包系统

135深圳3055源中瑞8032

DeFi流动性挖矿系统开发技术方案

薇電13242772558

区块链 defi

架构师训练营 - 第二周课后练习

joshuamai

解惑“高深”的Kafka时间轮原理,原来也就这么回事!

华为云开发者社区

中间件 消息队列

天呐!价值2980元Java成神面试题竟在Github开源了

996小迁

Java 学习 架构 面试

区块链是连接传统经济和数字经济的桥梁

CECBC区块链专委会

区块链 数字经济

测试悄然扩围 千万元红包搅活数字货币江湖

CECBC区块链专委会

数字人民币

区块链将构建数字社会高效的全球网络

CECBC区块链专委会

数字经济 数字时代

企业级RPC框架zRPC

Kevin Wan

go RPC microser

Netty源码解析 -- 零拷贝机制与ByteBuf

binecy

Netty 源码剖析

基于Bert-NER构建特定领域的中文信息抽取框架(上)-InfoQ