NLP信息抽取大总结:两种范式&三大任务&三种方案(带Prompt模板)

信息抽取大总结

    • 1.信息抽取的本质?
    • 2.信息抽取的两种范式?
    • 3.信息抽取三大任务?
    • 4.开放域VS限定域
    • 5.信息抽取三种方案?
      • 范式一:基于自定义规则抽取(2018年前)
      • 范式二:基于Bert+下游任务建模抽取(2018年后)
      • 范式三:基于大模型+Promt抽取(2022年后)
    • 附1:Prompt信息抽取模板
      • (1)实体抽取
      • (2)关系抽取
      • (3)事件抽取
      • (4)三元组抽取
    • 附2:中文大模型抽取哪家强?
    • 附3:专用于信息抽取的模型
    • 附4:信息抽取的趋势

2024.11.27
12.6更新

I hear and I forget; I see and I know; I do and I understand

1.信息抽取的本质?

针对NLP领域的信息抽取,即是从原始文本数据中自动提取出结构化的信息,本质相当于是对原始数据进行了一次信息加工,把我们不关注的信息进行了剔除或把我们关注的信息进行提炼。

抽取后的信息就相当于一篇论文的摘要和关键词。

2.信息抽取的两种范式?

有两种:
(1)NLU式:输入→编码器(如Bert,CNN,RNN)→解码器(如softmax,crf)→抽取的信息(如实体、关系、事件)
(2)NLG式:输入+Prompt→解码器(如各种生成式大模型)→生成的信息(如实体、关系、事件)

小结:
前者以bert为代表,我们通常选取一个预训练完成的bert模型作为编码器,然后根据目标任务在bert输出后手动添加解码层,如在实体抽取任务中添加一个crf层。在训练时可以选择冻结BERT全部参数或者微调较高的几层。
后者通常以如今的大模型为代表,如GPT4、Qwen等,端到端的信息抽取,输入文本和Prompt,直接输出期望的结果和格式。
两者对比,NLU的特点是需要针对任务单独训练解码器才能工作,这意味着需要准备去一定量的标注数据,属于监督学习。NLG的特点是零样本或者少样本学习,拿来即用,虽然其性能不如NLU(如BERT是双向学习更能理解语义信息),但在很多场景下,少样本学习够用了,不需要在训练泛化性好(省事),所以目前NLG的方式逐渐成为主流。但如果对抽取的质量有严格的要求(比如医疗、金融、安全领域),或者容易获取标注数据,那么NLU是更更适合的方式。
有一点需要明确:
现在倾向于使用NLG的方式进行信息抽取,并不是它的性能比NLU的更好,而是因为它更省事(拿来就用,少样本学习),NLU是效果更好的方式,但其成本更高(需要标注数据和训练)。
技术总是朝着更省事的方向发展。

3.信息抽取三大任务?

信息抽取是一个较大的范畴,可以细分为很多任务,但我们通常关注与知识图谱构建相关的以下三类:
在这里插入图片描述

  • 实体抽取

    实体抽取的总结可以查看我的另外一篇文章:

    https://blog.csdn.net/xiangxiang613/article/details/143922862

  • 关系抽取

    待总结

  • 事件抽取

    待总结

    这些任务在建模时可以独立建模(每种任务一个模型)或者统一建模(一个模型能同时处理多种任务,如下图的UIE)。
    请添加图片描述

4.开放域VS限定域

  • 开放域信息抽取,就是不限定实体和关系的类型,给定文本,抽取其包含的所有SPO三元组〈主,谓,宾〉,或者叫RDF三元组,这个通常就弱化了schema的设计(不需要设计);在大模型构建知识图谱时代,这个是趋势。
  • 限定域信息抽取,就是限定抽取的实体和关系类型(此时可以画出清晰的schema),此时适合清晰的业务场景,具备推理价值。

5.信息抽取三种方案?

下面更侧重与实体抽取和关系抽取任务的处理,因为在知识抽取过程中更关注这两类。

范式一:基于自定义规则抽取(2018年前)

典型的,使用自定义词典+分词工具+词性标注完成实体抽取;基于依存句法分析+自定义关系创建规则完成关系抽取。这是在深度学习时代前常用的方法,优点是简单好理解,上手快,不需要标注数据和训练模型,只需要写规则;但规则的最大缺点就是不灵活,覆盖率低。

范式二:基于Bert+下游任务建模抽取(2018年后)

请添加图片描述

Bert的诞生重塑了NLP的任务构建范式,几乎所有的NLP任务都被转换为BERT的下游任务进行微调。在信息抽取领域,此时需要完成一定量的下游任务样本数据集标注(通常还伴随着标注规范的指定),针对一份数据集,会同时标注实体和实体间的关系。

一个样本标注完的数据,大概包含下面这些信息:

(人工标注的过程其实就是人在做信息抽取的过程)

{
    "sentences": ["维护V3^对蓄电池进行充电处理^由于蓄电池电量不足^无法启动↓↓充电处理*蓄电池↓蓄电池*电量不足↓[整车]无法启动"],
    "ner": [[[6, 8, "PART"], [11, 14, "METHOD"], [18, 20, "PART"], [21, 24, "STATUE"], [26, 29, "STATUE"], [32, 39, "SOLUTION"], [41, 48, "TROUBLE"], [50, 57, "TROUBLE"]]],
    "relations": [[]],
    "doc_key": "RID_2014010129978096",
    "predicted_ner": [[[6, 8, "PART"], [11, 14, "METHOD"], [18, 20, "PART"], [21, 24, "STATUE"], [26, 29, "STATUE"], [32, 39, "SOLUTION"], [41, 48, "TROUBLE"], [50, 57, "TROUBLE"]]],
    "predicted_relations": [[]],
    "sections": [[[0, 3], [5, 14], [16, 24], [26, 29]]],
    "dtc": [[]],
    "part_no": [["00-000"]],
    "part_name": [["无零件"]],
    "relations_inside": [[[11, 14, 6, 8, "METH"], [18, 20, 21, 24, "TROU"]]],
    "combined_ner_to_rel": [{"充电处理*蓄电池": 0, "蓄电池*电量不足": 1}]
}

基于标注完成的数据,可以分别训练实体抽取模型和关系抽取模型(pipeline方式),也可以同时训练实体-关系抽取模型(joint方式),此处不展开,后面再关系抽取总结的文章中再谈。

无论是那种方式,都会采用bert来作为底层的文本编码器,实现文本向量生成,区别在于bert向量生成后的下游任务建模方式不同

在Bert时代,信息抽取任务通常是被当成一个序列标注型任务进行处理的,答案是存在于文本之中的。

即使在大模型时代,基于bert类的抽取方法也是性能最好的。在2024年了,都还有这方面的模型出现。如GliNER(基于DeBERTA v3 large)star1.5K,可以一看:

https://www.zhihu.com/people/luo-xie-yang-guang【GliNER 多任务: 适用于各种信息提取任务的通用轻量级模型

补充:bert这么好,为什么大家要用大模型,因为要用bert一方面是要标注数据进行微调,另一方面是微调后的模型通常只能识别限定域的实体类型和关系类型(训练什么就识别什么),这个特点导致使用bert模型的成本很高,而大模型则是属于开放域信息抽取,不限制实体和关系的类型(更具应用场景可以限定)。

范式三:基于大模型+Promt抽取(2022年后)

请添加图片描述

这里的大模型准确来说是指生成式大模型,此时将信息抽取任务转换为文本生成任务进行处理。

在大模型时代下,信息抽取任务只需要编写一个少样本学习的Promt即可完成抽取,见后文。少样本学习(few-short)是指在Prompt中添加几个任务的示例样本,包含输入和输出。在信息抽取领域,这种方式明细优于零样本学习(zero-short)。可以参考:https://zhuanlan.zhihu.com/p/702821255

尽管大模型在各种NLP任务上取得了SOTA性能,但其在NER上的性能仍然明显低于监督基线。这是由于NER和llm两个任务之间的差距:前者本质上是一个序列标记任务,而后者是一个文本生成模型。

完整的大模型用于信息抽取综述性文章可以参考:《Large Language Models for Generative Information Extraction: A Survey》https://arxiv.org/pdf/2312.17617.pdf

请添加图片描述

附1:Prompt信息抽取模板

收集的一些Prompt模板如下,英文模板需要翻译为中文模板进行使用,陆续更新:

(1)实体抽取

  • 模板1:来自oneKE
{
    "task": "NER",
    "source": "NER",
    "instruction": {
        "instruction": "你是专门进行实体抽取的专家。请从input中抽取出符合schema定义的实体,不存在的实体类型返回空列表。请按照JSON字符串的格式回答。",
        "schema": ["人物", "地理位置", "组织机构"],
        "input": "在这里恕弟不恭之罪,敢在尊前一诤:前人论书,每曰“字字有来历,笔笔有出处”,细读公字,何尝跳出前人藩篱,自隶变而后,直至明季,兄有何新出?"
    },
    "output": {
        "人物": [],
        "地理位置": [],
        "组织机构": []
    }
}

  • 模板2:来自YAYI-UIE
{
  "Task": "NER",
  "Dataset": "WikiNeural",
  "instruction": "Text: In the Tour of Flanders , he took on a defensive role when his teammate Stijn Devolder escaped and won . \n【Named Entity Recognition】From the given text, extract all the entities and types. Please format the answer in json {location/person/organization:[entities]}. \nAnswer:",
  "input": "",
  "label": {
    "person": ["Stijn Devolder"]
  }
}

  • 模板3:来自Assessing the Performance of Chinese Open Source Large Language Models in Information Extraction Tasks[https://arxiv.org/abs/2406.02079]

    包含普通的和二阶段,且NER两阶段性能大幅度优于普通

    请添加图片描述

(2)关系抽取

  • 模板1:来自oneKE
{
    "task": "RE",
    "source": "RE",
    "instruction": {
        "instruction": "你是专门进行关系抽取的专家。请从input中抽取出符合schema定义的关系三元组,不存在的关系返回空列表。请按照JSON字符串的格式回答。",
        "schema": ["丈夫", "上映时间", "专业代码", "主持人"],
        "input": "如何演好自己的角色,请读《演员自我修养》《喜剧之王》周星驰崛起于穷困潦倒之中的独门秘笈"
    },
    "output": {
        "丈夫": [],
        "上映时间": [],
        "专业代码": [],
        "主持人": []
    }
}

  • 模板2:来自Assessing the Performance of Chinese Open Source Large Language Models in Information Extraction Tasks[https://arxiv.org/abs/2406.02079]

​ 包含普通的和QA4RE

请添加图片描述

(3)事件抽取

  • 模板1:来自oneKE
{
    "task": "EE",
    "source": "PHEE",
    "instruction": {
        "instruction": "You are an expert in event extraction. Please extract events from the input that conform to the schema definition. Return an empty list for events that do not exist, and return NAN for arguments that do not exist. If an argument has multiple values, please return a list. Respond in the format of a JSON string.",
        "schema": [
            {
                "event_type": "potential therapeutic event",
                "trigger": true,
                "arguments": [
                    "Treatment.Time_elapsed",
                    "Treatment.Route",
                    "Treatment.Freq",
                    "Treatment",
                    "Subject.Race",
                    "Treatment.Disorder",
                    "Effect",
                    "Subject.Age",
                    "Combination.Drug",
                    "Treatment.Duration",
                    "Subject.Population",
                    "Subject.Disorder",
                    "Treatment.Dosage",
                    "Treatment.Drug"
                ]
            },
            {
                "event_type": "adverse event",
                "trigger": true,
                "arguments": [
                    "Subject.Population",
                    "Subject.Age",
                    "Effect",
                    "Treatment.Drug",
                    "Treatment.Dosage",
                    "Treatment.Freq",
                    "Subject.Gender",
                    "Treatment.Disorder",
                    "Subject",
                    "Treatment",
                    "Treatment.Time_elapsed",
                    "Treatment.Duration",
                    "Subject.Disorder",
                    "Subject.Race",
                    "Combination.Drug"
                ]
            }
        ],
        "input": "Our findings reveal that even in patients without a history of seizures, pregabalin can cause a cortical negative myoclonus."
    },
    "output": {
        "potential therapeutic event": [],
        "adverse event": [
            {
                "trigger": "cause",
                "arguments": {
                    "Subject.Population": "NAN",
                    "Subject.Age": "NAN",
                    "Effect": "cortical negative myoclonus",
                    "Treatment.Drug": "pregabalin",
                    "Treatment.Dosage": "NAN",
                    "Treatment.Freq": "NAN",
                    "Subject.Gender": "NAN",
                    "Treatment.Disorder": "NAN",
                    "Subject": "patients without a history of seizures",
                    "Treatment": "pregabalin",
                    "Treatment.Time_elapsed": "NAN",
                    "Treatment.Duration": "NAN",
                    "Subject.Disorder": "NAN",
                    "Subject.Race": "NAN",
                    "Combination.Drug": "NAN"
                }
            }
        ]
    }
}


  • 模板2:来自Assessing the Performance of Chinese Open Source Large Language Models in Information Extraction Tasks[https://arxiv.org/abs/2406.02079]

(4)三元组抽取

  • 模板1:来自YAYI-UIE
{
  "Task": "CRE",
  "Dataset": "SanWen_sample50000",
  "instruction": "文本: 我与其他云南同学对视骇笑 \n【关系抽取】已知关系列表是['unknown', '造出', '使用', '临近', '社会关系', '位于', '拥有者', '隶属于', '亲属', '包含']\n根据关系列表抽取关系三元组,在这个句子中可能包含哪些关系三元组?请按照json[{'relation':'', 'head':'', 'tail':''}, ]的格式回答。\n答案:",
  "input": "",
  "label": [
    {
      "relation": "社会关系",
      "head": "我",
      "tail": "其他云南同学"
    }
  ]
}

  • 模板2:来自textgraphs
prompt= """
        句子: {}        
        从句子中提取 RDF 三元组,格式如下:        
        主语:<主语>        
        谓词:<谓词>        
        宾语:<宾语,可选>            
        """    
text= """维尔纳·赫尔佐格是一位德国电影导演、编剧、作家、演员和歌剧导演,被认为是新德国电影的先驱。"""

附2:中文大模型抽取哪家强?

参考1:【哪个中文开源大模型在信息抽取上效果最好?
论文:https://arxiv.org/abs/2406.02079

结论:

  • 实体抽取(零样本):qwen-14B >> Baichuan2-13B > qwen-7B > ChatGLM3-6B
    请添加图片描述
    注意:各模型少样本的性能会普遍强于零样本,如Qwen-14B:
    在这里插入图片描述

同时和“传统模型”进行比较一下:
当你发现2021年的bert-crf在Weibo上的F1=72.77时,就突然觉得LLM也不过如此哈?进一步看到MSRA上的对比,发现LLM真的不够看。
在这里插入图片描述
在这里插入图片描述

  • 关系抽取(无限制):qwen-14B > qwen-7B > ChatGLM3-6B>Baichuan2-13B
    数据集:DuIE2.0,一个基线性能为(https://aistudio.baidu.com/projectdetail/428942?searchKeyword=%E5%85%B3%E7%B3%BB%E6%8A%BD%E5%8F%96%20%E5%9F%BA%E7%BA%BF&searchTab=ALL):
    precision: 0.626842, recall: 0.664693, f1: 0.645213
    请添加图片描述
    和传统模型比较:
    duIE 2.0 是一个2020年比赛中放出的数据集https://aistudio.baidu.com/competition/detail/31/0/introduction
    目前搜不到冠军方案欲的风
    在网上找到了一个CasRel的测试结果(https://blog.csdn.net/qq_44665283/article/details/140382690),供对比参考
    f1: 0.74309, precision: 0.78018, recall: 0.70936

可以发现在关系抽取上,LLM是有优势的。

  • 事件抽取:Baichuan2-13B > qwen-14B >>qwen-7B > ChatGLM3-6B
    数据集:duEE,也是比赛数据集,一个的基准性能为:
    参考:https://aistudio.baidu.com/projectdetail/2185828
    dev step: 69500 - loss: 0.41906, precision: 0.55107, recall: 0.67545, f1: 0.60696 current best 0.61992
    请添加图片描述
    对比发现:在事件抽取上,国产大模型的优势并不是很明显。

整体来看,Qwen系列确实很强,特别是现在还升级到了2.5系列,在实际使用过程中,体验也不错,可以作为一个不错的基准大模型用于中文领域的信息抽取。

附3:专用于信息抽取的模型

  • ✅UIE:2022,百度,基于ENRIE3.0开发,在当时刷新了13个IE任务的SOTA!开启了中文信息抽取统一建模方式,支持NER、RE、EE和情感分类,不限定领域和类型,非常优雅,支持中文、英文、多语言,有多个参数版本,亲测非常推荐。

  • InstructUIE:基于指令微调后的UIE?

  • oneKE:https://github.com/zjunlp/DeepKE/tree/main/example/llm/InstructKGC/data

  • UniLM:https://github.com/microsoft/unilm,微软出品,20+Kstar

  • UniIE:https://github.com/AAIG-NLP/UniIE

  • GliNER:https://github.com/urchade/GLiNER,2024新提出。1.5Kstar

  • ❌openNRE:清华出品,基于CNN_ATT用于关系抽取,不支持中文很大槽点,官方说需要修改tokenizer和读取预训练的词向量,亲测不推荐。
    ————————20224.12.6更新———————

  • ✅MAOE:通义,实体抽取模型,支持300多种实体类型,抽取式无需指定实体类型,亲测效果不错。

  • ❌SiameseUIE、SiameseUniNLU:通义,统一的信息抽取和NLU模型,前者对标UIE,实测效果不如UIE。后者因为有升级版RexUniNLU的存在,因此也不推荐。

  • ✅RexUniNLU:通义,2023,大模型时代的小模型优秀之作,基于debertaV2,支持11种NLU任务的零样本学习(包含指代消解、文本分类、阅读理解、自然语言推理等),官方测试优于UIE,亲测非常推荐。
    在这里插入图片描述

  • ✅Rebel和mRebel:基于BART-large,端到端关系抽取,支持200多种关系类型,使用时无需指定。前者是英文版,后者是多语言版(支持中文,效果不错),亲测推荐。

陆续更新…

附4:信息抽取的趋势

信息抽取经历了以下发展阶段:
1)BERT出现前,信息抽取(NER、RE、EE等任务)通常是分别建模,一任务一模型,这个范式在bert出现后仍存在;
2)BERT出现后,出现了一种新的实体-关系抽取联合建模范式,以TPLinker为代表;发展最壮大的时期,是一个模型统一了信息抽取的多个任务(NER、RE、EE、情感分类),以UIE为代表;
4)大模型出现后,将所有的IE和NLU任务都转换为NLG任务,一时间,单独的或统一的信息抽取模型似乎失去了存在的意义。
4)如今,大模型盛行了2-3年了,开始出现了新的趋势:更专注于某个子任务(如实体抽取)或者信息抽取统一建模或NLU多任务统一建模的小模型又开始复苏了,如将NER做得更好的GliNER,或只针对NLU任务的RexUniNLU,都是近两年的工作。大模型的NLG范式似乎不能完全遮盖住NLU类小模型的光芒。
这背后的深层原因,应该是当前的大模型并不能完全满足我们的需求,当我们对大模型抽取的质量不满意时,我们又将目光投回到了BERT类小模型。
这就像大厂什么都做的的背景下,总还是有一些地方它覆盖不到,会让一些“小而美”的公司突围出来,比如当初的字节和小红书。大模型亦是如此,总有它做不好的地方,而这些薄弱的地方,就一定会诞生出一些新的方法和模型。

聊点其他:
从减少开发工作量的角度,我们都希望一个模型就能够同时完成实体、关系、事件抽取,想想都觉得很优雅。
大模型时代,这个已经是一个事实,其将所有信息抽取任务都转换为了生成式任务。
然后在大模型一统江湖之前,也是有迹可循的,以百度的UIE为代表的统一模型就将三种任务进行了统一建模(多任务学习),一个模型能够学习到适合多种任务的表示,而不是只针对单个任务的。其刷新了当时13个IE数据集的SOTA。
总结一下,信息抽取统一建模一般有两种方式
(1)在输入端统一建模:即调整prompt,不论是UIE(一个prompt针对一种任务)还是大模型(一个Prompt可同时处理多种任务)
(2)在输出端联合解码:这个在joint型的实体-关系抽取模型中比较常见。

中科闻歌研发YAYI-UIE信息抽取模型的过程,实质上是利用了量人工构造的高质量数据集,这些数据集的规模达到了百万级别。在数据的构造过程中,算法团队采用了多样化的文本和信息结构,确保模型在训练过程中能学习到丰富和细致的特征表示,这对于提高模型的信息抽取准确性和可靠性是至关重要的。 参考资源链接:[中科闻歌研发百万级信息抽取模型YAYI-UIE](https://wenku.csdn.net/doc/7sm043tnpj?spm=1055.2569.3001.10343) 具体而言,中科闻歌的算法团队可能采取了以下几种策略来构造数据集和进行模型的指令微调: 1. 数据集构建:团队成员可能涉及量的数据标注工作,通过人工审核和校对来确保数据的质量。这些数据集可能包括了各种类型的文本和复杂的信息结构,涵盖了丰富的实体、关系和事件类型。 2. 微调策略:在有了高质量的数据集之后,研发团队会使用这些数据对模型进行指令微调。这通常意味着在预训练的基础上,针对特定的任务进行额外的训练,以调整模型参数,使其更适合完成特定的信息抽取任务。 3. 模型架构:YAYI-UIE模型可能采用了先进的深度学习技术,如循环神经网络(RNN)、长短期记忆网络(LSTM)、Transformer等。这些模型能够处理复杂的序列数据,并在自然语言处理任务中表现出色。 4. 预训练与迁移学习:中科闻歌还可能运用了预训练语言模型如BERT、GPT等,通过迁移学习使模型能在特定信息抽取任务中快速适应并达到更高的性能。 5. 指令微调:用户可以根据特定需求对模型进行微调,使模型能够更好地理解和处理各种不同的信息抽取任务,从而提供更准确和高效的信息抽取服务。 通过上述方法,中科闻歌成功研发出了高性能的YAYI-UIE信息抽取模型。该模型的成功表明,结合规模高质量数据集和先进的模型架构,通过指令微调技术,可以显著提升信息抽取任务的性能和效率。 参考资源链接:[中科闻歌研发百万级信息抽取模型YAYI-UIE](https://wenku.csdn.net/doc/7sm043tnpj?spm=1055.2569.3001.10343)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值