自然語言處理之序列標注問題


  序列標注問題是自然語言中最常見的問題,在深度學習火起來之前,常見的序列標注問題的解決方案都是借助於HMM模型,最大熵模型,CRF模型。尤其是CRF,是解決序列標注問題的主流方法。隨着深度學習的發展,RNN在序列標注問題中取得了巨大的成果。而且深度學習中的end-to-end,也讓序列標注問題變得更簡單了。

  序列標注問題包括自然語言處理中的分詞,詞性標注,命名實體識別,關鍵詞抽取,詞義角色標注等等。我們只要在做序列標注時給定特定的標簽集合,就可以進行序列標注。

  序列標注問題是NLP中最常見的問題,因為絕大多數NLP問題都可以轉化為序列標注問題,雖然很多NLP任務看上去大不相同,但是如果轉化為序列標注問題后其實面臨的都是同一個問題。所謂“序列標注”,就是說對於一個一維線性輸入序列:

    

  給線性序列中的每個元素打上標簽集合中的某個標簽:

    

  所以,其本質上是對線性序列中每個元素根據上下文內容進行分類的問題。一般情況下,對於NLP任務來說,線性序列就是輸入的文本,往往可以把一個漢字看做線性序列的一個元素,而不同任務其標簽集合代表的含義可能不太相同,但是相同的問題都是:如何根據漢字的上下文給漢字打上一個合適的標簽(無論是分詞,還是詞性標注,或者是命名實體識別,道理都是想通的)。

序列標注問題之中文分詞

  以中文分詞任務來說明序列標注的過程。假設現在輸入句子“跟着TFboys學左手右手一個慢動作”,我們的任務是正確地把這個句子進行分詞。首先,把句子看做是一系列單字組成的線性輸入序列,即:

    

  序列標注的任務就是給每個漢字打上一個標簽,對於分詞任務來說,我們可以定義標簽集合為(jieba分詞中的標簽集合也是這樣的):

    

  其中B代表這個漢字是詞匯的開始字符,M代表這個漢字是詞匯的中間字符,E代表這個漢字是詞匯的結束字符,而S代表單字詞。

    

  有了這四個標簽就可以對中文進行分詞了。這時你看到了,中文分詞轉換為對漢字的序列標注問題,假設我們已經訓練好了序列標注模型,那么分別給每個漢字打上標簽集合中的某個標簽,這就算是分詞結束了,因為這種形式不方便人來查看,所以可以增加一個后處理步驟,把B開頭,后面跟着M的漢字拼接在一起,直到碰見E標簽為止,這樣就等於分出了一個單詞,而打上S標簽的漢字就可以看做是一個單字詞。於是我們的例子就通過序列標注,被分詞成如下形式:

    

  在這里我們可以采用雙向LSTM來處理該類問題,雙向會關注上下文的信息。

  在NLP中最直觀的處理問題的方式就是要把問題轉換為序列標注問題,思考問題的思維方式也就轉換為序列標注思維,這個思維很重要,決定你能否真的處理好NLP問題。

序列標注之命名實體識別(NER)

  我們再來看看命名實體識別問題中的序列標注,命名實體識別任務是識別句子中出現的實體,通常識別人名、地名、機構名這三類實體。現在的問題是:假設輸入中文句子

    

  我們要識別出里面包含的人名、地名和機構名。如果以序列標注的角度看這個問題,我們首先得把輸入序列看成一個個漢字組成的線性序列,然后我們要定義標簽集合,標簽集合如下(在這里的標簽用什么代表不重要,重要的是它代表的含義):  

    

  其中,BA代表這個漢字是地址首字,MA代表這個漢字是地址中間字,EA代表這個漢字是地址的尾字;BO代表這個漢字是機構名的首字,MO代表這個漢字是機構名稱的中間字,EO代表這個漢字是機構名的尾字;BP代表這個漢字是人名首字,MP代表這個漢字是人名中間字,EP代表這個漢字是人名尾字,而O代表這個漢字不屬於命名實體。

    

  有了輸入漢字序列,也有了標簽集合,那么剩下的問題是訓練出一個序列標注ML系統,能夠對每一個漢字進行分類,假設我們已經學好了這個系統,那么就給輸入句子中每個漢字打上標簽集合中的標簽,於是命名實體就被識別出來了,為了便於人查看,增加一個后處理步驟,把人名、地名、機構名都明確標識出來即可。

  除了上面的分詞和命名實體標注,很多其他的NLP問題同樣可以轉換為序列標注問題,比如詞性標注、CHUNK識別、句法分析、語義角色識別、關鍵詞抽取等。

  傳統解決序列標注問題的方法包括HMM/MaxEnt/CRF等,很明顯RNN很快會取代CRF的主流地位,成為解決序列標注問題的標准解決方案,那么如果使用RNN來解決各種NLP基礎及應用問題,我們又該如何處理呢,下面我們就歸納一下使用RNN解決序列標注問題的一般優化思路。

  對於分詞、詞性標注(POS)、命名實體識別(NER)這種前后依賴不會太遠的問題,可以用RNN或者BiRNN處理就可以了。而對於具有長依賴的問題,可以使用LSTM、RLSTM、GRU等來處理。關於GRU和LSTM兩者的性能差不多,不過對於樣本數量較少時,有限考慮使用GRU(模型結構較LSTM更簡單)。此外神經網絡在訓練的過程中容易過擬合,可以在訓練過程中加入Dropout或者L1/L2正則來避免過擬合。

CRF和LSTM在序列標注上的優劣

  LSTM:像RNN、LSTM、BILSTM這些模型,它們在序列建模上很強大,它們能夠capture長遠的上下文信息,此外還具備神經網絡擬合非線性的能力,這些都是crf無法超越的地方,對於t時刻來說,輸出層yt受到隱層ht(包含上下文信息)和輸入層xt(當前的輸入)的影響,但是yt和其他時刻的yt`是相互獨立的,感覺像是一種point wise,對當前t時刻來說,我們希望找到一個概率最大的yt,但其他時刻的yt`對當前yt沒有影響,如果yt之間存在較強的依賴關系的話(例如,形容詞后面一般接名詞,存在一定的約束),LSTM無法對這些約束進行建模,LSTM模型的性能將受到限制。

  CRF:它不像LSTM等模型,能夠考慮長遠的上下文信息,它更多考慮的是整個句子的局部特征的線性加權組合(通過特征模版去掃描整個句子)。關鍵的一點是,CRF的模型為p(y | x, w),注意這里y和x都是序列,它有點像list wise,優化的是一個序列y = (y1, y2, …, yn),而不是某個時刻的yt,即找到一個概率最高的序列y = (y1, y2, …, yn)使得p(y1, y2, …, yn| x, w)最高,它計算的是一種聯合概率,優化的是整個序列(最終目標),而不是將每個時刻的最優拼接起來,在這一點上CRF要優於LSTM。

  HMM:CRF不管是在實踐還是理論上都要優於HMM,HMM模型的參數主要是“初始的狀態分布”,“狀態之間的概率轉移矩陣”,“狀態到觀測的概率轉移矩陣”,這些信息在CRF中都可以有,例如:在特征模版中考慮h(y1), f(yi-1, yi), g(yi, xi)等特征。

   CRF與LSTM:從數據規模來說,在數據規模較小時,CRF的試驗效果要略優於BILSTM,當數據規模較大時,BILSTM的效果應該會超過CRF。從場景來說,如果需要識別的任務不需要太依賴長久的信息,此時RNN等模型只會增加額外的復雜度,此時可以考慮類似科大訊飛 FSMN(一種基於窗口考慮上下文信息的“前饋”網絡)。
   CNN+BILSTM+CRF:這是目前學術界比較流行的做法,BILSTM+CRF是為了結合以上兩個模型的優點,CNN主要是處理英文的情況,英文單詞是由更細粒度的字母組成,這些字母潛藏着一些特征(例如:前綴后綴特征),通過CNN的卷積操作提取這些特征,在中文中可能並不適用(中文單字無法分解,除非是基於分詞后),這里簡單舉一個例子,例如詞性標注場景,單詞football與basketball被標為名詞的概率較高, 這里后綴ball就是類似這種特征。
 

 參考文章:

  使用RNN解決NLP中序列標注問題的通用優化思路

  使用深度學習進行中文自然語言處理之序列標注

  CRF和LSTM 模型在序列標注上的優劣?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM