官术网_书友最值得收藏!

2.3 知識抽取實例

接下來將介紹如何使用Deepdive抽取公司實體間的股權交易關系,即關系抽取。

Deepdive是由斯坦福大學InfoLab實驗室開發的一個開源知識抽取系統。它通過弱監督學習,從非結構化的文本中抽取結構化的關系數據。在使用Deepdive時需要考慮它是否支持中文,因為我們的數據是中文的。一般來說可以修改自然語言處理的model包,使它支持中文,并提供中文教程;也可以下載浙江大學支持中文的Deepdive版本。當學習了如何替換其中的各個模塊后,我們就可以自己定義語言了。我們將參考中文開放知識圖譜(OpenKG.CN)網站支持的中文Deepdive資源,給出知識抽取的實例并進行講解。

2.3.1 Deepdive的安裝和配置

我們首先下載并安裝Deepdive,進行環境配置之后,進行項目框架搭建。

1.下載

目前網絡已經有較多的Deepdive資源,這里使用的數據和工具都來自上面提到的開放資源,鏈接為http://www.openkg.cn/dataset/cn-deepdive,同時它也提供了有關Deepdive安裝以及進行知識抽取的詳細介紹。

2.安裝

我們以Linux環境下安裝Deepdive為例,首先下載.zip格式的壓縮文件并將其解壓。

1)創建一個deepdive文件夾。

2)將下載好的CNdeepdive.zip移動到deepdive文件夾下,并使用zip解壓;解壓后可以看到CNdeepdive文件夾,進入該文件夾有一個install.sh文件。

3)打開install.sh文件,修改第193行xzvf為xvf后,在CNdeepdive目錄下執行(此過程需要聯網)./install.sh。

4)按照提示輸入“1”,然后按回車鍵,Deepdive就會開始安裝;安裝完成后,我們再安裝PostgreSQL,輸入“6”然后按回車鍵執行安裝。

5)安裝自然語言處理的相關組件,可執行./nlp_setup.sh命令。

3.配置環境

安裝完成之后,主目錄會創建一個local文件夾,這時要把文件夾中的bin目錄添加到環境變量Path中。使用文本方式打開~/.bashrc以配置所需環境,可以在命令行中使用vi或者gedit等文本編輯程序;或者在圖形界面打開主目錄后,按快捷鍵Ctrl+H顯示隱藏文件后再編輯。例如,在文件的末尾添加下面的內容:

其中,username要替換成你當前登錄的用戶名。

修改完成后保存并關閉文件。要使我們的修改生效,在終端中輸入:

到這里Deepdive就已經安裝完成了,打開終端執行deepdive命令,我們就可以看到Deepdive的版本信息和命令參數的幫助頁。

4.項目框架搭建

建立自己的項目文件夾transaction,在本地PostgreSQL中為項目建立數據庫,之后在項目文件夾下建立數據庫配置文件:

接下來,在transaction下分別建立輸入數據文件夾input、腳本文件夾udf、用戶配置文件app.ddlog、模型配置文件deepdive.conf,可參照給定的transaction文件夾格式。transaction文件夾是已經建好的項目,后面所需的腳本和數據文件都可以直接復制。Deepdive定義了很多自己的語法規則和自動化腳本,導入數據庫的過程一般為deepdive do db_name指令,用戶通過配置app.ddlog指示數據流。

2.3.2 實驗步驟

在實驗過程中,我們先導入先驗數據,隨后導入待抽取文章,然后使用nlp模塊進行文本處理,生成實體抽取及候選實體,提取特征以供模型構建用。

1.先驗數據導入

我們需要從知識庫中獲取已知具有交易關系的實體對來作為訓練數據。本項目以國泰安數據庫(http://www.gtarsc.com)中公司關系-股權交易模塊中的數據為例。

1)通過匹配有交易的股票-代碼對和代碼-公司對,過濾出存在交易關系的公司對,存入transaction_dbdata.csv中,并將CSV文件放在input文件夾下。

2)在DeepdireTest項目文件夾的用戶配置文件app.ddlog中定義相應的數據表。

3)用命令行生成PostgreSQL數據表。

4)在執行app.ddlog前,如果有改動,需要先執行deepdive compile命令編譯才能生效,對于不依賴于其他表的表格,Deepdive會自動去input文件夾下找到同名CSV文件,在PostgreSQL里建表導入。

5)運行命令時,Deepdive會在當前命令行里生成一個執行計劃文件,和vi語法一樣,審核后使用:wq保存并執行。

2.待抽取文章導入

接下來,我們導入已準備好的待抽取文章。

1)準備待抽取的文章(示例使用了上市公司的公告),命名為articles.csv,并放在input文件夾下。

2)在app.ddlog中建立對應的articles表。

3)執行以下命令,將文章導入PostgreSQL中。

Deepdive可以直接查詢數據庫數據,用查詢語句或者Deepdive SQL語句進行數據庫操作。

4)使用查詢id指令,檢驗導入是否成功(結果可能因數據集更新而變化):

3.用nlp模塊進行文本處理

Deepdive默認采用Standford NLP處理包進行文本處理。輸入文本數據,nlp模塊將以句子為單位,返回每句的分詞、命名實體識別、每個詞的原詞形(Lemma)、詞性(Part Of Speech, POS)和句法分析的結果,為后續特征抽取做好準備。其中,原詞形為英文單詞經過詞形還原(Lemmalization)之后的結果,例如表示復數的cars將還原成car,表示過去時的ate將還原成eat,在進行中文處理時不需要再考慮這些。我們將這些結果存入sentences表中。

1)在app.ddlog文件中定義sentences表,用于存放NLP結果:

2)定義NLP處理的函數nlp_markup。

代碼說明如下。

?聲明一個ddlog函數,這個函數輸入文章的doc_id和content,輸出sentences表需要的字段格式。

?函數udf/nlp_markup.sh調用nlp模塊,這里可以自由發揮。

?nlp_markup.sh的腳本內容見transaction示例代碼中的udf/文件夾,它調用了udf/bazzar/parser下的run.sh實現。

注意,此處需要重新編譯nlp模塊。復制transaction/udf/目錄下的bazzar文件夾到項目DeepdiveTest的udf/中。進入bazzar/parser目錄下,執行編譯命令:

編譯完成后會在target中生成可執行文件。

3)使用如下語法調用nlp_markup函數,從articles表中讀取輸入,并將輸出存放在sentences表中。

4)編譯并執行deepdive compile和deepdive do sentences兩個命令,生成sentences數據表。執行以下命令來查詢并返回sentences表前5句的解析結果:

如果articles表有更新,需要重新執行deepdive redo articles命令或者用deepdive mark todo articles命令來將articles表標記為未執行,這樣在生成sentences表的過程中就會默認更新articles表了。注意,這一步運行會非常慢,可能需要四五個小時。我們可以減少articles表的行數來縮短時間。

4.實體抽取及候選實體對生成

這一步我們要抽取文本中的候選實體(公司),并生成候選實體對。

1)在app.ddlog中定義實體數據表company_mention:

每個實體都是實體數據表中的一列數據,該表同時存儲了實體在句中的起始位置和結束位置。

2)定義實體抽取的函數:

其中,map_company_mention.py腳本會遍歷每個數據庫中的句子,找出連續的、被命名實體識別環節標記為公司(ORG)的序列,再進行其他過濾處理。map_company_mention.py腳本也是一個生成函數,用yield語句返回輸出行。

3)在app.ddlog中調用函數,從sentences表中輸入數據,并將結果輸出到company_mention中,被調用的函數內容如下。

4)最后編譯并執行:

5)下面生成實體對(要預測關系的兩個公司)。在這一步我們將實體表進行笛卡兒積運算,同時按自定義腳本過濾一些不符合形成交易條件的公司。

定義數據表如下:

6)統計每個句子的實體數:

7)定義過濾函數:

8)描述函數的調用:

一些簡單的過濾操作可以直接通過app.ddlog中的數據庫規則執行,比如語句p1_name !=p2_name過濾掉兩個相同實體組成的實體對。

9)編譯并執行以下命令,以生成實體候選表。

5.特征提取

這一步我們抽取候選實體對的文本特征。

1)定義特征表:

這里的feature列是實體對間一系列文本特征的集合。

2)生成feature表需要的輸入為實體對表和文本表,輸入和輸出屬性在app.ddlog中定義如下:

函數調用extract_transaction_features.py來抽取特征。這里調用了Deepdive自帶的ddlib庫,得到各種POS、NER、詞序列的窗口特征。此處也可以自定義特征。

3)對sentences表和mention表進行join操作,將得到的結果輸入函數,輸出到transaction_feature表中。

4)然后編譯生成特征數據庫:

執行如下語句,查看生成結果(結果可能因數據集更新而變化):

現在,我們已經有了想要判定關系的實體對和它們的特征集合。

6.樣本打標簽

這一步,我們希望在候選實體對中標出部分正負樣本,主要思路如下。

?將已知標簽的實體對和候選實體對關聯,得到候選實體的標簽。

?利用清晰的正負樣本區分規則對部分能夠清晰區分的數據標記相應的正負標簽。

1)首先在app.ddlog里定義transaction_label表,存儲標記需要使用的數據:

其中,rule_id代表標記規則的名稱。而label為正負標簽,正值表示正相關,負值表示負相關。絕對值越大,相關性越大。

2)初始化定義,復制transaction_candidate表,將label預先填充為零。

3)將前文數據庫中的數據導入transaction_label表中,將rule_id標記為"from\dbdata"。因為國泰安的數據比較官方,可以設置較高的權重,這里設為3。在app.ddlog中進行如下定義:

4)如果只利用下載的實體對,可能和未知文本中提取的實體對重合度較小,不利于特征參數推導。因此可以通過一些邏輯規則,對未知文本進行預標記。將標記函數supervise()寫在udf/supervise_transaction.py腳本中。

說明:

?輸入候選實體對的關聯文本,并在app.ddlog中定義標記函數;

?標記函數調用udf/supervise_transaction.py腳本,規則名稱和所占的權重定義在該腳本中。

5)調用標記函數,將規則抽到的數據寫入transaction_label表中。

6)不同的規則可能覆蓋了相同的實體對,從而給出不同甚至相反的標簽,所以需要額外建立一張用于建立實體對標簽的表,如transaction_label_resolved表。利用標簽求和,在多條規則和知識庫標記的結果中,為每對實體進行投票,決定最終標簽類別。

7)執行以下命令,得到最終標簽,用于構建實體抽取模型。

2.3.3 模型構建

通過之前的步驟,我們已經得到了所有前期需要準備的數據。下面可以構建模型了。

1.變量表定義

1)定義最終存儲的表格,可以用“?”表示此表是用戶模式下的變量表,即需要推導關系的表。下面代碼預測的是公司間是否存在交易關系。

2)將打標簽的結果(交易關系)輸入到has_transaction表中。

此時變量表中的部分變量的label已知,成了先驗變量。

3)最后編譯執行transaction表:

2.關系概率模型生成

(1)指定特征

將每一對has_transaction中的實體對和特征表連接起來,通過特征的連接,從全局學習這些特征的權重。在app.ddlog中進行如下定義:

(2)指定變量間的依賴性

我們可以指定兩張變量表間遵守的規則,并給予這個規則一定權重。比如c1和c2有交易,可以推出c2和c1也有交易,因此對這條規則可以給予較高權重:

變量表間的依賴性使得Deepdive很好地支持了多關系下的抽取。

(3)編譯并生成最終的概率模型

查看我們預測的公司間交易關系概率(結果可能因數據集更新而發生變化):

至此,我們的交易關系抽取就完成了,在http://deepdive.stanford.edu中能夠查閱到更詳細的內容。

主站蜘蛛池模板: 新巴尔虎右旗| 略阳县| 鸡东县| 鱼台县| 广昌县| 疏附县| 汝阳县| 方城县| 鄂尔多斯市| 醴陵市| 台北县| 内黄县| 财经| 日土县| 江陵县| 沧源| 屯留县| 临邑县| 惠水县| 巴林右旗| 喀喇沁旗| 韶山市| 丰都县| 迭部县| 子长县| 大厂| 津南区| 罗源县| 翼城县| 讷河市| 阳曲县| 明光市| 上犹县| 马鞍山市| 会同县| 乌兰县| 白沙| 绵竹市| 伊川县| 乐安县| 安图县|