基于大语言模型抽取文本中的实体和关系

news/2025/1/15 13:28:33/

      在基于大语言模型图数据库存储中,要从文本中提取实体,实体属性和关系。  实体关系抽取是从文本中的句子里抽取出一对实体并给出实体间关系的任务。

该任务的输入是一句话,输出是一个spo三元组(subject-predicate-object)。

spo三元组

  • subject 主语
  • object  宾语
  • predicate 谓词

中文表达

 

实体联系模式图(ERD)(Entity-relationship model)

实体(Entity)

 实体是一个系统内可定义的事物或概念,如人/角色(例如学生),对象(例如发票),概念(例如简介)或事件(例如交易)

实体的属性(attributes)

属性是定义实体或实体类型的质量、属性和特征。

联系(Relationship)

联系是多个实体之间的相互联系。
联系集是相同类型联系的集合。

基于大语言模型抽取实体和关系

大语言模型能够从语句中提取实体和关系,这给实体抽取提供了新的方法。下面是kimi 的回答:

例子:

陈述:请列出下列语句中的实体和实体之间的关系。姚远的妻子是刘素霞,他们有一个儿子叫姚大伟。用JSON 输出。

回答:{
  "entities": [
    {
      "name": "姚远",
      "type": "person"
    },
    {
      "name": "刘素霞",
      "type": "person"
    },
    {
      "name": "姚大伟",
      "type": "person"
    }
  ],
  "relationships": [
    {
      "subject": "姚远",
      "predicate": "妻子",
      "object": "刘素霞"
    },
    {
      "subject": "姚远",
      "predicate": "儿子",
      "object": "姚大伟"
    },
    {
      "subject": "刘素霞",
      "predicate": "儿子",
      "object": "姚大伟"
    }
  ]
}

例2

陈诉:请列出下列语句中的实体和实体之间的关系。丹阳第二中学位于江苏省丹阳市。用JSON 输出

回答:{
  "entities": [
    {
      "name": "丹阳第二中学",
      "type": "school"
    },
    {
      "name": "江苏省",
      "type": "province"
    },
    {
      "name": "丹阳市",
      "type": "city"
    }
  ],
  "relationships": [
    {
      "subject": "丹阳第二中学",
      "predicate": "位于",
      "object": "江苏省丹阳市"
    }
  ]

提取实体和关系的难点

中文表达关系的含义不准确。

例如:姚远的父亲是姚邦豪。

实体:姚远,姚邦豪

关系:父亲

 表达关系 (姚远)->[父亲]->(姚邦豪)

        这种关系的名称并不确切,经常会误解为姚远是姚邦豪的儿子。不如英文 is_father 和father_of 表达更贴切。

因此我们改用了英文表达关系。

具体应用中,依然存在许多的问题:

1  姚远的哥哥是谁?

    有时候会提取出实体为”姚远“,有时候会提取出”姚远的哥哥“

2 姚远的哥哥今年60岁了

   提取出来的实体是”姚远“ 和”姚远的哥哥“两个实体。不会通过”姚远“节点找到他的哥哥。

ERD 的图数据库存储

 当LLM 获取了实体和关系之后,可以将这些信息存储到图数据库中。

    节点-存储实体

     关系-关系的类型

(主语)->[关系]->(宾语)

例如:

姚远->[妻子]->刘素霞

ERD 图的文本表达 

(主语)->[关系]->(宾语) => 姚远妻子刘素霞

(主语)->[关系]->(宾语) =>  丹阳第二中学位于江苏省丹阳市

基本符合中文的语法。但是容易产生幻觉。

提示词:

你是一个图数据库专家,通过路径查询信息,回答问题。
已经查询的路径:
Path ={"entities":[{"name":"姚远","type":"person"},{"name":"姚大伟","type":"person"}],"relationships": [{"subject": "姚远","predicate": "儿子","object": "姚大伟"}]
}当前节点的名称:姚大伟。
当前节点有一些相邻节点,通过如下关系连接。
"relationships": [{"subject": "姚大伟","predicate": "儿子","object": "姚舜宇"},
{"subject": "姚大伟","predicate": "妻子","object": "翟瑞玥"},
]
要回答的问题:姚大伟的儿子的同学是那些人?
如果能回答问题,直接回答(文本格式)。
如果目前的信息还无法回答问题,请推荐下一个查询节点名称。使用JSON输出。你是一个图数据库专家,通过路径查询信息,回答问题。
已经查询的路径:
Path ={"entities":[{"name":"姚远","type":"person"},{"name":"姚大伟","type":"person"}],"relationships": [{"subject": "姚远","predicate": "儿子","object": "姚大伟"}]
}当前节点的名称:姚大伟。
当前节点有一些相邻节点,通过如下关系连接。
"relationships": [{"subject": "姚大伟","predicate": "儿子","object": "姚舜宇"},
{"subject": "姚大伟","predicate": "妻子","object": "翟瑞玥"},
]
要回答的问题:姚大伟的儿子的同学是那些人?
如果能回答问题,直接回答(文本格式)。
如果目前的信息还无法回答问题,请推荐下一个查询节点名称。使用JSON输出。格式为:
{
“NextNodes”:[ {“name”:”next query node”}]
}

结束语

        使用LLM 提取实体和关系,查询neo4j图数据库。这看似简单,但是极其富有挑战性。我们尝试了kimi 和零一万物大模型yi-large 。效果都不十分令人满意。而且使用程序调用大模型,要比大模型在线对话差一点。也不知道是为什么。


http://www.ppmy.cn/news/1508991.html

相关文章

【数据结构详解】——归并排序(动图详解)

目录 🕒 1. 归并排序🕘 1.1 递归实现🕘 1.2 非递归实现 🕒 1. 归并排序 💡 算法思想:归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子…

使用java代码-实现去重累加,然后添加到数据库

假设这是您的数据,以字符串数组的形式给出 然后需要创建一个实体类用于赋值 具体实现代码 重新循环赋值到实体类 添加到 list中然后通过mapper 映射 写入数据库 mapper持久层 添加语句,使用foreach循环遍历数据写入 写入数据库成功(数据库字…

ElasticSearch的Mapping和DSL语言

ElasticSearch的Mapping和DSL语言 文章目录 ElasticSearch的Mapping和DSL语言mapping(映射)动态映射类型自动识别 静态映射关于后期更改mapping字段类型?重建索引步骤 常用mapping参数配置index_template 和mapping_template Query DSL数据初始化无条件查询&#xf…

wireshark使用介绍及案例分享

一、wireshark介绍 1、定义 wireshark是非常流行的网络封包分析软件,简称小鲨鱼,功能十分强大。可以截取各种网络封包,显示网络封包的详细信息。对应的,linux下的抓包工具是 tcpdump。 1.1、网络基础 参考TCP/IP五层模型,帧结构如下: 帧字段 帧字段含义 Frame 物理层的…

绕过CDN查看真实IP

CDN简介: CDN主要用于加速访问,在各个地区访问时,以最接近的地区的服务器提供访问服务,而不是从原始服务器获取,从而大大减少延迟。拥有CDN可以减少源站压力和隐藏服务器真实IP。 国内常见CDN: 阿里云腾…

Typora:通过PicGo设置GitHub图床

Typora:PicGo设置GitHub图床 1. GitHub配置(专用于图床) 登录GitHub首页,先准备一个GitHub项目(权限最好是:public,不然其他人访问不到),专用于图床 。 打开【Settings…

C语言:字符串函数strcpy

该函数用于字符串的拷贝。 使用方法如下&#xff1a; #include<stdio.h> #include<string.h>int main() {char str[10];char* str1 "abcd";//strcpy(str, str1);//把str1复制到str&#xff0c;但此函数不安全所以用strcpy_sstrcpy_s(str, 10, str1);/…

Vue知识笔记

一、父子组件 在‌vue.js中,父组件和子组件是通过组件的嵌套关系来定义的。当一个组件在另一个组件的模板中被使用,那么被使用的组件被称为子组件,而使用它的组件则被称为父组件。这种关系体现了Vue.js的组件化开发的核心思想,即通过创建可重用的、独立的组件来构建复杂的…