原计划这一节讲解如何利用UMDHMM这个HMM工具包来实现一个toy版本的HMM词性标注器,自己也写了几个相关的小脚本,不过由于处理过程中需要借用Philip Resnik教授写的另外几个小脚本,所以这里先介绍一下他的工作。
  Resnik教授利用UMDHMM写了一个关于如何使用隐马尔科夫模型的介绍和练习,主要目标包括以下四个方面:
  1、 在一个“似英语”的文本上训练一个HMM模型(Train an HMM on a sample of English-like text );
  2、对于训练好的模型进行检测(Inspect the resulting model);
  3、根据训练好的模型随机生成句子(Generate sentences at random from the model);
  4、对于测试句子寻找最可能隐藏状态序列(Create test sentences and find the most likely hidden state sequence)。
  我的工作和Resnik教授的主要区别再于,他的训练集没有进行词性标注,利用了前向-后向算法生成HMM模型,并且需要读者有一定想象能力来作虚拟词性标注;而我所用的训练集是有标注的,主要是通过统计的方法生成HMM模型,并且对于测试集标注是直观的。但是,殊途同归,都是为了建立一个HMM模型,都是为了能利用UMDHMM。
  关于如何下载和使用这个工具包具体请参考“Exercise: Using a Hidden Markov Model”,这里我主要讲解一些要点和一个例子。
  下载这个工具包主要是在命令行方式下利用ftp命令,估计有的读者不太习惯这种方式,所以我在网络硬盘上上传了一个已下载的版本,有需要的读者可以去这个地址下载: solaris.tar.gz
  首先对这个工具包解压:tar -zxvf solaris.tar.gz
  主要包括几个perl脚本,UMDHMM编译后生成的几个可执行程序以及两个样例文件夹,需要注意的是,几个perl脚本需要根据你所使用的环境修改perl的执行路径,另外UMDHMM的几个可执行程序是Resnik教授在Solaris 5.5系统下编译的,并不适用于其他操作系统,因此最好自己单独编译一下UMDHMM,关于UMDHMM的编译和使用,不太清楚的读者可以先看一下我之前写得一点介绍:UMDHMM
  对于这几个perl脚本,需要作一点预处理,第一使其可执行:chmod u+x *.pl 或 chmod 755 *.pl;第二,修改每个脚本的perl解释器目录,由于我用的是ubuntu9.04,所以处理的方法是,注释掉第一行,将第二行”/usr/local/bin/perl5“修改为“/usr/bin/perl”。
  修改完毕perl脚本使其可执行之后,就可以进入example0目录进行练习了:cd example0
  example0目录下有一个example0.train文件,只有一行,但是包含了一百句英语句子,这一百句英语句子只用了11个单词和两个标点符号”.”和“?”生成,是一个“似英语”句子生成器生成的,主目录下有这个程序,是lisp程序写的,我不明白怎么使用。如下所示部分句子:

the plane can fly . the typical plane can see the plane . a typical fly can see . who might see ? the large can might see a can . the can can destroy a large can …

  对于这个训练集,Resnik教授建议读者写一个简单的词性列表,并尝试为每一个单词分配一个词性标记,并且同一个单词可以有不同的标记。注意这个练习并不是要在这个文件中进行,可以在别的地方,譬如纸上或者心里都可以,不做也行的。我就偷懒了,因为不知道如何标记,并且手工标记的工作量较大,我用了一个基于Brown语料库训练的词性标注器标注了一下,这个之后再详细说明。
  由于UMDHMM这个工具包处理的都是数字而非符号,所以需要先将这个训练集转换为数字序列,由create_key.pl这个脚本完成:
  ../create_key.pl example0.key < example0.train > example0.seq
  这一步生成两个文件:example0.key及example0.seq,前者主要将训练集中出现的单词符号映射为数字编号,如:

1 the
2 plane
8 a
4 fly
3 can
7 see
12 large
11 ?
10 might
9 who
6 typical
5 .
13 destroy

  后者主要根据example0.key中的编号对训练集进行转换,并且形式为UMDHH中的训练集输入形式,如:

T= 590
1 2 3 4 5 1 6 2 3 7 1 2 5 8 6 4 3 7 5 9 10 7 11 1 12 3 10 7 8 3 5 1 3 3 13 8 12 3 5 9 10 7 11 9 10 4 11 9 3 4 11 1 3 10 7 5 1 2 3 4 8 6 4 5 9 3 4 11 1 12 4 3 4 5 9 3 7 11 9 3 7 8 3 11...

  其中T代表了训练集中的单词符号数目。
  今晚有点晚了,先到此为止吧,明晚继续!

未完待续:词性标注4

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

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

作者 52nlp

《HMM在自然语言处理中的应用一:词性标注3》有19条评论
  1. 博主老师你好!首先非常感谢你的这个网站,给我的学习提供了非常大的帮助,受益良多。另外我在学习过程中遇到一些问题想向你请教一下:
    1../create_key.pl example0.key example0.seq当example0.train文件比较巨大的时候,由于example0.seq得到的数字序列其实是一行,所以用编辑器打开的时候比较卡且不利于操作,不知道有没有优化的办法?
    2.当用EM算法./esthmm -N a -M b example0.seq > example0.hmm,我发现如果a和b的数值较大,也就是说所训练的语料比较大的时候我电脑会导致内存溢出程序就被终止了,也没有得到我想要得到的*.hmm文件,不知道有没有什么办法可以解决?
    3.目前自己在做一个输入法粗浅的研究,想用HMM的模型,拼音作为观察符号序列,而汉字作为隐形状态,拼音的翻译相当于是一个隐形状态解码的过程。然而在第一步构建HMM模型的时候遇到一点问题:我手上现在有一份拼音的语料以及与之一一对应的汉字的语料,按博客上说的方法用umdhmm工具去构建模型,除了上面提到的两点问题外我在想,由于提供给esthmm工具的是隐形状态的数目N,观察符号数M,和观察符号序列*.seq,也就是说当训练出的*.hmm文件我们其实并不知道某个隐形状态实际是对应的是哪个汉字,不知老师有没有什么建议?

    [回复]

    52nlp 回复:

    关于第一个问题,我当时写可能只是测试用,比较短,建议要么你修改一下这个代码,要么找一个好的编辑器查看,例如eltraedit之类的;

    对于2,因为我没有实际侧过很大的数据,不清楚这个溢出问题。不知道你的数据有多大?内存有多大?可能并不一定是内存问题,可以debug看看。

    对于3,你先给汉字编上号,再训练,训练完毕之后再反查这个编号对应的汉字应该就可以了吧!

    [回复]

    Li Huacong 回复:

    谢谢博主老师!

    [回复]

  2. 这个脚本文件(solaris.tar.gz),我无法下载下来啊 能否给发一份啊:chenkehai@gmail.com.
    谢谢!!!

    [回复]

    52nlp 回复:

    发给你了。

    [回复]

    JiangNanDeXue 回复:

    谢谢博主!

    [回复]

  3. 脚本似乎不能下载, 可否发我一份?zlzcomeon@gmail.com

    [回复]

    zlzcomeon 回复:

    已拿到脚本

    [回复]

  4. HOLLY.微盘里的solaris.tar.gz又没有了。

    [回复]

    52nlp 回复:

    谢谢提醒,发现微博不允许这个文件创建公开分享,建了一个私密链接:http://vdisk.weibo.com/lc/BZIdVBIRKFCwT3Z6 密码:R4U7

    [回复]

    ansersion 回复:

    博主好人~

    [回复]

  5. 博主老师您好,首先感谢您的分享!我在学习的过程中,发现一个问题,想向您请教:我在使用../create_key.pl example0.key example0.seq命令后,example0文件夹中只出现了example.seq这个文件,并没有出现example.key这个文件,而且example.seq还是个空文件,不知道怎么回事,望老师能拨冗解答,感谢!

    [回复]

  6. 博主你好,你上面给的几个solaris.tar.gz的链接不能打开,烦请能发一份给我,非常感谢!邮件:qinb@mail.ustc.edu.cn

    [回复]

    52nlp 回复:

    抱歉,看了一下,微盘的私密分享也没有了,我手头的电脑貌似没有,不太好找

    [回复]

  7. 博主你好,你上面给的几个solaris.tar.gz的链接不能打开,烦请能发一份给我,非常感谢!邮箱地址:qinb@mail.ustc.edu.cn

    [回复]

  8. /*天气这个例子中所定义的已知隐马尔科夫模型如下:
      1、隐藏状态 (天气):Sunny,Cloudy,Rainy;
      2、观察状态(海藻湿度):Dry,Dryish,Damp,Soggy;
      3、初始状态概率: Sunny(0.63), Cloudy(0.17), Rainy(0.20);
      4、状态转移矩阵:

                 weather today
                 Sunny Cloudy Rainy
         weather Sunny 0.500 0.375 0.125
        yesterday Cloudy 0.250 0.125 0.625
              Rainy  0.250 0.375 0.375

      5、混淆矩阵:

                observed states
               Dry Dryish Damp Soggy
             Sunny 0.60 0.20 0.15 0.05
        hidden  Cloudy 0.25 0.25 0.25 0.25
        states  Rainy 0.05 0.10 0.35 0.50

      为了UMDHMM也能运行这个例子,我们将上述天气例子中的隐马尔科夫模型转化为如下的UMDHMM可读的HMM文件weather.hmm:
    ——————————————————————–
        M= 4
        N= 3 
        A:
        0.500 0.375 0.125
        0.250 0.125 0.625
        0.250 0.375 0.375
        B:
        0.60 0.20 0.15 0.05
        0.25 0.25 0.25 0.25
        0.05 0.10 0.35 0.50
        pi:
        0.63 0.17 0.20
    ——————————————————————–

    用testfor来运行原文中默认给出的观察序列“Dry,Damp,Soggy”,其所对应的UMDHMM可读的观察序列文件test1.seq:
    ——————————————————————–
        T=3
        1 3 4
    ——————————————————————–

    */

    请问观察序列里134分别代表什么意思?

    [回复]

发表回复

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