前往
大廳
主題 達人專欄

[ 知識圖譜 ] 自動網路爬蟲,生成知識圖譜系統 附程式

%%鼠 拒收病婿 | 2024-07-24 21:29:24 | 巴幣 2264 | 人氣 815

前言

這是2年多前做的專題,當時對於AI知識還不夠穩健,若有錯誤還請勘誤。 內容取自我自己的國科會結案報告。
計畫編號111-2813-C-025-023-H

介紹影片:

以前可以live demo,但是網路host死掉了(找不到免費host docker的供應商了....),有錢再搬家。

整套系統只有我一個人做,當初為了他從前端學到後端,從BOW學到LAS,最後再學docker把整個環境般上架,雖然很忙但是滿充實的。

*注 網頁部分的程式碼取用時請標記我。(設計css很累)

先備知識可以看之前的筆記
照慣例還是放上個人網站


主旨

無監督式知識抽取與文本相似度對比技術,並結合自動摘要系統的概念篩選出文章中較關聯的句子,且不同於開放鏈結資料 (Linked Open Data, LOD)庫如YAGO 僅有實體與實體間的關連,導致KG缺少對於實體的描述,本研究基於自然語言處理,除了抽取出實體與關聯,更保留對於實體的描述內容。

系統框架

系統分為「爬蟲模組」與「語意處理模組」兩大部分,其執行流程如下圖:
 

預處理

我們使用Wikipedia為資料來源,其條目內容中相關的關鍵字大多會帶有其他條目的超連結,爬蟲能利用此特性去挖掘出相關的概念與其解釋。再來能用的工具有:Wikipedia API 能負責文本取得工作,其包含檢查單頁是否存在(exists()函式)、取得單頁完整文本(page()函式)、取得該頁所有超連結項目(links參數),或使用beautifulsoup、scrapy 等框架製作本計畫需求規則的爬蟲。
例如,使用Wikipedia API,輸入Python_(programming_language),輸出結果如下:

斷句(Sentence Boundary Disambiguation, SBD)

大多數的NLP工具都會以句子的型態作為輸入,因此需要將完整文本拆成多個句子。SBD的工作是找到句子的開頭與結尾,例如英文中「.」可能是斷句符號,也可以是名稱的縮寫(例如U.S.)。SBD主要是基於規則系統進行判斷。然而SpaCy框架下的預設斷句模組並沒有偵測該句子的主詞是否明確,導致主詞不明確的句子容易產生無意義的節點。因此本研究基於現有斷句框架再多一層判斷,將主詞不明確的句子(如代名詞)接合在上一個主詞明確句子後。
 

回指消解 ( Anaphora Resolution, AR)

回指是當下的指代項與上下文中出現的名詞、短句存在密切的語義關聯,例如辨別句子中的 “he”代表何人。共指則是兩個名詞、短句指向真實世界中同一個本體,例如辨別歐巴馬與美國第44任總統是同一實體。大部分同意AR是CR的一部分。本計畫使用NeuralCoref 套件進行AR處理,其是基於SpaCy的擴充訓練模型集,繼承SpaCy的處理效能,能迅速為句子中的實體與代稱項進行分群,其AR是透過計算相似度判斷是否為共指實體。
 
 

文本後處理

各個句子處理回指消解後,即可明確知道句子中的代名詞所指向的實體為何。在此步驟將代名詞基於規則模式以其所指的實體做替換,例如將「its use of significant indentation.」替換成「Python’s use of significant indentation.」
 

潛在語意分析 (Latent Semantic Analysis , LSA)

LSA 的概念是將各單詞BOW或TF-IDF的值以矩陣型式成現,其矩陣大多為稀疏矩陣,可以透過奇異值分解 (Singular Value Decomposition ,SVD)做降維,但考慮到SVD的計算量,也是有不做降維的案例。
(下圖:各句子間的關聯圖。(左)實際數值、(右)熱圖。)
 

知識抽取

知識抽取包含了實體抽取、關係抽取與屬性抽取。過去有文獻提出的「主詞-動詞-受詞」構句主要依靠詞性做分類,本研究進一步考慮了依存關係等資訊。例如句子「Python is a high-level, general-purpose programming language.」 中包含兩個對 Python 的描述:「 high-level」與「general-purpose programming language」,若單純依照詞性則只會抓到「Python is a high-level」 (因為 level 是名詞),但若考慮依存關係(dep)則會發現high-level 屬修飾語(-MOD),由此可以繼續找它所修飾的詞才能組成完整的名詞片語。最後整理成Noun Chunks。
 
 

合併

對依存規則做修改,最後我們得以將相近的概念做合併:
 
以Python_(programming_language)的 Wikipedia 頁面為出發點,保留率設定 10%,爬蟲深度設定2,得結果如下。可發現主要由Python、Javascript與tcl為中心發散的三叢節點群。
 

附錄

  • NLP處理
 


後記:
之前一直礙於國科會結案前不能公開,等了一段時間終於開放後就忙到沒時間處理了,今天因為得知颱風天連放兩天開始有點焦慮,被問到:「你為甚麼那麼奴?」,才赫然發現自己把所有時間都投入所謂的工作上。但當我有時間時,卻不知道要做什麼,所以才難過、焦慮。

現在想想,除了畫畫和一些小夢想,我現在能做,也想做的,大概就是寫一篇學習筆記吧(洗一篇)。




 
送禮物贊助創作者 !
0
留言

創作回應

%%鼠 拒收病婿
網頁部分
https://github.com/Lontoone/GraphDBwithDocker
2024-07-24 21:31:39
內心的吶喊
大佬
2024-07-24 22:24:56
御安鴨·摸頭害鴨哭
說到語言模型,全世界最機掰的語言就屬中文吧,光是斷句要怎麼餵機器都是個難題。

聽說目前最新的處理方式就是乾脆一字一字餵,讓機器自己在語彙處理時自動分類成一個單字,像是有關聯的字會聚集在一起:加+油、石+油、奶+油之類的。但又引出第二個問題,顯然奶油、加油、石油的字義相差甚遠,單純的二維矩陣無法應付,因此只能用三維矩陣,以多一個維度來分類單字的含義。

簡單彙整就是:一維漢字、二維單字、三維字義、四維句意、五維文化。

而五維跟文化有什麼關聯?簡單說,要寫到五維矩陣,機器才會理解星爆氣流斬跟星爆梗是什麼意思。

而這樣一頓操作下來,中文這語言模型硬是比英文多一個維度。
2024-07-29 02:57:00
追蹤 創作集

作者相關創作

相關創作

更多創作