Neo4j简单构建知识图谱实例
目錄
?一、需要兩組數據
二、提取所需專題數據
三、利用結巴分詞將專題數據分詞
四、連接并繪制知識圖譜
五、消除重復節點及重復關系
六、結果展示
Ps:在使用Neo4j前,需要先在該安裝路徑文件下cmd運行,輸入neo4j console 即可啟動,可根據關閉時輸入neo4j stop,如下圖所示說明已成功啟動,此時可打開 http://localhost:7474/進入Neo4j圖數據庫。
一、需要兩組數據
? ? ? ?如下圖所示,我們需要篩選出關鍵字中包含有“圖形化編程”的專題數據,并以此構建“圖形化編程”與各專題之間的關系。下圖以20條數據為例(本文使用的數據庫為Mysql數據庫):
二、提取所需專題數據
? ? ? ?利用SQL語句提取所需專題數據,即“圖形化編程”存在于keywords中的對應專題數據(本文舉的例子中,keywords中皆有“圖形化編程”,可以不用使用以下模糊語句;該語句適用于關鍵詞中沒有我們需要的,即相應專題也不需要,因此可以過濾掉,提高數據準確性)。SQL模糊查詢語句的代碼如下:
# 使用的是數據庫引擎連接數據庫,需導入"from sqlalchemy import create_engine",my_date是數據庫名 con = create_engine('mysql+pymysql://root:密碼@localhost:3306/my_date charset=utf8')# 獲取test表專題字段,使用pandas庫中的數據庫查詢方法 text = pd.read_sql_query(sql="SELECT distinct zhuanti FROM test where zhuanti is not null and keywords like '%%%%%s%%%%'" % '圖形化編程', con=con)三、利用結巴分詞將專題數據分詞
? ? ? ?由于本文舉的例子中,有些專題不止只有一個詞匯,同時也有部分數據是存在相同專題的情況,因此需要使用結巴分詞進行數據分詞。例如最后一行的【職業教育;計算機硬件技術】利用結巴分詞提取為【職業教育】、【計算機硬件應用】兩個詞匯。步驟如下:
# 導入自定義的專題分詞詞典 data = str(text) # 需將讀取的文檔dataframe格式轉為str jieba.load_userdict('專題詞典.txt')# 去除摘要中的空格、換行等不必要的數據 data = data.replace(';', '') data = data.replace('\n', '') data = data.replace(' ', '') data = data.replace(',', '')# 結巴分詞中的精確模式進行分詞 seg_list = jieba.lcut(data)# 導入自定義的停用詞詞典 with open('stopwords.txt', 'r+', encoding='utf-8')as fp:stopwords = fp.read().split('\n')# 存儲過濾停用詞后的分詞結果 word_list = []# 如果切出的詞不是停用詞,則存入列表 for seg in seg_list:if seg not in stopwords:word_list.append(seg)? ? ? ?其中自定義的專題分詞是為了防止出現,例如【計算機硬件技術】被劃分為【計算機】【硬件】【技術】等情況,不滿足我們的需求,因此自定義專題分詞詞典能夠提取我們所需的詞匯。本文的專題詞典【專題詞典.text】如下所示:
中等教育 教育理論與教育管理 初等教育 計算機軟件及計算機應用 自動化技術 工業通用技術及設備 計算機硬件技術 電信技術 鐵路運輸 建筑科學與工程 戲劇電影與電視藝術 職業教育?? ? ? ?其中自定義的停用詞詞典是為了過濾一些例如數字、符號等不需要的數據。本文的停用詞詞典【stopwords.text】如下所示:
; 1 2 3 4 5 6 7 8 9 10 11 12 zhuanti0?? ? ? ?最終過濾出的分詞結果【word_list】如下所示:
['中等教育', '教育理論與教育管理', '計算機軟件及計算機應用', '初等教育', '自動化技術', '工業通用技術及設備', '計算機軟件及計算機應用', '計算機軟件及計算機應用', '自動化技術', '計算機軟件及計算機應用', '計算機硬件技術', '電信技術', '計算機軟件及計算機應用', '鐵路運輸', '建筑科學與工程', '自動化技術', '初等教育', '工業通用技術及設備', '戲劇電影與電視藝術', '計算機軟件及計算機應用', '職業教育', '計算機硬件技術']PS:突然發現該方法其實不是很必要,就是其實我們上述最終過濾出的數據,結合后面消除重復節點,得到的就是我們定義的專題詞典,所以可以針對自己的數據情況酌情使用,這里也是展示一下如何進行結巴分詞提取所需數據。
四、連接并繪制知識圖譜
? ? ? ?分詞后便得到了我們繪制圖譜的數據,連接Neo4j圖數據庫,以“圖形化編程”為中心節點,將之前分詞并清洗后的數據【word_list】用for循環逐個添加,創建節點和關系,并為節點添加屬性,最后實例化。打開網址便能看到繪制好的圖譜。
# 連接Neo4j graph = Graph("http://localhost:7474", auth=("neo4j", "密碼")) graph.delete_all() # 清除neo4j中原有的結點# 創建節點 for i in range(1,len(word_list)):node = Node('title',name="圖形化編程")relation = Node('zhuanti',name=word_list[i])graph.create(node)graph.create(relation)# 給節點添加屬性(兩者間的關系)zhuanti = Relationship(node, '應用于', relation)# 節點實例化,并顯示在neo4j中graph.create(zhuanti)? ? ? ?打開網址,此時繪制的圖譜如下圖所示:
? ? ? ?但由圖可以發現,圖譜顯示的是構建每個“圖形化編程”與各專題節點關系,聯系分散了,不是我們想要的只有一個父節點“圖形化編程”,擁有多個專題子節點的關系。因此我們需要消除重復節點。
五、消除重復節點及重復關系
1.消除重復節點:在Neo4j上輸入以下語句(注意:不是寫在python的代碼中,是網址的運行框)
# 刪除專題重復的節點graph.run('MATCH (n:zhuanti) WITH n.name AS name, COLLECT(n) AS nodelist, COUNT(*) AS count WHERE count > 1 CALL apoc.refactor.mergeNodes(nodelist) YIELD node RETURN node')# 刪除“圖形化編程”重復的節點graph.run('MATCH (n:title) WITH n.name AS name, COLLECT(n) AS nodelist, COUNT(*) AS count WHERE count > 1 CALL apoc.refactor.mergeNodes(nodelist) YIELD node RETURN node')消除專題重復節點,運行結果如下圖所示:
消除“圖形化編程”重復節點,運行結果如下圖所示:
?此時繪制的圖譜如下圖所示:
??2.消除重復關系:如上圖所示圖譜中出現了許多重復關系,因此需要消除。同理在Neo4j上輸入以下語句
# 刪除重復關系graph.run('MATCH (a)-[r:應用于]- >(b) WITH a,b,TAIL (COLLECT(r)) as rr WHERE size(rr)>0 FOREACH (r IN rr | DELETE r)')六、結果展示
總結
以上是生活随笔為你收集整理的Neo4j简单构建知识图谱实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 聊天实录:刘静平谈网管员职业规划与技术
- 下一篇: pdg转pdf与djvu转pdf大法