中文分词和HMM模型

目录

    • 一、中文分词
        • 1.1 切分方案的标识
            • 数据结构
        • 1.2 Trie树
        • 1.3 DAG(有向无环图)
        • 1.4 概率模型
            • N元模型
        • 1.5 jieba分词
            • 中文分词流程
            • jieba登录词词库加载
            • jieba的DAG词图
            • jieba的Route概率-获得词频最大切分
            • 隐马尔可夫模型
    • 二、HMM模型(隐马尔可夫模型)
        • 2.1 马尔可夫模型
        • 2.2 隐马尔可夫模型
        • 2.3 隐马尔可夫模型的三种计算场景
          • (1) 概率计算算法
            • 1.1 直接计算法(穷举法)
            • 1.2 前向概率
            • 1.3 后向概率
            • 概率计算
          • (2) 学习算法
            • 监督学习方法(完全数据)
            • 非监督学习方法(不完全数据)
          • (3) 预测算法
        • 三、中文切词实践
        • 结巴切词
            • jieba切词
            • 加载自定义词典
            • 自定义词典user_dict.txt
            • 新词发现
        • 参考文献

一、中文分词

1.1 切分方案的标识

0有1/意2见3/分4歧5

两种标识方案

  1. 一个词的开始位置标识为1,其余位置标识为0,比如:[11010]
  2. 切词的索引位置,则“0有1意2见3分4歧5”的分词结点序列{0,1,3,5}

最常见的分词方法是基于词典匹配,规则是按照最大长度查找,由方向的不同可分为两类:前向查找和后向查找(后向查找准确度相对较高)

数据结构
  • 为了提高查找效率,不要逐个匹配词典中的词
  • 查找词典所占的时间较长,为了保证切分速度,选择一个好的查找词典方法
  • Trie树常用于加速分词查找词典问题

1.2 Trie树

中文分词和HMM模型_第1张图片

例子:大学生活动中心

  • 正向切词:大学生/活动/中心
  • 反向切词:大学生/活动/中心

1.3 DAG(有向无环图)

中文分词和HMM模型_第2张图片

1.4 概率模型

从统计思想的角度来看,分词问题的输入是一个字串 C = c 1 . c 2 , . . . , c n C=c_1.c_2,...,c_n C=c1.c2,...,cn,输出是一个词串 S = w 1 , w 2 , . . . , w m ( n > m ) S=w_1,w_2,...,w_m(n>m) S=w1,w2,...,wm(n>m),对于一个特定的字串,对应着多个切分方案 S S S,分词的任务是在这些S中找出一个合适的切分方案,使得 p ( S ∣ C ) p(S|C) p(SC)最大。

p ( S ∣ C ) p(S|C) p(SC)是字串C产生词串S的概率
S e g ( C ) = a r g max ⁡ S ϵ G p ( S ∣ C ) = a r g max ⁡ S ϵ G p ( C ∣ S ) p ( S ) p ( C ) Seg(C)=arg\max_{S\epsilon G}p(S|C)=arg\max_{S\epsilon G}\frac{p(C|S)p(S)}{p(C)} Seg(C)=argSϵGmaxp(SC)=argSϵGmaxp(C)p(CS)p(S)

N元模型
  • N元模型使用n个词组成的序列来衡量切分方案的合理性
  • p ( w 1 , w 2 , w 3 ) = p ( w 1 ) p ( w 2 ∣ w 1 ) p ( w 3 ∣ w 1 , w 2 ) p(w_1,w_2,w_3)=p(w_1)p(w_2|w_1)p(w_3|w_1,w_2) p(w1,w2,w3)=p(w1)p(w2w1)p(w3w1,w2)
  • p ( S ) = p ( w 1 , w 2 , . . . , w n ) = p ( w 1 ) p ( w 2 ∣ w 1 ) p ( w 3 ∣ w 1 , w 2 ) . . . p ( w n ∣ w 1 , w 2 , . . . , w n − 1 ) p(S)=p(w_1,w_2,...,w_n)=p(w_1)p(w_2|w_1)p(w_3|w_1,w_2)...p(w_n|w_1,w_2,...,w_{n-1}) p(S)=p(w1,w2,...,wn)=p(w1)p(w2w1)p(w3w1,w2)...p(wnw1,w2,...,wn1)

如果一个词的出现不依赖前面出现的词,叫做一元模型
p ( S ) = p ( w 1 , w 2 , . . . , w n ) = p ( w 1 ) p ( w 2 ) p ( w 3 ) . . . p ( w n ) p(S)=p(w_1,w_2,...,w_n)=p(w_1)p(w_2)p(w_3)...p(w_n) p(S)=p(w1,w2,...,wn)=p(w1)p(w2)p(w3)...p(wn)

如果简化为一个词的出现仅依赖于前面出现的一个词,那么称之为二元模型
p ( S ) = p ( w 1 , w 2 , … … , w n ) = p ( w 1 ) p ( w 2 ∣ w 1 ) p ( w 3 ∣ w 2 ) … … p ( w n ∣ w n − 1 ) p(S)=p(w_1,w_2,……,w_n)=p(w_1)p(w_2|w_1)p(w_3|w_2)……p(w_n|w_{n-1}) p(S)=p(w1,w2,,wn)=p(w1)p(w2w1)p(w3w2)p(wnwn1)
如果简化为一个词的出现仅依赖于前面出现的两个词,那么称之为三元模型
p ( S ) = p ( w 1 , w 2 , … … , w n ) = p ( w 1 ) p ( w 2 ∣ w 1 ) p ( w 3 ∣ w 1 , w 2 ) … … p ( w n ∣ w n − 2 , w n − 1 ) p(S)=p(w_1,w_2,……,w_n)=p(w1)p(w_2|w_1)p(w_3|w_1,w_2)……p(w_n|w_{n-2},w_{n-1}) p(S)=p(w1,w2,,wn)=p(w1)p(w2w1)p(w3w1,w2)p(wnwn2,wn1)

1.5 jieba分词

  • 支持三种分词模式
    • 精确模式:将句子最精确的分开,适合文本分析
    • 全模式:句子中所有可以成词的词语都扫描出来,速度快,不能解决歧义
    • 搜索引擎模式:在精确模式基础上,对长词再次切分,提高召回
  • 支持繁体分词
  • 支持自定义字典
  • 基于Trie树结构实现高效的词图扫描,生成句子汉字所有可能成词情况构成的有向无环图
  • 采用动态规划查找最大概率路径,找出基于词频的最大切分组合
  • 对于未登录词,采用了基于汉字成词能力的HMM模型,使用Viterbi算法
中文分词流程
中文分词和HMM模型_第3张图片
jieba登录词词库加载
中文分词和HMM模型_第4张图片
jieba的DAG词图
中文分词和HMM模型_第5张图片
jieba的Route概率-获得词频最大切分
中文分词和HMM模型_第6张图片
隐马尔可夫模型
中文分词和HMM模型_第7张图片
  • 观察和隐藏序列共同构成隐马尔可夫模型HMM
  • O ( o 1 , o 2 , . . . , o T ) O(o_1,o_2,...,o_T) O(o1,o2,...,oT):观测序列, o t o_t ot只依赖于 s t s_t st
  • S ( s 1 , s 2 , . . . , s T ) S(s_1,s_2,...,s_T) S(s1,s2,...,sT):状态序列,S是Markov序列,假设1阶Markov序列,则 s t + 1 s_{t+1} st+1只依赖于 s t s_t st

二、HMM模型(隐马尔可夫模型)

2.1 马尔可夫模型

定义:每一个状态只依赖于前面有限个状态

  • N阶马尔可夫:依赖前面n个状态
  • 1阶马尔可夫:仅依赖前一个状态

参数

  • 状态,假设有N个
  • 初始概率,每一个状态的初始概率 π k π_k πk π k = p ( S 1 = k ) [ k = 1 , 2 , . . . . N ] \pi_k=p(S_1=k) \qquad [k=1,2,....N] πk=p(S1=k)[k=1,2,....N]
  • 状态转移概率,一个状态转移到另一个状态的概率 [ a ( k , l ) ] ( N ∗ N ) [a(k,l)] (N * N) [a(k,l)](NN) a k , l = p ( S t + 1 = l ∣ S t = k ) [ k , l = 1 , 2 , . . . , N ] a_{k,l}=p(S_{t+1}=l|S_t=k) \qquad [k,l=1,2,...,N] ak,l=p(St+1=lSt=k)[k,l=1,2,...,N]

2.2 隐马尔可夫模型

定义:描述由一个隐藏的马尔可夫链随机生成不可观测的状态随机序列,再由各个状态生成一个观测随机序列的过程。
隐藏的序列称为状态序列;每一个状态数据生成一个观测数据而生成一个观测序列,称为观测序列。

应用:

  • 机器翻译:源语言序列->目标语言序列
  • 语音识别:语音信号序列->文字序列
  • 词性标注:文字序列->词性序列
  • 拼音纠错:原始拼音序列->纠正的文字序列
中文分词和HMM模型_第8张图片

观察序列O的数据通常是由对应的隐藏序列数据决定的,彼此之间相互独立;隐藏序列数据间相互依赖,构成马尔可夫序列

隐马尔可夫模型由初始概率分布、状态转移概率分布以及观测概率分布确定。

设Q是所有可能的状态集合,V是所有可能的观测集合 Q = { q 1 , q 2 , . . . , q N } , V = { v 1 , v 2 , . . . , v M } Q=\lbrace q_1,q_2,...,q_N \rbrace,V=\lbrace v_1,v_2,...,v_M \rbrace Q={q1,q2,...,qN},V={v1,v2,...,vM}

初始状态概率 π i = p ( i 1 = q i ) , i ∈ ( 1 , 2 , . . . , N ) \pi_i=p(i_1=q_i),i\in (1,2,...,N) πi=p(i1=qi),i(1,2,...,N)

A是状态转移概率分布 A = [ a i j ] N × N A=[a_{ij}]_{N \times N} A=[aij]N×N a i j = p ( i t + 1 = q j ∣ i t = q i ) , ( i , j ∈ ( 1 , 2 , . . . , N ) ) a_{ij}=p(i_{t+1}=q_j|i_t=q_i),(i,j\in (1,2,...,N)) aij=p(it+1=qjit=qi),(i,j(1,2,...,N))

B是观测概率分布 B = [ b j ( k ) ] N × M B=[b_j(k)]_{N\times M} B=[bj(k)]N×M b j ( k ) = p ( o t = v k ∣ i t = q j ) k ∈ ( 1 , 2 , . . . , M ) ; j ∈ ( 1 , 2 , . . , N ) b_j(k)=p(o_t=v_k|i_t=q_j) k\in (1,2,...,M);j\in (1,2,..,N) bj(k)=p(ot=vkit=qj)k(1,2,...,M);j(1,2,..,N)

2.3 隐马尔可夫模型的三种计算场景

  1. 概率计算问题
    • 给定模型参数λ和观测序列O,计算在模型λ下观测序列O出现的概率
  2. 学习问题
    • 已知观测序列O,估计模型参数λ,使得在该模型下观测序列概率P(O|λ)最大,即用极大似然估计的方法估计参数
  3. 预测问题
    • 已知模型参数λ和观测序列O,求对给定观测序列条件概率P(S|λ)最大的状态序列S。即给定观测序列,求最优的状态序列。

条件概率的转化 p ( w 2 , w 3 ∣ w 1 ) = p ( w 2 ∣ w 1 ) p ( w 3 ∣ w 1 , w 2 ) p(w_2,w_3|w_1)=p(w_2|w_1)p(w_3|w_1,w_2) p(w2,w3w1)=p(w2w1)p(w3w1,w2)

(1) 概率计算算法
1.1 直接计算法(穷举法)

思想:通过列举所有可能的长度为T的状态序列S,求各个状态序列S与观测序列O的联合概率P(O,S|λ),然后对所有可能的状态序列求和,得到P(O|λ)。

某一状态序列的概率 P ( S ∣ λ ) = π s 1 a s 1 , s 2 a s 2 , s 3 ⋯ a s t − 1 , s t P(S|\lambda)=π_{s_1}a_{s_1,s_2}a_{s_2,s_3} \cdots a_{s_t-1,s_t} P(Sλ)=πs1as1,s2as2,s3ast1,st

观察序列和对应的隐藏序列的联合概率为 P ( O 1 : t , S 1 : t ∣ λ ) = P ( S 1 : t ∣ λ ) P ( O 1 : t ∣ S 1 : t , λ ) = π s 1 a s 1 , s 2 a s 2 , s 3 ⋯ a s t − 1 : s t b s 1 ( o 1 ) b s 2 ( o 2 ) ⋯ b s t ( o t ) = π s 1 ∏ i = 1 t − 1 a s i , s i + 1 ∏ i = 1 t b s i ( o i ) \begin{aligned} P(O_{1:t},S_{1:t}|λ)&=P(S_{1:t}|\lambda) P(O_{1:t}|S_{1:t},\lambda)\\ &= π_{s_1}a_{s_1,s_2}a_{s_2,s_3} \cdots a_{s_{t-1}:s_t}b_{s_1}(o_1)b_{s_2}(o_2) \cdots b_{s_t}(o_t)\\ &=π_{s_1}\prod_{i=1}^{t-1}a_{s_i,s_{i+1}}\prod_{i=1}^{t}b_{s_i}(o_i) \end{aligned} P(O1:t,S1:tλ)=P(S1:tλ)P(O1:tS1:t,λ)=πs1as1,s2as2,s3ast1:stbs1(o1)bs2(o2)bst(ot)=πs1i=1t1asi,si+1i=1tbsi(oi)

复杂度为 O ( T ∗ N T ) O(T*N^T) O(TNT)

1.2 前向概率

给定隐马尔可夫模型参数 λ λ λ,定义到时刻t的部分观测序列为 o 1 , o 2 , . . . , o t o_1,o_2,...,o_t o1,o2,...,ot且对应的隐藏状态为 k k k的概率为前向概率。

α t ( k ) = p ( O 1 : t , S t = k ∣ λ ) = ∑ l = 1 N p ( O 1 : t , S t − 1 = l , S t = k ∣ λ ) = ∑ l = 1 N p ( O t ∣ O 1 : t − 1 , S t − 1 = l , S t = k , λ ) p ( O 1 : t − 1 , S t − 1 = l , S t = k ∣ λ ) = ∑ l = 1 N p ( O t ∣ O 1 : t − 1 , S t − 1 = l , S t = k , λ ) p ( S t = k ∣ O 1 : t − 1 , S t − 1 = l , λ ) p ( O 1 : t − 1 , S t − 1 = l ∣ λ ) = ∑ l = 1 N p ( O t ∣ S t = k , λ ) p ( S t = k ∣ S t − 1 = l , λ ) p ( O 1 : t − 1 , S t − 1 = l , λ ) = ∑ l = 1 N b k ( O t ) a l , k α t − 1 ( l ) \begin{aligned} \alpha_t(k) &= p(O_{1:t},S_t=k|\lambda) \\ & =\sum_{l=1}^Np(O_{1:t},S_{t-1}=l,S_t=k|\lambda) \\ &=\sum_{l=1}^Np(O_t|O_{1:t-1},S_{t-1}=l,S_t=k,\lambda)p(O_{1:t-1},S_{t-1}=l,S_t=k|\lambda) \\ &=\sum_{l=1}^Np(O_t|O_{1:t-1},S_{t-1}=l,S_t=k,\lambda)p(S_t=k|O_{1:t-1},S_{t-1}=l,\lambda)p(O_{1:t-1},S_{t-1}=l|\lambda)\\ &=\sum_{l=1}^Np(O_t|S_t=k,\lambda)p(S_t=k|S_{t-1}=l,\lambda)p(O_{1:t-1},S_{t-1}=l,\lambda)\\ &=\sum_{l=1}^Nb_k(O_t)a_{l,k}\alpha_{t-1}(l) \end{aligned} αt(k)=p(O1:t,St=kλ)=l=1Np(O1:t,St1=l,St=kλ)=l=1Np(OtO1:t1,St1=l,St=k,λ)p(O1:t1,St1=l,St=kλ)=l=1Np(OtO1:t1,St1=l,St=k,λ)p(St=kO1:t1,St1=l,λ)p(O1:t1,St1=lλ)=l=1Np(OtSt=k,λ)p(St=kSt1=l,λ)p(O1:t1,St1=l,λ)=l=1Nbk(Ot)al,kαt1(l)
前向概率公式表示 p ( O ∣ λ ) p(O|λ) p(Oλ) p ( O ∣ λ ) = ∑ l = 1 N α T ( l ) p(O|\lambda)=\sum_{l=1}^N\alpha_T(l) p(Oλ)=l=1NαT(l)

p ( O ∣ λ ) p(O|λ) p(Oλ)的时间复杂度为 O ( T ∗ N 2 ) O(T*N^2) O(TN2)

1.3 后向概率

给定隐马尔可夫模型 λ λ λ,定义在t时刻状态为 k k k的条件下,从 t + 1 t+1 t+1 T T T的部分观测序列为 O t + 1 , O t + 2 , . . . , O T O_{t+1},O_{t+2},...,O_T Ot+1,Ot+2,...,OT的概率为后向概率。
β t ( k ) = p ( O t + 1 , T ∣ S t = k , λ ) = ∑ l = 1 N p ( O t + 1 : T , S t + 1 = l ∣ S t = k , λ ) = ∑ l = 1 N p ( S t + 1 = l ∣ S t = k , λ ) p ( O t + 1 : T ∣ S t + 1 = l , S t = k , λ ) = ∑ l = 1 N p ( S t + 1 = l ∣ S t = k , λ ) p ( O t + 1 : T ∣ S t + 1 = l , λ ) = ∑ l = 1 N p ( S t + 1 = l ∣ S t = k , λ ) p ( O t + 2 : T ∣ S t + 1 = l , λ ) p ( O t + 1 ∣ O t + 2 : T , S t + 1 = l , λ ) = ∑ l = 1 N p ( S t + 1 = l ∣ S t = k , λ ) p ( O t + 1 ∣ S t + 1 = l , λ ) p ( O t + 2 : T ∣ S t + 1 = l , λ ) = ∑ l = 1 N a k , l b l ( O t + 1 ) β t + 1 ( l ) \begin{aligned} \beta_t(k)&=p(O_{t+1,T}|S_t=k,\lambda)\\ &=\sum_{l=1}^Np(O_{t+1:T},S_{t+1}=l|S_t=k,\lambda)\\ &=\sum_{l=1}^Np(S_{t+1}=l|S_t=k,\lambda)p(O_{t+1:T}|S_{t+1}=l,S_t=k,\lambda)\\ &=\sum_{l=1}^Np(S_{t+1}=l|S_t=k,\lambda)p(O_{t+1:T}|S_{t+1}=l,\lambda)\\ &=\sum_{l=1}^Np(S_{t+1}=l|S_t=k,\lambda)p(O_{t+2:T}|S_{t+1}=l,\lambda)p(O_{t+1}|O_{t+2:T},S_{t+1}=l,\lambda)\\ &=\sum_{l=1}^Np(S_{t+1}=l|S_t=k,\lambda)p(O_{t+1}|S_{t+1}=l,\lambda)p(O_{t+2:T}|S_{t+1}=l,\lambda)\\ &=\sum_{l=1}^Na_{k,l}b_l(O_{t+1})\beta_{t+1}(l) \end{aligned} βt(k)=p(Ot+1,TSt=k,λ)=l=1Np(Ot+1:T,St+1=lSt=k,λ)=l=1Np(St+1=lSt=k,λ)p(Ot+1:TSt+1=l,St=k,λ)=l=1Np(St+1=lSt=k,λ)p(Ot+1:TSt+1=l,λ)=l=1Np(St+1=lSt=k,λ)p(Ot+2:TSt+1=l,λ)p(Ot+1Ot+2:T,St+1=l,λ)=l=1Np(St+1=lSt=k,λ)p(Ot+1St+1=l,λ)p(Ot+2:TSt+1=l,λ)=l=1Nak,lbl(Ot+1)βt+1(l)

后向概率表示 p ( O ∣ λ ) p(O|λ) p(Oλ) p ( O ∣ λ ) = ∑ l = 1 N π l b l ( O 1 ) β 1 ( l ) p(O|\lambda)=\sum_{l=1}^N\pi_lb_l(O_1)\beta_1(l) p(Oλ)=l=1Nπlbl(O1)β1(l)

前向概率和后向概率表示观测序列概率 p ( O ∣ λ ) = ∑ i = 1 N ∑ j = 1 N α t ( i ) a i j b j ( O t + 1 ) β t + 1 ( j ) p(O|\lambda)=\sum_{i=1}^N\sum_{j=1}^N\alpha_t(i)a_{ij}b_j(O_{t+1})\beta_{t+1}(j) p(Oλ)=i=1Nj=1Nαt(i)aijbj(Ot+1)βt+1(j)

概率计算

(1) 给定模型 λ λ λ和观测序列 O O O,在时刻 t t t的状态为 k k k的概率
γ t ( k ) = p ( S t = k ∣ O 1 : T , λ ) = p ( O 1 : T , S t = k , λ ) p ( O 1 : T , λ ) = α t ( k ) β t ( k ) ∑ l = 1 N α t ( l ) β t ( l ) \gamma_t(k)=p(S_t=k|O_{1:T},\lambda)=\frac{p(O_{1:T},S_t=k,\lambda)}{p(O_{1:T},\lambda)}=\frac{\alpha_t(k)\beta_t(k)}{\sum_{l=1}^N\alpha_t(l)\beta_t(l)} γt(k)=p(St=kO1:T,λ)=p(O1:T,λ)p(O1:T,St=k,λ)=l=1Nαt(l)βt(l)αt(k)βt(k)

(2) 给定模型 λ λ λ和观测序列 O O O,在时刻 t t t的状态为 i i i,时刻 t + 1 t+1 t+1状态为 j j j的概率 ξ t ( i , j ) = p ( S t = i , S t + 1 = j ∣ O , λ ) = p ( S t = i , S t + 1 = j , O ∣ λ ) p ( O ∣ λ ) = p ( S t = i , S t + 1 = j , O ∣ λ ) ∑ m = 1 N ∑ n = 1 N p ( S t = m , S t + 1 = n , O ∣ λ ) = α t ( i ) a i , j b j ( O t + 1 ) β t ( j ) ∑ m = 1 N ∑ n = 1 N α t ( m ) a m , n b n ( O t + 1 ) β t ( n ) \begin{aligned} \xi_t(i,j)&=p(S_t=i,S_{t+1}=j|O,\lambda)\\ &=\frac{p(S_t=i,S_{t+1}=j,O|\lambda)}{p(O|\lambda)}\\ &=\frac{p(S_t=i,S_{t+1}=j,O|\lambda)}{\sum_{m=1}^N\sum_{n=1}^Np(S_t=m,S_{t+1}=n,O|\lambda)}\\ &=\frac{\alpha_t(i)a_{i,j}b_j(O_{t+1})\beta_t(j)}{\sum_{m=1}^N\sum_{n=1}^N\alpha_t(m)a_{m,n}b_n(O_{t+1})\beta_t(n)}\end{aligned} ξt(i,j)=p(St=i,St+1=jO,λ)=p(Oλ)p(St=i,St+1=j,Oλ)=m=1Nn=1Np(St=m,St+1=n,Oλ)p(St=i,St+1=j,Oλ)=m=1Nn=1Nαt(m)am,nbn(Ot+1)βt(n)αt(i)ai,jbj(Ot+1)βt(j)

(2) 学习算法
监督学习方法(完全数据)

假设已给训练数据包含了观测序列O和对应的状态序列S,利用极大似然估计方法来估计隐马尔可夫模型的参数

非监督学习方法(不完全数据)

假设给定训练数据只包含了 S S S个长度为 T T T的观测序列 O O O,而没有对应的状态序列,目标是学习隐马尔可夫模型参数 λ = ( A , B , π ) λ=(A,B,π) λ=(A,B,π)

(3) 预测算法

维特比算法:动态规划求概率最大路径,这时一条路径对应着一个最优的状态序列。过程是从时刻t=1开始,递推地计算在时刻t状态为i的各条部分路径的最大概率,直至得到时刻t=T状态的各条路径的最大概率。时刻T的最大概率即为最优路径的概率P,得到最优路径的终结点。之后,为了找出最优路径的各个结点,从终结点开始,由后向前逐步求结点,从而得到最优状态序列。

中文分词和HMM模型_第9张图片

每一个字所对应四种状态(BMES),status_matrix记录k的四种状态到j的某种状态(pi+A+B)的概率最大值,数据结构为【max_p,max_status】(BMES),直到最后一个字。从最后一个字的四种状态查询概率最大值,回溯搜索前一个字的最优状态,从而得到最优序列。

动态规划在t+1的位置重用t的结果。
变量δ定义了在时刻t状态为k的所有路径 O 1 : t O_{1:t} O1:t中概率最大值为
δ t ( k ) = max ⁡ S 1 : t − 1 p ( S 1 : t − 1 , S t = k , O 1 : t ∣ λ ) δ t + 1 ( k ) = max ⁡ S 1 : t p ( S 1 : t , S t + 1 = k , O 1 : t + 1 ∣ λ ) = max ⁡ 1 ≤ l ≤ M ( max ⁡ S 1 : t − 1 p ( S 1 : t − 1 , S t = l , S t + 1 = k , O 1 : t + 1 ∣ λ ) ) = max ⁡ 1 ≤ l ≤ M ( max ⁡ S 1 : t − 1 p ( S t + 1 = k , O t + 1 ∣ S 1 : t − 1 , S t = l , O 1 : t , λ ) p ( S 1 : t − 1 , S t = l , O 1 : t ∣ λ ) ) = max ⁡ 1 ≤ l ≤ M ( max ⁡ S 1 : t − 1 p ( S t + 1 = k , O t + 1 ∣ S t = l , λ ) p ( S 1 : t − 1 , S t = l , O 1 : t ∣ λ ) ) = max ⁡ 1 ≤ l ≤ M ( max ⁡ S 1 : t − 1 p ( S t + 1 = k ∣ S t = l , λ ) p ( O t + 1 ∣ S t + 1 = k , λ ) p ( S 1 : t − 1 , S t = l , O 1 : t ∣ λ ) ) = max ⁡ 1 ≤ l ≤ M a l , k b k ( O t + 1 ) δ t ( l ) \begin{aligned} \delta_t(k)&=\max_{S_{1:t-1}}p(S_{1:t-1},S_t=k,O_{1:t}|\lambda) \delta_{t+1}(k)=\max_{S_{1:t}}p(S_{1:t},S_{t+1}=k,O_{1:t+1}|\lambda)\\ &=\max_{1\leq l\leq M}(\max_{S_{1:t-1}}p(S_{1:t-1},S_t=l,S_{t+1}=k,O_{1:t+1}|\lambda))\\ &=\max_{1\leq l\leq M}(\max_{S_{1:t-1}}p(S_{t+1}=k,O_{t+1}|S_{1:t-1},S_t=l,O_{1:t},\lambda)p(S_{1:t-1},S_t=l,O_{1:t}|\lambda))\\ &=\max_{1\leq l\leq M}(\max_{S_{1:t-1}}p(S_{t+1}=k,O_{t+1}|S_t=l,\lambda)p(S_{1:t-1},S_t=l,O_{1:t}|\lambda))\\ &=\max_{1\leq l\leq M}(\max_{S_{1:t-1}}p(S_{t+1}=k|S_t=l,\lambda)p(O_{t+1}|S_{t+1}=k,\lambda)p(S_{1:t-1},S_t=l,O_{1:t}|\lambda))\\ &=\max_{1\leq l\leq M}a_{l,k}b_k(O_{t+1})\delta_t(l) \end{aligned} δt(k)=S1:t1maxp(S1:t1,St=k,O1:tλ)δt+1(k)=S1:tmaxp(S1:t,St+1=k,O1:t+1λ)=1lMmax(S1:t1maxp(S1:t1,St=l,St+1=k,O1:t+1λ))=1lMmax(S1:t1maxp(St+1=k,Ot+1S1:t1,St=l,O1:t,λ)p(S1:t1,St=l,O1:tλ))=1lMmax(S1:t1maxp(St+1=k,Ot+1St=l,λ)p(S1:t1,St=l,O1:tλ))=1lMmax(S1:t1maxp(St+1=kSt=l,λ)p(Ot+1St+1=k,λ)p(S1:t1,St=l,O1:tλ))=1lMmaxal,kbk(Ot+1)δt(l)

ψ定义了时刻t状态为k的所有路径中概率最大的路径的第t-1个结点为
ψ t ( k ) = a r g max ⁡ 1 ≤ l ≤ M [ δ t − 1 ( l ) a l , k ] \psi_t(k)=arg\max_{1\leq l\leq M}[\delta_{t-1}(l)a_{l,k}] ψt(k)=arg1lMmax[δt1(l)al,k]

三、中文切词实践

结巴切词

jieba切词
import jieba

str = "中国第十九届人工智能机器学习会议将在重庆举办,举办的内容主要包括大数据云计算多粒度粗糙集"

print("/".join(jieba.cut(str,cut_all=False)))

结果显示:一些专有名词被切开(词典没有这些专有名词)

中文分词和HMM模型_第10张图片
加载自定义词典
自定义词典user_dict.txt
中文分词
大数据
云计算
机器学习
多粒度
import jieba

def_dict = "user_dict.txt"  #自定义词典路径
jieba.load_userdict(def_dict)   # 加载外部的词典

str = "中国第十九届人工智能机器学习会议将在重庆举办,举办的内容主要包括大数据云计算多粒度粗糙集"

print("/".join(jieba.cut(str,cut_all=False)))

结果显示:这些专有名词作为一个词被切割(外部词典加载到默认词典)

新词发现
import jieba
from sklearn.feature_extraction.text import CountVectorizer

# 新词发现
s_list = ['中文分词中文计算','大数据中国好声音','云计算中国好声音','用结巴分词来做中文分词','云计算大数据']
s_l = [' '.join(jieba.cut(x)) for x in s_list]

# ngram_range : tuple (min_n, max_n)表示合并词的数量范围 如【人工 [智能】 机器]
# min_df : float in range [0.0, 1.0] or int, default=1表示为词频的最小值,筛选出大于这个值的组合词
# token_pattern表示切分词后的模式
ngram_vec = CountVectorizer(token_pattern=r'\b\w+\b',ngram_range=(2,2),min_df=0.4)
x1 = ngram_vec.fit_transform(s_l) # 训练模型
print(x1)
print(ngram_vec.vocabulary_)
# 新词格式化
new_word = dict()
for k,v in ngram_vec.vocabulary_.items():
    new_word[k.replace(' ','')] = v
print(new_word)

输出结果发现新词,然后加载到词典用于jieba切词

中文分词和HMM模型_第11张图片

参考文献

  • 李航 《统计学习方法》

你可能感兴趣的:(机器学习)