HMM(隱馬爾科夫模型)是統計模型,它用來描述一個含有隱含未知參數的馬爾可夫過程。其難點是從可觀察的參數中確定該過程的隱含參數,然後利用這些參數來作進一步的分析,例如模式識別。
HMM是自然語言處理中的一個基本模型,用途比較廣泛,如漢語分詞、詞性標註及語音識別等,在NLP中佔有很重要的地位。我們將以一個關於天氣和吃飯的例子來說明HMM模型。
一、簡單的例子:天氣與吃飯
我們假設一天的天氣有晴天和雨天兩種狀態,小明某天吃飯有三種選擇:火鍋、烤串、水餃,而他某天選擇吃哪樣品類受當天的天氣的一定影響。晴天我們稱為A,在晴天小明選擇就餐種類的概率(意願)分別為:1/6,2/3,1/6
雨天我們稱為B,在雨天小明選擇就餐種類的概率(意願)分別為:1/2,1/4,1/4
為了方便,後文我們分別用值1,2,3來代表火鍋、烤串、水餃。
假設第一天,這天是晴天或雨天的概率都是1/2,而且我們將這個概率稱為初始概率。然後小明從三種品類中選擇當天的就餐種類,比如選擇了水餃,我們標註為3。第二天重複同樣的過程,小明仍會選擇一種品類進行就餐,該值總是火鍋、烤串、水餃(1,2,3)中的一個。這樣我們可以得到一串數字(連續就餐10天):3,1,2,2,1,3,3,2,2,1
一般來說,HMM中說到的馬爾可夫鏈其實是指隱含狀態鏈,在這裡就是每一天的天氣狀況構成的序列,即B,B,A,A,B,B,A,B,A,A,隱含狀態(天氣)之間存在轉移概率(transition probability)。在我們這個例子裡,晴天的下一天天氣狀態是晴天、雨天的概率都是0.6和0.4。雨天的下一天狀態是晴天、雨天的轉換概率都是1/2。這樣設定是為了容易說清楚,但是我們其實是可以隨意設定轉移概率的。比如,我們可以這樣定義,雨天后面是晴天的概率是0.6,是雨天的概率是0.4。這樣就是一個新的HMM。
同樣的,儘管可見狀態之間沒有轉移概率,但是隱含狀態和可見狀態之間有一個概率叫做輸出概率(emission probability),既在此隱含狀態下產生該可見狀態的概率。就我們的例子來說,晴天狀態(隱含狀態)下吃火鍋(可見狀態)的輸出概率是1/6。產生其他可見狀態的概率分別是2/3(烤串),1/6(水餃)。我們同樣可以對輸出概率進行其他定義。比如,小王在晴天願意吃火鍋、烤串、水餃的概率分別是1/8,1/8,3/4。
通過上面的例子,我們可以得到一些概念。可見狀態,隱含狀態,轉移概率,輸出概率,初始概率,且可見狀態和隱含狀態,隱含狀態和隱含狀態之間分別具有一定的關係,這些關係我們以相應的概率來表示。通過這些概念,我們在下面就可以定義出我們的HMM模型。
二、HMM五要素:就這些
由上面的例子和概念,我們可以定義出一個HMM模型的基本要素如下:
隱含狀態:事物隱藏的狀態集合,一般是我們要求的,如晴天,雨天可見狀態:事物可被觀察到的集合,一般是我們的輸入,如吃水餃,吃火鍋初始概率:事物初始時處於某一隱含狀態的概率,如某天是晴天的概率轉移概率:事物從某一個隱含狀態轉移到下一個隱含狀態的概率,如晴天后是雨天的概率輸出概率:事物在某一隱含狀態下表現為可見狀態的概率,如晴天吃火鍋的概率一個滿足上述要素的模型,我們便稱之為HMM模型。隱馬爾可夫模型(Hidden Markov Model,HMM)是統計模型,它用來描述一個含有隱含未知參數的馬爾可夫過程。其難點是從可觀察的參數中確定該過程的隱含參數。
由上我們定義出了HMM模型,但是HMM模型可以幹什麼呢?我們這裡舉例說明。
假設我現在知道天氣狀態有幾種(隱含狀態數量),天氣之間轉換的關係(轉移概率),每種天氣和就餐的關係(輸出概率),現在根據小明每天就餐的種類(可見狀態鏈),我想知道每天的天氣是什麼(隱含狀態鏈)。
舉例來說,我知道天氣共有兩種:晴天、下雨。我也知道小明連續十天的就餐種類(3,1,2,2,1,3,3,2,2,1),我不知道每天是哪種天氣,但我想知道這連續十天最有可能的天氣序列。
其實最簡單而暴力的方法就是窮舉所有可能的天氣序列,然後把每個序列對應的概率算出來。然後我們從裡面把對應最大概率的序列挑出來就行了。如果馬爾可夫鏈不長,當然可行。如果長的話,窮舉的數量太大,就很難完成了。 因此,我們引入了解決該問題的新途徑:Viterbi算法,通過它可以明顯地降低求解的複雜度。
三、Viterbi算法:降低負責度
為了解決前面提出的求解天氣序列的問題以及窮舉法的複雜度問題,我們在此引入Viterbi算法,使用貪心算法的思想來降低複雜度。還是以天氣和吃飯的列子來說明。
第一天,小明吃飯:
看到結果為3(水餃)。對應的最大概率天氣序列就是雨天,因為雨天去吃水餃(3)的概率是1/4,高于晴天去吃水餃的概率1/6。
把這個情況拓展,小明連續兩天就餐:
結果為3(水餃),1(火鍋)。這時問題變得複雜起來,我們要計算兩個值,分別是第二天天氣是晴天、雨天的最大概率。顯然,要取到最大概率,第一天天氣必須為雨天。這時,第二天天氣取到晴天的最大概率是:
P2(晴天) = P(雨天) * P(雨天-> 水餃) * P(雨天-> 晴天) * P(晴天-> 火鍋)
= 1/2 * 1/4 * 1/2 * 1/6 = 1/96
同樣的,我們可以計算第二天天氣是雨天的最大概率:
P2(雨天) = P(雨天) * P(雨天-> 水餃) * P(雨天-> 雨天) * P(雨天-> 火鍋)
= 1/2 * 1/4 * 1/2 * 1/2 = 1/32
我們發現,第二天是雨天的概率最大。而使這個概率最大時,第一天天氣為雨天。所以這連續兩天的最大概率天氣序列就是(雨天,雨天)。
繼續拓展,小明連續三天就餐:
同樣,我們計算第三天分別是晴天、雨天的最大概率。我們再次發現,要取到最大概率,第二天天氣必須為雨天。這時,第三天取到晴天的最大概率是:
P3(晴天) = P2(雨天) * P(雨天-> 晴天) * P(晴天-> 烤串)
= 1/32 * 1/2 * 2/3 = 1/96
同上,我們可以計算第三天天氣是雨天時的最大概率:
P3(雨天) = P2(雨天) * P(雨天-> 雨天) * P(雨天-> 烤串)
= 1/32 * 1/2 * 1/4 = 1/256
我們發現,第三天天氣是晴天的概率最大。而使這個概率最大時,第二天天氣為雨天,第一天天氣為雨天。
所以最大概率的天氣序列就是雨天,雨天,晴天。
寫到這裡,大家應該看出點規律了。既然連續三天可以算,那麼連續多少天都可以以此類推。我們發現,我們要求最大概率天氣序列時要做這麼幾件事情。首先,不管序列多長,要從序列長度為1算起,算序列長度為1時取到每個天氣的最大概率。然後,逐漸增加長度,每增加一次長度,重新算一遍在這個長度下最後一個位置取到每個天氣的最大概率。因為上一個長度下的取到每個天氣的最大概率都算過了,重新計算的話其實不難。當我們算到最後一位時,就知道最後一位是哪個天氣的概率最大了。然後,我們要把對應這個最大概率的序列從後往前推出來。如此,我們就可以計算出一個給定的可見狀態序列(就餐種類)對應的隱含狀態序列(天氣狀況)了。
HMM模型不僅可以用於解決上面的反推天氣序列的問題,還可以解決其他問題,如語音識別,詞性標註等,在此我們以詞性標註為例,說明HMM模型在詞性標註上的應用。
四、詞性標註:用武之地
我們首先給出詞性標註的概念:BMES。給定一個字符,它的詞性標記代表的是該字在詞語中的位置,B代表該字是詞語中的起始字,M代表是詞語中的中間字,E代表是詞語中的結束字,S則代表是單字成詞。如「愛狄特」對應的標記分別為「BME」。這裡的{B,M,E,S}的集合就對應於我們前面講過的天氣狀況集合{晴天,雨天},既我們中文分詞的隱含狀態集合。
可見狀態集合就是所有漢字(東南西北你我他…),甚至包括標點符號所組成的集合,對應於我們前面的{火鍋,烤串,水餃}集合。
隱含狀態值也就是我們要求的值,在HMM模型中文分詞中,我們的輸入是一個句子(也就是觀察值序列),輸出是這個句子中每個字的隱含狀態值(詞性標記)。
比如:
輸出的狀態序列為:
根據這個狀態序列我們可以進行切詞:
所以最終分詞結果如下:
這樣當給定一個輸入的句子(觀察值序列),我們總是能夠通過前面講過的HMM模型和Viterbi算法計算出該句子對應的詞性標記序列(隱含狀態序列),進而完成分詞。
通過上面我們知道,HMM可以完成詞性標註的工作,從而進一步對一個給定的語句通過詞性標註對其完成分詞。但上面講的只是一般的句子分詞,當推廣應用到我們的地址分詞時,還需要對HMM模型進行更多的處理,以便達到更好的分詞效果。
五、地址分詞:做的更多一點
在實際的分詞應用中,我們一般是通過觀察序列(輸入的句子)求隱含狀態序列(詞性標記序列),這樣我們通常需要初始概率、轉移概率、輸出概率等矩陣。在實際應用中這些值一般是通過統計經過標記的語料庫獲得。所謂標記是根據詞性將語料庫內的句子人為進行分割。
具體到我們的地址分詞,這些值可以從我們的明文字典(已經分割過,無需再進行人工標記)中統計獲得,通過計算各個字符出現的數量,以及各種詞性的詞相互出現的數量,計算對應的概率。
流程圖如下:
1. 全字符覆蓋
在我們的分詞程序中,顯狀態就是字符,包括漢字,標點符號,英文字母,阿拉伯數字,特殊符號等,為了保證顯狀態對常見字符的全覆蓋進而保證程序的正確性,防止出現「某字符在語料庫中存在但在顯狀態集合中不存在」這種情況,我們需要事先定義一個顯狀態集合,該集合包含GB2312定義的漢字以及所有的英文字母、數字、標點符號和一些特殊符號,程序啟動後加載該字符集合,之後再進行語料庫的統計。
2. 人工標記
語料庫需要通過人工標記之後才能進行統計。人工標記是根據句子內詞的詞性使用分隔符進行人工分詞,如語料庫內有句子「北京愛狄特信息科技有限公司」,我們使用空格進行人工標記,標記後的結果為「北京 愛狄特 信息 科技 有限公司」。這部分需要大量的人工工作,且語料庫需要有足夠大的量才能保證準確率。
3. 初始概率近似
當統計完語料庫後,可能某個詞性標記的統計值為0,這樣其初始概率便為0,如詞性B的字符統計量為0,這不太符合事實,我們需要對這種情況進行修正。當前我們程序中使用加1估計的方式,將這種0值給予一個非常小的值進行近似估計,如1,之後再進行初始概率的計算。
4. 顯狀態概率近似
在統計顯狀態後,可能某個字符在某個詞性標記上的統計量為0,如「北」的詞性E統計量為0,這樣既不符合事實,也會導致Viterbi算法出現問題,因此我們也需要對這種情況進行修正。同樣使用加1估計的方法,計算概率時使用該字符在各個詞性上的真實統計值或修正值除以該詞性標記的總值(真實統計值加修正值),得到一個近似的顯狀態概率矩陣。
5. 分詞效果
我們使用最新的全部街道明文字典進行建模,使用一定量的客戶地址數據進行分詞,抽取一定樣本,得出的結果如下圖:
六、總結
HMM(隱馬爾科夫模型)是一個統計模型,它用來描述一個含有隱含未知參數的馬爾可夫過程。顧名思義,在隱馬爾可夫模型中,狀態發生序列是未知的,只能通過一些觀察得到的另一組狀態發生序列來獲得相關信息。例如,在語音識別中,當然無法直接識別語言,我們實際得到的只是某一個人發出的聲音,而這個聲音是真正的聲音(這裡指人類某種語言的所有語調等信息)通過和聲帶,空氣等信息混合表現得到的。
一個HMM模型是一個五元組,它常被用於求解一些問題,其中一類問題就是:已知了隱含狀態數量,轉移概率,輸出概率,可見狀態鏈,我想知道最可能的隱含狀態鏈。為了簡化求解複雜度,我們常常使用Viterbi算法來解決此類問題。
在實際的應用中,HMM經常被用於語音識別,中文分詞等場景,我們一般使用詞性標註的方式來實現中文分詞,且在真實的程序中,需要對模型做更多的近似平滑處理以及一些其他處理,才能更好地完成分詞工作。
【i分享】
案例-政府招投標網站監測平臺
案例-新華社廣東物流信用平臺
案例-金融行業地址數據服務項目
案例-金融行業-地址數據應用項目
案例-內外部信息整合共享平臺
案例-實時寫字樓價格信息平臺
案例-保險行業動態情報雲平臺
案例-市場產品比價平臺
案例-地址清洗技術支持
…… ……
【八鬥之才原創集】
淺談Docker技術的實際應用
漫談雲計算
淺談廠商在銀行業大數據建設領域的建設能力
淺談銀行零售客戶細分與營銷
軟體設計開發經驗分享
網頁設計參考標準
簡化圖表,凸顯數據價值
談一談架構相關的那些事
淺談java性能優化
NBA球員場上位置的預測分析
微服務—軟體架構又一春
NodeJS作為Web架構中間層的使用
傳統數倉從 Teradata 遷移到 Hadoop平臺實踐
淺談網絡I/O
…… ……
更多信息請查閱www.ideadata.com.cn官方網站
關於IDEADATA
IDEADATA專注於從數據到信息的有效管理與應用,是領先的商業信息服務技術提供商,是數據倉庫及大數據技術和應用的先行實踐者。
公司官網:www.ideadata.com.cn新浪微博:IDEADATA大數據視界微信關注:IDEADATA大數據長按指紋或掃描下面的二維碼可以直接添加: