Advertisement

NLP概率图

阅读量:

面对越来越复杂的问题,传统的概率方法显得越来越力不从心。
概率图模型 用图表示变量相关关系的概率模型。

  1. 贝叶斯网络 :有向无环图
  2. 马尔可随机场 :无向图

马尔可夫链

  1. 马尔可夫过程 :系统第T+1次结果只受第T次结果的影响。
  2. 马尔可夫链 :实践和状态都离散的马尔可夫过程:
    马尔科夫链
  3. NLP应用 :基于马尔可夫的语言模型(每个词只与它前面的某几个词有关)
马尔可夫链的3元组:

这里写图片描述
这里写图片描述


隐马尔可夫模型(HMM)

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
4.8
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述


使用Python对隐马尔科夫模型实例求解

复制代码
    #HMM_weather
    import numpy as np
    startP = np.array([0.63,0.17,0.20])     #初始状态 分别为晴天、阴天、雨天的概率分布
    
    trans_P = np.array([[0.5,0.375,0.125],  #状态转移矩阵
                    [0.25,0.125,0.625], #4.7
                    [0.25,0.375,0.375]])
    
    emitP = np.array([[0.6,0.20,0.05],       #发射(输出)概率矩阵
                  [0.25,0.25,0.25],      #4.8混淆矩阵
                  [0.05,0.10,0.50]])
    #第一天(初始)天气预测:初始状态乘以发射概率
    #第二天天气预测:前一状态乘以状态转移矩阵再乘以发射概率
    #第三天天气预测:前一状态乘以状态转移矩阵再乘以发射概率
    #当前时刻状态(隐状态)由上一时刻状态(转移概率已定)和发射(输出)概率决定
    
    
    #第一天天气(第一天观测状态为干旱)预测概率=初始状态*发射概率矩阵
    state1emit = startP*emitP[:,0]
    
    #第二天前一状态*状态转移矩阵(第一天天气预测概率*转移概率矩阵)(np.dot:矩阵乘法)
    state2_mid = np.dot(state1emit,trans_P) 
    
    #第二天天气(第二天观测状态为干燥)预测概率
    state2emit = state2_mid*emitP[:,1]
    
    state3_mid = np.dot(state2emit,trans_P)  #第二天天气预测概率乘以转移概率矩阵
    state3emit = state3_mid*emitP[:,2]       #第三天天气预测概率
    
    #第一天天气值
    #第二天天气值
    #第三天天气值
    # argmax()取最大参数位置
    state1 = state1emit.argmax()
    state2 = state2emit.argmax()
    state3 = state3emit.argmax()
    
    print(state1emit)
    print(state2emit)
    print(state3emit)
    
    print(state1,state2,state3)
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-12/UR7s1JbNam6zOPAZlyktLH2BcpGe.png)

Viterbi算法

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

使用Python运用Viterbi算法求解问题

复制代码
    # viterbi_weathaer
    import numpy as np
    # obs:   观察状态
    # states:真实(隐)状态
    # startP:初始状态/概率
    # transP:转移概率(隐状态)
    # emitP :发射(输出)概率
    startP = np.array([0.63,0.17,0.20])      #初始状态
    transP = np.array([[0.5, 0.375, 0.125],  #状态转移矩阵
                    [0.25, 0.125, 0.625],
                    [0.25, 0.375, 0.375]])
    
    emitP = np.array([[0.6, 0.20, 0.05],     #发射(输出)概率矩阵
                  [0.25, 0.25, 0.25],
                  [0.05, 0.10, 0.50]])
    
    
    state1emit = startP*emitP[:,0]   #第一天天气预测概率
    #运用列表推导式
    #使用np.array将列表转化为数组
    state2emit = np.array([max(state1emit*transP[:,i])*emitP[i,1] for i in range(3)])  #第二天天气预测概率
    state3emit = np.array([max(state2emit*transP[:,i])*emitP[i,2] for i in range(3)])  #第三天天气预测概率
    
    
    #第一天天气值
    #第二天天气值
    #第三天天气值
    state1 = state1emit.argmax()
    state2 = state2emit.argmax()
    state3 = state3emit.argmax()
    print(state1emit)
    print(state2emit)
    print(state3emit)
    print(state1,state2,state3)
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-12/4FpjPZ9a8iCwImcOkNXMSq7gBxdh.png)
以上是HMM在天气预测上的运用实例

在中文分词中,由于上下文语境常常没有考虑在内,分词结果常不佳。
将Viterbi算法用在 HMM针对中文分词应用中可规避此类问题。
这里写图片描述
这里写图片描述
这里写图片描述

全部评论 (0)

还没有任何评论哟~