句子转语义图的奇妙探险之旅
需求:输入一句话将其转化为语义图
最基本的思路,输入句子,分解三元组,根据三元组在图中查找相关的,最后组成图
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()
..未完待续