HanLP《自然語言處理入門》筆記--3.二元語法與中文分詞

筆記轉(zhuǎn)載于GitHub項(xiàng)目https://github.com/NLP-LOVE/Introduction-NLP

3. 二元語法與中文分詞

上一章中我們實(shí)現(xiàn)了塊兒不準(zhǔn)的詞典分詞,詞典分詞無法消歧。給定兩種分詞結(jié)果“商品 和服 務(wù)”以及“商品 和 服務(wù)”,詞典分詞不知道哪種更加合理。

我們?nèi)祟惔_知道第二種更加合理,只因?yàn)槲覀儚男〉酱蠼佑|的都是第二種分詞,出現(xiàn)的次數(shù)多,所以我們判定第二種是正確地選擇。這就是利用了統(tǒng)計(jì)自然語言處理。統(tǒng)計(jì)自然語言處理的核心話題之一,就是如何利用統(tǒng)計(jì)手法對語言建模,這一章講的就是二元語法的統(tǒng)計(jì)語言模型。

3.1 語言模型

  1. 什么是語言模型

    模型指的是對事物的數(shù)學(xué)抽象,那么語言模型指的就是對語言現(xiàn)象的數(shù)學(xué)抽象。準(zhǔn)確的講,給定一個句子 w,語言模型就是計(jì)算句子的出現(xiàn)概率 p(w) 的模型,而統(tǒng)計(jì)的對象就是人工標(biāo)注而成的語料庫。

    假設(shè)構(gòu)建如下的小型語料庫:

    商品 和 服務(wù)
    商品 和服 物美價廉
    服務(wù) 和 貨幣
    

    每個句子出現(xiàn)的概率都是 1/3,這就是語言模型。然而 p(w) 的計(jì)算非常難:句子數(shù)量無窮無盡,無法枚舉。即便是大型語料庫,也只能“枚舉”有限的數(shù)百萬個句子。實(shí)際遇到的句子大部分都在語料庫之外,意味著它們的概率都被當(dāng)作0,這種現(xiàn)象被稱為數(shù)據(jù)稀疏

句子幾乎不重復(fù),單詞卻一直在重復(fù)使用,于是我們把句子表示為單詞列表 w=w_1w_2...w_k ,每個 w_t,t\in[1,k] 都是一個單詞,然后定義語言模型:
\begin{aligned} p(\boldsymbol{w}) &=p\left(w_{1} w_{2} \cdots w_{k}\right) \\ &=p\left(w_{1} | w_{0}\right) \times p\left(w_{2} | w_{0} w_{1}\right) \times \cdots \times p\left(w_{k+1} | w_{0} w_{1} w_{2} \dots w_{k}\right) \\ &=\prod_{t=1}^{k+1} p\left(w_{t} | w_{0} w_{1} \cdots w_{t-1}\right) \end{aligned}
其中,w_0=BOS (Begin Of Sentence,有時用<s>),w_{k+1}=EOS (End Of Sentence,有時也用</s>),是用來標(biāo)記句子收尾的兩個特殊“單詞”,在NLP領(lǐng)域的文獻(xiàn)和代碼中經(jīng)常出現(xiàn)。

然而隨著句子長度的增大,語言模型會遇到如下兩個問題。

  • 數(shù)據(jù)稀疏,指的是長度越大的句子越難出現(xiàn),可能統(tǒng)計(jì)不到頻次,導(dǎo)致 p(w_k|w_1w_2...w_{k-1})=0,比如 p(商品 和 貨幣)=0。
  • 計(jì)算代價大,k 越大,需要存儲的 p 就越多,即便用上字典樹索引,依然代價不菲。
  1. 馬爾可夫鏈與二元語法

    為了解決以上兩個問題,需要使用馬爾可夫假設(shè)來簡化語言模型,給定時間線上有一串事件順序發(fā)生,假設(shè)每個事件的發(fā)生概率只取決于前一個事件,那么這串事件構(gòu)成的因果鏈被稱作馬爾可夫鏈。

    在語言模型中,第 t 個事件指的是 w_t 作為第 t 個單詞出現(xiàn)。也就是說,每個單詞出現(xiàn)的概率只取決于前一個單詞:

    p(w_t|w_0w_1...w_{t-1})=p(w_t|w_{t-1})

基于此假設(shè),式子一下子變短了不少,此時的語言模型稱為二元語法模型
\begin{aligned} p(\boldsymbol{w}) &=p\left(w_{1} w_{2} \cdots w_{k}\right) \\ &=p\left(w_{1} | w_{0}\right) \times p\left(w_{2} | w_{1}\right) \times \cdots \times p\left(w_{k+1} | w_{k}\right) \\ &=\prod_{t=1}^{k+1} p\left(w_{t} | w_{t-1}\right) \end{aligned}
由于語料庫中二元連續(xù)的重復(fù)程度要高于整個句子的重要程度,所以緩解了數(shù)據(jù)稀疏的問題,另外二元連續(xù)的總數(shù)量遠(yuǎn)遠(yuǎn)小于句子的數(shù)量,存儲和查詢也得到了解決。

  1. n元語法

    利用類似的思路,可以得到n元語法的定義:每個單詞的概率僅取決于該單詞之前的 n 個單詞:
    p(w)=\prod_{t=1}^{k+n-1} p\left(w_{t} | w_{t-n+1} \dots w_{t-1}\right)
    特別地,當(dāng) n=1 時的 n 元語法稱為一元語法 ( unigram);當(dāng) n=3 時的 n 元語法稱為三元語法(tigam); n≥4時數(shù)據(jù)稀疏和計(jì)算代價又變得顯著起來,實(shí)際工程中幾乎不使用。

  1. 數(shù)據(jù)稀疏與平滑策略

    對于 n 元語法模型,n 越大,數(shù)據(jù)稀疏問題越嚴(yán)峻。比如上述語料庫中“商品 貨幣”的頻次就為0。一個自然而然的解決方案就是利用低階 n 元語法平滑高階 n 元語法,所謂平滑,就是字面上的意思:使 n 元語法頻次的折線平滑為曲線。最簡單的一種是線性插值法:
    p\left(w_{t} | w_{t-1}\right)=\lambda p_{\mathrm{ML}}\left(w_{t} | w_{t-1}\right)+(1-\lambda) p\left(w_{t}\right)
    其中,\lambda\in(0,1) 為常數(shù)平滑因子。通俗理解,線性插值就是劫富濟(jì)貧的稅賦制度,其中的 λ 就是個人所得稅的稅率。p_{ML}(w_t|w_{t-1}) 是稅前所得,p(w_t) 是社會福利。 通過繳稅,高收人(高概率)二元語法的一部分收人 (概率)被移動到社會福利中。而零收入(語料庫統(tǒng)計(jì)不到頻次)的一元語法能夠從社會福利中取得點(diǎn)低保金, 不至于餓死。低保金的額度與二元語法掙錢潛力成正比:二元語法中第二個詞詞頻越高,它未來被統(tǒng)計(jì)到的概率也應(yīng)該越高,因此它應(yīng)該多拿一點(diǎn)。

    類似地,一元語法也可以通過線性插值來平滑:
    p\left(w_{t}\right)=\lambda p_{\mathrm{ML}}\left(w_{t}\right)+(1-\lambda) \frac{1}{N}
    其中,N 是語料庫總詞頻。

3.2 中文分詞語料庫

語言模型只是一個函數(shù)的骨架,函數(shù)的參數(shù)需要在語料庫上統(tǒng)計(jì)才能得到。為了滿足實(shí)際工程需要,一個質(zhì)量高、分量足的語料庫必不可少。以下是常用的語料庫:

  • 《人民日報》語料庫 PKU
  • 微軟亞洲研究院語料庫 MSR
  • 香港城市大學(xué) CITYU(繁體)
  • 臺灣中央研究院 AS(繁體)
語料庫 字符數(shù) 詞語種數(shù) 總詞頻 平均詞長
PKU 183萬 6萬 111萬 1.6
MSR 405萬 9萬 237萬 1.7
AS 837萬 14萬 545萬 1.5
CITYU 240萬 7萬 146萬 1.7

一般采用MSR作為分詞語料的首選,有以下原因:

  • 標(biāo)注一致性上MSR要優(yōu)于PKU。
  • 切分顆粒度上MSR要優(yōu)于PKU,MSR的機(jī)構(gòu)名稱不予切分,而PKU拆開。
  • MSR中姓名作為一個整體,更符合習(xí)慣。
  • MSR量級是PKU的兩倍。

3.3 訓(xùn)練與預(yù)測

訓(xùn)練指的是統(tǒng)計(jì)二元語法頻次以及一元語法頻次,有了頻次,通過極大似然估計(jì)以及平滑策略,我們就可以估計(jì)任意句子的概率分布,即得到了語言模型。這里以二元語法為例:

這里我們選用上面自己構(gòu)造的小型語料庫:data/dictionnary/my_cws_corpus.txt

代碼請見:code/ch03/ngram_segment.py

步驟如下:

  • 加載語料庫文件并進(jìn)行詞頻統(tǒng)計(jì)。

  • 對詞頻文件生成詞網(wǎng)

    詞網(wǎng)指的是句子中所有一元語法構(gòu)成的網(wǎng)狀結(jié)構(gòu),是HanLP工程上的概念。比如“商品和服務(wù)”這個句子,我們將句子中所有單詞找出來,起始位置(offset)相同的單詞寫作一行:

    0:[ ]
    1:[商品]
    2:[]
    3:[和,和服]
    4:[服務(wù)]
    5:[務(wù)]
    6:[ ]
    

    其中收尾(行0和行6)分別對應(yīng)起始和末尾。詞網(wǎng)必須保證從起點(diǎn)出發(fā)的所有路徑都會連通到鐘點(diǎn)房。

    詞網(wǎng)有一個極佳的性質(zhì):那就是第 i 行的詞語 w 與第 i+len(w) 行的所有詞語相連都能構(gòu)成二元語法。

    image
  • 詞圖上的維特比算法

    上述詞圖每條邊以二元語法的概率作為距離,那么中文分詞任務(wù)轉(zhuǎn)換為有向無環(huán)圖上的最長路徑問題。再通過將浮點(diǎn)數(shù)乘法轉(zhuǎn)化為負(fù)對數(shù)之間的加法,相應(yīng)的最長路徑轉(zhuǎn)化為負(fù)對數(shù)的最短路徑。使用維特比算法求解。

    這里僅作一下簡述,詳細(xì)過程參考書本第三章。

該模型代碼輸入是句子“貨幣和服務(wù)”,得到結(jié)果如下:

[' ', '貨幣', '和', '服務(wù)', ' ']

結(jié)果正確,可見我們的二元語法模型具備一定的泛化能力。

3.4 HanLP分詞與用戶詞典的集成

詞典往往廉價易得,資源豐富,利用統(tǒng)計(jì)模型的消歧能力,輔以用戶詞典處理新詞,是提高分詞器準(zhǔn)確率的有效方式。HanLP支持 2 檔用戶詞典優(yōu)先級:

  • 低優(yōu)先級:分詞器首先在不考慮用戶詞典的情況下由統(tǒng)計(jì)模型預(yù)測分詞結(jié)果,最后將該結(jié)果按照用戶詞典合并。默認(rèn)低優(yōu)先級。
  • 高優(yōu)先級:分詞器優(yōu)先考慮用戶詞典,但具體實(shí)現(xiàn)由分詞器子類自行決定。

HanLP分詞器簡潔版

from pyhanlp import *

ViterbiSegment = SafeJClass('com.hankcs.hanlp.seg.Viterbi.ViterbiSegment')

segment = ViterbiSegment()
sentence = "社會搖擺簡稱社會搖"
segment.enableCustomDictionary(False)
print("不掛載詞典:", segment.seg(sentence))
CustomDictionary.insert("社會搖", "nz 100")
segment.enableCustomDictionary(True)
print("低優(yōu)先級詞典:", segment.seg(sentence))
segment.enableCustomDictionaryForcing(True)
print("高優(yōu)先級詞典:", segment.seg(sentence))

輸出:

不掛載詞典: [社會/n, 搖擺/v, 簡稱/v, 社會/n, 搖/v]
低優(yōu)先級詞典: [社會/n, 搖擺/v, 簡稱/v, 社會搖/nz]
高優(yōu)先級詞典: [社會搖/nz, 擺/v, 簡稱/v, 社會搖/nz]

可見,用戶詞典的高優(yōu)先級未必是件好事,HanLP中的用戶詞典默認(rèn)低優(yōu)先級,做項(xiàng)目時請讀者在理解上述說明的情況下根據(jù)實(shí)際需求自行開啟高優(yōu)先級。

3.5 二元語法與詞典分詞比較

按照NLP任務(wù)的一般流程,我們已經(jīng)完成了語料標(biāo)注和模型訓(xùn)練,現(xiàn)在來比較一下二元語法和詞典分詞的評測:

算法 P R F1 R(oov) R(IV)
最長匹配 89.41 94.64 91.95 2.58 97.14
二元語法 92.38 96.70 94.49 2.58 99.26

相較于詞典分詞,二元語法在精確度、召回率及IV召回率上全面勝出,最終F1值提高了 2.5%,成績的提高主要受惠于消歧能力的提高。然而 OOV 召回依然是 n 元語法模型的硬傷,我們需要更強(qiáng)大的語言模型。

3.6 GitHub項(xiàng)目

HanLP何晗--《自然語言處理入門》筆記:

https://github.com/NLP-LOVE/Introduction-NLP

項(xiàng)目持續(xù)更新中......

目錄


章節(jié)
第 1 章:新手上路
第 2 章:詞典分詞
第 3 章:二元語法與中文分詞
第 4 章:隱馬爾可夫模型與序列標(biāo)注
第 5 章:感知機(jī)分類與序列標(biāo)注
第 6 章:條件隨機(jī)場與序列標(biāo)注
第 7 章:詞性標(biāo)注
第 8 章:命名實(shí)體識別
第 9 章:信息抽取
第 10 章:文本聚類
第 11 章:文本分類
第 12 章:依存句法分析
第 13 章:深度學(xué)習(xí)與自然語言處理
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容