欢迎关注我的公众号NLP奇幻之旅,原创技术文章第一时间推送。
![](https://i-blog.csdnimg.cn/blog_migrate/b4c00b06e68299f3a3379200b303d4e6.jpeg)
欢迎关注我的知识星球“自然语言处理奇幻之旅”,笔者正在努力构建自己的技术社区。
![](https://i-blog.csdnimg.cn/blog_migrate/4cc5f1c13d69fcdb4b9c2c7297015a46.jpeg)
本文将会介绍在大模型(LLM)时代下,如何在开放领域进行三元组抽取。本文内容已开源至Github,网址为:https://github.com/percent4/llm_open_triplet_extraction .
回顾
在三年前,那时候还是BERT模型时代,笔者在三元组抽取方面做了一些探索尝试,分别在限定领域、开放领域进行三元组抽取,并进一步给出了构建知识图谱的例子。
以下是笔者关于这方面探索的文章:
限定领域三元组抽取
所谓限定领域三元组抽取
,指的是在特定的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构造如下:
给定以下文本,请分析并提取其中的关系三元组。每个三元组应该包括主体(人物、组织或物体)、关系和客体(人物、地点或物体)。如果文本中没有明显的关系,请返回空字符串。\n\n文本: “{content}”\n\n请按照以下格式提取关系三元组列表:\n- (主体,关系,客体)\n- (主体,关系,客体)\n\n如果没有可识别的关系,请返回空字符串。
训练参数如下:
{
"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 .
最终的评估结果为:
f1: 0.84831, precision: 0.90419, recall: 0.79894: : 100it
总结
这几年来,笔者一直在思考如何在开放领域进行三元组抽取,但在BERT模型时代受限太大,基本就是传统的限定领域的关系抽取模型。
大模型的出现,无疑是现阶段解决开放领域三元组抽取的最佳方式,也算是了了笔者多年的一个夙愿。
当然,大模型在解决开放领域中三元组抽取的过程中并不是万能的,还有许多问题待解决,笔者尝试着列举如下:
- 如何对抽取的三元组中的实体进行对齐
- 在抽取三元组过程中添加时间维度(即知识更新),形成时序知识图谱
- 如何避免抽取无效三元组
- 当数据涉及的领域变多后,如何保证模型的效果
- 如何在一本书籍中,将抽取出的三元组自动构建知识图谱
- 给出更多的知识图谱的构建例子
- 如何提升模型的推理速度
- 其它
以上内容笔者已开源至Github,网址为:https://github.com/percent4/llm_open_triplet_extraction,欢迎大家参考~