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

news2024/9/23 8:04:25

大家好,文本信息转化为知识图谱的技术,自问世以来一直是研究界的宠儿。大型语言模型(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 Neo4jPGStore

username="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 pd

NUMBER_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, coreferee

coref_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.text
                    if 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.text

    return 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 Document

news["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 RelikPathExtractor

relik = 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 os

from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.llms.openai import OpenAI

os.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 PropertyGraphIndex

index = 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.coloradmin.cn/o/2157040.html

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

相关文章

没有 Microsoft Wi-Fi Direct Virtual Adapter #2 导致无法打开热点

我的环境 电脑打不开热点 系统 win11 64位 品牌 hp 笔记本电脑 解决方法: https://answers.microsoft.com/zh-hans/windows/forum/all/%E7%A7%BB%E5%8A%A8%E7%83%AD%E7%82%B9%E6%97%A0/9285620a-71d9-4671-b125-4cd607b6371a 解决 😓 扫描一下设…

读构建可扩展分布式系统:方法与实践12分布式数据库案例

1. Redis 1.1. 2009年首次发布 1.1.1. 更注重原始性能和简单性,而不是数据安全性和一致性 1.2. 主要吸引力在于它能够同时充当分布式缓存和数据存储 1.3. 维护一个内存中的数据存储,也称为数据结构存储(data structure store) 1.4. 配置Redis将每个…

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

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

2024年华为杯数学建模E题-高速公路应急车道启用建模-基于YOLO8的数据处理代码参考(无偿分享)

利用YOLO模型进行高速公路交通流量分析 识别效果: 免责声明 本文所提供的信息和内容仅供参考。尽管我尽力确保所提供信息的准确性和可靠性,但我们不对其完整性、准确性或及时性作出任何保证。使用本文信息所造成的任何直接或间接损失,本人…

记一次Meilisearch轻量级搜索引擎使用

以前使用的是mysql的全文索引、最开始还行。后续觉得就不好用了,但是服务器资源有限,没法上ES,只好找一个轻量级的搜索引擎、找了半天,决定使用这一个,目前效果还不错的。 参考网址 官网:https://www.meil…

java反射基础知识

1.java的反射机制 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的反射…

【C语言零基础入门篇 - 16】:栈和队列

文章目录 栈和队列栈栈功能的实现源代码 队列队列功能的实现源代码 栈和队列 栈 什么是栈:功能受限的线性数据结构 栈的特点:先进后出 。例如:仓库进货、出货。 栈只有一个开口,先进去的数据在栈底(bottom&#xf…

高版本idea开启热部署找不到compiler.automake.allow.when.app.running

高版本idea开启热部署找不到compiler.automake.allow.when.app.running 1.解决方案 设置----》高级设置 搜索 allow 勾选完成就能使用了

针对论坛系统设计测试用例

针对用户登录设计测试用例 针对站内信编写测试用例

mysql5.7小版本升级

最近因为mysql漏洞问题需要升级版本 目标:5.7.17升级到最新的5.7.44 提前准备:必须 MySQL :: Download MySQL Community Server (Archived Versions) 下载最新的5.7版本5.7.44,下载后,解压备用 ​ 方案1:卸载原有…

网站建设模板选择哪种

在选择网站建设模板时,需要考虑多个因素,包括网站的目的、受众、内容类型以及个性化需求等。以下是一些常见的网站建设模板类型,以及它们的特点,希望对你的选择有所帮助。 企业/商务模板: 企业和商务网站通常需要专业、…

python画图|把X轴标签移动到图像顶端

在前述学习过程中,我们一直使用的是默认的轴坐标,X轴往往置于图像的下端。 有时候,也会有将X轴标签放置在图形顶端的需求,今天就一起学习一下。 【1】官网教程 首先打开官网,可以通过下述链接一步直达: …

【开源免费】基于SpringBoot+Vue.JS学科竞赛管理系统(JAVA毕业设计)

本文项目编号 T 047 ,文末自助获取源码 \color{red}{T047,文末自助获取源码} T047,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

小红书自动化写文以及发文机器人

💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通 😁 2. 毕业设计专栏,毕业季咱们不慌忙,几百款毕业设计等你选。 ❤️ 3. Python爬虫专栏…

【C语言零基础入门篇 - 15】:单链表

文章目录 单链表链表的基本概念单链表功能的实现单链表的初始化单链表新结点的创建单链表头插法单链表的输出单链表的查找单链表修改单链表的删除单链表所有数据结点释放源代码 单链表 链表的基本概念 一、什么是链表? 链表是数据结构中线性表的一种,其…

element ui实现全局el-dialog可拖拽

此情况适用于在已有项目中,想实现全局拖拽弹出框,而逐一添加拖拽自定义指令会过于麻烦的情况下,这种情况可以尝试下此方法。 话不多说,直接上代码: 1.先在src下新建一个config文件夹,里面再新建一个dialog…

【MySQL 03】表的操作

目录 1.在数据库内创建表 2.表的查询 3.表的插入 往数据库中插入数据 4.表的修改 5.删除表 1.在数据库内创建表 create table 表名(字段1 字段1类型); 这样我们就创建好了一张表,我们可以进入hellosql目录下进行查看:所以在数据库内建立表&#xf…

python绘制弦图-科研作图

一、背景 弦图以其直观、精美的展示方式受到越来越多人的关注,它不仅能够有效展示两个变量之间的联系,还能同时展现多个变量间的复杂互动,本文将通过Python语言中的pycirclize库,带你深入了解如何绘制弦图。 弦图是一种圆…

linux中vim编辑器的应用实例

前言 Linux有大量的配置文件,其中编辑一些配置文件,最常用的工具就是 Vim ,本文介绍一个实际应用的Vim编辑器开发文档的实例。 Vim是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性。…

力扣 92.反转链表Ⅱ

力扣《反转链表》系列文章目录 刷题次序,由易到难,一次刷通!!! 题目题解206. 反转链表反转链表的全部 题解192. 反转链表 II反转链表的指定段24. 两两交换链表中的节点两个一组反转链表 题解225. K 个一组翻转链表K …