需求:輸入一句話將其轉化爲語義圖
最基本的思路,輸入句子,分解三元組,根據三元組在圖中查找相關的,最後組成圖
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()
..未完待續