- 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的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
Facebook今天发布了事件页面的新设计(http://allfacebook.com/testing-new-layout-for-events_b111326) 有什么方法可以访问封面网址并使用
这个问题在这里已经有了答案: What's the Facebook's Graph API call limit? (5 个答案) 关闭 5 年前。 我已经研究并得出结论,Facebook Gra
我刚开始使用 Facebook,老实说,我发现它非常令人困惑,术语和文档在很多情况下似乎非常模糊。有人可以用简单的英语解释我如何实现以下目标吗? 将图片发布到 Facebook(在用户页面上),然后检
有人有关于如何使用 Android Graph API 的示例吗? 我受困于基础知识,例如在 Facebook 上将文本发布到墙上。 我正在使用适用于 Android 的 Facebook SDK。这
我的任务是使用 Instagram Graph API 获取我的商业 Instagram 帐户的照片数据。我按照 Instagram Graph API 的说明进行操作 - https://devel
我正在使用 Facebook Graph API我想知道哪些字段可用于 &fields 参数,以及在哪里可以找到有关这些字段的文档。 我只能在文档中找到 &type 参数的搜索类型,例如 page 搜
我曾经使用 Facebook 的 PHP 在我的应用程序中返回 RSS 提要。现在已弃用。在 Facebook 开发者页面上它说 “页面 RSS Feed 端点 - 位于 https://www.fa
尝试了以下端点: https://graph.facebook.com/v2.6/{video-id}/video_insights/total_video_views?access_token={t
Facebook 发布了其著名图形 API 的新版本,我认为 https://developers.facebook.com/ 提供的文档很困惑。我实际上正在开发一个需要 facebook 连接的应用
这是我在 StackOverflow 上的第一篇文章,但我已经使用了很长时间... 我的问题基本上很简单,我想把一个UITextView(mShareText)的内容分享到用户的墙上,不提示任何Dia
我正在尝试为此issue 提供关联ID但我不确定如何获得它。我想应该是回应,对吗?可能是 client-request-id 吗? HTTP 响应 HTTP/1.1 403 Forbidden Cac
我正在尝试使用 this 集成 Facebook android sdk|关联。一切运行完美,除了我在尝试为已登录用户获取 email 时收到一个 JSONException。 下面是我得到的logc
我想显示我在单独网页上发布的公共(public) Facebook 事件列表,以便更轻松地保持更新 - 只需更新 Facebook,下次调用图形 API 就会显示我当前的事件。 我已经在页面上运行了
我正在尝试在我的 Android 应用程序中添加访问 friend 列表的额外权限,有很多关于旧 API 图的资源,但找不到新 API 的任何内容,所以我尝试向数组添加新权限,但没有成功'无法正常工作
根据 Facebook 的 Graph API 文档 (here),您可以通过以下 URL 访问用户个人资料图片的各种尺寸: https://graph.facebook.com/(userid)/p
想象一下当我以 userA 身份登录 facebook web 应用程序时的情况。我知道 userB 的昵称,但他不在我的好友列表中,我也不知道他的 ID。当然,他不使用我的应用程序。 如何通过昵称获
对于我的测试用户,我可以获得的访问 token 始终具有相同的范围: public_profile, basic_info, user_friends 我没有找到修改测试用户在界面中或通过 API 调
我知道一旦我拥有访问 token 就可以显示公共(public)图像,但我该如何获取它?我发现 facebook 开发文档在扩展权限方面有点令人困惑。 我是否需要以某种方式将图片库/作品集注册为应用程
我是一名优秀的程序员,十分优秀!