作者:周纪咏、汪诚愚、严俊冰、黄俊
导读
信息抽取的三大工作是命名实体辨认、关系抽取、事件抽取。命名实体辨认是指辨认文本中具备特定意义的实体,包含人名、地名、机构名、专有名词等;关系抽取是指辨认文本中实体之间的关系;事件抽取是指辨认文本中的事件信息并以结构化的模式出现进去。信息抽取技术被广泛应用于常识图谱的构建、机器浏览了解、智能问答和信息检索零碎中。信息抽取的三大工作不是互相独立的关系,而是相互依存、彼此依赖的关系。命名实体辨认是关系抽取、事件抽取的根底,关系抽取是事件抽取的根底。同时,关系抽取、事件抽取对命名实体辨认工作有帮忙,事件抽取对关系抽取工作有帮忙。但目前对于仅应用一个模型实现中文信息抽取三大工作的钻研绝对较少,因而,咱们提出 K -Global Pointer 算法并集成进 EasyNLP 算法框架中,使用户能够应用自定义数据集训练中文信息抽取模型并应用。
EasyNLP(https://github.com/alibaba/Ea…)是阿⾥云机器学习 PAI 团队基于 PyTorch 开发的简略易⽤且功能丰富的中⽂ NLP 算法框架,⽀持常⽤的中⽂预训练模型和⼤模型落地技术,并且提供了从训练到部署的⼀站式 NLP 开发体验。EasyNLP 提供了简洁的接⼝供⽤户开发 NLP 模型,包含 NLP 应⽤ AppZoo 和预训练 ModelZoo,同时提供技术帮忙⽤户⾼效的落地超⼤预训练模型到业务。因为跨模态了解需要的一直减少,EasyNLP 也⽀持各种跨模态模型,特地是中⽂畛域的跨模态模型,推向开源社区,心愿可能服务更多的 NLP 和多模态算法开发者和研究者,也心愿和社区⼀起推动 NLP/ 多模态技术的倒退和模型落地。
本⽂简要介绍 K -Global Pointer 的技术解读,以及如何在 EasyNLP 框架中使⽤ K -Global Pointer 模型。
K-Global Pointer 模型详解
Global Pointer 模型是由苏剑林提出的解决命名实体辨认工作的模型,\(n*n \) 的矩阵 \(A \)(\(n \) 为序列长度),\(A[i,j] \) 代表的是序列 \(i \) 到序列 \(j \) 组成的间断子串为对应实体类型的概率,通过设计门槛值 \(B \) 即可将文本中具备特定意义的实体辨认进去。
K-Global Pointer 模型是在 Global Pointer 模型的根底之上改良的。首先咱们将仅反对命名实体辨认的模型拓展成反对中文信息抽取三大工作的模型。而后,咱们应用了 MacBERT 预训练语言模型来将文本序列转换成向量序列。最初咱们针对不同的工作设计了一套 prompt 模板,其能帮忙预训练语言模型“回顾”起本人在预训练时“学习”到的内容。接下来,咱们将依据中文信息抽取三大工作别离进行论述。
针对命名实体辨认工作,咱们有文本 \(w_{1},w_{2},w_{3},…,w_{n} \) 以及须要提取的实体类型 entity_type,对应的 prompt 为“找到文章中所有【entity_type】类型的实体?”,对应的输出模型的文本 \(H \) 为“找到文章中所有【entity_type】类型的实体?文章:【\(w_{1},w_{2},w_{3},…,w_{n} \)】”,模型通过相应的解决即可输入文本中实体类型为 entity_type 的实体。
针对关系抽取工作,咱们有文本 \(w_{1},w_{2},w_{3},…,w_{n} \) 以及须要提取的关系类型 relation_type(subject_type-predicate-object_type),分为两步。第一步,对应的 prompt 为“找到文章中所有【subject_type】类型的实体?”,对应的输出模型的文本 \(H \) 为“找到文章中所有【subject_type】类型的实体?文章:【\(w_{1},w_{2},w_{3},…,w_{n} \)】”,模型通过相应的解决即可输入文本中实体类型为 subject_type 的实体 \(e_{1} \)。第二步,对应的 prompt 为“找到文章中所有【\(e_{1} \)】的【\(predicate \)】?”,对应的输出模型的文本 \(H \) 为“找到文章中所有【\(e_{1} \)】的【\(predicate \)】?文章:【\(w_{1},w_{2},w_{3},…,w_{n} \)】”,模型通过相应的解决即可输入实体 \(e_{2} \)。即可形成关系三元组 (\( e_{1}、predicate、e_{2} \))。
针对事件抽取工作,咱们有文本 \(w_{1},w_{2},w_{3},…,w_{n} \) 以及须要提取的事件类型 \(class \),每个 \(class \) 蕴含 event_type 以及 role_list(r_{1},r_{2},…),分为两步。第一步,对应的 prompt 为“找到文章中所有【event_type】类型的实体?”,对应的输出模型的文本 \(H \) 为“找到文章中所有【event_type】类型的实体?文章:【\(w_{1},w_{2},w_{3},…,w_{n} \)】”,模型通过相应的解决即可输入的实体 \(e \)。第二步,针对 role_list 中不同的 \(r_{x} \),对应的 prompt 为“找到文章中所有【\(e \)】的【\(r_{x} \)】?”,对应的输出模型的文本 \(H \) 为“找到文章中所有【\(e \)】的【\(r_{x} \)】?文章:【\(w_{1},w_{2},w_{3},…,w_{n} \)】”,模型通过相应的解决即可输入实体 \(e_{x} \)。即可形成事件 {event_type:\( e \),role_list:{\( r_{1}:e_{1},r_{2}:e_{2},… \)}}。
K-Global Pointer 模型的实现与成果
在 EasyNLP 框架中,咱们在模型层构建了 K -Global Pointer 模型的 Backbone,其核⼼代码如下所示:
self.config = AutoConfig.from_pretrained(pretrained_model_name_or_path)
self.backbone = AutoModel.from_pretrained(pretrained_model_name_or_path)
self.dense_1 = nn.Linear(self.hidden_size, self.inner_dim * 2)
self.dense_2 = nn.Linear(self.hidden_size, self.ent_type_size * 2)
context_outputs = self.backbone(input_ids, attention_mask, token_type_ids)
outputs = self.dense_1(context_outputs.last_hidden_state)
qw, kw = outputs[..., ::2], outputs[..., 1::2]
pos = SinusoidalPositionEmbedding(self.inner_dim, 'zero')(outputs)
cos_pos = pos[..., 1::2].repeat_interleave(2, dim=-1)
sin_pos = pos[..., ::2].repeat_interleave(2, dim=-1)
qw2 = torch.stack([-qw[..., 1::2], qw[..., ::2]], 3)
qw2 = torch.reshape(qw2, qw.shape)
qw = qw * cos_pos + qw2 * sin_pos
kw2 = torch.stack([-kw[..., 1::2], kw[..., ::2]], 3)
kw2 = torch.reshape(kw2, kw.shape)
kw = kw * cos_pos + kw2 * sin_pos
logits = torch.einsum('bmd,bnd->bmn', qw, kw) / self.inner_dim ** 0.5
bias = torch.einsum('bnh->bhn', self.dense_2(last_hidden_state)) / 2
logits = logits[:, None] + bias[:, ::2, None] + bias[:, 1::2, :, None]
mask = torch.triu(attention_mask.unsqueeze(2) * attention_mask.unsqueeze(1))
y_pred = logits - (1-mask.unsqueeze(1))*1e12
y_true = label_ids.view(input_ids.shape[0] * self.ent_type_size, -1)
y_pred = y_pred.view(input_ids.shape[0] * self.ent_type_size, -1)
loss = multilabel_categorical_crossentropy(y_pred, y_true)
为了验证 EasyNLP 框架中 K -Global Pointer 模型的有效性,咱们应用 DuEE1.0、DuIE2.0、CMeEE-V2、CLUENER2020、CMeIE、MSRA、People’s_Daily 7 个数据集联结进行训练,并在各个数据集上别离进行验证。其中 CMeEE-V2、CLUENER2020、MSRA、People’s_Daily 数据集实用于命名实体辨认工作,DuIE2.0、CMeIE 数据集实用于关系抽取工作,DuEE1.0 数据集实用于事件抽取工作。后果如下所示:
数据集 | DuEE1.0 | DuIE2.0 | CMeEE-V2 | CLUENER2020 | CMeIE | MSRA | People’s_Daily |
---|---|---|---|---|---|---|---|
参数设置 B =0.6 | 0.8657 | 0.8725 | 0.8266 | 0.889 | 0.8155 | 0.9856 | 0.9933 |
能够通过上述后果,验证 EasyNLP 框架中 K -Global Pointer 算法实现的正确性、有效性。
K-Global Pointer 模型应用教程
以下咱们简要介绍如何在 EasyNLP 框架使⽤ K -Global Pointer 模型。分为三种状况,别离是①用户应用数据训练模型②用户验证训练好的模型③用户应用训练好的模型实现中文信息抽取工作。咱们提供了联结 DuEE1.0、DuIE2.0、CMeEE-V2、CLUENER2020、CMeIE、MSRA、People’s_Daily 7 个数据集的数据,能够通过 sh run_train_eval_predict_user_defined_local.sh 来下载获取 train.tsv、dev.tsv、predict_input_EE.tsv、predict_input_NER.tsv 文件,其中 train.tsv 文件可用于训练、dev.tsv 文件可用于验证、predict_input_EE.tsv、predict_input_NER.tsv 文件可用于测试。用户也能够应用自定义数据。
⽤户能够间接参考 GitHub(https://github.com/alibaba/Ea…)上的阐明装置 EasyNLP 算法框架。而后 cd EasyNLP/examples/information_extraction。
①用户应用数据训练模型
数据筹备
训练模型须要应用训练数据和验证数据。用户能够应用咱们提供的数据,也能够应用自定义数据。数据表示为 train.tsv 文件以及 dev.tsv 文件,这两个⽂件都蕴含以制表符 \t 分隔的五列,第一列是标签,第二列是上文 K -Global Pointer 模型详解中提到的![](),第三列是答案的开始,第四列是答案的的完结,第五列是答案。样例如下:
People's_Daily-train-0 [' 找到文章中所有【LOC】类型的实体?文章:【海钓较量地点在厦门与金门之间的海域。】'] [29, 32] [31, 34] 厦门 | 金门
DuIE2.0-train-0 ['找到文章中所有【图书作品】类型的实体?文章:【《邪少兵王》是冰火未央写的网络小说连载于旗峰天下】'] [24] [28] 邪少兵王
DuIE2.0-train-1 ['找到文章中【邪少兵王】的【作者】?文章:【《邪少兵王》是冰火未央写的网络小说连载于旗峰天下】'] [28] [32] 冰火未央
DuEE1.0-train-25900 ['找到文章中所有【比赛行为 - 夺冠】类型的实体?文章:【盖斯利在英国大奖赛首场练习赛中夺冠】'] [41] [43] 夺冠
DuEE1.0-train-25901 ['找到文章中【夺冠】的【冠军】?文章:【盖斯利在英国大奖赛首场练习赛中夺冠】'] [19] [22] 盖斯利
DuEE1.0-train-25902 ['找到文章中【夺冠】的【夺冠赛事】?文章:【盖斯利在英国大奖赛首场练习赛中夺冠】'] [25] [35] 英国大奖赛首场练习赛
训练模型
代码如下:
python main.py \
--mode train \
--tables=train.tsv,dev.tsv \
--input_schema=id:str:1,instruction:str:1,start:str:1,end:str:1,target:str:1 \
--worker_gpu=4 \
--app_name=information_extraction \
--sequence_length=512 \
--weight_decay=0.0 \
--micro_batch_size=2 \
--checkpoint_dir=./information_extraction_model/ \
--data_threads=5 \
--user_defined_parameters='pretrain_model_name_or_path=hfl/macbert-large-zh' \
--save_checkpoint_steps=500 \
--gradient_accumulation_steps=8 \
--epoch_num=3 \
--learning_rate=2e-05 \
--random_seed=42
训练好的模型保留在 information_extraction_model 文件夹中。
②用户验证训练好的模型
数据筹备
验证模型须要应用验证数据。用户能够应用咱们提供的数据,也能够应用自定义数据。数据表示为 dev.tsv 文件,这个⽂件蕴含以制表符 \t 分隔的五列,第一列是标签,第二列是上文 K -Global Pointer 模型详解中提到的 \(H \),第三列是答案的开始,第四列是答案的的完结,第五列是答案。样例如下:
People's_Daily-train-0 [' 找到文章中所有【LOC】类型的实体?文章:【海钓较量地点在厦门与金门之间的海域。】'] [29, 32] [31, 34] 厦门 | 金门
DuIE2.0-train-0 ['找到文章中所有【图书作品】类型的实体?文章:【《邪少兵王》是冰火未央写的网络小说连载于旗峰天下】'] [24] [28] 邪少兵王
DuIE2.0-train-1 ['找到文章中【邪少兵王】的【作者】?文章:【《邪少兵王》是冰火未央写的网络小说连载于旗峰天下】'] [28] [32] 冰火未央
DuEE1.0-train-25900 ['找到文章中所有【比赛行为 - 夺冠】类型的实体?文章:【盖斯利在英国大奖赛首场练习赛中夺冠】'] [41] [43] 夺冠
DuEE1.0-train-25901 ['找到文章中【夺冠】的【冠军】?文章:【盖斯利在英国大奖赛首场练习赛中夺冠】'] [19] [22] 盖斯利
DuEE1.0-train-25902 ['找到文章中【夺冠】的【夺冠赛事】?文章:【盖斯利在英国大奖赛首场练习赛中夺冠】'] [25] [35] 英国大奖赛首场练习赛
验证模型
代码如下:
python main.py \
--mode evaluate \
--tables=dev.tsv \
--input_schema=id:str:1,instruction:str:1,start:str:1,end:str:1,target:str:1 \
--worker_gpu=4 \
--app_name=information_extraction \
--sequence_length=512 \
--weight_decay=0.0 \
--micro_batch_size=2 \
--checkpoint_dir=./information_extraction_model/ \
--data_threads=5
③用户应用训练好的模型实现中文信息抽取工作
数据筹备
测试模型须要应用测试数据。用户能够应用咱们提供的数据,也能够应用自定义数据。
对于命名实体辨认工作,数据表示为 predict_input_NER.tsv 文件,这个⽂件蕴含以制表符 \t 分隔的三列,第一列是标签,第二列是实体类型,第三列是文本。咱们反对对同一个文本辨认多种实体类型,仅须要在第二列中将不同的实体类型用; 分隔开。样例如下:
1 LOC;ORG 海钓较量地点在厦门与金门之间的海域。
对于关系抽取工作,数据表示为 predict_input_RE.tsv 文件,这个⽂件蕴含以制表符 \t 分隔的三列,第一列是标签,第二列是关系类型,第三列是文本。咱们反对对同一个文本辨认多种关系类型,仅须要在第二列中将不同的关系类型用; 分隔开。对于一个关系类型 relation_type(subject_type-predicate-object_type)示意为 subject_type:predicate,样例如下:
1 图书作品: 作者《邪少兵王》是冰火未央写的网络小说连载于旗峰天下
对于事件抽取工作,数据表示为 predict_input_EE.tsv 文件,这个⽂件蕴含以制表符 \t 分隔的三列,第一列是标签,第二列是事件类型 class,第三列是文本。咱们反对对同一个文本辨认多种事件类型,仅须要在第二列中将不同的事件类型用; 分隔开。对于一个事件类型 class 蕴含 event_type 以及 role_list(r1,r2,……)示意为 event_type:r1,r2,……,样例如下:
1 比赛行为 - 夺冠: 夺冠赛事, 裁员人数 盖斯利在英国大奖赛首场练习赛中夺冠
测试模型
对于命名实体辨认工作,代码如下:
python main.py \
--tables=predict_input_NER.tsv \
--outputs=predict_output_NER.tsv \
--input_schema=id:str:1,scheme:str:1,content:str:1 \
--output_schema=id,content,q_and_a \
--worker_gpu=4 \
--app_name=information_extraction \
--sequence_length=512 \
--weight_decay=0.0 \
--micro_batch_size=4 \
--checkpoint_dir=./information_extraction_model/ \
--data_threads=5 \
--user_defined_parameters='task=NER'
模型输入后果见 predict_output_NER.tsv 文件
对于关系抽取工作,代码如下:
python main.py \
--tables=predict_input_RE.tsv \
--outputs=predict_output_RE.tsv \
--input_schema=id:str:1,scheme:str:1,content:str:1 \
--output_schema=id,content,q_and_a \
--worker_gpu=4 \
--app_name=information_extraction \
--sequence_length=512 \
--weight_decay=0.0 \
--micro_batch_size=4 \
--checkpoint_dir=./information_extraction_model/ \
--data_threads=5 \
--user_defined_parameters='task=RE'
模型输入后果见 predict_output_RE.tsv 文件
对于事件抽取工作,代码如下:
python main.py \
--tables=predict_input_EE.tsv \
--outputs=predict_output_EE.tsv \
--input_schema=id:str:1,scheme:str:1,content:str:1 \
--output_schema=id,content,q_and_a \
--worker_gpu=4 \
--app_name=information_extraction \
--sequence_length=512 \
--weight_decay=0.0 \
--micro_batch_size=4 \
--checkpoint_dir=./information_extraction_model/ \
--data_threads=5 \
--user_defined_parameters='task=EE'
模型输入后果见 predict_output_EE.tsv 文件
在阿里云机器学习 PAI-DSW 上进行中文信息抽取
PAI-DSW(Data Science Workshop)是阿里云机器学习平台 PAI 开发的云上 IDE,面向不同程度的开发者,提供了交互式的编程环境(文档)。在 DSW Gallery 中,提供了各种 Notebook 示例,不便用户轻松上手 DSW,搭建各种机器学习利用。咱们也在 DSW Gallery 中上架了应用 PAI-Diffusion 模型进行中文信息抽取的 Sample Notebook,欢送大家体验!
将来瞻望
在将来,咱们打算进一步改良 K -Global Pointer 模型,敬请期待。咱们将在 EasyNLP 框架中集成更多中⽂模型,笼罩各个常⻅中⽂畛域,敬请期待。咱们也将在 EasyNLP 框架中集成更多 SOTA 模型,来⽀持各种 NLP 和多模态工作。此外,阿⾥云机器学习 PAI 团队也在继续推动中⽂ NLP 和多模态模型的⾃研⼯作,欢送⽤户继续关注咱们,也欢送加⼊咱们的开源社区,共建中⽂ NLP 和多模态算法库!
Github 地址:https://github.com/alibaba/Ea…
Reference
- Chengyu Wang, Minghui Qiu, Taolin Zhang, Tingting Liu, Lei Li, Jianing Wang, Ming Wang, Jun Huang, Wei Lin. EasyNLP: A Comprehensive and Easy-to-use Toolkit for Natural Language Processing. EMNLP 2022
- GlobalPointer:https://kexue.fm/archives/8373
阿里灵杰回顾
- 阿里灵杰:阿里云机器学习 PAI 开源中文 NLP 算法框架 EasyNLP,助力 NLP 大模型落地
- 阿里灵杰:预训练常识度量较量夺冠!阿里云 PAI 公布常识预训练工具
- 阿里灵杰:EasyNLP 带你玩转 CLIP 图文检索
- 阿里灵杰:EasyNLP 中文文图生成模型带你秒变艺术家
- 阿里灵杰:EasyNLP 集成 K -BERT 算法,借助常识图谱实现更优 Finetune
- 阿里灵杰:中文稠密 GPT 大模型落地 — 通往低成本 & 高性能多任务通用自然语言了解的要害里程碑
- 阿里灵杰:EasyNLP 玩转文本摘要(新闻标题)生成
- 阿里灵杰:跨模态学习能力再降级,EasyNLP 电商文图检索成果刷新 SOTA
- 阿里灵杰:EasyNLP 带你实现中英文机器浏览了解
- 阿里灵杰:EasyNLP 公布交融语言学和事实常识的中文预训练模型 CKBERT
- 阿里灵杰:当大火的文图生成模型遇见常识图谱,AI 画像趋近于真实世界
- 阿里灵杰:PAI-Diffusion 模型来了!阿里云机器学习团队带您徜徉中文艺术陆地
- 阿里灵杰:阿里云 PAI-Diffusion 性能再降级,全链路反对模型调优,均匀推理速度晋升 75% 以上