NLP(七十五)大模型时代下的开放领域三元组抽取

本文将会介绍在大模型(LLM)时代下,如何在开放领域进行三元组抽取。本文内容已开源至Github,网址为:https://github.com/percent4/llm_open_triplet_extraction .

回顾

在三年前,那时候还是BERT模型时代,笔者在三元组抽取方面做了一些探索尝试,分别在限定领域、开放领域进行三元组抽取,并进一步给出了构建知识图谱的例子。

以下是笔者关于这方面探索的文章:

  1. NLP(二十六)限定领域的三元组抽取的一次尝试

  2. NLP(二十七)开放领域的三元组抽取的一次尝试

  3. 知识图谱构建举例

限定领域三元组抽取

所谓限定领域三元组抽取,指的是在特定的Schema约束下,从文本中抽取出符合条件的三元组。笔者当时以2019语言与智能技术竞赛的三元组抽取比赛为例,其数据集的三元组Schema为50种关系。

采用的模型为Pipeline模型,先用序列标注算法进行实体识别,再用关系分类模型进行关系分类,形成三元组,流程图如下:

限定领域三元组抽取

开放领域三元组抽取

所谓开放领域三元组抽取,指的是不限定Schema,从文本中抽取出有效的三元组。笔者当时以自己标注的三元组数据(主要为人物关系、头衔职务等)为例,数据集规模为3200条样本,采用的模型流程图如下:

开放领域三元组抽取

知识图谱构建

三元组抽取能够从非结构化数据(文本)中抽取出符合条件的(实体1, 关系, 实体2)或(实体1, 属性, 属性值)三元组,从而方便我们加工出知识图谱,因为知识图谱的基本单元就是三元组。

笔者以上述的开放领域三元组抽取为例,在文学作品《平凡的世界》、《白鹿原》、《神雕侠侣》、《明朝那些事儿》、《曾国藩》和政治新闻中抽取三元组,结合人工整理,形成有价值的知识图谱。

关于知识图谱构建的例子,可参考Github项目:knowledge_graph_demo .

数据集

时间已进入大模型时代,用大模型来进行开放领域三元组抽取,应当有更好的效果。本文即是笔者的进一步尝试。有了大模型,以往难做的开放领域三元组抽取就变得较为容易了,因为大模型的文本生成模式,基本可以完成以往所有的NLP任务,这无疑是一次NLP领域的重大革命。

笔者在以往3200条关于开放领域三元组抽取样本的基础上,采用主动学习方法,将数据集扩充至5259条样本,涉及领域主要为人物关系、头衔职务等。数据集已上传至HuggingFace,网址为:jclian91/open_domain_triple_extraction.

对三元组数量进行统计分析,如下图所示:

三元组数量分布图

我们构造了1680条无三元组的样本,这在数据集中十分重要,因为现实世界中的文本中包含有大量的无三元组的数据,因此,基于标注数据训练的模型需要有区分是否含有三元组的能力。

可视化

在介绍大模型微调三元组抽取前,我们先来看一下,微调后的模型在新样本的表现。

例子1

来源网站:https://www.chinanews.com/cj/2023/09-25/10083719.shtml

可视化页面抽取结果如下:

形成的知识图谱如下:

例子2

来源网站:https://www.jjxw.cn/xinwen/jjsz/202309/t20230926_6225481.html

可视化页面抽取结果如下:

形成的知识图谱如下:

模型训练

本文采用Firefly框架和基座模型Baichuan2-13B-Base,在开放领域三元组抽取数据集上进行微调(SFT)。

只需要将数据加工成Firefly框架支持的对话格式,prompt构造如下:

给定以下文本,请分析并提取其中的关系三元组。每个三元组应该包括主体(人物、组织或物体)、关系和客体(人物、地点或物体)。如果文本中没有明显的关系,请返回空字符串。: "{content}":- (主体,关系,客体)- (主体,关系,客体),请返回空字符串。

训练参数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
"output_dir": "output/firefly-baichuan2-13b-spo",
"model_name_or_path": "/workspace/Baichuan2-13B-Base",
"train_file": "./data/spo.jsonl",
"num_train_epochs": 10,
"per_device_train_batch_size": 4,
"gradient_accumulation_steps": 2,
"learning_rate": 1e-4,
"max_seq_length": 550,
"logging_steps": 100,
"save_steps": 100,
"save_total_limit": 1,
"lr_scheduler_type": "constant_with_warmup",
"warmup_steps": 300,
"lora_rank": 64,
"lora_alpha": 16,
"lora_dropout": 0.05,

"gradient_checkpointing": true,
"disable_tqdm": false,
"optim": "paged_adamw_32bit",
"seed": 42,
"fp16": true,
"report_to": "tensorboard",
"dataloader_num_workers": 0,
"save_strategy": "steps",
"weight_decay": 0,
"max_grad_norm": 0.3,
"remove_unused_columns": false
}

模型评估

对开放领域三元组抽取进行模型评估应当是一件困难的事情,因为三元组的Schema是不受约束的。但好在,笔者构建的数据集主要是从新闻、小说中采集的关于人物关系、头衔职务的数据,因此,笔者又收集了来自各个网站的新闻、小说中的三元组,共100条评估样本,文件为evaluate_data.xlsx,前几行如下:

文本 真实三元组 来源 网址
新华社杭州9月24日电(记者姬烨、董意行)国际奥委会主席巴赫23日在杭州出席了第19届亚运会开幕式,他称赞这场开幕式是数字创新和人文风采的完美结合。 (新华社,记者,姬烨)(新华社,记者,董意行)(国际奥委会,主席,巴赫) 新华网 https://www.news.cn/sports/2023-09/24/c_1212274341.htm
2022年11月,法国总统马克龙访问泰国,受到泰国国王哇集拉隆功接见。希里婉瓦丽出现在父亲身边。 (法国,总统,马克龙)(泰国,国王,哇集拉隆功) 网易新闻 https://www.163.com/dy/article/IFDIJR03051283GO.html
“这位是红岸基地的雷志成政委。我是杨卫宁,基地的总工程师。离降落还有一个小时,你休息吧。” (红岸基地,政委,雷志成)(基地,总工程师,杨卫宁) 鲲弩小说 https://www.kunnu.com/santi/26653.htm

对三元组抽取的评估办法,笔者借鉴了苏神的思路,主要参考代码为 examples/task_relation_extraction.py .

最终的评估结果为:

1
f1: 0.84831, precision: 0.90419, recall: 0.79894: : 100it

总结

这几年来,笔者一直在思考如何在开放领域进行三元组抽取,但在BERT模型时代受限太大,基本就是传统的限定领域的关系抽取模型。

大模型的出现,无疑是现阶段解决开放领域三元组抽取的最佳方式,也算是了了笔者多年的一个夙愿。

当然,大模型在解决开放领域中三元组抽取的过程中并不是万能的,还有许多问题待解决,笔者尝试着列举如下:

  • 如何对抽取的三元组中的实体进行对齐
  • 在抽取三元组过程中添加时间维度(即知识更新),形成时序知识图谱
  • 如何避免抽取无效三元组
  • 当数据涉及的领域变多后,如何保证模型的效果
  • 如何在一本书籍中,将抽取出的三元组自动构建知识图谱
  • 给出更多的知识图谱的构建例子
  • 如何提升模型的推理速度
  • 其它

以上内容笔者已开源至Github,网址为:https://github.com/percent4/llm_open_triplet_extraction,欢迎大家参考~

推荐阅读

欢迎关注我的公众号NLP奇幻之旅,原创技术文章第一时间推送。

欢迎关注我的知识星球“自然语言处理奇幻之旅”,笔者正在努力构建自己的技术社区。


NLP(七十五)大模型时代下的开放领域三元组抽取
https://percent4.github.io/NLP(七十五)大模型时代下的开放领域三元组抽取/
作者
Jclian91
发布于
2024年1月10日
许可协议