知识图谱最简单的demo实现

一、简介

知识图谱整个建立过程可以分为以下几点:

数据处理
创建三元组
可视化展示

其中:

  • 数据预处理:分词、命名实体识别、语义角色识别、句法依存分析等
  • 创建三元组:需要根据命名实体识别、语义角色识别结果进行处理,建立规则生成三元组
  • 用用图数据库或者接触可视化工具进行展示

二、数据预处理

这里我们使用哈工大的开源工具包LTP进行展示

本文主要介绍整体流程,中间的技术细节,会在后面分章节展开

2.1 数据

我们自己创建一段文本
当然也可以导入文本,或者批量导入csv等格式的数据,为了简便我们使用一段话来展示。

text="苏轼是宋朝的著名文学家,黄庭坚是他的好朋友。苏轼擅长写词,而黄庭坚擅长写诗。他在常州去世。"

2.2 数据处理

LTP支持将全部处理流程进行pipeline执行,当然我们也可以选择分布执行,在后面技术章节会详细展开

#  分词 cws、词性 pos、命名实体标注 ner、语义角色标注 srl、依存句法分析 dep、语义依存分析树 sdp、语义依存分析图 sdpg
output = ltp.pipeline(text, tasks=["cws", "pos", "ner", "srl", "dep", "sdp", "sdpg"])

我们把output展开看一下

output
LTPOutput(cws=['苏轼', '是', '宋朝', '的', '著名', '文学家', ',', '黄庭坚', '是', '他', '的', '好', '朋友', '。', '苏轼', '擅长', '写', '词', ',', '而', '黄庭坚', '擅长', '写', '诗', '。', '他', '在', '常州', '去世', '。'], pos=['nh', 'v', 'nt', 'u', 'a', 'n', 'wp', 'nh', 'v', 'r', 'u', 'a', 'n', 'wp', 'nh', 'v', 'v', 'n', 'wp', 'c', 'nh', 'v', 'v', 'n', 'wp', 'r', 'p', 'ns', 'v', 'wp'], ner=[('Nh', '苏轼'), ('Nh', '黄庭坚'), ('Nh', '苏轼'), ('Nh', '黄庭坚'), ('Ns', '常州')], srl=[{'predicate': '是', 'arguments': [('A0', '苏轼'), ('A1', '宋朝的著名文学家')]}, {'predicate': '是', 'arguments': [('A0', '黄庭坚'), ('A1', '他的好朋友')]}, {'predicate': '擅长', 'arguments': [('A0', '苏轼'), ('A1', '写词')]}, {'predicate': '写', 'arguments': [('A1', '词')]}, {'predicate': '擅长', 'arguments': [('A0', '黄庭坚'), ('A1', '写诗')]}, {'predicate': '写', 'arguments': [('A1', '诗')]}, {'predicate': '去世', 'arguments': [('A0', '他'), ('ARGM-LOC', '在常州')]}], dep={'head': [2, 0, 6, 3, 6, 2, 2, 9, 2, 13, 10, 13, 9, 2, 16, 2, 16, 17, 16, 22, 22, 16, 22, 23, 2, 29, 29, 27, 2, 2], 'label': ['SBV', 'HED', 'ATT', 'RAD', 'ATT', 'VOB', 'WP', 'SBV', 'COO', 'ATT', 'RAD', 'ATT', 'VOB', 'WP', 'SBV', 'COO', 'VOB', 'VOB', 'WP', 'ADV', 'SBV', 'COO', 'VOB', 'VOB', 'WP', 'SBV', 'ADV', 'POB', 'COO', 'WP']}, sdp={'head': [2, 0, 6, 3, 6, 2, 2, 9, 2, 13, 10, 13, 9, 9, 16, 9, 16, 17, 16, 22, 22, 16, 22, 23, 22, 29, 28, 29, 22, 29], 'label': ['EXP', 'Root', 'TIME', 'mDEPD', 'FEAT', 'LINK', 'mPUNC', 'EXP', 'eSUCC', 'FEAT', 'mDEPD', 'FEAT', 'LINK', 'mPUNC', 'AGT', 'eSUCC', 'dCONT', 'CONT', 'mPUNC', 'mRELA', 'AGT', 'eCOO', 'dCONT', 'CONT', 'mPUNC', 'EXP', 'mRELA', 'LOC', 'eSUCC', 'mPUNC']}, sdpg=[(1, 2, 'EXP'), (2, 0, 'Root'), (3, 6, 'TIME'), (4, 3, 'mDEPD'), (5, 6, 'FEAT'), (6, 2, 'LINK'), (7, 2, 'mPUNC'), (8, 9, 'EXP'), (8, 10, 'eCOO'), (9, 2, 'eSUCC'), (10, 13, 'FEAT'), (11, 10, 'mDEPD'), (12, 13, 'FEAT'), (13, 9, 'LINK'), (14, 9, 'mPUNC'), (15, 16, 'AGT'), (16, 9, 'eSUCC'), (17, 16, 'dCONT'), (18, 17, 'CONT'), (19, 16, 'mPUNC'), (20, 22, 'mRELA'), (21, 22, 'AGT'), (22, 16, 'eCOO'), (23, 22, 'dCONT'), (24, 23, 'CONT'), (25, 22, 'mPUNC'), (26, 29, 'EXP'), (27, 28, 'mRELA'), (28, 29, 'LOC'), (29, 22, 'eSUCC'), (30, 22, 'mPUNC'), (30, 29, 'mPUNC')])

当然,我们也可以使用字典分别返回其结果

# 使用字典格式作为返回结果
print(output.cws)  # print(output[0]) / print(output['cws']) # 也可以使用下标访问
print(output.pos)
print(output.sdp)
print(output.ner)
print(output.srl)

我们这里创建知识图谱主要使用命名实体识别和语义角色标注的结果

2.3 实体创建

实体创建主要是命名实体识别的结果

print(output.cws) 
print(output.ner)

['苏轼', '是', '宋朝', '的', '著名', '文学家', ',', '黄庭坚', '是', '他', '的', '好', '朋友', '。', '苏轼', '擅长', '写', '词', ',', '而', '黄庭坚', '擅长', '写', '诗', '。', '他', '在', '常州', '去世', '。']

[('Nh', '苏轼'), ('Nh', '黄庭坚'), ('Nh', '苏轼'), ('Nh', '黄庭坚'), ('Ns', '常州')]

LTP目前可以识别的实体类别主要有三种:

标记含义
Nh人名
Ni机构名
Ns地名

当然如果是复杂项目的数据,这个明显是不能支持的,后面我们会介绍如果训练自己的命名实体识别模型

从上面的结果我们可以看到,目前识别的结果只有人名和地名

正常来讲,北宋作为时间,应该也需要进行识别

接下来我们创建实体:

def entity_extraction(ner_result):
    ner_list_Nh=[]
    ner_list_Ni=[]
    ner_list_Ns=[]
    
    
    for i in  range(len(ner_result)):
        
        if output.ner[i][0] == "Nh":
            ner_list_Nh.append(ner_result[i][1])
        elif output.ner[i][0] == "Ni":
            ner_list_Ni.append(ner_result[i][1])
        elif output.ner[i][0] == "Ns":
            ner_list_Ns.append(ner_result[i][1])
            
    return list(set(ner_list_Nh)),list(set(ner_list_Ni)),list(set(ner_list_Ns))
    

根据不同的识别标签创建三个list,并且用set去重,最后得到实体

ner_list_Nh,ner_list_Ni,ner_list_Ns

(['苏轼', '黄庭坚'], [], ['常州'])

最终的实体有三个,两个人名,一个地名

2.4 三元组构建

我们使用角色标注的结果创建三元组

实际情况下,只使用角色标注创建是不行的,需要根据依存句法、语义依存等一起来进行构建,这样会更好的理解上下文和全局

print(output.cws)  
print(output.srl)

['苏轼', '是', '宋朝', '的', '著名', '文学家', ',', '黄庭坚', '是', '他', '的', '好', '朋友', '。', '苏轼', '擅长', '写', '词', ',', '而', '黄庭坚', '擅长', '写', '诗', '。', '他', '在', '常州', '去世', '。']

[{'predicate': '是', 'arguments': [('A0', '苏轼'), ('A1', '宋朝的著名文学家')]}, {'predicate': '是', 'arguments': [('A0', '黄庭坚'), ('A1', '他的好朋友')]}, {'predicate': '擅长', 'arguments': [('A0', '苏轼'), ('A1', '写词')]}, {'predicate': '写', 'arguments': [('A1', '词')]}, {'predicate': '擅长', 'arguments': [('A0', '黄庭坚'), ('A1', '写诗')]}, {'predicate': '写', 'arguments': [('A1', '诗')]}, {'predicate': '去世', 'arguments': [('A0', '他'), ('ARGM-LOC', '在常州')]}]

为了更好的展示,我们分别打印一下

for i in range(len(output.srl)):
    #if srl[i]
    print(output.srl[i])
{'predicate': '是', 'arguments': [('A0', '苏轼'), ('A1', '宋朝的著名文学家')]}
{'predicate': '是', 'arguments': [('A0', '黄庭坚'), ('A1', '他的好朋友')]}
{'predicate': '擅长', 'arguments': [('A0', '苏轼'), ('A1', '写词')]}
{'predicate': '写', 'arguments': [('A1', '词')]}
{'predicate': '擅长', 'arguments': [('A0', '黄庭坚'), ('A1', '写诗')]}
{'predicate': '写', 'arguments': [('A1', '诗')]}
{'predicate': '去世', 'arguments': [('A0', '他'), ('ARGM-LOC', '在常州')]}

语义角色类型可以在LTP官网上查看
在这里插入图片描述
我们这里筛选有A0角色的进行创建

从一般的结果看,一般A0会对应到命名实体识别的实体上,当然我个人觉得这里是有优化空间的

kg_list=[]
for i in range(len(output.srl)):
    judge_for_a0=[]
    for j in range(len(output.srl[i]["arguments"])):
        judge_for_a0.append(output.srl[i]["arguments"][j][0])
        #print((judge_for_a0))
    if "A0" in judge_for_a0:
        index_a0 = judge_for_a0.index("A0")
        if "A1" in judge_for_a0:
            index_a1 = judge_for_a0.index("A1")
        elif "ARGM-LOC" in judge_for_a0:
            index_a1 = judge_for_a0.index("ARGM-LOC")
        
        kg_list.append([output.srl[i]["arguments"][index_a0][1],output.srl[i]["predicate"],output.srl[i]["arguments"][index_a1][1]])

生成的结果就是:

[['苏轼', '是', '宋朝的著名文学家'],
 ['黄庭坚', '是', '他的好朋友'],
 ['苏轼', '擅长', '写词'],
 ['黄庭坚', '擅长', '写诗'],
 ['他', '去世', '在常州']]

2.5 数据整理

  • 如果在三元组中的A0没有在实体中的话我们直接去掉;
  • 对于三元组中的第三列,我们这里单独将其定义为一类实体为标签
#实体清洗,与ner结果匹配
def  kg_list_rule(kg_list,ner_list_Nh):
    for i in range(len(kg_list)):
        for j in ner_list_Nh:#如果A0角色,包含ner识别的实体,将其替换为实体名称
            if j in kg_list[i][0]:
                kg_list[i][0]=j
    
    for i in range(len(kg_list)):#如果语义角色识别的角色不再ner结果中则删除,此处需要优化
        if kg_list[i][0] in ner_list_Nh:
            continue
        del kg_list[i]

    predicate = []
    for i in range(len(kg_list)):#提取谓语
        predicate.append(kg_list[i][2])
    return kg_list,predicate
                

最终结果如下:

([['苏轼', '是', '宋朝的著名文学家'],
  ['黄庭坚', '是', '他的好朋友'],
  ['苏轼', '擅长', '写词'],
  ['黄庭坚', '擅长', '写诗']],
 ['宋朝的著名文学家', '他的好朋友', '写词', '写诗'])

3、创建图谱–neo4j

目前neo4j应该是最容易使用的图数据库,所以我们使用neo4j进行创建,如果大家不想用图数据库,我们下一节介绍一个工具来进行可视化

3.1 链接neo4j

from py2neo import Node, Graph, Relationship, NodeMatcher

graph = Graph("bolt://localhost:7687", 
			user="neo4j", 
			password='1qa2ws3ed',
            name="demo"
              )

3.2 创建节点

def node_create(ner_list_Nh,ner_list_Ni,ner_list_Ns,predicate):
    if len(ner_list_Nh)!=0:
        for i in range(len(ner_list_Nh)):
            graph.create(Node('人名', name=ner_list_Nh[i]))

    if len(ner_list_Ni)!=0:
        for i in range(len(ner_list_Ni)):
            graph.create(Node('机构名', name=ner_list_Ni[i]))

    if len(ner_list_Ns)!=0:
        for i in range(len(ner_list_Ns)):
            graph.create(Node('地名', name=ner_list_Ns[i]))

    if len(predicate)!=0:
        for i in range(len(predicate)):
            graph.create(Node('标签', name=predicate[i]))
            

将所有实体,包括标签进行创建

3.3 创建边

def relationship_create(kg_list):
    for m in range(len(kg_list)):
        try:
            rel = Relationship(matcher.match("人名").where("_.name=" + "'" + kg_list[m][0]  + "'").first(),
                               kg_list[m][1],
                               matcher.match("标签").where("_.name=" + "'" + kg_list[m][2]  + "'").first())
            graph.create(rel)

        except AttributeError as e:
            print(e, m)

在这里插入图片描述
这里可以看到,其实这个结果有点不太理想,就是苏轼和黄庭坚之间没有建立关系,其实这个就是我们前面提到的,只使用语义角色标注创建三元组是不行的,后面我们可以结合其他方法进行优化。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图片点击放大

在列表中添加插槽 <template slot-scope"scope">&#xff0c;获取当前点击的数据 在图片中添加点击事件的方法&#xff0c;用来弹出窗口 <vxe-columnfield"icon"title"等级图标"><template slot-scope"scope"><…

Kubernetes(K8s) Pod详解-05

Pod详解 Pod介绍 Pod结构 每个Pod中都可以包含一个或者多个容器&#xff0c;这些容器可以分为两类&#xff1a; 用户程序所在的容器&#xff0c;数量可多可少 Pause容器&#xff0c;这是每个Pod都会有的一个根容器&#xff0c;它的作用有两个&#xff1a; 可以以它为依据…

hadoop完全分布式搭建

文章目录 集群部署规划服务器准备Mobaxterm 远程登录实验前准备安装软件工具关闭防火墙 安装 JDK 和 Hadoop创建软件包目录解压软件包配置环境变量 集群搭建先创建 HDFS 工作目录和 LOG 目录配置集群配置环境配置 HDFS 主节点信息、持久化和数据文件的主目录配置 HDFS 默认的数…

程序员养生之道:延寿不忘初心——延寿必备

文章目录 每日一句正能量前言如何养生饮食篇运动篇休息篇后记 每日一句正能量 现代社会已不是大鱼吃小鱼的年代&#xff0c;而是快鱼吃慢鱼的年代。 前言 在IT行业中&#xff0c;程序员是一个重要的职业群体。由于长时间的繁重编程工作&#xff0c;程序员们常常忽略了身体健康…

Unity中Shader编译目标渲染器

文章目录 前言一、Unity在打包时&#xff0c;会把Shader编译成不同平台对应的代码我们在状态栏&#xff0c;可以看见我们目前所处于的目标平台 二、在Unity中&#xff0c;怎么指定目标平台1、#pragma only_renderers2、#pragma exclude_renderers 三、我们测试一下看看效果1、 …

postman利用pre-request script自动设置token

场景&#xff1a; 我们请求接口&#xff1a;/api/rest/user/list获取用户列表&#xff0c;但是该接口需要在header中带上Authorization表示的鉴权Token才行。 而登录接口/api/rest/login&#xff0c;则可以返回改Token 常规方案 我们先调登录接口/api/rest/login获取到Toke…

极简云网络验证系统开源源码

极简云验证&#xff0c;多样化应用管理方式&#xff0c;多种项目任你开发&#xff0c;分布式应用开关&#xff0c;让您的应用开发更简单&#xff0c;完美实现多用户多应用管理。 支持多应用卡密生成&#xff1a; 卡密生成 单码卡密 次数卡密 会员卡密 积分卡密 卡密管理 卡密长…

了解http协议

http的相关概念 互联网&#xff1a;是网络的网络&#xff0c;是所有类型网络的母集 因特网&#xff1a;世界上最大的互联网网络。即因特网概念从属于互联网概念。习惯上&#xff0c;大家把连接在因特网上的计算机都成为主机。 万维网&#xff1a;数据库 URL&#xff1a;万维…

亚马逊云科技向量数据库与生成式AI的完美融合:落地实践详解(四)

以往 OpenSearch 摄入时的一些最佳实践中并不包含 knn 的情况&#xff0c;所以在 knn 索引存在的情况&#xff0c;不能完全参照之前的结论&#xff0c;通过以上三种不同的实验方式&#xff0c;在多次实验的过程中&#xff0c;本文得到了以下的一些实践经验和结论&#xff0c;供…

自研分布式IM-HubuIM RFC草案

HubuIM RFC草案 消息协议设计 基本协议 评估标准 【性能】协议传输效率&#xff0c;尽可能降低端到端的延迟&#xff0c;延迟高于200ms用户侧就会有所感知 【兼容】既要向前兼容也要向后兼容 【存储】减少消息包的大小&#xff0c;降低空间占用率&#xff0c;一个字节在亿…

一键添加特效与色彩变化,视频剪辑高手助力创作炫酷短片!

亲爱的视频创作者们&#xff0c;想要让你的视频更加炫酷、吸引眼球吗&#xff1f;现在&#xff0c;我们有一款神奇的工具&#xff0c;可以帮助你一键添加特效与色彩变化&#xff0c;让你的视频瞬间焕发新活力&#xff01; 首先第一步&#xff0c;我们要进入视频剪辑高手并在上…

关于Unity中字典在Inspector的显示

字典在Inspector的显示 方法一&#xff1a;实现ISerializationCallbackReceiver接口 《unity3D游戏开发第二版》记录 在编辑面板中可以利用序列化监听接口特性对字典进行序列化。 主要继承ISerializationCallbackReceiver接口 实现OnAfterDeserialize() OnBeforeSerialize() …

「实用场景教程」如何用日程控件DHTMLX Scheduler制作酒店预订日历?(三)

dhtmlxScheduler是一个类似于Google日历的JavaScript日程安排控件&#xff0c;日历事件通过Ajax动态加载&#xff0c;支持通过拖放功能调整事件日期和时间&#xff0c;事件可以按天&#xff0c;周&#xff0c;月三个种视图显示。 DHTMLX Scheduler正式版下载 在本教程中&…

Mac 安装 Django 并连接 MySQL

一、下载安装运行Django看官方教程就好了&#xff0c;网址&#xff1a;Django 安装_w3cschool 二、连接MySQL&#xff08;我用的是pymysql和mysqlclient&#xff09;&#xff1a; 1、创建好项目后找到这个文件 2、修改当中的连接信息&#xff0c;将这些信息改成你自己的就好了…

(三)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)

一、无人机模型简介&#xff1a; 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 参考文献&#xff1a; [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、Tiki-taka算法&#xff08;TTA&#xf…

ruoyi+Hadoop+hbase实现大数据存储查询

前言 有个现实的需求&#xff0c;数据量可能在100亿条左右。现有的数据库是SQL Server&#xff0c;随着采集的数据不断的填充&#xff0c;查询的效率越来越慢&#xff08;现有的SQL Server查询已经需要数十秒钟的时间&#xff09;&#xff0c;看看有没有优化的方案。 考虑过S…

vue中使用echarts实现省市地图绘制,根据数据在地图上显示柱状图信息,增加涟漪特效动画效果

一、实现效果 使用echarts实现省市地图绘制根据数据在地图显示柱状图根据数据显示数据&#xff0c;涟漪效果 二、实现方法 1、安装echarts插件 npm install echarts --save2、获取省市json数据 https://datav.aliyun.com/portal/school/atlas/area_selector 通过 阿里旗下…

(2)(2.2) Lightware SF45/B(350度)

文章目录 前言 1 安装SF45/B 2 连接自动驾驶仪 3 通过地面站进行配置 4 参数说明 前言 Lightware SF45/B 激光雷达(Lightware SF45/B lidar)是一种小型扫描激光雷达&#xff08;重约 50g&#xff09;&#xff0c;扫描度可达 350 度&#xff0c;扫描范围 50m。 1 安装SF45…

老技术告诉你如何选择代理IP以满足数据采集需求

根据IDC发布的大数据行业最新报道显示&#xff0c;目前已经有越来越多的企业将重点放在大数据技术之上&#xff0c;以大数据来进行创新工业互联网的建设&#xff0c;携手央国企共同推进新型工业化。由此可见大数据的重要性。不过具体到每一位技术人员来说&#xff0c;在进行数据…

[读论文][跑代码]BK-SDM: A Lightweight, Fast, and Cheap Version of Stable Diffusion

github: GitHub - Nota-NetsPresso/BK-SDM: A Compressed Stable Diffusion for Efficient Text-to-Image Generation [ICCV23 Demo] [ICML23 Workshop] ICML 2023 Workshop on ES-FoMo 简化方式 蒸馏方式&#xff08;训练Task蒸馏outKD-FeatKD&#xff09; 训练数据集 评测指标…