国产chatgpt:基于chatGLM微调nlp信息抽取任务

2023-11-08

一、传统nlp做信息抽取

  1. 文本预处理:包括去除HTML标签、分段、分句、分词、词性标注、命名实体识别等。
  2. 句法分析:对句子进行结构分析,确定语法成分和关系。可以采用依存句法或者短语结构句法进行分析。
  3. 语义分析:使用自然语言理解技术进行语义解析,提取句子的含义。包括词义消歧、指代消解、情感分析等。
  4. 实体识别:对文本中的实体进行识别,包括人名、地名、组织机构名等。可以采用规则匹配、统计学方法、机器学习等方法进行实现。
  5. 关系抽取:基于实体识别和语义分析结果,提取实体之间的关系。可以采用规则匹配、模式匹配、统计学方法、机器学习等方法进行实现。
  6. 结果过滤:根据需要,对抽取的信息进行筛选和过滤。可以采用阈值过滤、逻辑判断、规则匹配等方法进行实现。

在这个流程中,有几个困难点需要注意:

  1. 数据质量问题:数据质量会影响到整个流程的效果,因此需要对数据进行清洗、去重等操作。需要大量人工标注数据,进行训练才能达到想要的效果
  2. 解析复杂度问题:句法分析和语义分析都是NLP中比较复杂的任务,需要耗费大量的计算资源和时间。
  3. 实体识别难点:实体识别需要考虑上下文环境、实体类型、同名实体等问题,这些都会影响到实体识别的准确性。
  4. 关系抽取挑战:关系抽取需要考虑多个实体之间的关系,同时还需要解决一些歧义问题。
    在整个流程中,实体识别和关系抽取是比较关键的工作,它们的准确性直接影响到信息抽取的结果。

二、什么是零样本和少样本

1. 零样本和少样本的概念:

零样本和少样本是机器学习领域中常见的两个概念,特别是在图像识别、自然语言处理等领域中应用较为广泛。所谓的零样本学习是指模型在没有任何样本数据的情况下进行预测;而少样本学习则是指模型只有很少的样本数据时进行预测。

2. 零样本和少样本的应用场景:

在实际应用中,零样本和少样本学习都有广泛的应用场景。比如,在自然语言处理中,我们希望算法能够自动理解新出现的单词,即使它们从未在训练集中出现过,这就是一种零样本学习。另外,当我们需要训练一个模型来分类大量不同物体的图像时,如果每个类别的训练数据都很少,那么就需要利用少样本学习的方法来训练模型。

3. 零样本和少样本在大模型时代的优势和意义:

在当前的大模型时代,零样本和少样本学习变得更加重要。对于大规模的复杂任务,模型需要更多的数据来训练,但是获取足够的数据却非常困难。在这种情况下,通过零样本学习和少样本学习,我们可以利用已有的数据来加速模型的训练,并且提高模型的泛化能力。同时,这种方法还可以减少人工标注数据的工作量,大大降低了人力和时间成本

4. 相比传统NLP,零样本和少样本学习具有以下优势:

  1. 更高的泛化能力:在传统NLP中,模型通常需要大量训练数据才能达到较好的性能。但是在实际应用中,我们经常遇到新的、未知的情况,此时传统NLP的表现会受到限制。而利用零样本和少样本学习的方法,则可以通过先前学习到的知识来更好地适应新的环境和任务,从而提高模型的泛化能力。

  2. 更低的数据标注成本:传统NLP通常需要大量的人工标注数据来进行模型的训练。但是这种方法需要耗费大量人力和时间,并且难以适应不断变化的场景。而利用零样本和少样本学习的方法,我们可以减少数据标注的成本,并且更快地适应新的任务和环境。

  3. 更广泛的应用场景:传统NLP通常需要大量的数据来支持模型的训练,因此很难在一些场景下应用,比如医疗、法律、金融等领域,这些领域的数据往往非常敏感、难以获取。而利用零样本和少样本学习的方法,则可以通过少量数据来支持模型的训练,并且在这些敏感领域具有更广泛的应用场景。

三、大模型时代信息抽取

console函数

Rich库中,consoleprint函数都用于向控制台输出文本。它们的用途略有不同,print函数会将其参数打印成字符串,然后输出到控制台;而console对象则提供了许多其他的输出功能,如输出进度条、表格、警告信息等。

例如,你可以使用console.log()方法向控制台输出调试信息或状态更新,console.print()方法可以将数据按照指定格式输出为表格或树形结构,console.warn()方法可以显示警告信息等。这些功能可以帮助开发者更快地发现问题并解决它们。

console.status()方法用于向控制台输出状态信息。它通常用于在长时间运行的操作中显示进度。

例如,如果你有一个需要进行一段时间的耗时操作(比如下载大型文件),你可以使用console.status()方法在控制台上显示进度条或百分比,以便用户知道操作的进展情况。

console.status()方法接受三个参数:textdonetotal
text参数是要显示的文本,
done参数是已完成的数量,
total参数是总数量。
使用这些参数,console.status()方法会自动计算出当前进度,并将其以进度条的形式显示在控制台上。

例如,下面的代码演示了如何使用console.status()方法显示下载进度:

import time
from rich.console import Console

console = Console()

def download_file(url):
    # 模拟下载大型文件
    total_size = 10000
    for i in range(total_size):
        time.sleep(0.01)  # 假装下载速度很慢
        console.status(f"Downloading... ({i}/{total_size})", i, total_size)
    console.print("Download complete!")

当你运行这段代码时,会在控制台上显示一个进度条,告诉你下载的进度。

1. 提示词设计

该任务的 prompt ,我们主要考虑 是什么,输出什么:

也就是:

  1. 告诉模型你要干什么:信息抽取任务

  2. 告诉模型输出格式

2. 微调逻辑

基于chatGLM微调nlp信息抽取任务的大致逻辑是这样的:

先进行对预料做一个分类,即该语料属于哪个概念(也就是属于哪个模式层,例如:猫,狗等概念层)。然后对这个概念进行属性的抽取:例如,猫有年纪,品种,产地等属性信息。

3. 数据样本

ok有了这个逻辑就知道,需要两个语料:

分类语料一: 告诉模型 属于哪个模式层

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. 微调代码

import re
import json

from rich import print
from rich.console import Console
from transformers import AutoTokenizer, AutoModel


# 分类 example
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 = "{}\n\n提取上述句子中{}类型的实体,并按照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. 优势

可以看到,我们可以不在进行繁琐的数据标注工作,另外可以用少量的数据即可带来不错的表现。

参考文献

[1]. https://mp.weixin.qq.com/s/XlY2VUR9eXeiC8lJI5Q7Nw
[2]. https://github.com/HarderThenHarder/transformers_tasks
[3]. https://huggingface.co/THUDM/chatglm-6b

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

国产chatgpt:基于chatGLM微调nlp信息抽取任务 的相关文章

随机推荐

  • 打印纸张尺寸换算_各种打印纸的尺寸是多少?

    展开全部 常用打印纸尺寸为 A4 16k 297mm 210mm A5 32k 210mm 148mm A6 64k 144mm 105mm A3 8k 420mm 297mm 按照尺寸的大小 通常62616964757a686964616
  • 我说我懂多线程,面试官立马给我发了offer

    前言 只有光头才能变强 文本已收录至我的GitHub精选文章 欢迎Star https github com ZhongFuCheng3y 3y 在上周总结了一篇 工作中常用到的Java集合类 反响还不错 这周来写写Java另一个重要的知识
  • UE4资源及内存控制台命令

    UE4资源及内存控制台命令 原文地址 UE4资源及内存控制台命令 可可西 博客园 ListLoadedPackages 打印被加载的包 每个包对应一个uasset或umap文件 List of all loaded packages Nam
  • angularjs $http调用接口的方式

    angularjs http调用接口的方式 http get merchantmall merchant json success function data status headers config console log argume
  • Java8 方法积累

    Java8 方法积累 removeIf 移除集合中字段全为NULL的无意义对象 list removeIf filter gt filter getProperty1 null filter getProperty2 null stream
  • 6款免费的PDF解锁软件

    下面这些软件提供不同的选项来解锁PDF文件 如 暴力攻击 字典攻击 网络搜索 掩码攻击和键搜索攻击选项 支持可以部署的各种攻击方法 如 简单方法 复杂方法和混合方法 也可以为攻击设置不同的选项 例如 要包括的字符和数字 要扫描的密码长度等
  • Apache服务器的下载安装与配置

    最近在学习Android 需要搭建一个服务器 于是在网上查找了一些资料 主要参考博文https www cnblogs com yerenyuan p 5460336 html点击打开链接 目前官网可以下载的版本是2 4 29 分VC14和
  • Redis 管道

    目录 Redis 管道 Abstract 管道和原生批命令的比较 管道和脚本的区别 使用管道需要注意的事项 Redis 管道 Abstract Redis 客户端执行一条命令分 4 个过程 发送命令 命令排队 命令执行 返回结果 这个过程称
  • 2.4.9 Profile虚拟以太网网卡参数

    最后更新2021 07 22 参考 lt 图 242 虚拟IO设备管理界面 gt 我们来了解一下虚拟以太网网卡参数 图 244 虚拟以太网参数设置 普通设置 Adapter ID 等同于虚拟IO设备的Slot ID 槽位号 参考 lt 49
  • 在crontab中执行scrapy(解决不执行,不爬取数据的问题)

    文章来着 在crontab中执行scrapy 解决不执行 不爬取数据的问题 自我的进化 在crontab中执行scrapy会遇到命令不执行 或者执行了但是没有爬取数据的问题 这里做一下总结 先说这里遇到的问题和解决方案 spider不执行
  • 图说设计模式

    软件模式是将模式的一般概念应用于软件开发领域 即软件开发的 总体指导思路或参照样板 软件模式并非仅限于设计模式 还包括 架构模式 分析模式和过程模式等 实际上 在软件生存期的每一 个阶段都存在着一些被认同的模式 本书使用图形和代码结合的方式
  • 《CSDN 涨粉攻略》11个涨粉方法,你学会了几个?

    文章目录 前言 一 我最近的涨粉情况 二 不忘初心 三 涨粉要诀 1 社区 a 规则 b 详述 2 热榜 a 规则 b 详述 3 粉丝可见 a 规则 b 详述 4 标题 a 规则 b 详述 5 封面 a 规则 b 详述 6 一键三连 a 规
  • python中的元组(tuple)的用法

    以下内容主要摘抄博客 https blog csdn net yezonggang article details 50976664 utm medium distribute pc relevant none task blog Blog
  • 几种常见开源软件授权协议

    转载地址见图片
  • Data Structure (三)

    动态规划 1 区间调度问题 1 1无权区间调度问题 任务j开始于sj 结束于fj 如果两个任务没有重叠的时间 则两个任务互相兼容 目标 找到最多 最大互相兼容的任务集合 贪心算法总是做出当前最优的选择 贪心算法并不总能得到最优解 但是它是最
  • MATLAB绘图设置坐标轴标注

    绘图之后设置坐标轴标注 以下均为用例 自行按需更改 xlim 0 512 限制x轴坐标数值范围 ylim 0 512 限制y轴坐标数值范围 set gca XTick 0 510 4 512 设定x轴坐标刻度 0 512是数值范围 512
  • Qt开发,链接了数据库后,调用QSqlQuery::setQuery执行SQL语句获取我们想要的数据

    继上篇文章将数据库封装成一个类 链接为成员函数 而当我将查询做为另一个函数时 无法对已有的database进行操作 尽管db为类的成员 同样会报错误 QSqlQuery exec database not open QSqlQueryMod
  • C#判断是否是以管理员权限允许当前应用

    private static bool CheckForAdminRights string path Path Combine Environment GetFolderPath Environment SpecialFolder Win
  • 微信小程序防止后退,返回主页,30秒看完关闭

    防止后退 使用 wx redirectTo 代替wx navigateto 关闭返回主页 在onShow function 中调用wx hideHomeButton 讲完收工
  • 国产chatgpt:基于chatGLM微调nlp信息抽取任务

    文章目录 一 传统nlp做信息抽取 二 什么是零样本和少样本 1 零样本和少样本的概念 2 零样本和少样本的应用场景 3 零样本和少样本在大模型时代的优势和意义 4 相比传统NLP 零样本和少样本学习具有以下优势 三 大模型时代信息抽取 c