句子轉語義圖的奇妙探險之旅

需求:輸入一句話將其轉化爲語義圖

最基本的思路,輸入句子,分解三元組,根據三元組在圖中查找相關的,最後組成圖

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()

..未完待續

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章