一篇文章教你用隱馬爾科夫模型實現中文分詞

2020-12-04 雷鋒網

雷鋒網按:本文作者劉鵬,原文載於作者,雷鋒網已獲授權。個人博客

什麼問題用HMM解決

現實生活中有這樣一類隨機現象,在已知現在情況的條件下,未來時刻的情況只與現在有關,而與遙遠的過去並無直接關係。

比如天氣預測,如果我們知道「晴天,多雲,雨天」之間的轉換概率,那麼如果今天是晴天,我們就可以推斷出明天是各種天氣的概率,接著後天的天氣可以由明天的進行計算。這類問題可以用Markov模型來描述。

markov

進一步,如果我們並不知道今天的天氣屬於什麼狀況,我們只知道今明後三天的水藻的乾燥溼潤狀態,因為水藻的狀態和天氣有關,我們想要通過水藻來推測這三天的真正的天氣會是什麼,這個時候就用HiddenMarkov模型來描述。

hmm

HMM模型的本質是從觀察的參數中獲取隱含的參數信息,並且前後之間的特徵會存在部分的依賴影響。

我們從如何進行中文分詞的角度來理解HMM

根據可觀察狀態的序列找到一個最可能的隱藏狀態序列

中文分詞,就是給一個漢語句子作為輸入,以「BEMS」組成的序列串作為輸出,然後再進行切詞,進而得到輸入句子的劃分。其中,B代表該字是詞語中的起始字,M代表是詞語中的中間字,E代表是詞語中的結束字,S則代表是單字成詞。

例如:給個句子

小明碩士畢業於中國科學院計算所

得到BEMS組成的序列為

BEBEBMEBEBMEBES

因為句尾只可能是E或者S,所以得到切詞方式為

BE/BE/BME/BE/BME/BE/S

進而得到中文句子的切詞方式為

小明/碩士/畢業於/中國/科學院/計算/所

這是個HMM問題,因為你想要得到的是每個字的位置,但是看到的只是這些漢字,需要通過漢字來推出每個字在詞語中的位置,並且每個字屬於什麼狀態還和它之前的字有關。

此時,我們需要根據可觀察狀態的序列找到一個最可能的隱藏狀態序列。

五元組,三類問題,兩個假設

五元組

通過上面的例子,我們可以知道HMM有以下5個要素。

觀測序列-O:小明碩士畢業於中國科學院計算所

狀態序列-S:BEBEBMEBEBMEBES

初始狀態概率向量-π:句子的第一個字屬於{B,E,M,S}這四種狀態的概率

狀態轉移概率矩陣-A:如果前一個字位置是B,那麼後一個字位置為BEMS的概率各是多少

觀測概率矩陣-B:在狀態B的條件下,觀察值為耀的概率,取對數後是-10.460

備註:示例數值是對概率值取對數之後的結果,為了將概率相乘的計算變成對數相加,其中-3.14e+100作為負無窮,也就是對應的概率值是0

三類問題

當通過五元組中某些已知條件來求未知時,就得到HMM的三類問題:

●似然度問題:參數(O,π,A,B)已知的情況下,求(π,A,B)下觀測序列O出現的概率。(Forward-backward算法)

●解碼問題:參數(O,π,A,B)已知的情況下,求解狀態值序列S。(viterbi算法)

●學習問題:參數(O)已知的情況下,求解(π,A,B)。(Baum-Welch算法)

中文分詞這個例子屬於第二個問題,即解碼問題。

我們希望找到s_1,s_2,s_3,...使P(s_1,s_2,s_3,...|o_1,o_2,o_3....)達到最大。

意思是,當我們觀測到語音信號o_1,o_2,o_3,...時,我們要根據這組信號推測出發送的句子s_1,s_2,s_3,....,顯然,我們應該在所有可能的句子中找最有可能性的一個。

兩個假設

利用貝葉斯公式得到:

這裡需要用到兩個假設來進一步簡化上述公式

有限歷史性假設:si只由si-1決定

獨立輸出假設:第i時刻的接收信號oi只由發送信號si決定

有了上面的假設,就可以利用算法Viterbi找出目標概率的最大值。

Viterbi算法

根據動態規劃原理,最優路徑具有這樣的特性:如果最優路徑從結點i_{t}^到終點i_{T}^,那麼這兩點之間的所有可能的部分路徑必須是最優的。

依據這一原理,我們只需從時刻t=1開始,遞推地計算在時刻t狀態為i的各條部分路徑的最大概率,直至得到時刻t=T狀態為i的各條路徑的最大概率P^,最優路徑的終結點i_{T}^也同時得到。之後,為了找出最優路徑的各個結點,從終結點i_{T}^開始,由後向前逐步求得結點i_{T-1}^...,i_{1}^,進而得到最優路徑I^=i_{1}^...,i_{T}^,這就是維特比算法.

舉個慄子:

觀測序列O=(紅,白,紅),想要求狀態序列S。

需要定義兩個變量:

●weight[3][3],行3是狀態數(1,2,3),列3是觀察值個數(紅,白,紅)。意思是,在時刻t狀態為i的所有單個路徑中的概率最大值。

●path[3][3],意思是,在時刻t狀態為i的所有單個路徑中概率最大的那條路徑,它的第t-1個結點是什麼。比如path[0][2]=1,則代表weight[0][2]取到最大時,前一個時刻的狀態是1.

1.初始化

t=1時的紅,分別是在狀態1,2,3的條件下觀察得來的概率計算如下:

此時path的第一列全是0.

2.遞歸

t=2時的白,如果此時是在1的條件下觀察得來的話,先計算此時狀態最可能是由前一時刻的哪個狀態轉換而來的,取這個最大值,再乘以1條件下觀測到白的概率,同時記錄path矩陣:如下圖weight[0][1]=0.028,此值來源於前一時刻狀態是3,所以,

3.終止

在t=3時的最大概率P^=0.0147,相應的最優路徑的終點是i_3^=3.

4.回溯

由最優路徑的終點3開始,向前找到之前時刻的最優點:

在t=2時,因i_3^=3,狀態3的最大概率P=0.0147,來源於狀態3,所以i_2^=3.

在t=1時,因i_2^=3,狀態3的最大概率P=0.042,來源於狀態3,所以i_1^=3.

最後得到最優路徑為I^=(i_{1}^,i_{2}^,i_{3}^)=(3,3,3)

用Viterbi算法求解中文分詞問題

根據上面講的HMM和Viterbi,接下來對中文分詞這個問題,構造五元組並用算法進行求解。

InitStatus:π

TransProbMatrix:A

EmitProbMatrix:B

Viterbi求解

經過這個算法後,會得到兩個矩陣weight和path:

二維數組weight[4][15],4是狀態數(0:B,1:E,2:M,3:S),15是輸入句子的字數。比如weight[0][2]代表狀態B的條件下,出現'碩'這個字的可能性。

二維數組path[4][15],4是狀態數(0:B,1:E,2:M,3:S),15是輸入句子的字數。比如path[0][2]代表weight[0][2]取到最大時,前一個字的狀態,比如path[0][2]=1,則代表weight[0][2]取到最大時,前一個字(也就是明)的狀態是E。記錄前一個字的狀態是為了使用viterbi算法計算完整個weight[4][15]之後,能對輸入句子從右向左地回溯回來,找出對應的狀態序列。

先對weight進行初始化,

使用InitStatus和EmitProbMatrix對weight二維數組進行初始化。

由EmitProbMatrix可以得出

所以可以初始化weight[i][0]的值如下:

注意上式計算的時候是相加而不是相乘,因為之前取過對數的原因。

然後遍歷找到weight每項的最大值,同時記錄了相應的path

//遍歷句子,下標i從1開始是因為剛才初始化的時候已經對0初始化結束了

for(size_ti=1;i<15;i++)

{

//遍歷可能的狀態

for(size_tj=0;j<4;j++)

weight[j][i]=MIN_DOUBLE;

path[j][i]=-1;

//遍歷前一個字可能的狀態

for(size_tk=0;k<4;k++)

doubletmp=weight[k][i-1]+_transProb[k][j]+_emitProb[j][sentence[i]];

if(tmp>weight[j][i])//找出最大的weight[j][i]值

weight[j][i]=tmp;

path[j][i]=k;

}

如此遍歷下來,weight[4][15]和path[4][15]就都計算完畢。

確定邊界條件和路徑回溯

邊界條件如下:

對於每個句子,最後一個字的狀態只可能是E或者S,不可能是M或者B。

所以在本文的例子中我們只需要比較weight[1(E)][14]和weight[3(S)][14]的大小即可。

在本例中:

weight[1][14]=-102.492;

weight[3][14]=-101.632;

所以S>E,也就是對於路徑回溯的起點是path[3][14]。

進行回溯,得到序列

SEBEMBEBEMBEBEB。

再進行倒序,得到

接著進行切詞得到

最終就找到了分詞的方式

HMM還有哪些應用

HMM不只用於中文分詞,如果把S換成句子,O換成語音信號,就變成了語音識別問題,如果把S換成中文,O換成英文,就變成了翻譯問題,如果把S換成文字,O換成圖像,就變成了文字識別問題,此外還有詞性標註等等問題。

對於上述每種問題,只要知道了五元組中的三個參數矩陣,就可以應用Viterbi算法得到結果。

雷鋒網相關文章:

深入NLP———看中文分詞如何影響你的生活點滴|硬創公開課

深度學習將會變革NLP中的中文分詞

相關焦點

  • 「NLP」用於語音識別、分詞的隱馬爾科夫模型HMM
    大家好,今天介紹自然語言處理中經典的隱馬爾科夫模型(HMM)。HMM早期在語音識別、分詞等序列標註問題中有著廣泛的應用。了解HMM的基礎原理以及應用,對於了解NLP處理問題的基本思想和技術發展脈絡有很大的好處。本文會詳細講述HMM的基本概念和原理,並詳細介紹其在分詞中的實際應用。
  • 海量新聞信息處理中的中文分詞算法研究
    我們根據以往的研究積累,針對人民網對於社會化海量新聞的分析需求,有針對性的在文中提出了幾種分詞算法。不僅在原理上做了正確論述,由理論應用到分詞算法上也有詳細描述。通過研究,我們認為基於隱馬爾科夫模型(HMM)的改進模型多重隱馬爾科夫模型(CHMM)在分詞算法上更為出色,更適合為風險評估系統提供服務。 與此同時,結合人民網風險評估系統,我們認為具有預警意義的詞應該是名詞動詞或者形容詞。
  • 中文分詞最佳紀錄刷新,兩大模型分別解決中文分詞及詞性標註問題
    另外,在詞性標註方面,TwASP模型同樣刷新了成績。中文分詞的SOTA中文分詞目的是在中文的字序列中插入分隔符,將其切分為詞。例如,「我喜歡音樂」將被切分為「我/喜歡/音樂」(「/」表示分隔符)。中文語言因其特殊性,在分詞時面臨著兩個主要難點。一是歧義問題,由於中文存在大量歧義,一般的分詞工具在切分句子時可能會出錯。例如,「部分居民生活水平」,其正確的切分應為「部分/居民/生活/水平」,但存在「分居」、「民生」等歧義詞。「他從小學電腦技術」,正確的分詞是:他/從小/學/電腦技術,但也存在「小學」這種歧義詞。
  • 創新工場提出中文分詞和詞性標註模型,性能分別刷新五大數據集
    基於此,創新工場近日公布的兩篇論文各自提出了「鍵-值記憶神經網絡的中文分詞模型」和「基於雙通道注意力機制的分詞及詞性標註模型」,將外部知識(信息)創造性融入分詞及詞性標註模型,有效剔除了分詞「噪音」誤導,大幅度提升了分詞及詞性標註效果。
  • 「八鬥之才」HMM模型在地址分詞中的應用
    HMM(隱馬爾科夫模型)是統計模型,它用來描述一個含有隱含未知參數的馬爾可夫過程。其難點是從可觀察的參數中確定該過程的隱含參數,然後利用這些參數來作進一步的分析,例如模式識別。HMM是自然語言處理中的一個基本模型,用途比較廣泛,如漢語分詞、詞性標註及語音識別等,在NLP中佔有很重要的地位。
  • 有趣的隱馬爾科夫模型
    01 隱馬爾科夫模型簡介隱馬爾科夫模型是關於時序的概率模型,描述由一個隱藏的馬爾科夫鏈隨機生成不可觀測的狀態隨機序列,再由各個狀態生成一個觀測而產生觀測序列的過程02 隱馬爾科夫模型舉例為了讓讀者更直觀地了解馬爾科夫模型,本文將針對經典的盒子與球模型展開分析。
  • 中文分詞新模型幫它進步
    據研究人員介紹,分詞及詞性標註是中文自然語言處理的基本任務,但當前沒有比較好的一體化解決方案,而且中文分詞普遍存在歧義和未登錄詞的難題。基於此,兩篇論文各自提出了鍵-值記憶神經網絡的中文分詞模型和基於雙通道注意力機制的分詞及詞性標註模型,將外部知識(信息)融入分詞及詞性標註模型,剔除了分詞「噪音」誤導,提升了分詞及詞性標註效果。
  • 科學網—幫機器學會中文分詞和詞性標註
    >本報記者 鄭金武 「部分居民生活水平」這樣的中文短語,人們理解起來沒有太大困難。兩篇論文的作者之一、創新工場大灣區人工智慧研究院執行院長宋彥告訴《中國科學報》,對於文本分類、情感分析、文本摘要、機器翻譯等,分詞和詞性標註是不可或缺的基本「元件」。 刷新中文分詞新高度 中文分詞目的是在中文語句的字序列中插入分隔符,將其切分為詞。例如,「我喜歡音樂」,在機器中將被切分為「我/喜歡/音樂」。
  • 簡單有效的多標準中文分詞
    本文介紹一種簡潔優雅的多標準中文分詞方案,可聯合多個不同標準的語料庫訓練單個模型,同時輸出多標準的分詞結果。通過不同語料庫之間的遷移學習提升模型的性能,在10個語料庫上的聯合試驗結果優於絕大部分單獨訓練的模型。模型參數和超參數全部共享,複雜度不隨語料庫種類增長。
  • 創新工場兩篇論文入選ACL 2020,將中文分詞數據刷至新高
    「大聖,你的金箍,棒就棒在,特別配你的髮型。」感謝神奇的中文分詞,給我們帶來了多少樂趣。豐富多變的中文行文,給人的理解造成歧義,也給AI分詞帶來挑戰。跨領域分詞實驗(對話測試集)的結果主動引入和分辨知識,實現中文分詞技術突破中文分詞在中國科研領域已經有幾十年的歷史。最初的中文分詞是基於詞典構建,詞典的好壞會直接影響到最後分析的效果。如果某個新詞在詞典裡沒有,那麼模型是死活都分不出來的。
  • 隱馬爾科夫模型-基本模型與三個基本問題
    這次學習會講了隱馬爾科夫鏈,這是一個特別常見的模型,在自然語言處理中的應用也非常多。常見的應用比如分詞,詞性標註,命名實體識別等問題序列標註問題均可使用隱馬爾科夫模型.隱馬爾可夫模型由初始狀態概率向量π、狀態轉移概率矩陣A和觀測概率矩陣B決定。π和A決定狀態序列,B決定觀測序列。因此,隱馬爾可夫模型可以用三元符號表示,即
  • 創新工場提出中文分詞和詞性標註新模型 可提升工業應用效率
    DoNews7月13日消息(記者 翟繼茹)13日,記者從創新工場獲悉,其最新提出了中文分詞和詞性標註模型,可將外部知識(信息)融入分詞及詞性標註模型,剔除了分詞「噪音」誤導,提升了分詞及詞性標註效果。
  • 中文分詞和詞性標註:為拓展工業場景應用夯基—新聞—科學網
    在7月5日-10日舉行的自然語言處理(NLP)領域頂級學術會議 ACL 2020上,來自創新工場大灣區人工智慧研究院的兩篇入選論文,正是針對中文自然語言處理的類似問題,各自提出了「鍵-值記憶神經網絡的中文分詞模型」和「基於雙通道注意力機制的分詞及詞性標註模型」,將外部知識(信息)創造性融入分詞及詞性標註模型,有效剔除了分詞「噪音」誤導,大幅度提升了分詞及詞性標註效果。
  • 創新工場兩篇論文入選ACL2020 中文分詞和詞性標註新模型性能創新高
    據宋彥介紹,中文分詞和詞性標註是中文自然語言處理的兩個基本任務。近年來,隨著預訓練模型的提出,有一些人提出質疑是否還有必要進行中文分詞的處理,對此我們提出了不同的意見,尤其考慮到詞彙級別的信息依然是中文信息處理最重要的基礎。一個例子就是,雖然BERT大行其道,但是在中文上基於全詞覆蓋 (whole word masking)的預訓練模型比直接使用單字編碼的效果更好。
  • 中文文本分類:你需要了解的10項關鍵內容
    中文文本分類最常用的特徵提取的方法就是分詞。區別於英文天然的存在空格符作為詞與詞之間的間隔標誌,中文文本中詞的提取必須通過基於序列預測等方法的分詞技術來實現。在提取了特徵值之後,再採用One-hot或TF-IDF等方法將每個樣本轉化為固定長度的特徵編碼作為分類算法的輸入。除了分詞,N-gram模型也完全值得你去嘗試。
  • 創新工場兩篇論文入選頂會ACL2020,將中文分詞性能刷出新高度
    兩篇技術論文均聚焦在中文分詞和詞性標註領域,將該領域近年來廣泛使用的各數據集上的分數全部刷至新高,取得的研究突破對於工業界來說有著十分可觀的應用前景。兩篇文章的作者包括華盛頓大學博士研究生、創新工場實習生田元賀,創新工場大灣區人工智慧研究院執行院長宋彥,創新工場科研合伙人張潼,創新工場 CTO 兼人工智慧工程院執行院長王詠剛等人。
  • 每天調用達80億次的小米MiNLP平臺,近期又開源了中文分詞功能
    機器之心報導作者:陳萍近日,小米開源了其自然語言處理平臺 MiNLP 的中文分詞功能,具備分詞效果好、輕量級、詞典可定製、多粒度切分以及調用更便捷等特點。在自然語言處理任務中,除了模型之外,底層的數據處理也是非常重要的。
  • 聯合漢語分詞和依存句法分析的統一模型:當前效果最佳
    因此,本文提出一種基於圖的統一模型來解決這些問題。這種模型將漢語分詞和依存句法分析集成在一個分析模型中。它比以前的聯合模型性能更好,並在漢語分詞和依存句法分析中實現了當前最佳的結果。與英語不同,漢語句子由連續的字符組成,詞語之間缺乏明顯的界限。
  • 【機器學習】隱馬爾可夫模型
    隱馬爾科夫模型是一種時序的概率模型,描述由一個隱的馬爾科夫鏈隨機生成的不可觀察的隱狀態序列,在每一個隱狀態下隨機產生觀察值構成一個可觀測的隨機序列。其中關鍵是狀態序列是滿足馬爾科夫性質的,且可觀測序列是由隱藏的狀態序列以一定的概率隨機生成。在自然語言中文分詞中,由於自然語言是有明顯的上下文關係的,即當前字與其前後出現的字都是有關係的。
  • 一篇文章教你用11行Python代碼實現神經網絡
    聲明:本文是根據英文教程 (用 11 行 Python 代碼實現的神經網絡)學習總結而來,關於更詳細的神經網絡的介紹可以參考我的另一篇博客:。A Neural Network in 11 lines of Python從感知機到人工神經網絡如果你讀懂了下面的文章,你會對神經網絡有更深刻的認識,有任何問題,請多指教。