今天是大年三十兒,祝各位簡友新春快樂,心想事成,萬事如意!今天也繼續來學一波nlp技術。
HMM 和 CRF
常被用于分詞、句法分析、命名實體識別、詞性標注等
HMM是一個生成模型
? 使用隱含變量生成可觀測狀態
? 生成式模型
? 估計的是聯合概率分布
? 由聯合概率密度分布求出條件概率分布
? 生成模型公式為:P(Y|X)= P(X,Y)/ P(X)
? 關心的是給定輸入 X 產生輸出 Y 的生成關系P(Y|X)
? 其他常見的生成式模型有:Gaussian、 Naive Bayes、Mixtures of multinomials 等
CRF是一個判別模型
? 判別式模型
? 估計的是條件概率分布, P(Y|X)
? 由數據直接學習條件概率分布 P(Y|X)
? 關心的是對于給定的輸入 X,應該預測什么樣的輸出 Y
? 其他常見的判別式模型有:K 近鄰法、感知機、決策樹、邏輯斯諦回歸模型、最大熵模型、支持向量機、提升方法等。
HMM 的“五元組”
? StatusSet:狀態值集合
? 在分詞任務中狀態值集合為 (B, M, E, S),每個狀態代表的是該字在詞語中的位置,其中 B 為詞的首個字,M 為詞中間的字,E 為詞語中最后一個字,S 為單個字
? ObservedSet:觀察值集合
? 即所有語料的漢字,包括標點符號
? TransProbMatrix:轉移概率矩陣
? 就是從狀態 X 轉移到狀態 Y 的概率,是一個4×4的矩陣,即 {B,E,M,S}×{B,E,M,S}
? EmitProbMatrix:發射概率矩陣
? 矩陣的每個元素都是一個條件概率,代表 P(Observed[i]|Status[j]) 概率
? InitStatus:初始狀態分布
? 表示句子的第一個字屬于 {B,E,M,S} 這四種狀態的概率。
基于 HMM 的中文分詞器
? 在分詞上,要做的是:已知 參數(ObservedSet、TransProbMatrix、EmitRobMatrix、InitStatus),求解狀態值序列
? 解決這個問題的最有名的方法是 Viterbi 算法
? 一般流程為:
? 語料準備
? ? 爬取文本,用空格隔開
? 定義 HMM 中的狀態,初始化概率,以及中文停頓詞
? 將 HMM 模型封裝為獨立的類 HMM_Model
? ? ? ? class HMM_Model:
? ? ? ? def __init__(self):
? ? ? ? ? ? pass
? ? ? ? #初始化? ?
? ? ? ? def setup(self):
? ? ? ? ? ? pass
? ? ? ? #模型保存?
? ? ? ? def save(self, filename, code):
? ? ? ? ? ? pass
? ? ? ? #模型加載
? ? ? ? def load(self, filename, code):
? ? ? ? ? ? pass
? ? ? ? #模型訓練
? ? ? ? def do_train(self, observes, states):
? ? ? ? ? ? pass
? ? ? ? #HMM計算
? ? ? ? def get_prob(self):
? ? ? ? ? ? pass
? ? ? ? #模型預測
? ? ? ? def do_predict(self, sequence):
? ? ? ? ? ? pass
? ? __init__()
? ? 定義了數據結構和初始變量
? ? setup()
? ? 初始化第一個方法中的數據結構
? ? save()
? ? 用來保存訓練好的模型
? ? load()
? ? 用來加載模型
? ? do_train()
? ? 用來訓練模型
? ? 訓練函數輸入觀測序列和狀態序列進行訓練, 依次更新各矩陣數據
? ? get_prob()
? ? 在進行預測前,需將數據結構的頻數轉換為頻率
? ? do_predict()
? ? 預測采用 Viterbi 算法求得最優路徑
? ? get_tags函數
? ? 對輸入的訓練語料中的每個詞進行標注
? ? cut_sent函數
? ? 根據預測得到的標注序列將輸入的句子分割為詞語列表
? 定義分詞器類 HMMSoyoger
? ? ? ? class HMMSoyoger(HMM_Model):
? ? ? ? def __init__(self, *args, **kwargs):
? ? ? ? ? ? pass
? ? ? ? #加載訓練數據
? ? ? ? def read_txt(self, filename):
? ? ? ? ? ? pass
? ? ? ? #模型訓練函數
? ? ? ? def train(self):
? ? ? ? ? ? pass
? ? ? ? #模型分詞預測
? ? ? ? def lcut(self, sentence):
? ? ? ? ? ? pass
? ? 繼承 HMM_Model 類并實現中文分詞器訓練、分詞功能
? ? init(),構造函數,定義了初始化變量
? ? read_txt(),加載訓練語料,讀入文件為 txt,并且 UTF-8 編碼,防止中文出現亂碼
? ? train(),根據單詞生成觀測序列和狀態序列,并通過父類的 do_train() 方法進行訓練
? ? lcut(),模型訓練好之后,通過該方法進行分詞測試
? 訓練模型
? ? 首先實例化 HMMSoyoger 類,然后通過 read_txt() 方法加載語料,再通過 train() 進行在線訓練
? 模型測試
學習資料:
《中文自然語言處理入門實戰》