HMM在自然语言处理中的应用一:词性标注6

  有一段时间没有谈HMM和词性标注了,今天我们继续这个系列的最后一个部分:介绍一个开源的HMM词性标注工具并且利用Brown语料库构造一个英文词性标注器。
  上一节借用umdhmm构造的HMM词性标注工具是二元语法(bigram)标注器,因为我们只考虑了前一个词性标记和当前词性标记,算的上是最基本的马尔科夫模型标注器。这个HMM词性标注器可以通过好几种方式进行扩展,一种方式就是考虑更多的上下文,不只考虑前面一个词性标记,而是考虑前面两个词性标记,这样的标注器称之为三元语法(trigram)标注器,是非常经典的一种词性标注方法,在《自然语言处理综论》及《统计自然语言处理基础》中被拿来介绍。
  正因为经典, 所以老外已经做足了功课,包括paper以及开源工具,我查了一下,其中比较有名的一个是TnT,作者既写了一篇“TnT — Statistical Part-of-Speech Tagging”,被引用869次,又开发了一套开源工具(http://www.coli.uni-saarland.de/~thorsten/tnt/),可谓“知行合一”。但是要获得这个工具必须填一个表,并且传真给对方,比较麻烦。不过幸好在英文维基百科关于词性标注的介绍页面上有替代品:Part-of-speech_tagging.
  在这个页面的“External links(外部链接)”的最后一行,提到了一个名叫Citar的利用C++开发的隐马尔科夫模型(HMM)三元语法词性标注器:
  “Citar LGPL C++ Hidden Markov Model trigram POS tagger, a Java port named Jitar is also available”
  同时,它也提供Java版本的Jitar。不过可惜,这个页面目前无法直接访问到。如果读者对这个词性标注工具感兴趣的话,这里提供一个Citar的下载链接: citar-0.0.2.zip
  以下是citar的简要介绍:
  Citar is a simple part-of-speech tagger, based on a trigram Hidden Markov Model (HMM). It (partly) implements the ideas set forth in [1]. Citaris written in C++. There is also a Java/JDK counterpart named Jitar,
which is available at: http://code.google.com/p/jitar/
  其中[1]指的是“TnT — Statistical Part-of-Speech Tagging”,其具体的实现思想在这篇文章里描述的很细致,我觉得主要需要注意的几个地方是trigram的平滑算法,未登录词的处理方法(主要是针对英文的),以及柱搜索(beam search)解码算法。
  编译citar直接make就可以了,生成三个可执行文件:train,tag,evaluate。顾名思义,“train”是用来一些必要的文件的,tag则是进行标注的,而evaluate则是用来评价标注结果的。下面我们以Brown语料库为例来演示如何使用这三个可执行程序。
  关于Brown语料库,我是从NLTK的包中得到的,NLTK提供了两个版本的语料库,一个是纯文本格式,另外一个是XML格式,都进行了词性标注,如果你对NLTK不熟悉,可以从下面两个链接直接下载这两个语料库:
  1、XML格式的brown语料库,带词性标注;
  2、普通文本格式的brown语料库,带词性标注;
  至于Brown语料库的具体介绍,大家可以参考这个页面:BROWN CORPUS MANUAL。在这个练习中,我采用的是纯文本格式的brown语料库,但是这些文件是按照类别分布在很多小文件里,并且包含很多空行,所以我处理了一下这个文件,把它们合并到一个大的文件中,并且去除了行首的空格及空行,共得到57340个带词性标注的句子(brown.corpus)。我们首先对这个语料库进行划分,从中选取前55340句作为训练集(brown.train),选取剩余的2000句作为测试集(brown.test),现在我们就来运行这三个命令。
  首先利用train来训练:
  ../train brown.train brown.lex brown.ngram
  其中输入文件是训练集brown.train,而输出文件是brown.lex及brown.ngram,如果大家还记着上一节里我也生成了两个前处理文件lex和ngram的话,那么就不难理解这两个文件的内容含义了。事实上,我当时就是模仿citar的这个预处理思想做得,只是结果文件里的格式稍有不同而已。
  有了上述两个文件,就可以利用tag进行词性标注了,我们拿citar里的一个示例句子来实验一下:
  echo “The cat is on the mat .” | ../tag brown.lex brown.ngram
  得到如下的结果:
  The/at cat/nn is/bez on/in the/at mat/nn ./.
  如果对一个没有标注的文件进行标注,可以利用如下的命令:
  ../tag brown.lex brown.ngram < input > output
  最后,我利用evaluate来验证一下基于brown.train训练出来的词性标注器的准确率,在测试集brown.test上进行测试:
  ../evaluate brown.lex brown.ngram brown.test
  得到如下的结果:
  Accuracy (known): 0.964621
  Accuracy (unknown): 0.740937
  Accuracy (overall): 0.956389
  说明这个词性标注器对于语料库中已存在的词的标注准确率是96.46%,对于未登录词的标注准确率是74.09%,而整体标注准确虑是95.63%。
  好了,关于Citar我们就到此为止,有兴趣的读者可以找一些标注好的语料库来试试,包括中文的词性标注语料库,只不过它用于英文的未登录词处理方法对于中文并不合适而已。上面所提到的几个文件,包括处理好的brown.corpus,训练集brown.train,测试集brown.test及中间生成的brown.lex,brown.ngram我已经打包放在了网络硬盘里,可以在如下地址下载:browntest.zip
  关于HMM在词性标注中的应用就说完了,再次回头说词性标注时,我会基于其他的模型来作相关的词性标注练习。下一个关于HMM在自然语言处理的应用,将会谈谈中文分词的相关问题,欢迎继续关注52nlp。

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

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

此条目发表在标注, 自然语言处理, 隐马尔科夫模型分类目录,贴了, , , , , , , , , , 标签。将固定链接加入收藏夹。

HMM在自然语言处理中的应用一:词性标注6》有 39 条评论

  1. Mars说:

    辛苦啦!

    补充一个,TreeTagger,

    http://www.ims.uni-stuttgart.de/projekte/corplex/TreeTagger/DecisionTreeTagger.html

    免费的,也很好用。下面是他们论文摘要的第一句话,

    In this paper, a new probabilistic tagging model is presented which avoids problems that Markov Model based taggers face, when they have to estimate transition probabilities from sparse data.

    我扫了一遍论文,感觉他们的模型对于词形变化比较丰富的(morphologically rich)语言(比如德语)效果会更好一些。

    [回复]

    52nlp 回复:

    谢谢!词性标注应该算的上机器学习分类方法的一个练兵场了!

    [回复]

  2. srrc说:

    现在中文词性标注的正确率能到多少了?我想在此基础上搞点基于规则的句法分析,但如果词性标注本身正确率太低,我的基础就太弱了。

    [回复]

    52nlp 回复:

    没看过这方面的文献,不太清楚,这个和标注器、语料库关系密切,可以用一些测试集测测你需要用的语料库的词性标注准确率。
    或者找找可用的词性标注器,看看他们的文档中是否描述了准确率。

    [回复]

  3. fangfei说:

    关于HMM的前向后向算法的一个问题。如果标注好的语料,可以用最大似然估计直接统计产生(pi,A,B).但是用前向后向算法也需要标注好的语料啊,那么为何不用前者,原因在哪里?小弟刚开始做这方面的学习,理解掌握不足,望多指教。

    [回复]

    52nlp 回复:

    前向后向算法本质上是不需要标注好的训练语料来学习HMM模型的,属于无监督的学习方法。但是如果有了标注好的训练语料,直接计算生成的HMM模型的效果会更好。不过并不是所有的语言都有标注好的训练语料的。

    [回复]

  4. myguoo说:

    博主你好,有个问题想请教下你。比如给出一句话,找出动词的发出者,不知道你有没这方面的经验,或者有不有相关的文献。谢谢

    [回复]

    52nlp 回复:

    不太清楚这方面的情况,你可以考虑看一下句法分析或依存句法分析方面的内容。

    [回复]

  5. waynew说:

    看52nlp有段时间了,挺好的,呵呵。最近有个问题,硕士开题结合信息检索(实验室偏重)和MT(这段时间看的比较多)哪个(些)点比较好呐,呵呵,问题可能有点大,没啥重点,希望师兄指导哈,不知师兄有没有啥想法,谢谢!

    [回复]

    52nlp 回复:

    谈不上指导,不过信息检索加机器翻译似乎最好的应用就是“跨语言信息检索”了,MSRA周明老师的自然语言计算组好像研究这个。

    [回复]

  6. 说:

    阅读你的文章受益良多!再次感谢咯!

    [回复]

    52nlp 回复:

    不客气,欢迎常来看看!

    [回复]

  7. Ricky说:

    请教一个问题:
    如果用HMM对中文进行标注,是需要先分词的吧?
    如果是HMM分词标注一体化,那么在HMM里先对句子做全切分,然后针对每一种切分,找出对应的最好的标注序列(概率最大的),然后比较每一种切分的最大概率标注序列,再找最大的那个标注序列的概率,确定下它就是那个分词和标注的结果?

    不知道我的理解是否正确。
    多谢!!!!

    [回复]

    52nlp 回复:

    HMM对中文进行标注,是需要进行切分的。
    至于分词标注一体化,我稍微有点不太明白你的描述,尤其是利用分词,可以考虑利用语言模型来找合适的分词序列,直接的切分貌似很难。

    [回复]

  8. shui说:

    最近在研究nlp,想获得文中提到的citar-0.0.2.zip 和 browntest.zip,但链接的那个网站好像倒闭了,可否再传一下到我的邮箱?

    [回复]

    52nlp 回复:

    果然出问题了,谢谢提醒,我会尽快找个新地方上传,请稍等一段时间,抱歉!

    [回复]

  9. JiangNanDeXue说:

    博主,你在这个系列中提供的下载链接似乎都不能用啊?

    [回复]

    52nlp 回复:

    参考下面的回复。

    [回复]

  10. nlper说:

    博主,你好。我是自然语言的初学者,你的文章对我启发很大,非常希望你能把下载链接重新设置下,或者帮忙发到我的邮箱,谢谢了。

    [回复]

    52nlp 回复:

    上传的微盘了,自行下载吧:
    “citar-0.0.2.rar” http://vdisk.weibo.com/s/3xqWo

    “brown.rar” http://vdisk.weibo.com/s/3xqTC

    [回复]

  11. nickrobison说:

    hello博主,citar链接又连不上去了 请问能更新下吗?多谢啦~

    [回复]

  12. 李前说:

    博主您好,
    我想问一下,我下载到了citar文件,是个压缩文件,打开后是个文件夹,然后里面还有很多文件夹和文件,接下来如何make呢?是在windows下还是linux下?是用windows命令行吗?visual studio里面行不行?

    [回复]

    52nlp 回复:

    make是在linux系统下用的,如果你想在windows下跑,最好装一个cygwin来试一下,可以google一下。

    [回复]

  13. 王亮说:

    更新下下载位置:)
    citar:
    https://github.com/danieldk/citar/tree/master/models/brown
    brown语料:
    http://nltk.github.com/nltk_data/packages/corpora/brown.zip

    [回复]

    52nlp 回复:

    赞!

    [回复]

    李冰 回复:

    您好!我向您的QQ邮箱和163邮箱发了一封求助邮件,想问您求一些语料库(网上找了很久,好像发现您有),具体情况请查看邮件。

    [回复]

    52nlp 回复:

    很神奇的是,你怎么知道我的qq邮箱和163邮箱的?不过遗憾的是我没有163邮箱,qq邮箱也没收到任何信息。

    李冰 回复:

    好吧,那您该不是发这篇文章的人http://bbs.w3china.org/dispbbs.asp?boardID=62&ID=87169
    不过,看您这个论坛是关于自然语言处理的,我是一名学生,最近在做中文垃圾短信检测系统实现,想找一些中文短信数据集(有垃圾短信和正常短信),但一直没找到,不知道您有没有关于这方面的资料信息?

    52nlp 回复:

    抱歉,没有这方面的数据

  14. stormier说:

    有一个问题想请教,如果是多机实现的baum-welch,也就是把语料库分割成多个,那么在每一台机器上用那一部分语料构造自己的模型参数,它们应该怎么合并呢?

    [回复]

    52nlp 回复:

    你是想搞map-reduce吧,不过具体合并策略抱歉我也不太清楚。

    [回复]

    stormier 回复:

    不是,就是自己实现一套并行计算机制,但是应该会建立起多个隐马尔科夫模型,不知道应该怎样合并在数学上是正确的。

    [回复]

    52nlp 回复:

    抱歉,这个不太清楚,你自己找一下并行方面相关的论文吧。

  15. Pingback引用通告: 中文分词入门之字标注法1 | 我爱自然语言处理

  16. stormier说:

    博主您好,您预处理过的browntest.zip,下载不了,可以重新上传或给发一下吗?谢谢啦LD130330@yeah.net

    [回复]

    52nlp 回复:

    抱歉,很久很久之前处理的,不知道放哪里了。不过这个是citar和brown的副产品,应该比较好生成的,你可以按介绍自己处理一下。

    [回复]

  17. wsc说:

    请问,如果我想训练HMM模型。词性有20个,word有50万,那么如果判断需要标注多少语料?谢谢

    [回复]

    52nlp 回复:

    抱歉,这个没有什么经验

    [回复]

  18. 囍儿说:

    看了文章和评论,很有帮助,楼主加油

    [回复]

发表评论

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