1. 程式人生 > >淺談分詞算法(1)分詞中的基本問題

淺談分詞算法(1)分詞中的基本問題

最短 hub 好的 說明 可能 漢語 等等 http ring

[TOC]

前言

分詞或說切詞是自然語言處理中一個經典且基礎的問題,在平時的工作中也反復的接觸到分詞問題,用到了不同的模型,不同的方法應用在各個領域中,所以想對分詞問題做一個系統的梳理。大多數分詞問題主要是針對類似漢語、韓語、日語等,詞語之間並沒有天然的分割,而像英語等,句子中是帶有天然的分割的。但是英語也會涉及到分詞問題,比如實體識別、詞性標註等內容。而本系列文章更多的是討論漢語中的分詞問題,首先我們從分詞問題的基本出發,之後從傳統的詞典分詞到將分詞轉為序列標註問題的分詞,以及最新的結合深度學習的分詞,基本按照時間順序對分詞模型可能用到的算法模型進行一步步嘗試與介紹,所有代碼我會放在自己的github上:xlturing。

目錄

淺談分詞算法(1)分詞中的基本問題
淺談分詞算法(2)基於詞典的分詞方法
淺談分詞算法(3)基於字的分詞方法(HMM)
淺談分詞算法(4)基於字的分詞方法(CRF)
淺談分詞算法(5)基於字的分詞方法(LSTM)

分詞中的基本問題

簡單的講,漢語自動分詞就是讓計算機在漢語文本中的詞與詞之間自動加上空格或其他邊界標記。分詞中涉及到三個基本問題:分詞規範、歧義切分和未登錄詞的識別。

分詞規範

我們從小學習漢語開始,基本順序就是漢字->詞語->句子->段落->篇章,而其中詞是什麽,什麽是詞語,這個問題看似有些莫名其妙,但是如何界定一個詞語卻是分詞中一個很重要的話題。有關專家的調查表明,在母語為漢語的被試者之間,對漢語文本中出現的詞語的認同率只有大約70%,從計算的嚴格意義上說,自動分詞是一個沒有明確定義的問題[黃昌寧等,2003]。舉個簡單的例子:

“小明看到湖岸上的花草,一株不知名的小花引起了他的註意”

對於這句話中的“湖岸”、“花草”、“不知名”等,不同的詞語界定方式就會出現不一樣的分詞結果,如我們可以切分成以下幾種形式:

  1. “小明/看到/湖岸/上/的/花草/,一株/不知名/的/小花/引起/了/他的/註意”
  2. “小明/看到/湖/岸/上/的/花/草,一株/不/知名/的/小花/引起了/他的/註意”
  3. “小明/看到/湖岸/上的/花/草,一株/不知名的/小花/引起了/他的/註意”

我們可以看出不同的詞語界定方式,可以組合出很多種分詞結果,所以說分詞可以看做是找尋一個沒有明確定義問題的答案。所以當我們在衡量一個分詞模型的好壞時,我們首先需要確定一個統一的標準,即所謂Golden Data,大家所有的模型都在統一的數據集上進行訓練和評測,這樣比較才會具有可參考性。

歧義切分

歧義字段在漢語中是普遍存在的,而歧義字段是漢語切分的一個重要難點。梁南元最早對歧義字段進行了兩種基本的定義:

  • 交集型切分歧義:漢字串AJB稱作交集型切分歧義,如果滿足AJ、JB同時為詞(A、J、B分別為漢字串)。此時漢字串J稱作交集串。如,大學生(大學/學生)、研究生物(研究生/生物)、結合成(結合/合成).
  • 組合型切分歧義:漢字串AB稱作多義組合型切分歧義,如果滿足A、B、AB同時為詞。如,起身(他|站|起|身|來/明天|起身|去北京)、學生會(我在|學生會|幫忙/我的|
    學生|會來|幫忙)

我們可以看出歧義字段給我們的分詞問題帶來了極大的困擾,所以想要正確的做出切分判斷,一定要結合上下文語境,甚至韻律、語氣、重音、停頓等。

未登錄詞識別

未登錄詞,一種是指已有的詞表中沒有收錄的詞,另一種是指訓練語料中未曾出現過的詞。而後一種含義也可以被稱作集外詞,OOV(out of vocabulary),即訓練集以外的詞。通常情況下未登錄詞和OOV是一回事,我們這裏不加以區分。
未登錄詞大體可以分為如下幾個類型:

  • 新出現的普通詞匯,如網絡用語當中層出不窮的新詞,這在我們的分詞系統這種也是一大挑戰,一般對於大規模數據的分詞系統,會專門集成一個新詞發現模塊,用於對新詞進行挖掘發現,經過驗證後加入到詞典當中。
  • 專有名詞,在分詞系統中我們有一個專門的模塊,命名體識別(NER name entity recognize),用於對人名、地名以及組織機構名等單獨進行識別。
  • 專業名詞和研究領域名稱,這個在通用分詞領域出現的情況比較少,如果出現特殊的新領域,專業,就會隨之產生一批新的詞匯。
  • 其他專用名詞,包含其他新產生的產品名、電影、書籍等等。

經過統計漢語分詞出現問題更多是由於未登錄詞造成的,那麽分詞模型對於未登錄詞的處理將是衡量一個系統好壞的重要指標。

常用的漢語分詞方法

基於詞典的分詞方法

基於詞典的方法是經典的傳統分詞方法,這種方式很直觀,我們從大規模的訓練語料中提取分詞詞庫,並同時將詞語的詞頻統計出來,我們可以通過逆向最大匹配、N-最短路徑以及N-Gram模型等分詞方法對句子進行切分。基於詞典的分詞方法非常直觀,我們可以很容易的通過增減詞典來調整最終的分詞效果,比如當我們發現某個新出現的名詞無法被正確切分的時候,我們可以直接在詞典當中進行添加,以達到正確切分的目的;同樣的過於依賴於詞典也導致這種方法對於未登錄詞的處理不是很好,並且當詞典當中的詞出現公共子串的時候,就會出現歧義切分的問題,這需要語料庫足夠的豐富,從而能夠對每個詞的頻率有一個很好的設置。

基於字的分詞方法

不同於基於詞典的分詞方法,需要依賴於一個事先編制好的詞典,通過查詞典的方式作出最後的切分決策;基於字的分詞方法將分詞過程看作是字的分類問題,其認為每個字在構造一個特定詞語時都占據著一個確定的構詞位置(詞位)[1]。這種方法最早由薛念文等人於2002年提出,並在各種分詞大賽上取得了不錯的成績,尤其是對未登錄詞問題的處理,召回率一直很高。
一般情況下,我們認為每個字的詞位有4種情況:B(Begin)、E(End)、M(Middle)、S(Single),那麽我們對於一個句子的切分就可以轉為對句子中每個字打標簽的過程,舉個例子:

  • 自然語言處理/可以/應用/在/諸多/領域。
  • 自B 然M 語M 言M 處M 理E 可B 以E 應B 用E 在S 諸B 多E 領B 域E。

我們對句子中的每個字賦予了一個詞位,即BEMS中的一個標簽,這樣我們就完成了分詞的目的。
基於字的方法將傳統的語言學問題轉換為了一個更加容易建模的序列標註問題,我們可以用最大熵模型為每個字進行標簽分類;也可以利用HMM將其看作一個解碼問題;或者考慮句子間的時序關系,利用判別模型CRF來建模;同樣時下火熱的深度學習中的LSTM也可以用在這裏進行建模。

總結

本篇博文我們先簡單介紹分詞問題本身,其重點和難點是什麽,已經大的方向上用到了哪些方法和模型,後續我們會選取常用的分詞模型進行一一介紹和實現。這裏需要特別說明下的是,本系列文章在介紹的時候是分開單個模型進行介紹的,在實際生產環境中,我們往往會融合多種方法來提高準確率和召回率,比如在github中經常被提及的結巴分詞就融合了n-gram詞典分詞和HMM字分詞,大家具體用到的時候要根據實際環境進行選擇和搭配,必要的時候要對模型進行重train和調整。

如有任何紕漏,歡迎大家指正。

參考文獻

  1. 《統計自然語言處理 第2版》

淺談分詞算法(1)分詞中的基本問題