- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
自动信息抽取发展了几十年,虽然模型很多,但是泛化能力很难用满意来形容,直到LLM的诞生。虽然最终信息抽取质量部分还是需要专家审核,但是已经极大的提高了信息抽取的效率。因为传统方法需要大量时间来完成数据清洗、标注和训练,然后来实体抽取、实体属性抽取、实体关系抽取、事件抽取、实体链接和指代消解等等。现在有了LLM,可以实现Zero/One/Few-Shot信息抽取构建知识图谱. 一.ChatIE实现过程 ChatIE本质上是将零样本IE任务转变为一个两阶段框架的多轮问答问题(使用的ChatGPT,也可以修改为ChatGLM2),问题是第一阶段和第二阶段如何设计?本质上还是Prompt的设计。接下来都是以RE(关系抽取)为例进行说明,NER(命名实体识别)和EE(事件抽取)以此类推。下面看一个例子,如下所示: 1.第一阶段 第一阶段的模板,如下所示: 2.第二阶段 第二段的模板,如下所示: ChatIE通过两阶段的ChatGPT多轮问答来解决Zero-Shot信息抽取构建知识图谱。但有个问题是可能或一定会出现错误关系抽取,这该如何办呢?工程有个解决方案就是引入多个裁判,比如ChatGPT是一个裁判,文心一言是一个裁判,BERT实体关系抽取是一个裁判,规则实体关系抽取是一个裁判。可根据知识精度要求,比如4个裁判都一致了,才会自动更新到知识库中,否则需要人工来审核实体关系抽取是否正确。知识图谱自动化更新是一个工程活,需要一个人工审核的功能,来确保模型识别不一致时的最终审核。 3.测试效果 ChatIE在不同任务(RE、NER和EE)和不同数据集上的测试效果,如下所示: 二.使用ChatGLM2来信息抽取[1] 这部分替换ChatGPT为ChatGLM2来做多轮问答。ChatGLM2进行金融知识抽取实践中,在ChatGLM前置了两轮对话达到了较好的效果,具体代码实现参考[9]。基本思路是加载ChatGLM2模型,然后初始化Prompt(分类和信息抽取),最后根据输入和模型完成推理过程。简单理解,整体思路是通过Few-Shot信息抽取构建知识图谱。 (1)加载ChatGLM2模型 。 (2)初始化Prompt 。 custom_settings数据结构中的内容如下所示: (3)根据输入和模型完成推理过程 。 如果实体关系抽取搞定了,那么自动更新到NebulaGraph就比较简单了,可参考 NebulaGraph实战:2-NebulaGraph手工和Python操作 . 参考文献: [1]利用ChatGLM构建知识图谱:https://discuss.nebula-graph.com.cn/t/topic/13029 [2]ChatGPT+SmartKG 3分钟生成"哈利波特"知识图谱:https://www.msn.cn/zh-cn/news/technology/chatgpt-smartkg-3分钟生成-哈利波特-知识图谱/ar-AA17ykNr [3]ChatIE:https://github.com/cocacola-lab/ChatIE [4]ChatIE:http://124.221.16.143:5000/ [5]financial_chatglm_KG:https://github.com/zhuojianc/financial_chatglm_KG [6]Creating a Knowledge Graph From Video Transcripts With ChatGPT 4:https://neo4j.com/developer-blog/chatgpt-4-knowledge-graph-from-video-transcripts/ [7]GPT4IE:https://github.com/cocacola-lab/GPT4IE [8]GPT4IE:http://124.221.16.143:8080/ [9]https://github.com/ai408/nlp-engineering/blob/main/20230917_NLP工程化公众号文章\NebulaGraph教程\NebulaGraph实战:3-信息抽取构建知识图谱 。
df_ret = {
'chinese'
: {
'所属专辑'
: [
'歌曲'
,
'音乐专辑'
],
'成立日期'
: [
'机构'
,
'Date'
],
'海拔'
: [
'地点'
,
'Number'
],
'官方语言'
: [
'国家'
,
'语言'
],
'占地面积'
: [
'机构'
,
'Number'
],
'父亲'
: [
'人物'
,
'人物'
],
'歌手'
: [
'歌曲'
,
'人物'
],
'制片人'
: [
'影视作品'
,
'人物'
],
'导演'
: [
'影视作品'
,
'人物'
],
'首都'
: [
'国家'
,
'城市'
],
'主演'
: [
'影视作品'
,
'人物'
],
'董事长'
: [
'企业'
,
'人物'
],
'祖籍'
: [
'人物'
,
'地点'
],
'妻子'
: [
'人物'
,
'人物'
],
'母亲'
: [
'人物'
,
'人物'
],
'气候'
: [
'行政区'
,
'气候'
],
'面积'
: [
'行政区'
,
'Number'
],
'主角'
: [
'文学作品'
,
'人物'
],
'邮政编码'
: [
'行政区'
,
'Text'
],
'简称'
: [
'机构'
,
'Text'
],
'出品公司'
: [
'影视作品'
,
'企业'
],
'注册资本'
: [
'企业'
,
'Number'
],
'编剧'
: [
'影视作品'
,
'人物'
],
'创始人'
: [
'企业'
,
'人物'
],
'毕业院校'
: [
'人物'
,
'学校'
],
'国籍'
: [
'人物'
,
'国家'
],
'专业代码'
: [
'学科专业'
,
'Text'
],
'朝代'
: [
'历史人物'
,
'Text'
],
'作者'
: [
'图书作品'
,
'人物'
],
'作词'
: [
'歌曲'
,
'人物'
],
'所在城市'
: [
'景点'
,
'城市'
],
'嘉宾'
: [
'电视综艺'
,
'人物'
],
'总部地点'
: [
'企业'
,
'地点'
],
'人口数量'
: [
'行政区'
,
'Number'
],
'代言人'
: [
'企业/品牌'
,
'人物'
],
'改编自'
: [
'影视作品'
,
'作品'
],
'校长'
: [
'学校'
,
'人物'
],
'丈夫'
: [
'人物'
,
'人物'
],
'主持人'
: [
'电视综艺'
,
'人物'
],
'主题曲'
: [
'影视作品'
,
'歌曲'
],
'修业年限'
: [
'学科专业'
,
'Number'
],
'作曲'
: [
'歌曲'
,
'人物'
],
'号'
: [
'历史人物'
,
'Text'
],
'上映时间'
: [
'影视作品'
,
'Date'
],
'票房'
: [
'影视作品'
,
'Number'
],
'饰演'
: [
'娱乐人物'
,
'人物'
],
'配音'
: [
'娱乐人物'
,
'人物'
],
'获奖'
: [
'娱乐人物'
,
'奖项'
]
}
}
re_s1_p = {
'chinese'
:
''
'给定的句子为:"{}"\n\n给定关系列表:{}\n\n在这个句子中,可能包含了哪些关系?\n请给出关系列表中的关系。\n如果不存在则回答:无\n按照元组形式回复,如 (关系1, 关系2, ……):'
''
,
}
re_s2_p = {
'chinese'
:
''
'根据给定的句子,两个实体的类型分别为({},{})且之间的关系为{},请找出这两个实体,如果有多组,则按组全部列出。\n如果不存在则回答:无\n按照表格形式回复,表格有两列且表头为({},{}):'
''
,
}
tokenizer = AutoTokenizer.from_pretrained(r
"L:/20230713_HuggingFaceModel/chatglm2-6b"
, trust_remote_code=True)
# 指定使用的tokenizer
model = AutoModel.from_pretrained(r
"L:/20230713_HuggingFaceModel/chatglm2-6b"
, trust_remote_code=True).half().cuda()
# 指定使用的model
model = model.eval()
# 指定model为eval模式
def init_prompts():
""
"
初始化前置prompt,便于模型做 incontext learning。
"
""
class_list = list(class_examples.keys())
# 获取分类的类别,class_list = ['基金', '股票']
cls_pre_history = [
(
f
'现在你是一个文本分类器,你需要按照要求将我给你的句子分类到:{class_list}类别中。'
,
f
'好的。'
)
]
for
_type, exmpale
in
class_examples.items():
# 遍历分类的类别和例子
cls_pre_history.append((f
'“{exmpale}”是 {class_list} 里的什么类别?'
, _type))
# 拼接前置prompt
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
schema_str_list = f
'“{_type}”({properties_str})'
# 拼接schema
sentence_with_prompt = IE_PATTERN.format(sentence, schema_str_list)
# 拼接前置prompt
ie_pre_history.append((
# 拼接前置prompt
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}
# 返回前置prompt
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)
# 拼接前置prompt
cls_res, _ = model.chat(tokenizer, sentence_with_cls_prompt,
history
=custom_settings[
'cls_pre_history'
])
# 推理
if
cls_res not
in
schema:
# 如果推理结果不在schema中,报错并退出
print
(f
'The type model inferenced {cls_res} which is not in schema dict, exited.'
)
exit
()
properties_str =
', '
.join(schema[cls_res])
# 拼接schema
schema_str_list = f
'“{cls_res}”({properties_str})'
# 拼接schema
sentence_with_ie_prompt = IE_PATTERN.format(sentence, schema_str_list)
# 拼接前置prompt
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)
# 打印推理结果
最后此篇关于NebulaGraph实战:3-信息抽取构建知识图谱的文章就讲到这里了,如果你想了解更多关于NebulaGraph实战:3-信息抽取构建知识图谱的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
03-25 05:52:15.329 8029-8042/com.mgh.radio W/MediaPlayerNative: info/warning (703, 0) 03-25 05:52:15
我一直在 Internet 上到处寻找关于 FrameworkElementFactory 类的适当文档,但我似乎找不到有关它的适当教程或有用信息。 请问对这个问题了解更多的人可以给我更多的信息吗?这
我需要知道一个线程在进入等待状态之前如何将其ID发送到另一个线程。我想传递一个带有其ID的变量,但我不知道该怎么做。 最佳答案 如果只有一个线程及其父线程,则可以使用全局变量,因为它们在所有线程之间共
我正在尝试制作一个程序,该程序可以读取命令行上的所有单词,然后将其打印在新行上,而我想要做的是这样的: Some text: hello 但是相反,我得到了这样的东西: Some text: Hell
我有一个连接到rabbitmq服务器的python程序。当该程序启动时,它连接良好。但是当rabbitmq服务器重新启动时,我的程序无法重新连接到它,并留下错误“Socket已关闭”(由kombu产生
我正在设置CI / CD管道。部署步骤运行以下命令: kubectl apply -f manifest.yml --namespace kubectl rollout status Deploym
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
这是我在文件上运行 svn info 时输出的一部分: Last Changed Author: [user] Last Changed Rev: 269612 Last Changed Date:
所以我正在构建这个音乐应用程序,到目前为止它只扫描 SD 卡内的特定文件夹。这将返回路径,然后播放它们。 几个小时前我得知android系统中有一个媒体文件数据库所以 我想知道这个媒体文件数据库是否存
我正在绘制树形图,并且想知道如何绘制树类的相对百分比,即 A组=100 B地=30 C地=50 D 地 =20 然后,在图中,应该添加: A 组“50%” B 组“15%” 等在其“Group X”标
我正在构建一个社交网站,我想知道如何在用户首次登录时显示交互式教程和信息。比如只有在第一次登录时,用户才会被要求在他们的个人资料中填写更多信息。我怎样才能通过 php 和 mysql 实现这一点?例子
我是 java servlet 的新手。我研究了一些关于 servlet 的代码,但我真的很想知道更多基本的东西以及它是如何工作的。我只是想知道什么类型的 Material /内容可以从 java s
我想知道是否有办法为 user_id、sender_user_id 和 recipient_user_id 提供 name 信息来自 this fiddle 中的模式. 我现在唯一能想到的办法就是做这
这是我存储2个大学生信息的源代码。我想从输入中获取每个人的姓名、姓氏、ID 和 5 分,然后在输出中显示它们。我在输出中显示分数时遇到问题。 请帮忙 #include using namespace
假设我有一张带有条形图的图像,如下所示: 我想提取条形图和标签的值,除了训练 ML 模型之外,还有其他方法吗? 我有一堆图像,我为其生成了图表和一些描述。我目前正尝试仅从我能够做到的描述中提取信息,但
有没有办法从 GKTurnBasedParticipant 对象中检索玩家的名字?似乎除了根据类引用的难看的 playerID 之外,没有办法显示有关游戏玩家的相关信息。还是我遗漏了什么? 谢谢...
我有一个随机抛出“KeyNotFoundException”的 C# Silverlight 应用程序。我不知道找不到什么 key 。这让我想到了两个问题: KeyNotFoundException
本文实例为大家分享了ios获取本地音频文件的具体代码,供大家参考,具体内容如下 获取本地音频文件地址: ?
下面为大家介绍利用SQL查询语句获取Mysql数据库中表的表名,表描述、字段ID、字段名、数据类型、长度、精度、是否可以为null、默认值、是否自增、是否是主键、列描述 1、查询表信息(表名/表
问题 有没有办法获取代码中使用属性的位置,或声明成员变量的位置? 我不是在寻找解决此问题的方法,只是寻求一个简单的答案,无论这在技术上是否可行。 一些背景信息 我已经定义了一个属性,该属性使用提供给属
我是一名优秀的程序员,十分优秀!