1. 程式人生 > >自然語言處理1 -- 分詞

自然語言處理1 -- 分詞

1 概述

分詞是自然語言處理的基礎,分詞準確度直接決定了後面的詞性標註、句法分析、詞向量以及文字分析的質量。英文語句使用空格將單詞進行分隔,除了某些特定詞,如how many,New York等外,大部分情況下不需要考慮分詞問題。但中文不同,天然缺少分隔符,需要讀者自行分詞和斷句。故在做中文自然語言處理時,我們需要先進行分詞。

2 中文分詞難點

中文分詞不像英文那樣,天然有空格作為分隔。而且中文詞語組合繁多,分詞很容易產生歧義。因此中文分詞一直以來都是NLP的一個重點,也是一個難點。難點主要集中在分詞標準,切分歧義和未登入詞三部分。

分詞標準

比如人名,有的演算法認為姓和名應該分開,有的認為不應該分開。這需要制定一個相對統一的標準。又例如“花草”,有的人認為是一個詞,有的人認為應該劃分開為兩個詞“花/草”。某種意義上,中文分詞可以說是一個沒有明確定義的問題。

切分歧義

不同的切分結果會有不同的含義,這又包含如下幾種情況

  1. 組合型歧義:分詞粒度不同導致的不同切分結果。比如“中華人民共和國”,粗粒度的分詞結果為“中華人民共和國”,細粒度的分詞結果為“中華/人民/共和國”。這種問題需要根據使用場景來選擇。在文字分類,情感分析等文字分析場景下,粗粒度劃分較好。而在搜尋引擎場景下,為了保證recall,細粒度的劃分則較好。jieba分詞可以根據使用者選擇的模式,輸出粗粒度或者細粒度的分詞結果,十分靈活。
    另外,有時候漢字串AB中,AB A B可以同時成詞,這個時候也容易產生組合型歧義。比如“他/將/來/網商銀行”,“他/將來/想/應聘/網商銀行”。這需要通過整句話來區分。
    組合型歧義描述的是AB A B均可以同時成詞的漢字串,它是可以預測的,故也有專家稱之為“固有型歧義”
  2. 交集型歧義:不同切分結果共用相同的字,前後組合的不同導致不同的切分結果。比如“商務處女幹事”,可以劃分為“商務處/女幹事”,也可以劃分為“商務/處女/幹事”。這也需要通過整句話來區分。交集型歧義前後組合,變化很多,難以預測,故也有專家稱之為“偶發型歧義”。
  3. 真歧義:本身語法或語義沒有問題,即使人工切分也會產生歧義。比如“下雨天留客天天留人不留”,可以劃分為“下雨天/留客天/天留/人不留”,也可以劃分為“下雨天/留客天/天留人不/留”。此時通過整句話還沒法切分,只能通過上下文語境來進行切分。如果是不想留客,則切分為前一個。否則切分為後一個。

有專家統計過,中文文字中的切分歧義出現頻次為1.2次/100漢字,其中交集型歧義和組合型歧義佔比為12:1。而對於真歧義,一般出現的概率不大。

未登入詞

也叫新詞發現,或者生詞,未被詞典收錄的詞。未登入詞分為如下幾種型別

  1. 新出現的詞彙,比如一些網路熱詞,如“超女”“給力”等
  2. 專有名詞,主要是人名 地名 組織機構,比如“南蘇丹”“特朗普” “花唄”“借唄”等。
  3. 專業名詞和研究領域詞語,比如“蘇丹紅” “禽流感”
  4. 其他專有名詞,比如新出現的電影名、產品名、書籍名等。

未登入詞對於分詞精度的影響遠遠超過歧義切分。未登入詞識別難度也很大,主要原因有

  1. 未登入詞增長速度往往比詞典更新速度快很多,因此很難利用更新詞典的方式解決未登入詞問題。不過詞典越大越全,分詞精度也會越高。因此一個大而全的詞典還是相當重要的。
  2. 未登入詞都是由普通詞彙構成,長度不定,也沒有明顯的邊界標誌詞
  3. 未登入詞還有可能與上下文中的其他詞彙構成交集型歧義。
  4. 未登入詞中還有可能夾雜著英語字母等其他符號,這也帶來了很大難度。比如“e租寶”。

對於詞典中不包含的未登入詞,我們無法基於字串匹配來進行識別。此時基於統計的分詞演算法就可以大顯身手了,jieba分詞采用了HMM隱馬爾科夫模型和viterbi演算法來解決未登入詞問題。下一篇文章我們會詳細分析這個演算法過程。

3 中文分詞演算法

當前的分詞演算法主要分為兩類,基於詞典的規則匹配方法,和基於統計的機器學習方法。

基於詞典的分詞演算法

基於詞典的分詞演算法,本質上就是字串匹配。將待匹配的字串基於一定的演算法策略,和一個足夠大的詞典進行字串匹配,如果匹配命中,則可以分詞。根據不同的匹配策略,又分為正向最大匹配法,逆向最大匹配法,雙向匹配分詞,全切分路徑選擇等。

__最大匹配法__主要分為三種:

  1. 正向最大匹配法,從左到右對語句進行匹配,匹配的詞越長越好。比如“商務處女幹事”,劃分為“商務處/女幹事”,而不是“商務/處女/幹事”。這種方式切分會有歧義問題出現,比如“結婚和尚未結婚的同事”,會被劃分為“結婚/和尚/未/結婚/的/同事”。
  2. 逆向最大匹配法,從右到左對語句進行匹配,同樣也是匹配的詞越長越好。比如“他從東經過我家”,劃分為“他/從/東/經過/我家”。這種方式同樣也會有歧義問題,比如“他們昨日本應該回來”,會被劃分為“他們/昨/日本/應該/回來”。
  3. 雙向匹配分詞,則同時採用正向最大匹配和逆向最大匹配,選擇二者分詞結果中詞數較少者。但這種方式同樣會產生歧義問題,比如“他將來上海”,會被劃分為“他/將來/上海”。由此可見,詞數少也不一定劃分就正確。

全切分路徑選擇,將所有可能的切分結果全部列出來,從中選擇最佳的切分路徑。分為兩種選擇方法

  1. n最短路徑方法。將所有的切分結果組成有向無環圖,切詞結果作為節點,詞和詞之間的邊賦予權重,找到權重和最小的路徑即為最終結果。比如可以通過詞頻作為權重,找到一條總詞頻最大的路徑即可認為是最佳路徑。
  2. n元語法模型。同樣採用n最短路徑,只不過路徑構成時會考慮詞的上下文關係。一元表示考慮詞的前後一個詞,二元則表示考慮詞的前後兩個詞。然後根據語料庫的統計結果,找到概率最大的路徑。

基於統計的分詞演算法

基於統計的分詞演算法,本質上是一個序列標註問題。我們將語句中的字,按照他們在詞中的位置進行標註。標註主要有:B(詞開始的一個字),E(詞最後一個字),M(詞中間的字,可能多個),S(一個字表示的詞)。例如“網商銀行是螞蟻金服微貸事業部的最重要產品”,標註後結果為“BMMESBMMEBMMMESBMEBE”,對應的分詞結果為“網商銀行/是/螞蟻金服/微貸事業部/的/最重要/產品”。

我們基於統計分析方法,得到序列標註結果,就可以得到分詞結果了。這類演算法基於機器學習或者現在火熱的深度學習,主要有HMM,CRF,SVM,以及深度學習等。

  1. HMM,隱馬爾科夫模型。隱馬爾科夫模型在機器學習中應用十分廣泛,它包含觀測序列和隱藏序列兩部分。對應到NLP中,我們的語句是觀測序列,而序列標註結果是隱藏序列。任何一個HMM都可以由一個五元組來描述:觀測序列,隱藏序列,隱藏態起始概率,隱藏態之間轉換概率(轉移概率),隱藏態表現為觀測值的概率(發射概率)。其中起始概率,轉移概率和發射概率可以通過大規模語料統計來得到。從隱藏態初始狀態出發,計算下一個隱藏態的概率,並依次計算後面所有的隱藏態轉移概率。我們的序列標註問題就轉化為了求解概率最大的隱藏狀態序列問題。jieba分詞中使用HMM模型來處理未登入詞問題,並利用viterbi演算法來計算觀測序列(語句)最可能的隱藏序列(BEMS標註序列)。
  2. CRF,條件隨機場。也可以描述輸入序列和輸出序列之間關係。只不過它是基於條件概率來描述模型的。詳細的這兒就不展開了。
  3. 深度學習。將語句作為輸入,分詞結果作為標註,可以進行有監督學習。訓練生成模型,從而對未知語句進行預測。

4 分詞質量和效能

中文分詞對於自然語言處理至關重要,評價一個分詞引擎效能的指標主要有分詞準確度和分詞速度兩方面。分詞準確度直接影響後續的詞性標註,句法分析,文字分析等環節。分詞速度則對自然語言處理的實時性影響很大。下圖為幾種常用分詞引擎在準確度和速度方面的對比。

image.png | left | 827x224

image.png | left | 827x231

由上可見,想要做準確度很高的通用型分詞引擎是多麼的困難。如果對準確度要求很高,可以嘗試開發特定領域的分詞引擎。比如專門針對金融領域。同時從圖中可見,作為一款開源的通用型分詞引擎,jieba分詞的準確度和速度都還是不錯的。後面我們會詳細講解jieba分詞的用法及其原理。

5 總結

中文分詞是中文自然語言處理中的一個重要環節,為後面的詞向量編碼,詞性標註,句法分析以及文字分析打下了堅實的基礎。同時,由於中文缺少空格等分隔符,並且漢字間的組合特別多,很容易產生歧義,這些都加大了中文分詞的難度。基於詞典的字串匹配演算法和基於統計的分詞演算法,二者各有優缺點,我們可以考慮結合使用。隨著深度學習的興起,我們可以考慮利用深度學習來進行序列標註和中文分詞。