• 【ML-13-7】隐马尔科夫模型HMM--词性标注任务


     

    自然语言处理中经典的隐马尔科夫模型(HMM)HMM早期在语音识别、分词等序列标注问题中有着广泛的应用。

    了解HMM的基础原理以及应用,对于了解NLP处理问题的基本思想和技术发展脉络有很大的好处。本文会详细讲述HMM的基本概念和原理,并详细介绍其在分词中的实际应用。

    一、HMM简介

    HMM是一种链式依赖模型,由隐含状态S、可观测状态O表现。具体有初始状态概率矩阵π、隐含状态转移概率矩阵A、可观测值转移矩阵B;π和A决定了状态序列,B决定观测序列,因此HMM可以使用三元符号表示,称为HMM的三元素: λ = (A, B,π)具体介绍,可见其他文章系列

    如图,HMM模型满足如下的性质:

    (1) 它基于观测变量来推测未知变量;

    (2) 状态序列满足马尔科夫性;

    (3) 观测序列变量X在t时刻的状态仅由t时刻隐藏状态yt决定。

    联合概率:

    二、序列标注问题

    序列标注定义可见另一篇文章。简单而言:

    这里使用BMES标记。

    B,即Begin,表示开始

    M,即Mediate,表示中间

    E,即End,表示结尾

    S,即Single,表示单个字符
    序列标注问题,就是对语句做出序列标注的判断,类似分类问题,但是又不是纯粹的分类任务,因为各部分标注之间有一定关系。这也是为何用马尔科夫模型式的原因:利用已知的观测序列来推断未知变量序列。主要涉及
    HMM-Viterbi算法。

    举个例子吧:中文的句子"忆凡很喜欢自然语言处理"就是可以被观测到的序列,而其分词的标记序列就是未知的状态序列"忆凡//喜欢/自然语言/处理"这种分词方式对应的标记序列为"BESBEBMMEBS".

    三、HMM模型的几个重要概率矩阵

    (1) 初始状态概率P(y1)

    初始概率矩阵是指序列头的状态分布,以分词为例,就是每个句子开头,标记分别为BMES的概率。

    (2) 状态转移概率P(yi|yi-1)

    状态转移概率是指状态序列内,两个时刻内不同状态之间转移的状态分布。以分词为例,标记状态总共有BMES四种,因此状态转移概率构成了一个4*4的状态转移矩阵。这个矩阵描述了4种标记之间转化的概率。例如,P(yi="E"|yi-1="M")描述的i-1时刻标为"M"时,i时刻标记为"E"的概率。

    (3) 输出观测概率P(xi|yi)

    输出观测概率是指由某个隐藏状态输出为某个观测状态的概率。以分词为例,标记状态总共有BMES四种,词表中有N个字,则输出观测概率构成了一个4*N的输出观测概率矩阵。这个矩阵描述了4种标记输出为某个字的概率。例如,P(Xi="忆"|yi="B")描述的是i时刻标记为"B"时,i时刻观测到到字为"忆"的概率。

    四、HMM在分词应用中的实战

    假设有词序列Y = y1y2....yn,HMM分词的任务就是根据序列Y进行推断,得到其标记序列X= x1x2....xn,也就是计算这一个概率:

    根据贝叶斯公式:

    当语料确定时,上式分母为常数,只需要计算分子:

    这个问题就变成了就三个矩阵问题和Viterbi算法了。

    4.1 根据语料计算三个概率矩阵

    当获得了分好词的语料之后,三个概率可以通过如下方式获得:

    (1) 初始状态概率P(y1)

    统计每个句子开头,序列标记分别为BS的个数,最后除以总句子的个数,即得到了初始概率矩阵。

    (2) 状态转移概率P(yi|yi-1)

    根据语料,统计不同序列状态之间转化的个数,例如count(yi="E"|yi-1="M")为语料中i-1时刻标为"M"时,i时刻标记为"E"出现的次数。得到一个4*4的矩阵(注意BIOES5*5的矩阵),再将矩阵的每个元素除以语料中该标记字的个数,得到状态转移概率矩阵。

    (3) 输出观测概率P(xi|yi)

    根据语料,统计由某个隐藏状态输出为某个观测状态的个数,例如count(xi="忆"|yi="B")i时刻标记为"B"时,i时刻观测到字为"忆"的次数。得到一个4*N的矩阵,再将矩阵的每个元素除以语料中该标记的个数,得到输出观测概率矩阵。

    我们看一下该部分的伪代码:

    Pi = {k: v*1.0/line_num for k,v in Pi_dict.items()} 

    A = {k: { k1: v1/ Count_dict[k] for k1, v1 in v.items()} 

            for k, v in A_dict.items()

           }

    B= {k: { k1: v1/ Count_dict[k] for k1, v1 in v.items()} 

           for k,v in B_dict.items()

           } 

       

    line_num 为预料中句子的个数;

    Pi_dic 记录了语料中句子中开头标记的个数。

    Count_dict 记录了预料中"BMES"四个标记的个数;

    A_dict 记录了不同序列状态之间转化的个数;

    B_dict 记录了不同隐藏状态输出为某个观测状态的个数。

    4.2 维特比算法

    求给定观测序列条件下,最可能出现的对应的隐藏状态序列。即给定模型λ=(A,B,π)和观测序列Q={q1,q2,...,qT},求给定观测序列条件概率P(I|Q,λ)最大的隐含状态序列 I。

    HMM模型的解码问题最常用的算法是Viterbi(维特比)算法,当然也有其他的算法可以求解这个问题。同时维特比算法是一个通用的求序列最短路径的动态规划算法。具体可见这篇文章

    另外再举一个分词类的例子吧:

    维特比算法是计算一个概率最大的路径,如图要计算"我爱中国"的分词序列:

       

    第一个词为"我",通过初始概率矩阵和输出观测概率矩阵分别计算

    delta1("B")=P(y1="S")P(x1="我"|y1="S"),

    delta1("M")=P(y1="B")P(x1="我"|y1="B"),

    delta1("E")=P(y1="M")P(x1="我"|y1="M"),

    delta1("S")=P(y1="E")P(x1="我"|y1="E"),

    并设kethe1("B")=kethe1("M")=kethe1("E")=kethe1("S")=0;

       

    同理利用公式分别计算:

    delta2("B"),delta2("M"),delta2("E"),delta2("S")。图中列出了delta2("S")的计算过程,就是计算:

    P(y2="S"|y1="B")P(x2="爱"|y2="S")

    P(y2="S"|y1="M")P(x2="爱"|y2="S")

    P(y2="S"|y1="E")P(x2="爱"|y2="S")

    P(y2="S"|y1="S")P(x2="爱"|y2="S")

    其中 P(y2="S"|y1="S")P(x2=""|y2="S")的值最大,为0.034,因此delta2("S")kethe2("S")="S",同理,可以计算出delta2("B")delta2("M")delta2("E")kethe2("B")kethe2("M")kethe2("E")

       

    同理可以获得第三个和第四个序列标记的delta和kethe。

    到最后一个序列,delta4("B"),delta4("M"),delta4("E"),delta4("S")中delta4("S")的值最大,因此,最后一个状态为"S"。

    最后,回退,

    i3 = kethe4("S") ="B"

    i2 =kethe3("B") = "S"

    i1 = kethe2("S") ="S"

    求得序列标记为:"SSBE"。

    主要参考

    1用于语音识别、分词的隐马尔科夫模型HMM

  • 相关阅读:
    route命令
    自动删除n天前日志
    ss命令
    rcp命令
    crontab,at命令,常见问题
    locate,nl命令
    kill,killall,top,free,vmstat,iostat,watch命令
    [转载]memcached stats 命令
    Swift学习笔记
    C++移位运算符
  • 原文地址:https://www.cnblogs.com/yifanrensheng/p/13510897.html
Copyright © 2020-2023  润新知