NLP——序列标注之命名实体识别
1.概述
序列標注包括自然語言處理中的分詞,詞性標注,命名實體識別,關鍵詞抽取,詞義角色標注等。解決方案是NN模型(神經網絡模型)+CRF
命名實體識別(Named Entity Recognition,簡稱NER)是指識別文本中具有特定意義的實體,主要包括人名、地名、機構名、日期、時間、百分數、貨幣等。這里就需要理解句子的詞性。
詞性是詞匯的語法屬性,是連接詞匯到句法的橋梁,一個詞的詞性與它在句子中的成分密切相關。在傳統語法學中,漢語句子主要分為主語、謂語、賓語、定語、狀語、補語6個成分。詞性分為名詞、動詞、代詞、形容詞、數量詞、副詞等。
例:游泳是一種很好的健身運動
在NLP任務中,中文分詞、詞性標注、組塊標注、淺層語法分析等任務,標記和切分觀察序列都是序列結構,解決此類問題的模型基本是概率圖模型中的序列算法,這一系列問題通常稱為標記序列學習或序列學習。任務的順序是命名實體識別->詞性標注->語義組塊標注。但從算法應用策略的復雜性而言,命名實體識別是最復雜的序列標注任務。
詞性標注常用算法:最大熵
詞性標注常用工具:stanfordNLP
序列標簽分成兩個部分,第一部分是IOB表示法(或BIO表示法),B代表當前詞在一個組塊的開始,I代表在當前詞在一個組塊中,O代表當前詞不在任意一個組塊中。另一個變種,start/end表示法:
- B代表當前詞在一個組塊的開始
- I代表在當前詞在一個組塊內部
- E代表在當前詞在一個組塊終結
- O代表當前詞不在任意一個組塊中
- S代表在當前詞是一個組塊,該組塊只有一個詞
例如:(快遞信息識別)張三18625584663廣東省深圳市南山區學府路東百度國際大廈(P代表人名,T是電話號,A是地址,A1是省,A2是市,A3是區,A2是街道(詳細地址))
| 文本 | 符號 |
| 張三 | P |
| 18625584663 | T |
| 廣東省 | A1 |
| 深圳市 | A2 |
| 南山區 | A3 |
| 學府路東百度國際大廈 | A4 |
用BIO表示法:
從語言分析的全過程來看,命名實體識別屬于中文分詞中未登錄詞識別的范疇,也是信息抽取、信息檢索、機器翻譯、問答系統等多種自然語言處理技術必不可少的組成部分。
2.相關算法
2.1 概率圖模型
概率圖模型分為貝葉斯網絡和馬爾科夫網絡,貝葉斯網絡是有向圖結構,馬爾科夫網絡是無向圖結構。概率無向圖模型又稱為馬爾科夫隨機場,是無向圖表示的聯合概率分布。
定義:設有聯合概率分布P(Y),由無向圖G=(V,E)表示,在圖G中,結點表示隨機變量,邊表示隨機變量之間的依賴關系。如果聯合概率分布P(Y)滿足成對、局部和全局馬爾科夫性,就成次聯合概率分布為概率無向圖模型。
- 成對:有兩個結點u,v,對應的隨機變量是Yu,Yv,其他結點為Yo,在Yo的條件下隨機變量Yu,Yv是條件獨立
- 局部:有一個結點v,其它與v有邊相連的集合是w,其他結點是o,則在Yw的條件下Yv,Yo是獨立的
- 全局:結點集合A,B在無向圖G中被集合C分開的任意結點集合,則在Yc條件下Ya,Yb條件獨立
2.2 條件隨機場
在條件概率模型P(Y|X)中,Y是輸出變量(表示標記序列),X是輸入變量(需要標注的序列),學習時,通過極大似然估計得出條件概率模型,預測時,對于給定的輸入序列x,求出條件概率最大的輸出序列y。
CRF定義:設X和Y是隨機變量,P(Y|X)是給定X的條件下Y的條件概率分布,若隨機變量Y構成了一個由無向圖G=(V,E)表示的馬爾科夫隨機場,即
是除v以外的其他結點,在無向圖中與v有邊連接的所有結點w。稱P(Y|X)為條件隨機場。
linear chain CRF定義:設X,Y是線性鏈表示的隨機變量序列,在X的條件下,Y的條件概率分布構成條件隨機場,即滿足馬爾科夫性
序列標注任務除了長句子以外,還有標簽之間的依賴性需要關注。與簡單的分類任務不同,命名實體識別是需要獲取標簽之間的依賴關系,例如張三(P-B,P-I)是人名,且張和三存在依賴關系。
如下圖,CRF是屬于概率圖模型,綠點是輸入(GRU的輸出),紅點是輸出,點和點之間的邊分為兩類,一類是x和y之間的連線,表示其相關性,另一類是相鄰y之間的相關性。
?
3.算法包
3.1 詞性標注和NER
#詞性標注 import nltk pos = nltk.word_tokenize(text) pos_ = nltk.pos_tag(pos) for i in pos_:print(''.join(i)) pos__ = nltk.ne_chunk(pos_, binary=True) for j in pos_:print(''.join(j))3.2 CRF
在paddlenlp中,實現線性鏈條件隨機場。
4.實現(快遞單信息提取)
(1)讀取數據,并將數據轉換成paddle可以接受的模型數據
from paddle.utils.download import get_path_from_url URL = "https://paddlenlp.bj.bcebos.com/paddlenlp/datasets/waybill.tar.gz" get_path_from_url(URL,"./")for i, line in enumerate(open('data/train.txt')):if 0 < i < 5:print ('%d: ' % i, line.split()[0])print (' ', line.split()[1])數據集格式:
(2)轉換paddle數據集格式
- 定義trans_func(),直接用map映射,或者是在dataLoader時作為函數傳入。
直接map映射,對數據執行convert_example函數里邊的操作。
?
通過partial操作,partial除了函數外,還需指定函數中的參數(tokenizer,max_seq_length),此處函數只做對比,僅參考。
最終將數據轉換成有特征和標簽的train、dev數據,或只有特征的test數據,快遞單信息識別是獲取到了快遞單信息詞向量列表(token_ids),詞向量長度(len(token_ids)),標簽列表(label_ids)。
- 定義dataLoader
對數據進行轉換,相關函數有Pad(對數據進行填充),Stack(對數據進行堆疊),Tuple,對上述過程的2個特征信息,1個標簽信息進行轉換。
還可以進行隨機采樣,這里有兩種采樣方式,在CPU中,使用paddle.io.BatchSampler,在GPU中,使用paddle.io.DistributedBatchSampler。
if?mode?==?'train'?and?use_gpu:sampler?=?paddle.io.DistributedBatchSampler(dataset=dataset,?batch_size=batch_size,?shuffle=True) else:shuffle?=?True?if?mode?==?'train'?else?Falsesampler?=?paddle.io.BatchSampler(dataset=dataset,?batch_size=batch_size,?shuffle=shuffle)然后轉換成DataLoader。
?dataloader?=?paddle.io.DataLoader(dataset,batch_sampler=sampler, #隨機采用return_list=True,collate_fn=batchify_fn #數據轉換)(3)定義模型(包括模型定義、模型優化、損失函數計算等)
此處選擇的模型是Bi-GRU+CRF,其中GRU的輸出是CRF的輸入。
模型其他參數:
ChunkEvaLluator函數是集成了precision、recall和f1的評價指標,常用于序列標記任務。
模型訓練、預測、評估不做講述!!!
具體代碼實現:https://aistudio.baidu.com/aistudio/projectdetail/2042911
總結
以上是生活随笔為你收集整理的NLP——序列标注之命名实体识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php ip2long bug,php
- 下一篇: matlab 离散系统稳定性,基于LMI