在继续昨晚的工作之前,先聊两句Philip Resnik教授。作为美国马里兰大学的教授,他的主要研究领域是自然语言处理,不过最近他被美国某个网站评为“当代卫生保健领域最具创新性和最有影响力的百位革新者之一(the most creative and influential innovators working in healthcare today)" ,Resnik教授也非常吃惊(Much to my surprise),之所以入选,再于他利用自然语言处理来提高医用编码(medical coding)的水平,具体什么是医用编码我不太清楚,不过这项工作至少说明自然语言处理还是有相当的应用前景的。
  另外,05年的时候,他的一个学生开发了一套统计机器翻译系统,取名为“Hiero”,在当年NIST机器翻译评测中表现出色,虽然没有拿到第一,但是其提出的“层次短语模型”的论文获得了当年ACL的最佳论文,此人名叫David Chiang ,中文名蒋伟。
  一年之前有一段时间我对Web平行语料库自动采集比较感兴趣,就找了很多这方面的paper,其中最有名的当属Resnik教授的Strand和LDC的BITS了,只是当时没有仔细考虑过他是何方神圣。今天仔细读了一下他的个人主页,觉得他在自然语言处理领域也是一个比较神奇的人物,有兴趣的读者不妨看看他的这个主页,对于扩展研究思路和把握当前的研究动态还是非常有好处的。好了,以下我们转入HMM词性标注的正题。

  在将训练集转换成UMDHMM需要的形式后,就可以利用UMDHMM中编译好的可执行程序esthmm来训练HMM模型了。esthmm的作用是,对于给定的观察符号序列,利用BaumWelch算法(前向-后向算法)学习隐马尔科夫模型HMM。这里采用如下的命令训练HMM模型:
  ../esthmm -N 7 -M 13 example0.seq > example0.hmm
  其中 N指示的隐藏状态数目,这里代表词性标记,这个例子中可以随便选,我选的是7,下一节会用到。注意Resnik教授给出的命令:
  esthmm 6 13 example0.seq > example0.hmm
  是错误的,需要加上”-N”和“-M”。example0.hmm的部分形式如下:

M= 13
N= 7
A:
0.001002 0.001003 0.001000 0.001000 0.462993 0.001000 0.538002
...
B:
0.001000 0.366300 0.420021 0.215676 0.001000 0.001001 0.001001 0.001000 0.001001 0.001000 0.001000 0.001001 0.001000
...
pi:
0.001000 0.001000 0.001005 0.001000 0.001000 0.999995 0.001000

  抛开这个HMM模型的效果如何,这里不得不感叹前向-后向算法或者EM算法的神奇。当然这里只是一个练习,实际处理中需要加上一些辅助手段,譬如词典之类的,这种无监督的学习是非常有难度的。
  有了这个HMM模型,就可以作些练习了。首先我们利用genseq来随机生成句子:
  ../genseq -T 10 example0.hmm > example0.sen.seq
  其中T指示的是输出序列的长度,如下所示:

T= 10
8 12 4 5 9 3 7 5 9 3

  注意 Resink教授给出的命令仍然是错的,上面的输出结果可读性不好,读者可以对照着example0.key将这个句子写出来,不过Resnik教授写了一个ints2words.pl的脚本,帮助我们完成了这件事:
  ../ints2words.pl example0.key < example0.sen.seq > example0.sen
  example0.sen中包含的就是这个HMM模型随机生成的句子:

a large fly . who can see . who can

  虽然不是一句整句,但是局部还是可读的,注意这两步可以利用管道命令合并在一起:
  ../genseq -T 10 example0.hmm | ../ints2words.pl example0.key
  注意每次的结果并不相同。
  最后一个练习也是最重要的一个:对于一个测试句子寻找其最可能的隐藏状态序列(Finding the Hidden State Sequence for a Test Sentence),对于本文来说,也就是词性序列了。我们使用testvit来完成这个任务,当然,前提是先准备好测试句子。可以根据exampl0.key中的单词和标点自己组织句子,也可以利用上一个练习随机生成一个句子,不过我选择了训练集中的第91句,比较典型:

the can can destroy the typical fly .

  虽然违背了自然语言处理中实验的训练集与测试集分离的原则,不过考虑到这只是一个练习,另外也是为下一节做个小准备,我们就以此句话为例建立一个文件example0.test.words。不过UMDHMM还是只认数字,所以Resnik教授有为我们写了一个words2seq.pl处理此事:
  ../words2seq.pl example0.key < example0.test.words > example0.test
  example0.test就是UMDHMM可以使用的测试集了,如下所示:

T= 8
1 3 3 13 1 6 4 5

  现在就可以使用testvit,这次Resnik教授没有写错:
  ../testvit example0.hmm example0.test
  看到结果了吗?我们得到了一个隐藏状态序列:


Optimal state sequence:
T= 8
6 1 5 2 6 3 1 7

  如果之前你已经建立好了隐藏状态与词性标记的一一映射,那么就可以把它们所对应的词性标记一个一个写出来了!这个词性标注结果是否与你的期望一样?
  如果你还没有建立这个映射,那么就可以好好发挥一下想象力了!无论如何,恭喜你和52nlp一起完成了Philip Resnik教授布置的这个练习。

未完待续:词性标注5

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

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

作者 52nlp

《HMM在自然语言处理中的应用一:词性标注4》有11条评论
  1. David Chiang那篇论文扩展以后发在CL上了。另外,明年naacl是他们主办。呵呵,不过好像跟主题没什么关系:)

    [回复]

    52nlp 回复:

    写得有点一本正经了,因为很多人都知道David Chiang,所以就提到这里说说他们之间的关系了,算个小八卦,和主题的确没啥关系!

    [回复]

  2. 首先感谢这篇文章,让我对HMM的词性标注有了整体的印像。但是我这里有一个小的疑问:隐藏状态与词性标记的映射如何对应起来?这篇的测试例子下来我感觉7个状态是系统随机生成1-7个状态,并没有手工对应起来,如果在生成7个状态之前手工对应标注? 还希望52NLP同学给个提示。

    [回复]

    52nlp 回复:

    隐藏状态与词性标记的映射如何对应起来?这个本身就是对应的吧。

    手工对应和随机对应应该是一致的吧,只是这里用数字代表而已。

    [回复]

    menuvb 回复:

    先感谢52nlp的回复,看了你的第5篇HMM应用的文章,我基本上已经解决我前面提的疑问。所以我现在也可以回答我前面的问题,
    纯粹针对这篇文章(第4篇),我并不认为手工对应和随机对应应该是一致的,因为umdhmm学习的时候针对词性它是系统按照数字从小到大的生成的,然后再去对应,并不代表1就是名词,2就是动词。实际上你的第5篇文章已经回答了我的问题。
    最后还是非常感谢你的这一系列的文章。我是纯粹初学者,只是想试试利用hmm应用在中文的命名实体实别。

    [回复]

    52nlp 回复:

    解决就好!不过我所说的一致的并不是指“1就是名词,2就是动词”,而是一个id而已。

  3. 博主您好,我看到把似英语文本数字化后进行了训练,但是自始至终和“词性”一点都没关联起来啊??

    [回复]

    52nlp 回复:

    "如果之前你已经建立好了隐藏状态与词性标记的一一映射", 这里的隐藏状态的数字代表的就是词性标记,你可以认为1就是动词,二是名词,依次类推,用数字只是方便而已。

    [回复]

    learning 回复:

    非常感谢博主的回答,但我还是不太明白。这个一一映射是根据什么建立起来的呢,或者说是怎么建立起来的?1代表某个词,2又代表某个词等等,这是根据什么得来的?

    [回复]

    52nlp 回复:

    这个只要你有个词性标记文件,就可以做个map映射,用的时候先转换成数字,做完后在转化成词性,没有什么依据,可以随便指定谁是1,谁是2,但是完成之后必须按你的指定在还原回来。

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

    [回复]

发表回复

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