首页 > 技术文章 > 句子转语义图的奇妙探险之旅

LandingGuy 2019-10-04 22:13 原文

需求:输入一句话将其转化为语义图

最基本的思路,输入句子,分解三元组,根据三元组在图中查找相关的,最后组成图

1. 句子提取三元组

参考https://github.com/lemonhu/open-entity-relation-extraction

2. 对每个三元组映射到知识库

2.1  知识库的构建

下载一个小的开源知识图谱http://www.openkg.cn/dataset/microeconomy

2.1.1 将json文件转化为2个csv,一个存放实体,一个存放关系

import json
path='C:\\sofware\\neo4jDatabases\\database-e44ebbf3-eba1-4327-beed-73add9065c47\\installation-3.5.6\\bin\\'
obj=open(path+'obj.csv','w+',encoding='utf-8')#存放实体
rel=open(path+'rel.csv','w+',encoding='utf-8')#存放关系
obj.write('oid:ID'+','+'name'+','+':LABEL'+'\n')
#写明每个实体的表头,代表neo4j 结点的id,name(属性),neo4j结点标签
rel.write(':START_ID'+','+':END_ID'+','+':TYPE'+'\n')
#写明关系,:START_ID是上面结点的id :TYPE是关系的值
mydist={}
with open('C:\\sofware\\ChatBot_web-master\\tu\\eco.json','r',encoding='utf-8') as f:
    line = f.readlines()
    json1 = json.loads(line[0])
    count=0
    for i in json1:
        if(i['object'] not in mydist.keys()):
            mydist[i['object']]=count
            obj.write(str(mydist[i['object']])+','+i['object']+','+'Object'+'\n')
            count+=1
        if(i['subject'] not in mydist.keys()):
            mydist[i['subject']]=count
            obj.write(str(mydist[i['subject']])+','+i['subject']+','+'Object'+'\n')
            count+=1
        
        rel.write(str(mydist[i['object']])+','+str(mydist[i['subject']])+','+i['relation']+'\n')
        #print(i['object'])
obj.close()
rel.close()
sub.close()
f.close()

2.2 下载neo4j

我的环境 win10+neo4jdesktop

再新建一个graph

进去后

此处打开的就是该图所在数据库的位置

将上面生成的两个csv文件放入这个数据库的bin位置下(也可以其他位置,这里为了方便),比如我的C:\sofware\neo4jDatabases\database-e44ebbf3-eba1-4327-beed-73add9065c47\installation-3.5.6\bin

在此终端执行

#neo4j-import --into graph.db  --nodes obj.csv   --relationships rel.csv

此时在bin目录下生成graph.db ,把它移到

C:\sofware\neo4jDatabases\database-e44ebbf3-eba1-4327-beed-73add9065c47\installation-3.5.6\data\databases

也就是bin的同级目录data里的databases 下 覆盖原来默认的graph.db

最后运行graph

此时成功建立起知识库啦

2.3 那么在neo4j 如何根据一个实体查找与之相关的实体呢?

查找与之相关的:MATCH (me)-[*1..2]-(remote_friend) WHERE me.name = '弹性' RETURN remote_friend 

解释:

MATCH  查找命令

me 随便取的 类似于select * from data as me 这样只是个别名

*1-2 表示查找与之相关的1到2条路径

remote_friend 同me随便取,表示的是要查询的实体结果

(xx)-[xx]-(xx) 就是实体-关系-另一实体无论箭头是怎么指向的

(xx)-[xx]->(xx) 有箭头的话就是实体指向另一实体

 

查找和它类似名称的:MATCH (n) where n.name =~'.*弹性.*'  RETURN n

2.4 查找一个实体的近义词

使用Synonyms 包,具体用法https://github.com/huyingxi/Synonyms

pip install -U synonyms

.

2.5 py2neo

pip install py2neo

from py2neo import Graph, NodeMatcher
 
##连接neo4j数据库,输入地址、用户名、密码
graph = Graph('http://localhost:7474',username='neo4j',password='123456')
graph.run('MATCH (n) where n.name =~\'.*弹性.*\'  RETURN n LIMIT 25').to_data_frame()

..未完待续

 

 

 

推荐阅读