上一节我们对自然语言处理中词性标注的基本问题进行了描述,从本节开始我们将详细介绍HMM与词性标注的关系以及如何利用HMM进行词性标注。首先回顾一下隐马尔科夫模型(HMM)的定义和三大基本问题,并由此与词性标注的基本问题进行一个对比。
  隐马尔科夫模型(HMM)是什么?说白了,就是一个数学模型,用一堆数学符号和参数表示而已,包括隐藏状态集合、观察符号集合、初始概率向量pi, 状态转移矩阵A,混淆矩阵B。
  隐马尔科夫模型(HMM)的三大基本问题与解决方案包括:
  1. 对于一个观察序列匹配最可能的系统——评估,使用前向算法(forward algorithm)解决;
  2. 对于已生成的一个观察序列,确定最可能的隐藏状态序列——解码,使用维特比算法(Viterbi algorithm)解决;
  3. 对于已生成的观察序列,决定最可能的模型参数——学习,使用前向-后向算法(forward-backward algorithm)解决。
  回顾完HMM,这里暂且先放下词性标注,瞎扯一下数学建模。
  记得以前在大学里参加数学建模竞赛,本着拿奖的目的,稀里糊涂的就和几个同学一起组队参加,并没有仔细考虑过数学建模的本质到底是什么。反正感觉和平常作数学题不同,数学题都是定义好的,只需给出一个解答就行,而数学建模给的问题都很实际,并没有按数学题的形式出题,不仅要把这个实际问题转化为一个合理的数学问题,还要给出一个解答,由于自己概括问题的能力有限,在数学建模竞赛上也基本毫无建树。
  我在Google上搜索了一下数学建模的定义,有好几种解释,觉得下面这个最符合本质:
  把现实世界中的实际问题加以提炼,抽象为数学模型,求出模型的 解,验证模型的合理性,并用该数学模型所提供的解答来解释现实问题,我们把 数学知识的这一应用过程称为数学 建模。
  好了,这就是数学建模,如果把词性标注问题作为一个数学建模的题目来出,该如何作答?套用上面的定义,可以解释为:
  1、对词性标注问题进行提炼:词性标注本质上是一个分类问题,对于句子中的每一个单词W,找到一个合适的词类类别T,也就是词性标记,不过词性标注考虑的是整体标记的好坏,既整个句子的序列标记问题;
  2、抽象为数学模型:对于分类问题,有很多现成的数学模型和框架可以套用,譬如HMM、最大熵模型、条件随机场、SVM等等;
  3、求出模型的解:上述模型和框架一旦可以套用,如何求解就基本确定好了,就像HMM中不仅描述了三大基本问题,并相应的给出了求解方案一样;
  4、验证模型的合理性:就是词性标注的准确率等评测指标了,在自然语言处理中属于必不可少的评测环节;
  5、解释现实问题:如果词性标注的各项指标够好,就可以利用该数学模型构造一个词性标注器来解决某种语言的标注问题了!
  词性标注的数学建模就这样了,自然语言处理中的多数分类问题与此相似。这里讲得是HMM的应用,所以其他模型暂且不表,以后有机会有条件了我们再说。
  如何建立一个与词性标注问题相关联的HMM模型?首先必须确定HMM模型中的隐藏状态和观察符号,也可以说成观察状态,由于我们是根据输入句子输出词性序列,因此可以将词性标记序列作为隐藏状态,而把句子中的单词作为观察符号,那么对于Brown语料库来说,就有87个隐藏状态(标记集)和将近4万多个观察符号(词型)。
  确定了隐藏状态和观察符号,我们就可以根据训练语料库的性质来学习HMM的各项参数了。如果训练语料已经做好了标注,那么学习这个HMM模型的问题就比较简单,只需要计数就可以完成HMM各个模型参数的统计,如标记间的状态转移概率可以通过如下公式求出:
        P(Ti|Tj) = C(Tj,Ti)/C(Tj)
  而每个状态(标记)随对应的符号(单词)的发射概率可由下式求出:
        P(Wm|Tj) = C(Wm,Tj)/C(Tj)
  其中符号C代表的是其括号内因子在语料库中的计数。
  如果训练语料库没有标注,那么HMM的第三大基本问题“学习”就可以派上用处了,通过一些辅助资源,如词典等,利用前向-后向算法也可以学习一个HMM模型,不过这个模型比之有标注语料库训练出来的模型要差一些。
  总之,我们已经训练了一个与语料库对应的HMM词性标注模型,那么如何利用这个模型来解决词性标注问题呢?当然是采用维特比算法解码了, HMM模型第二大基本问题就是专门来解决这个问题的。
  说完了如何建模,下一节我们将利用UMDHMM这个HMM工具包来实现一个toy版本的HMM词性标注器。

未完待续:词性标注3

注:原创文章,转载请注明出处“我爱自然语言处理”:www.52nlp.cn

本文链接地址:https://www.52nlp.cn/hmm-application-in-natural-language-processing-one-part-of-speech-tagging-2

作者 52nlp

《HMM在自然语言处理中的应用一:词性标注2》有12条评论
  1. 谢谢分享,学到很多东西。联想到语音识别中的HMM用法,有个问题想请教下。词性标识中最后归结为HMM的decode问题。在语音识别中,为什么不把单词作为隐含状态,句子的语音特征为输出序列。进而类似地decode出句子每个发音对应的状态,即单词。而且这么做只需要一个HMM模型就行了。为什么语音识别中要对每个单词v建立一个HMM模型lambda(v)。而且对于待识别语音信号,需要很麻烦地计算argmax_v{P(O|lambda(v) )}得到(即是HMM的第一类问题)。两种不同的方式,是因为模型假设的问题呢,还是语音信号的特点决定的呢?

    [回复]

    52nlp 回复:

    抱歉,对语音识别不太清楚。

    [回复]

  2. 您好:
    在用srilm建立模型时出现问题:
    命令输入为
    ngram-count-text Train.txt -lm lm.txt -vocab PinYin.txt -order 3 -gt1m
    in 0 -gt2min 0 -gt3min 0 -kndiscount1 -kndiscount2 -kndiscount3 -debug 3
    运行后部分的输出为
    discarded 1 1-gram probs predicting pseudo-events
    warning: distributing 0.511802 left-over probability mass over 2418596 zeroton w
    ords
    discarded 2 2-gram contexts containing pseudo-events
    discarded 1143 2-gram probs predicting pseudo-events
    discarded 8862 3-gram contexts containing pseudo-events
    discarded 519 3-gram probs predicting pseudo-events
    建立的模型不完整,/3-grams部分只有数字和英文单词,没有中文词语,不知道问题出在哪?谢谢。

    [回复]

    52nlp 回复:

    分词是否正常?另外考虑一下是否是编码的问题,不过我是猜的

    [回复]

  3. 请问P(Ti|Tj) = C(Tj,Tk)/C(Tj)这个公式怎么理解,Tk代表什么

    [回复]

    hover 回复:

    我估计是写错了,正确应该是P(Ti|Tj)=C(Tj,Tj)/C(Tj)

    [回复]

    52nlp 回复:

    应该是写错了,已更新,谢谢指正

    [回复]

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注