高效打造知识图谱,使用LlamaIndex Relik实现实体关联和关系抽取

大家好,文本信息转化为知识图谱的技术,自问世以来一直是研究界的宠儿。大型语言模型(LLMs)的兴起让这个领域受到更多关注,但LLMs的成本之高令人却步。然而通过对小型模型微调优化,可以找到一种更经济高效的解决方案。

今天向大家介绍Relik,这是由罗马大学(Sapienza University of Rome)自然语言处理团队精心研发的快速、轻量级信息提取框架。

 

1.信息提取流程

在不依赖LLMs的情况下,信息提取流程通常包括:

图片

上图呈现了信息提取的完整流程。始于一段简单的文本输入:“Tomaz likes to write blog posts. He is particularly interested in drawing diagrams.”。流程首先进行指代消解,将“Tomaz”和“He”识别为同一人。紧接着,命名实体识别(NER)技术辨识出“Tomaz”、“Blog”和“Diagram”等关键实体。

随后,实体链接环节将这些识别出的实体与数据库或知识库中的相应条目相对应。例如,“Tomaz”对应到“Tomaz Bratanic (Q12345)”,“Blog”对应到“Blog (Q321)”。然而,"Diagram"在知识库中未找到匹配项。

接下来,关系提取步骤进一步分析实体间的联系,如识别出“Tomaz”与“Blog”之间存在“WRITES”关系,说明Tomaz撰写博客;“Tomaz”与“Diagram”之间存在“INTERESTED_IN”关系,表明他对图表有兴趣。

最后,这些经过结构化的实体和关系信息被整合进知识图谱中,为后续的数据分析或信息检索提供了有序且易于访问的资源。

在没有大型语言模型(LLMs)支持的情况下,信息提取工作通常依赖一系列专业模型来分别处理指代消解、命名实体识别、实体链接和关系提取等任务。整合这些模型需要付出额外的工作和细致的调整,但这种方法能够有效降低成本。通过使用和优化这些小型、特定任务的模型,可以在整体上减少系统的构建和维护成本。

2.环境搭建与数据准备

推荐使用独立的Python环境,例如Google Colab,以便管理项目依赖项。

接下来配置Neo4j图数据库以存储解析出的数据。推荐使用Neo4j Aura(https://neo4j.com/cloud/platform/aura-graph-database/),它提供便捷的免费云服务,且与Google Colab笔记本完美兼容。

完成数据库的搭建后,可通过LlamaIndex建立数据库连接。

from llama_index.graph_stores.neo4j import Neo4jPGStoreusername="neo4j"
password="rubber-cuffs-radiator"
url="bolt://54.89.19.156:7687"graph_store = Neo4jPGStore(username=username,password=password,url=url,refresh_schema=False
)

数据集

这里使用一个新闻数据集进行分析,这个数据集是通过Diffbot API(https://www.diffbot.com/data/article/)获取的。

import pandas as pdNUMBER_OF_ARTICLES = 100
news = pd.read_csv("https://raw.githubusercontent.com/tomasonjo/blog-datasets/main/news_articles.csv"
)
news = news.head(NUMBER_OF_ARTICLES)

3.技术实现

信息提取流程首先从指代消解着手,其任务是识别文本中指代相同实体的不同表述。

据了解,目前可用于指代消解的开源模型相对较少。经过尝试比较,这里选择使用spaCy的Coreferee(https://spacy.io/universe/project/coreferee)。需要注意的是,使用Coreferee可能会遇到一些依赖性问题。

加载spaCy中的指代消解模型,使用以下代码实现:

import spacy, corefereecoref_nlp = spacy.load('en_core_web_lg')
coref_nlp.add_pipe('coreferee')

Coreferee模型能够识别文本中指代相同实体或实体组的表达式集群。为了根据这些识别出的集群对文本进行重写,需要自定义函数来实现这一过程。

def coref_text(text):coref_doc = coref_nlp(text)resolved_text = ""for token in coref_doc:repres = coref_doc._.coref_chains.resolve(token)if repres:resolved_text += " " + "and".join([t.textif t.ent_type_ == ""else [e.text for e in coref_doc.ents if t in e][0]for t in repres])else:resolved_text += " " + token.textreturn resolved_text

测试下这个函数,确保模型和依赖项设置正确:

print(coref_text("Tomaz is so cool. He can solve various Python dependencies and not cry")
)

在这个例子中,模型成功识别出“Tomaz”和“He”实际上指向同一实体。通过应用coref_text函数,将“Tomaz”替换“He”。

请注意,这种重写机制并不总能生成完全符合语法规则的句子,因为它采用了一种直接的替换逻辑来处理文本中的实体集群。尽管如此,对于大多数应用场景,这种方法已经足够有效。

现在把这一指代消解技术应用于我们的新闻数据集,并将其转换为LlamaIndex文档格式:

from llama_index.core import Documentnews["coref_text"] = news["text"].apply(coref_text)
documents = [Document(text=f"{row['title']}: {row['coref_text']}")for i, row in news.iterrows()
]

Relik库集成了实体链接和关系提取两大功能,能够将这两种技术融合应用。实体链接时,Relik以维基百科为依托,实现文本实体与百科条目的精准对应。

图片

将实体链接到维基百科

在关系提取方面,Relik通过辨识和定义文本中实体间的关系,帮助我们将原始的非结构化数据转化为有序的结构化信息。

图片

关系提取

如果你使用的是Colab的免费版本,请选择relik-ie/relik-relation-extraction-small模型,这个模型专门负责关系提取。如果有Colab Pro版本,或者打算在本地更高性能的机器上运行,那么可以尝试relik-ie/relik-cie-small模型,它不仅包含关系提取,还能进行实体链接的功能。

from llama_index.extractors.relik.base import RelikPathExtractorrelik = RelikPathExtractor(model="relik-ie/relik-relation-extraction-small"
)# 在Pro Collab上使用GPU
# relik = RelikPathExtractor(
#    model="relik-ie/relik-cie-small", model_config={"skip_metadata": True, "device":"cuda"}
# )

此外,我们必须定义将用于嵌入实体的嵌入模型,以及用于问答流程的LLM:

import osfrom llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.llms.openai import OpenAIos.environ["OPENAI_API_KEY"] = "sk-"llm = OpenAI(model="gpt-4o", temperature=0.0)
embed_model = OpenAIEmbedding(model_name="text-embedding-3-small")

注意在构建知识图谱的过程中,不会使用大型语言模型(LLM)。

4.知识图谱的构建与应用

目前,一切准备工作已经就绪。接下来,可以创建PropertyGraphIndex实例,并将新闻文档作为数据输入,整合进知识图谱中。

此外,为了提取文档中的关系,需要将relik模型设置为kg_extractors参数的值。

from llama_index.core import PropertyGraphIndexindex = PropertyGraphIndex.from_documents(documents,kg_extractors=[relik],llm=llm,embed_model=embed_model,property_graph_store=graph_store,show_progress=True,
)

构建图后,可以打开Neo4j浏览器来验证导入的图。通过运行以下Cypher语句获得类似的可视化:

MATCH p=(:__Entity__)--(:__Entity__)
RETURN p LIMIT 250

结果如下:

图片

5.问答功能实现

使用LlamaIndex,现在可以轻松地进行问答。只需利用系统自带的图检索器,便能够直接提出问题:

query_engine = index.as_query_engine(include_text=True)response = query_engine.query("What happened at Ryanair?")
print(str(response))

这就是定义的 LLM 和嵌入模型发挥作用的地方。

不依赖大型语言模型构建知识图谱是切实可行,具有成本效益且效率高。通过优化调整如Relik框架中的小型、任务专精的模型,检索增强型生成应用便能高效提取信息。

实体链接作为关键步骤,确保了识别出的实体能够准确映射到知识库中的对应条目,从而维持了知识图谱的完整性与实用性。

借助Relik框架和Neo4j平台,我们能够构建出功能强大的知识图谱,这些图谱可以助力复杂的数据分析和检索任务,而且避免了部署大型语言模型所带来的高昂成本。这种方法不仅让先进的数据处理工具变得更加亲民,也推动了信息提取流程的创新与效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/148382.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Linux中的环境变量及main函数参数详解

目录 Linux中的环境变量 常见环境变量 PATH : 和环境变量相关的命令 通过系统调用获取或设置环境变量 getenv putenv 新增环境变量 进程切换: main函数参数 命令行参数 Linux中的环境变量 环境变量(environment variables)一般是指在操作系统中用来指定操…

面试速通宝典——1

1. 内存有哪几种类型? ‌‌‌‌  内存分为五个区,堆(malloc)、栈(如局部变量、函数参数)、程序代码区(存放二进制代码)、全局/静态存储区(全局变量、static变量&#…

GNU链接器(LD):什么是符号?符号定义及实例解析

0 参考资料 GNU-LD-v2.30-中文手册.pdf GNU linker.pdf1 前言 一个完整的编译工具链应该包含以下4个部分: (1)编译器 (2)汇编器 (3)链接器 (4)lib库 在GNU工具链中&…

手动实现逻辑回归算法(LogisticRegression)

目录 1. 前言 2. 示例 3. 原理介绍 4. 实验代码 1. 前言 逻辑回归是一种解决分类问题的算法 值得注意的是,在机器学习中,回归指的是连续型数据的预测问题。而这里的逻辑回归特指分类任务,比如判断一个人是否患病、是否健康等等 逻辑回归…

nodejs基于vue+express度假村旅游管理系统设计与实现7t82p

目录 功能介绍数据库设计具体实现截图技术栈技术论证解决的思路论文目录核心代码风格详细视频演示源码获取 功能介绍 实现了一个完整的农家乐系统,其中主要有用户表模块、关于我们模块、收藏表模块、公告信息模块、酒店预订模块、酒店信息模块、景区信息模块、景区…

ARM(Day 2)

一、作业 (1)汇编代码 .text.globl _start_start:mov r0, #0x5mov r1, #0x10比较r0,r1 是否相等 相等执行stop 不相等执行下一步比较( r0 > r1 ?)cmp r0, r1 比较实际在做减法 (YES NO )subhi r0, r0, r1 r0 > r1 …

VLDB 2024 圆桌会议回顾:展望物联网与 AI 时代的时序数据库

回顾我们在 VLDB 2024 8 月 26 日至 8 月 30 日,数据库领域的顶级国际会议 VLDB 2024 在广州举行。IoTDB 最新研发成果的三篇论文被本次大会录用(详见:IoTDB 在顶级会议 VLDB 2024:四篇最新论文入选,特邀做 TPC 报告与…

MySQL篇(存储过程 触发器 存储函数)(持续更新迭代)

目录 一、存储过程 1. 简介 2. 特点 3. 语法 3.1. 创建 3.2. 调用 3.3. 查看 3.4. 删除 4. 示例 二、变量 1. 简介 2. 系统变量 2.1. 查看系统变量 2.2. 设置系统变量 2.3. 演示示例 3. 用户定义变量 3.1. 赋值 方式一 方式二 3.2. 使用 3.3. 演示示例 4.…

计算机组成原理——存储系统

计算机组成原理——存储系统 存储器层次结构 存储器层次结构如下: 寄存器(CPU)Cache(高速缓冲存储器)主存磁盘磁带、光盘等 按照上述层次结构,自下而上速度依次增快、容量相对依次渐小、造价越来越高昂…

vitis2022.2生成动态设备树

打开vitis 点击xilinx 点击generate Device Tree 导入硬件描述文件,以及指定输出目录 再点击Modify Device Tree Settings 修改device_tree下的dt_overlay 修改后点击ok 最后点击generate即可

每日学习一个数据结构-Trie树(字典树)

文章目录 定义节点结构根节点插入操作查找操作删除操作特点应用示例 “Trie”树,又称为前缀树或字典树,是一种专门用于存储字符串的数据结构。它在许多应用程序中都非常有用,特别是在那些需要高效查找、插入和删除字符串的应用场景中。下面是…

网络通信——路由器、交换机、集线器(HUB)

注意:传输层,应用层没有网路设备 一.路由器(网络层设备) 1.分割广播域 2.一个接口就是一个广播域 3.一般接口位4,8,12。 4.数据转发 (由路由表转发数据) 5.根据路由表来进行路径选…

MySQL连接查询解析与性能优化成本

文章目录 一、连接查询1.连接查询基础1. INNER JOIN内连接2. LEFT JOIN (或 LEFT OUTER JOIN)左外连接3. RIGHT JOIN (或 RIGHT OUTER JOIN)右外连接4. FULL OUTER JOIN 2.连接查询的两种过滤条件3.连接的原理 二、性能优化成本1.基于成本的优化2.调节成本常数(1)mysql.server_…

【最基础最直观的排序 —— 冒泡排序算法】

最基础最直观的排序 —— 冒泡排序算法 冒泡排序(Bubble Sort)是一种计算机科学领域的较简单的排序算法,属于交换排序。其基本思想是在待排序的一组数中,将相邻的两个数进行比较,若前面的数比后面的数大就交换两数&am…

【C++】继承(上)

个人主页~ 继承 一、继承的概念以及定义1、继承的概念2、继承的定义(1)定义格式(2)继承基类成员访问方式的变化 二、基类和派生类对象赋值转换三、继承中的作用域 一、继承的概念以及定义 1、继承的概念 继承机制是面向对象程序…

Java集合(Map篇)

一.Map a.使用Map i.键值(key-value)映射表的数据结构,能高效通过key快速查找value(元素)。 ii.Map是一个接口,最常用的实现类是HashMap。 iii.重复放入k-v不会有问题,但是一个…

周邦彦,北宋文坛的独特乐章

周邦彦,字美成,号清真居士,生于北宋仁宗嘉祐元年(公元1056年),卒于北宋徽宗宣和三年(公元1121年),享年65岁。他是宋代“婉约派”词人的代表之一,与柳永、晏几…

java日志框架之Log4j

文章目录 一、Log4j简介二、Log4j组件介绍1、Loggers (日志记录器)2、Appenders(输出控制器)3、Layout(日志格式化器) 三、Log4j快速入门四、Log4j自定义配置文件输出日志1、输出到控制台2、输出到文件3、输出到数据库 五、Log4j自…

comp 9517 Computer Vision week1

本篇博文为课堂笔记,因为英语不好现在不得不课下看录像复习一遍 颜色模型 RGBHSVYCbCrL\*a\*b RGB 有红、绿、蓝三通道 problem:不同通道之间高度相关,包含同种信息 如果想要紧凑的(as compactly as possible)存储图像RGB不合适,…

[DRAM Test]内存测试维修工具大全

目录 1、《HCI MemTest, RunMemtestPro》 2、《MEMTEST64》 3、AIDA64稳定性测试 4、《MEMTEST86》与《MEMTEST86》 5、Windows Memory Diagnostic Tool(微软内存诊断工具) 6、《RAM STRESS TEST》 7、《AMT64和AMT128》 8、《DocMemory》 9、《RAMFIX V110516B》 10…