大模型时代的信息抽取技术:零样本与少样本学习的崛起
在信息爆炸的今天,如何高效地从海量文本数据中提取关键信息,成为了自然语言处理(NLP)领域的一项核心挑战。传统的信息抽取方法依赖于大量的人工标注数据和复杂的规则设计,效率低下且难以适应新的领域。然而,随着大模型的兴起,零样本和少样本学习为信息抽取带来了新的可能性。本文将深入探讨大模型时代信息抽取技术的发展趋势,重点介绍零样本和少样本学习的优势、应用场景以及在大模型时代的意义。
一、传统NLP信息抽取面临的挑战
传统的NLP信息抽取流程通常包括以下几个步骤:
- 文本预处理:清洗文本数据,包括去除HTML标签、分段、分句、分词、词性标注和命名实体识别等。这一步是信息抽取的基石,直接影响后续流程的准确性。
- 句法分析:分析句子的结构,确定语法成分和关系。常用的方法包括依存句法分析和短语结构句法分析。句法分析的目的是为后续的语义分析提供结构化的信息。
- 语义分析:利用自然语言理解技术进行语义解析,提取句子的含义。这包括词义消歧、指代消解和情感分析等。语义分析旨在理解文本的深层含义。
- 实体识别:识别文本中的实体,如人名、地名和组织机构名等。实体识别是信息抽取的关键步骤,为关系抽取提供基础。
- 关系抽取:基于实体识别和语义分析的结果,提取实体之间的关系。关系抽取的目标是发现文本中实体之间的联系。
- 结果过滤:根据需求,对抽取的信息进行筛选和过滤,以提高信息的准确性和相关性。
然而,传统的NLP信息抽取流程存在诸多困难:
- 数据质量问题:数据质量直接影响整个流程的效果。低质量的数据需要进行清洗、去重等操作,这需要耗费大量的人工成本。
- 解析复杂度问题:句法分析和语义分析是NLP中较为复杂的任务,需要消耗大量的计算资源和时间。对于长文本和复杂句子的处理,传统方法往往难以达到理想的效果。
- 实体识别难点:实体识别需要考虑上下文环境、实体类型和同名实体等问题。这些因素都会影响实体识别的准确性,尤其是在处理歧义性文本时。
- 关系抽取挑战:关系抽取需要考虑多个实体之间的关系,同时还需要解决一些歧义问题。关系的复杂性和多样性使得关系抽取成为一项具有挑战性的任务。
在整个流程中,实体识别和关系抽取是比较关键的环节,它们的准确性直接影响到信息抽取的结果。为了解决这些问题,研究者们开始探索新的方法,其中零样本和少样本学习逐渐崭露头角。
二、零样本与少样本学习:概念与优势
1. 零样本与少样本的概念
零样本学习(Zero-Shot Learning)和少样本学习(Few-Shot Learning)是机器学习领域中常见的概念,尤其在图像识别和自然语言处理等领域应用广泛。零样本学习指的是模型在没有任何样本数据的情况下进行预测;而少样本学习则是指模型仅有少量样本数据时进行预测。
2. 零样本与少样本的应用场景
在实际应用中,零样本和少样本学习都有广泛的应用场景。例如,在自然语言处理中,我们希望算法能够自动理解新出现的单词,即使它们从未在训练集中出现过,这就是一种零样本学习。另外,当我们需要训练一个模型来分类大量不同物体的图像时,如果每个类别的训练数据都很少,那么就需要利用少样本学习的方法来训练模型。例如,在医学诊断领域,罕见疾病的病例数据非常有限,传统的机器学习方法难以有效应用。零样本和少样本学习则可以通过利用已有的相关知识,对罕见疾病进行诊断。
3. 零样本与少样本在大模型时代的优势和意义
在大模型时代,零样本和少样本学习变得更加重要。对于大规模的复杂任务,模型需要更多的数据来训练,但是获取足够的数据却非常困难。在这种情况下,通过零样本学习和少样本学习,我们可以利用已有的数据来加速模型的训练,并且提高模型的泛化能力。同时,这种方法还可以减少人工标注数据的工作量,大大降低了人力和时间成本。
4. 相比传统NLP,零样本和少样本学习具有以下优势:
- 更高的泛化能力:在传统NLP中,模型通常需要大量训练数据才能达到较好的性能。但是在实际应用中,我们经常遇到新的、未知的情况,此时传统NLP的表现会受到限制。而利用零样本和少样本学习的方法,则可以通过先前学习到的知识来更好地适应新的环境和任务,从而提高模型的泛化能力。
- 更低的数据标注成本:传统NLP通常需要大量的人工标注数据来进行模型的训练。但是这种方法需要耗费大量人力和时间,并且难以适应不断变化的场景。而利用零样本和少样本学习的方法,我们可以减少数据标注的成本,并且更快地适应新的任务和环境。
- 更广泛的应用场景:传统NLP通常需要大量的数据来支持模型的训练,因此很难在一些场景下应用,比如医疗、法律、金融等领域,这些领域的数据往往非常敏感、难以获取。而利用零样本和少样本学习的方法,则可以通过少量数据来支持模型的训练,并且在这些敏感领域具有更广泛的应用场景。
三、大模型时代的信息抽取技术
大模型如GPT-3、BERT等,通过预训练学习了丰富的语言知识,具备强大的泛化能力。这使得零样本和少样本学习在信息抽取任务中成为可能。以下将介绍如何利用大模型进行信息抽取,并提供代码示例。
1. 提示词设计
提示词(Prompt)设计是利用大模型进行信息抽取的关键。一个好的提示词能够引导模型输出期望的结果。在信息抽取任务中,我们需要考虑以下几个方面:
- 任务描述:明确告诉模型需要完成的任务,例如“信息抽取任务”。
- 输出格式:指定模型的输出格式,例如JSON格式。
IE_PATTERN = "{}
提取上述句子中{}类型的实体,并按照JSON格式输出,上述句子中不存在的信息用['原文中未提及']来表示,多个值之间用','分隔。"
2. 微调逻辑
基于ChatGLM等大模型微调NLP信息抽取任务的大致逻辑是这样的:
先进行对语料做一个分类
,即该语料属于哪个概念
(也就是属于哪个模式层,例如:猫,狗等概念层)。然后对这个概念
进行属性的抽取:例如
,猫有年纪,品种,产地等属性信息。
3. 数据样本
根据上述逻辑,我们需要准备两个语料:
- 分类语料一:告诉模型属于哪个模式层。
class_examples = {
'人物': '秦始皇(259BC – 210BC),又称嬴政,是中国历史上著名的政治家和军事家。他是秦国的君主,统一了六国之后建立了中国的第一个中央集权制度的封建王朝——秦朝。',
'书籍': '论语》是中国古代文化经典之一,由春秋时期的著名思想家孔子及其弟子们的言行录成。全书共20篇,收录孔子及其弟子的言论和事迹,它主要关注人的品德、修养和社会伦理。',
'电影': '《忠犬八公》是一部由拉斯·哈尔斯特朗执导,理查·基尔、琼·艾伦等主演的电影,于2009年上映。该电影改编自真实故事',
'都市': '郑州市隶属于中国河南省,是中华人民共和国的一个地级市。全名为“郑州市”,又称“中原之都”。郑州市是河南省的省会城市,成立省会时间为1952年。截至2021年统计数据,郑州市的总面积为7,446.2平方公里,人口约为1423万。郑州市是河南省的政治、文化、经济中心,也是中国中部地区的重要城市。',
'国家': '中国是位于亚洲东部的一个大国,拥有悠久的历史文化和丰富的自然资源。中国的首都是北京,人口超过14亿人,是世界上最大的国家之一。中国的经济实力也非常强大,在全球范围内拥有很高的影响力。中文是中国的官方语言,中国也拥有丰富多彩的饮食、艺术、体育和娱乐活动等文化特色。'
}
- 微调语料二:告诉模型一些示例,让它输出什么样的数据。
ie_examples = {
'人物': [
{
'content': '秦始皇(259BC – 210BC),又称嬴政,是中国历史上著名的政治家和军事家。他是秦国的君主,统一了六国之后建立了中国的第一个中央集权制度的封建王朝——秦朝。',
'answers': {
'姓名': ['秦始皇'],
'出生日期': ['259BC – 210BC'],
'职业': ['政治家', '军事家','秦国的君主'],
'功绩': ['统一了六国']
}
}
],
'都市': [
{
'content': '郑州市隶属于中国河南省,是中华人民共和国的一个地级市。全名为“郑州市”,又称“中原之都”。郑州市是河南省的省会城市,成立省会时间为1952年。截至2021年统计数据,郑州市的总面积为7,446.2平方公里,人口约为1423万。郑州市是河南省的政治、文化、经济中心,也是中国中部地区的重要城市。',
'answers': {
'名字': ['郑州市'],
'别名': ['中原之都'],
'归属地': ['河南省'],
'确立时间': ['1952年',],
'人口': ['1423万']
}
}
]
}
- 定义需要的属性:
schema = {
'人物': ['姓名', '性别', '出生日期', '出生地点', '职业', '国籍'],
'都市': ['别名', '名字', '归属地', '确立时间', '人口'],
'电视剧': ['电视剧名称', '导演', '演员', '题材', '出品方']
}
4. 微调代码
以下是一个基于ChatGLM微调NLP信息抽取任务的示例代码:
import re
import json
from rich import print
from rich.console import Console
from transformers import AutoTokenizer, AutoModel
class_examples = {
'人物': '秦始皇(259BC – 210BC),又称嬴政,是中国历史上著名的政治家和军事家。他是秦国的君主,统一了六国之后建立了中国的第一个中央集权制度的封建王朝——秦朝。',
'书籍': '论语》是中国古代文化经典之一,由春秋时期的著名思想家孔子及其弟子们的言行录成。全书共20篇,收录孔子及其弟子的言论和事迹,它主要关注人的品德、修养和社会伦理。',
'电影': '《忠犬八公》是一部由拉斯·哈尔斯特朗执导,理查·基尔、琼·艾伦等主演的电影,于2009年上映。该电影改编自真实故事',
'都市': '郑州市隶属于中国河南省,是中华人民共和国的一个地级市。全名为“郑州市”,又称“中原之都”。郑州市是河南省的省会城市,成立省会时间为1952年。截至2021年统计数据,郑州市的总面积为7,446.2平方公里,人口约为1423万。郑州市是河南省的政治、文化、经济中心,也是中国中部地区的重要城市。',
'国家': '中国是位于亚洲东部的一个大国,拥有悠久的历史文化和丰富的自然资源。中国的首都是北京,人口超过14亿人,是世界上最大的国家之一。中国的经济实力也非常强大,在全球范围内拥有很高的影响力。中文是中国的官方语言,中国也拥有丰富多彩的饮食、艺术、体育和娱乐活动等文化特色。'
}
class_list = list(class_examples.keys())
CLS_PATTERN = f"“{{}}”是 {class_list} 里的什么类别?"
schema = {
'人物': ['姓名', '性别', '出生日期', '出生地点', '职业', '国籍'],
'都市': ['别名', '名字', '归属地', '确立时间', '人口'],
'国家': ['名称', '别称', '成立时间', '地理位置', '特色','人口','面积']
}
IE_PATTERN = "{}
提取上述句子中{}类型的实体,并按照JSON格式输出,上述句子中不存在的信息用['原文中未提及']来表示,多个值之间用','分隔。"
ie_examples = {
'人物': [
{
'content': '秦始皇(259BC – 210BC),又称嬴政,是中国历史上著名的政治家和军事家。他是秦国的君主,统一了六国之后建立了中国的第一个中央集权制度的封建王朝——秦朝。',
'answers': {
'姓名': ['秦始皇'],
'出生日期': ['259BC – 210BC'],
'职业': ['政治家', '军事家','秦国的君主'],
'功绩': ['统一了六国']
}
}
],
'都市': [
{
'content': '郑州市隶属于中国河南省,是中华人民共和国的一个地级市。全名为“郑州市”,又称“中原之都”。郑州市是河南省的省会城市,成立省会时间为1952年。截至2021年统计数据,郑州市的总面积为7,446.2平方公里,人口约为1423万。郑州市是河南省的政治、文化、经济中心,也是中国中部地区的重要城市。',
'answers': {
'名字': ['郑州市'],
'别名': ['中原之都'],
'归属地': ['河南省'],
'确立时间': ['1952年',],
'人口': ['1423万']
}
}
]
}
def init_prompts():
"""
初始化前置prompt,便于模型做 incontext learning。
"""
class_list = list(class_examples.keys())
cls_pre_history = [
(
f'现在你是一个文本分类器,你需要按照要求将我给你的句子分类到:{class_list}类别中。',
f'好的。'
)
]
for _type, exmpale in class_examples.items():
cls_pre_history.append((f'“{exmpale}”是 {class_list} 里的什么类别?', _type))
ie_pre_history = [
(
"现在你需要帮助我完成信息抽取任务,当我给你一个句子时,你需要帮我抽取出句子中三元组,并按照JSON的格式输出,上述句子中没有的信息用['原文中未提及']来表示,多个值之间用','分隔。",
'好的,请输入您的句子。'
)
]
for _type, example_list in ie_examples.items():
for example in example_list:
sentence = example['content']
properties_str = ', '.join(schema[_type])
schema_str_list = f'“{_type}”({properties_str})'
sentence_with_prompt = IE_PATTERN.format(sentence, schema_str_list)
ie_pre_history.append((
f'{sentence_with_prompt}',
f"{json.dumps(example['answers'], ensure_ascii=False)}"
))
return {'ie_pre_history': ie_pre_history, 'cls_pre_history': cls_pre_history}
def clean_response(response: str):
"""
后处理模型输出。
Args:
response (str): _description_
"""
if '```json' in response:
res = re.findall(r'```json(.*?)```', response)
if len(res) and res[0]:
response = res[0]
response.replace('、', ',')
try:
return json.loads(response)
except:
return response
def inference(
sentences: list,
custom_settings: dict
):
"""
推理函数。
Args:
sentences (List[str]): 待抽取的句子。
custom_settings (dict): 初始设定,包含人为给定的 few-shot example。
"""
for sentence in sentences:
with console.status("[bold bright_green] Model Inference..."):
sentence_with_cls_prompt = CLS_PATTERN.format(sentence)
cls_res, _ = model.chat(tokenizer, sentence_with_cls_prompt, history=custom_settings['cls_pre_history'])
if cls_res not in schema:
print(f'The type model inferenced {cls_res} which is not in schema dict, exited.')
exit()
properties_str = ', '.join(schema[cls_res])
schema_str_list = f'“{cls_res}”({properties_str})'
sentence_with_ie_prompt = IE_PATTERN.format(sentence, schema_str_list)
ie_res, _ = model.chat(tokenizer, sentence_with_ie_prompt, history=custom_settings['ie_pre_history'])
ie_res = clean_response(ie_res)
print(f'>>> [bold bright_red]sentence: {sentence}')
print(f'>>> [bold bright_green]inference answer: ')
print(ie_res)
if __name__ == '__main__':
console = Console()
device = 'cuda:0'
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half()
model.to(device)
sentences = [
'成龙先生,原名陈港生,1954年4月7日出生于香港,中国男演员、导演、制片人、编剧、歌手、 stuntman。以其独特的拳击风格和幽默风趣的表演风格而著名。成龙先生在影视圈拥有超过40年的经验,他曾主演过多部动作电影,如《警察故事》、《红番区》和《东方三侠》等。他还曾在好莱坞电影中扮演重要角色,如《神话》和《绝地战警》等。成龙先生是华语电影界最具代表性和影响力的演员之一,他的表演和贡献已经得到了广泛的认可和赞誉。',
'中国是位于亚洲东部的一个大国,拥有悠久的历史文化和丰富的自然资源。中国的首都是北京,人口超过14亿人,是世界上最大的国家之一。中国的经济实力也非常强大,在全球范围内拥有很高的影响力。中文是中国的官方语言,中国也拥有丰富多彩的饮食、艺术、体育和娱乐活动等文化特色。',
]
custom_settings = init_prompts()
inference(
sentences,
custom_settings
)
5. 优势
通过零样本和少样本学习,我们可以避免繁琐的数据标注工作,仅用少量数据即可获得不错的表现。这大大降低了信息抽取的成本,并提高了效率。
结论
大模型时代的到来为信息抽取技术带来了革命性的变化。零样本和少样本学习凭借其强大的泛化能力和低数据依赖性,成为信息抽取领域的重要发展方向。通过合理的提示词设计和微调,我们可以利用大模型高效地从海量文本数据中提取关键信息,为各行各业的应用提供强大的支持。