閆博
黑龍江工商學(xué)院,黑龍江 哈爾濱 150001
關(guān)鍵詞抽取和句法分析是知識圖譜構(gòu)建過程的重要組成部分,其準確性直接決定了知識圖譜構(gòu)建的最終效果。知識圖譜由谷歌在2012年提出,伴隨著人工智能和大數(shù)據(jù)的飛速發(fā)展,已經(jīng)廣泛應(yīng)用于智能搜索、自然語言處理、智能問答、個性化推薦等諸多領(lǐng)域[1]。垂直知識圖譜是面向特定領(lǐng)域的知識圖譜,具有較強的專業(yè)性,廣泛應(yīng)用于專業(yè)領(lǐng)域問題的解決,關(guān)鍵詞抽取是知識圖譜構(gòu)建的重要環(huán)節(jié)[2]。目前,關(guān)鍵詞抽取的研究中包括:基于TextRank方法并與信息熵、情感分析、邏輯回歸等方法進行算法融合,以及基于TF-IDF(Trem Frequency-Inverse Document Frequency,詞頻-逆文檔頻率)、TopicRank等方法的關(guān)鍵詞抽取[3]。此外,依存句法分析也被應(yīng)用在關(guān)鍵詞的抽取、語義角色標注等研究中。
本文采用爬蟲技術(shù)對目標網(wǎng)站的C語言課程內(nèi)容進行采集。使用HanLP自然語言處理軟件中的CRF分詞技術(shù)切割文本,借助scikit-learn工具包中的TfidfVectorizer()方法實現(xiàn)TF-IDF算法并抽取關(guān)鍵詞,利用HanLP中的parseDependency()方法實現(xiàn)基于神經(jīng)網(wǎng)絡(luò)的依存句法分析器。對關(guān)鍵詞和句法分析結(jié)果進行融合,最后使用Graphviz繪制圖像。
本研究以全球著名開源代碼庫GitHub中提供的課程項目C-CrashCourse為數(shù)據(jù)樣本,目標網(wǎng)址為https://github.com/hairrrrr/C-CrashCourse。C-CrashCourse開源項目為C語言初學(xué)者提供了從入門到高級的在線學(xué)習(xí)資源,項目以中文為講解語言,包含了知識點介紹和C語言代碼實例,具體內(nèi)容模塊劃分為:導(dǎo)航、C語言程序設(shè)計—現(xiàn)代方法導(dǎo)讀、C語言初級、C語言進階、C語言陷阱與缺陷、C經(jīng)典練習(xí)題等。本研究以“C語言程序設(shè)計—現(xiàn)代方法導(dǎo)讀”包含的24個課程內(nèi)容為研究案例,使用Python爬蟲代碼庫requests對網(wǎng)頁進行批量采集,使用XPath選擇頁面路徑并進行內(nèi)容提取,保存到JSON格式文本文件中。
數(shù)據(jù)采集包含兩個頁面層級,首先獲取主網(wǎng)頁https://github.com/hairrrrr/C-CrashCourse的信息,提取24個課程詳情頁面鏈接,針對詳情頁面進行內(nèi)容提取并保存。主頁面、詳情頁面的關(guān)鍵信息提取規(guī)則,如表1所示。
表1 頁面主要信息XPath提取規(guī)則
詳情頁面的提取結(jié)果使用join()方法進行字符串拼接、使用replace()方法去除掉空白字符,并使用JSON格式存儲。最外層為數(shù)組,用來保存24個詳情頁面的信息;第二層為對象,key為詳情頁面名稱,value為頁面詳細信息對象;第三層為頁面文本信息和代碼信息,分別用key為“info”和“value”的對象內(nèi)容表示。
HanLP是一款主流的人工智能自然語言處理軟件,提供多語言分詞、詞性標注、命名實體識別、關(guān)鍵詞提取、文本分類等功能,并支持Java、C++、Python等主流編程語言。HanLP的官方網(wǎng)站https://www.hanlp.com/提供了免費的開源項目、功能文檔,以及種類豐富的語料庫,并支持語料庫的自定義。
本研究使用HanLP提供的條件隨機場(Conditional Random Field,CRF)自然語言處理模型,進行中文分詞、命名實體識別、詞性標注[4]。
中文分詞采用BMES詞位法,即詞首、詞中、詞尾、獨立詞,基本原理如下面公式所示。其中,t代表詞位順序、c代表字序列。
然后將句子進行原子切割,并進行實體標注。采用當前位置的前后n個位置上的詞,確定特征函數(shù),公式如下所示。其中,x為句子,y為實體標注序列。
CRF訓(xùn)練模型參數(shù)wk的公式如下所示。
本研究選擇“9.數(shù)組”中“三變長數(shù)組(C99)”的文本內(nèi)容,作為分詞過程的演示案例,將該文本樣例稱為“文本樣本1”。使用HanLP中的CRF分詞技術(shù),獲取分詞結(jié)果并保存到JSON格式文件中。在抽取關(guān)鍵詞之前,根據(jù)nature中詞性的劃分,過濾掉非核心詞匯,保留詞匯的詞性如表2所示。
表2 保留詞性對照表
將過濾后的詞匯,拼接成空格間隔的字符串,用來進行后續(xù)的分析操作。
TF-IDF用來評估一個字詞對于一個文件集或一個語料庫中的一份文件重要程度[5]。其核心思想是,如果某個詞或短語在一篇文章中出現(xiàn)的概率高,并且在其他文章中很少出現(xiàn),則認為此詞或者短語具有很好的類別區(qū)分能力,適合用來分類,常用于樸素貝葉斯。TF表示詞頻,計算公式如下所示,其中m表示某個詞語在一篇文章中出現(xiàn)的次數(shù),n表示文章總詞數(shù)。
IDF表示逆文檔頻率,計算公式如下所示,其中N為總文檔數(shù)量,M為某個詞出現(xiàn)的文檔數(shù)量,使用M+1作為分母是為了避免文章未出現(xiàn)該詞導(dǎo)致分母為零的情況發(fā)生。該值用來衡量一個詞語的普遍程度。
本研究使用基于Python語言的開源機器學(xué)習(xí)工具包scikit-learn,借助sklearn.feature_extraction.text.TfidfVectorizer()實現(xiàn)TF-IDF,一共提取了75個詞匯。根據(jù)TF-IDF的計算結(jié)果從大到小排序,提取前10個詞匯,如表3所示。
表3 基于TF-IDF關(guān)鍵詞(前10)
在實際應(yīng)用過程中,可以結(jié)合TextRank等抽取關(guān)鍵詞的算法綜合考量關(guān)鍵詞的選取,通過多次篩選提高關(guān)鍵詞選取質(zhì)量;只提取權(quán)重值高于某個閾值的關(guān)鍵詞。此外,可以結(jié)合人工篩選和專業(yè)知識語料庫,篩選關(guān)鍵詞。本研究在使用TFIDF計算后,結(jié)合人工篩選的方法進一步提取關(guān)鍵詞,最終選取的核心概念詞匯包括:長度、變長數(shù)組、變長、數(shù)組、程序、函數(shù)、靜態(tài)、變量、表達式、編譯器、空間、編譯、動態(tài)內(nèi)存、內(nèi)存、常量等,將該關(guān)鍵詞集合定義為“詞匯表1”。
基于神經(jīng)網(wǎng)絡(luò)的依存句法分析,通過分析句子內(nèi)部的語法關(guān)系,將句子內(nèi)部詞語的序列轉(zhuǎn)換為圖結(jié)構(gòu)。常用語法關(guān)系包括動賓關(guān)系、左附加關(guān)系、右附加關(guān)系、并列關(guān)系、定中關(guān)系、主謂關(guān)系等。
依存語法是常用的語法體系,依存弧連接句子中兩個具有一定語法關(guān)系的語句,形成一棵句法依存樹。通過棧構(gòu)建依存樹,從根節(jié)點root開始入棧,然后利用移進(Shift)、左規(guī)約(Left-Reduce)、右規(guī)約(Right-Reduce)三種狀態(tài),將緩存中存儲的全部詞匯逐個壓入棧中。
神經(jīng)網(wǎng)絡(luò)包括三個層次,輸入層(Softmax layer)、隱含層(Hidden layer)和輸出層(Input layer),模型設(shè)計來自Danqi Chen和Christopher D.Manning于2014年發(fā)表的論文《A Fast and Accurate Dependency Parser using Neural Networks》[6]。
本研究采用HanLP中的parseDependency()方法實現(xiàn)基于神經(jīng)網(wǎng)絡(luò)的依存句法分析器,分析結(jié)果如圖1所示,一共包含262條數(shù)據(jù),定義為“數(shù)據(jù)集1”。
圖1 基于神經(jīng)網(wǎng)絡(luò)的依存句法分析示例1
通過對圖1中的序號進行關(guān)聯(lián),可以確定詞匯之間的關(guān)系。例如,第9行的詞匯“數(shù)組”跟第10行的詞匯“變量”為定中關(guān)系。通過獲取每行數(shù)據(jù)信息的LEMMA、DEPREL、HEAD.LEMMA得到的關(guān)聯(lián)信息,一共包含262條數(shù)據(jù),定義為“數(shù)據(jù)集2”。
將“數(shù)據(jù)集2”根據(jù)“詞匯表1”進行篩選,去除標點、單獨文字等無效的內(nèi)容,最終得到53條數(shù)據(jù),定義為“數(shù)據(jù)集3”。提取結(jié)果示例如圖2所示。
圖2 基于神經(jīng)網(wǎng)絡(luò)的依存句法分析示例2
采用Graphviz繪圖軟件對依存句法分析器的分析結(jié)果進行圖像繪制。首先對“數(shù)據(jù)集2”的數(shù)據(jù)進行關(guān)系提取和圖像繪制,設(shè)置“核心關(guān)系”的詞匯為Root結(jié)點,并根據(jù)LEMMA、DEPREL、HEAD.LEMMA分別設(shè)置圖像中的結(jié)點詞語、依存關(guān)系詞語、依存父節(jié)點詞語。
由于繪制結(jié)果中包含了樣本段落中的全部信息,例如標點符號、單個文字等無效信息,導(dǎo)致圖片過于復(fù)雜,無法從中直接觀察有效的詞語關(guān)系。這里基于“詞匯表1”將“數(shù)據(jù)集2”進行刪減,只保留包含“詞匯表2”中的詞匯信息,然后再使用Graphviz繪制圖像,刪除孤立的結(jié)點,繪制圖像的結(jié)果如圖3所示。
圖3 依存語法分析結(jié)果圖示
根據(jù)上述分析結(jié)果,進一步采用HanLP中基于神經(jīng)網(wǎng)絡(luò)的依存句法分析器,根據(jù)構(gòu)建的依存語法樹,分析關(guān)鍵詞與關(guān)鍵詞之間的句法關(guān)系。例如,針對“主謂關(guān)系”和“動賓關(guān)系”提取三元關(guān)系,可直接用于構(gòu)建知識圖譜。
本文針對知識圖譜構(gòu)建的關(guān)鍵步驟進行研究,通過CRF分詞、TF-IDF算法實現(xiàn)關(guān)鍵詞的抽取,利用基于神經(jīng)網(wǎng)絡(luò)的依存句法分析器分析關(guān)鍵詞之間的關(guān)系,然后將抽取的關(guān)鍵詞與句法分析結(jié)果進行融合,繪制核心關(guān)鍵詞的句法分析結(jié)果。本研究為知識圖譜的構(gòu)建提供了一種可行的思路。