閆博
黑龍江工商學院,黑龍江 哈爾濱 150001
關鍵詞抽取和句法分析是知識圖譜構建過程的重要組成部分,其準確性直接決定了知識圖譜構建的最終效果。知識圖譜由谷歌在2012年提出,伴隨著人工智能和大數據的飛速發展,已經廣泛應用于智能搜索、自然語言處理、智能問答、個性化推薦等諸多領域[1]。垂直知識圖譜是面向特定領域的知識圖譜,具有較強的專業性,廣泛應用于專業領域問題的解決,關鍵詞抽取是知識圖譜構建的重要環節[2]。目前,關鍵詞抽取的研究中包括:基于TextRank方法并與信息熵、情感分析、邏輯回歸等方法進行算法融合,以及基于TF-IDF(Trem Frequency-Inverse Document Frequency,詞頻-逆文檔頻率)、TopicRank等方法的關鍵詞抽取[3]。此外,依存句法分析也被應用在關鍵詞的抽取、語義角色標注等研究中。
本文采用爬蟲技術對目標網站的C語言課程內容進行采集。使用HanLP自然語言處理軟件中的CRF分詞技術切割文本,借助scikit-learn工具包中的TfidfVectorizer()方法實現TF-IDF算法并抽取關鍵詞,利用HanLP中的parseDependency()方法實現基于神經網絡的依存句法分析器。對關鍵詞和句法分析結果進行融合,最后使用Graphviz繪制圖像。
本研究以全球著名開源代碼庫GitHub中提供的課程項目C-CrashCourse為數據樣本,目標網址為https://github.com/hairrrrr/C-CrashCourse。C-CrashCourse開源項目為C語言初學者提供了從入門到高級的在線學習資源,項目以中文為講解語言,包含了知識點介紹和C語言代碼實例,具體內容模塊劃分為:導航、C語言程序設計—現代方法導讀、C語言初級、C語言進階、C語言陷阱與缺陷、C經典練習題等。本研究以“C語言程序設計—現代方法導讀”包含的24個課程內容為研究案例,使用Python爬蟲代碼庫requests對網頁進行批量采集,使用XPath選擇頁面路徑并進行內容提取,保存到JSON格式文本文件中。
數據采集包含兩個頁面層級,首先獲取主網頁https://github.com/hairrrrr/C-CrashCourse的信息,提取24個課程詳情頁面鏈接,針對詳情頁面進行內容提取并保存。主頁面、詳情頁面的關鍵信息提取規則,如表1所示。

表1 頁面主要信息XPath提取規則
詳情頁面的提取結果使用join()方法進行字符串拼接、使用replace()方法去除掉空白字符,并使用JSON格式存儲。最外層為數組,用來保存24個詳情頁面的信息;第二層為對象,key為詳情頁面名稱,value為頁面詳細信息對象;第三層為頁面文本信息和代碼信息,分別用key為“info”和“value”的對象內容表示。
HanLP是一款主流的人工智能自然語言處理軟件,提供多語言分詞、詞性標注、命名實體識別、關鍵詞提取、文本分類等功能,并支持Java、C++、Python等主流編程語言。HanLP的官方網站https://www.hanlp.com/提供了免費的開源項目、功能文檔,以及種類豐富的語料庫,并支持語料庫的自定義。
本研究使用HanLP提供的條件隨機場(Conditional Random Field,CRF)自然語言處理模型,進行中文分詞、命名實體識別、詞性標注[4]。
中文分詞采用BMES詞位法,即詞首、詞中、詞尾、獨立詞,基本原理如下面公式所示。其中,t代表詞位順序、c代表字序列。

然后將句子進行原子切割,并進行實體標注。采用當前位置的前后n個位置上的詞,確定特征函數,公式如下所示。其中,x為句子,y為實體標注序列。

CRF訓練模型參數wk的公式如下所示。

本研究選擇“9.數組”中“三變長數組(C99)”的文本內容,作為分詞過程的演示案例,將該文本樣例稱為“文本樣本1”。使用HanLP中的CRF分詞技術,獲取分詞結果并保存到JSON格式文件中。在抽取關鍵詞之前,根據nature中詞性的劃分,過濾掉非核心詞匯,保留詞匯的詞性如表2所示。

表2 保留詞性對照表
將過濾后的詞匯,拼接成空格間隔的字符串,用來進行后續的分析操作。
TF-IDF用來評估一個字詞對于一個文件集或一個語料庫中的一份文件重要程度[5]。其核心思想是,如果某個詞或短語在一篇文章中出現的概率高,并且在其他文章中很少出現,則認為此詞或者短語具有很好的類別區分能力,適合用來分類,常用于樸素貝葉斯。TF表示詞頻,計算公式如下所示,其中m表示某個詞語在一篇文章中出現的次數,n表示文章總詞數。

IDF表示逆文檔頻率,計算公式如下所示,其中N為總文檔數量,M為某個詞出現的文檔數量,使用M+1作為分母是為了避免文章未出現該詞導致分母為零的情況發生。該值用來衡量一個詞語的普遍程度。

本研究使用基于Python語言的開源機器學習工具包scikit-learn,借助sklearn.feature_extraction.text.TfidfVectorizer()實現TF-IDF,一共提取了75個詞匯。根據TF-IDF的計算結果從大到小排序,提取前10個詞匯,如表3所示。

表3 基于TF-IDF關鍵詞(前10)
在實際應用過程中,可以結合TextRank等抽取關鍵詞的算法綜合考量關鍵詞的選取,通過多次篩選提高關鍵詞選取質量;只提取權重值高于某個閾值的關鍵詞。此外,可以結合人工篩選和專業知識語料庫,篩選關鍵詞。本研究在使用TFIDF計算后,結合人工篩選的方法進一步提取關鍵詞,最終選取的核心概念詞匯包括:長度、變長數組、變長、數組、程序、函數、靜態、變量、表達式、編譯器、空間、編譯、動態內存、內存、常量等,將該關鍵詞集合定義為“詞匯表1”。
基于神經網絡的依存句法分析,通過分析句子內部的語法關系,將句子內部詞語的序列轉換為圖結構。常用語法關系包括動賓關系、左附加關系、右附加關系、并列關系、定中關系、主謂關系等。
依存語法是常用的語法體系,依存弧連接句子中兩個具有一定語法關系的語句,形成一棵句法依存樹。通過棧構建依存樹,從根節點root開始入棧,然后利用移進(Shift)、左規約(Left-Reduce)、右規約(Right-Reduce)三種狀態,將緩存中存儲的全部詞匯逐個壓入棧中。
神經網絡包括三個層次,輸入層(Softmax layer)、隱含層(Hidden layer)和輸出層(Input layer),模型設計來自Danqi Chen和Christopher D.Manning于2014年發表的論文《A Fast and Accurate Dependency Parser using Neural Networks》[6]。
本研究采用HanLP中的parseDependency()方法實現基于神經網絡的依存句法分析器,分析結果如圖1所示,一共包含262條數據,定義為“數據集1”。

圖1 基于神經網絡的依存句法分析示例1
通過對圖1中的序號進行關聯,可以確定詞匯之間的關系。例如,第9行的詞匯“數組”跟第10行的詞匯“變量”為定中關系。通過獲取每行數據信息的LEMMA、DEPREL、HEAD.LEMMA得到的關聯信息,一共包含262條數據,定義為“數據集2”。
將“數據集2”根據“詞匯表1”進行篩選,去除標點、單獨文字等無效的內容,最終得到53條數據,定義為“數據集3”。提取結果示例如圖2所示。

圖2 基于神經網絡的依存句法分析示例2
采用Graphviz繪圖軟件對依存句法分析器的分析結果進行圖像繪制。首先對“數據集2”的數據進行關系提取和圖像繪制,設置“核心關系”的詞匯為Root結點,并根據LEMMA、DEPREL、HEAD.LEMMA分別設置圖像中的結點詞語、依存關系詞語、依存父節點詞語。
由于繪制結果中包含了樣本段落中的全部信息,例如標點符號、單個文字等無效信息,導致圖片過于復雜,無法從中直接觀察有效的詞語關系。這里基于“詞匯表1”將“數據集2”進行刪減,只保留包含“詞匯表2”中的詞匯信息,然后再使用Graphviz繪制圖像,刪除孤立的結點,繪制圖像的結果如圖3所示。

圖3 依存語法分析結果圖示
根據上述分析結果,進一步采用HanLP中基于神經網絡的依存句法分析器,根據構建的依存語法樹,分析關鍵詞與關鍵詞之間的句法關系。例如,針對“主謂關系”和“動賓關系”提取三元關系,可直接用于構建知識圖譜。
本文針對知識圖譜構建的關鍵步驟進行研究,通過CRF分詞、TF-IDF算法實現關鍵詞的抽取,利用基于神經網絡的依存句法分析器分析關鍵詞之間的關系,然后將抽取的關鍵詞與句法分析結果進行融合,繪制核心關鍵詞的句法分析結果。本研究為知識圖譜的構建提供了一種可行的思路。