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