信息抽取介紹
信息抽取的主要功能是從文本中抽取出特定的事實信息,這些文本可以是結構化、半結構化或非結構化的數據。通常信息抽取利用機器學習、自然語言處理等方法從上述文本中抽取出特定的信息后,保存到結構化的數據庫當中,一邊用戶查詢和使用。路線分為兩條:
1.基於KDD和數據挖掘的方法,主要從結構化、半結構化數據中抽取信息;
2.采用自然語言處理和文本挖掘的方法,從非結構化的開放文本中發現新知識。
信息抽取的任務:
-
-
實體抽取與識別
-
實體消歧
- 關系抽取
-
時間抽取
-
信息抽取關鍵技術
1.實體識別與抽取
(1)實體識別
命名實體識別的主要任務是識別出待處理文本中七類命名實體,分別為人名、機構名、地名、時間、日期、貨幣和百分比。
在這七類當中,時間、日期、貨幣、百分比相對而言其構成具有很明顯的規律,識別起來相對容易,但是剩下的三類由於用字靈活,所以識別難度很大。命名實體的內部構成和外部語言環境具有一些特征,無論何種方法,都在試圖充分發現和利用實體所在的上下文特征和實體的內部特征。
考慮到每一類命名實體都具有不同的特征,不同類別的實體適合用不同的識別模型[,如:
人名:用基於字的模型描述其內部構成
地名和機構名:用基於詞的模型描述
同時利用MEMM、HMM、CRF等序列標注工具計算特征權重。
(2)開放域實體抽取
開放域實體抽取的特點是不限定抽取文本的類別,具有很大的靈活性。
基本思路在於種子詞與目標詞在網頁中具有相同或者類似的上下文(包括網頁結構和上下文)。因此需要首先利用種子詞提取模板,隨后利用模板提取更多同類實體。處理該問題的主流框架為:
- 目前國內有多個開源的中文語言處理工具可供直接調用實現命名實體識別,比如復旦大學研發的fudanNLP,中科院的NLPIR分詞系統(又名ICTCLAS2013)和哈工大的LTP。在這里使用哈工大的LTP,用python調用其封裝成的pyltp的模塊實現命名實體識別。具體安裝配置見官方文檔,可以參考的博客為 點擊這里。
Python使用ltp_test
LTP提供的模型包括:(在ltp_data文件夾)
cws.model 分句模型,單文件
pos.model 詞性標注模型,單文件
ner.model 命名實體識別模型,單文件
parser.model 依存句法分析模型,單文件
srl_data/ 語義角色標注模型,多文件(文件夾srl)
ltp_test是一個整合LTP中各模塊的命令行工具。它完成加載模型,依照指定方法執行分析的功能。
主要參數:線程數、最終步驟、輸入文件路徑、模型路徑、詞典路徑等。
具體可通過CMD運行ltp_test.exe查看。
# -*- coding: utf-8 -*- """ 學習:python執行CMD命令command,可以用&連接多個命令 功能:python調用CMD命令來執行本地LTP功能 """ import os project_path = "d:\\BeTheBest\\LTP" # 項目文件夾目錄 # 可設置ltp_test、(cws、pos、par、ner)_cmdline,但是注意各自能用的參數,沒有的參數請置空"" model_exe = "ltp_test" # 又如cws_cmdline threads_num = " --threads "+str(3) # 更改線程數 last_stage = " --last-stage "+"all" # 最終步驟,可設置ws、pos、ner、dp、srl、all input_path = " --input "+"d:\\myprojects\\LTP\\file\\test.txt" # 輸入文件 seg_lexicon = "" # 分詞用戶詞典 pos_lexicon = "" # 詞性標注用戶詞典 output_path = "D:\\myprojects\\LTP\\result\\out.txt" # 輸出文件 command = "cd "+project_path+" & "+model_exe+threads_num+input_path+last_stage+" > "+output_path os.system(command)
Python使用xxx_cmdline
(1)cws_cmdline :分詞命令行
(2)pos_cmdline :詞性標注命令行
(3)par_cmdline :句法分析命令行
(4)ner_cmdline :命名實體識別命令行
python程序簡單調用(以cws_cmdline為例,其他類似,參數略不同)
# -*- coding: utf-8 -*- """ 功能:LTP本地分詞cws_cmdline,輸入文本需要每行一句。(不能自動分句) """ import os project_path = "d:\\myprojects\\LTP" # 項目文件夾目錄 model_exe = "cws_cmdline" # 分詞模塊,相當於ltp_test的last_stage=ws,但是輸出格式不同 threads_num = " --threads "+str(3) # 更改線程數 input_path = " --input "+"d:\\myprojects\\LTP\\file\\test.txt" # 輸入文件 seg_lexicon = " --segmentor-lexicon "+"D:\\myprojects\\LTP\\file\\seg_lexicon.txt" # 分詞用戶詞典 output_path = "D:\\myprojects\\LTP\\result\\out.txt" # 輸出文件 command = "cd "+project_path+" & "+model_exe+threads_num+input_path+seg_lexicon+" > "+output_path os.system(command)
注意事項
(1)長度限制:為了防止輸入過長句子對穩定性造成影響,限制輸入字數少於1024字,分詞結果少於256詞。
(2)編碼:統一采用UTF-8
使用心得
(1)ltp_test輸出結果只有xml格式;(在線ltp-cloud api調用可以返回多種格式)
(2)ltp_test可以自動分句,遇到新的文本段落時,句子編號重新會從0開始(所以已經分好句的文本,輸出結果中的句子編號都是0)
(3)單獨使用某個功能模塊時,需要事先分好句或者分好詞;(不同分析之間存在的依賴關系)
(4)#、&、+等特殊符號不會影響LTP本地分析;(在線ltp-cloud api調用會有影響);
(5)cws_cmdline分詞模塊輸出結果為plain格式,分詞間隔用的是TAB制表符;
(6)pos_cmdline詞性標注模塊輸出結果為plain格式,結果用TAB制表符分隔;詞與詞性之間以下划線(_)連接。
(7)分詞用戶詞典問題:官方說“可以設置用戶詞典,但是ltp的分詞模塊並非采用詞典匹配的策略,外部詞典以特征方式加入機器學習算法,並不能保證所有的詞都是按照詞典里的方式進行切分。”
例子:“C++”、“互聯網+”這樣的詞,加入詞典還是不能切分出來。
(8)一定要注意編碼問題:用戶詞典也要用UTF-8無BOM格式編碼,如果是UTF-8格式編碼,將導致第一行的詞不能被正確識別(因為存在字節前綴)。
- 條件隨機場(CRF):一種判別式概率模型,是隨機場的一種,常用於標注或分析序列資料,如自然語言文字或是生物序列。簡單是說在NER中應用是,給定一系列的特征去預測每個詞的標簽。
目前的思路是通過深度學習,將數據放入神經網絡,輸出理想結果,即得到特征。最后,將特征放到CRF進行應用。
使用NER,這是一個中文的實體命名識別系統。
使用CRF++
-
基於神經網絡的實體識別和關系抽取聯合學習
1.采用流水線的方法:輸入一個句子,首先進行命名實體識別,然后對識別出來的實體進行兩兩組合,再進行關系分類,最后把存在實體關系的三元組作為輸入。
這種方法容易造成錯誤傳播,忽視兩個子任務之間存在的關系,並且由於對識別出來的實體進行兩兩配對,然后再進行關系分類,那些沒有關系的實體對就會帶來多余信息,提升錯誤率。
2.聯合學習:
輸入一個句子,通過實體識別和關系抽取聯合模型,直接得到有關系的實體三元組。這種可以克服上面流水線方法的缺點,但是可能會有更復雜的結構。
基於神經網絡的聯合學習:
分為兩步:參數共享和標准策略。