有一段时间没有谈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

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

作者 52nlp

《HMM在自然语言处理中的应用一:词性标注6》有42条评论
  1. 辛苦啦!

    补充一个,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. 现在中文词性标注的正确率能到多少了?我想在此基础上搞点基于规则的句法分析,但如果词性标注本身正确率太低,我的基础就太弱了。

    [回复]

    52nlp 回复:

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

    [回复]

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

    [回复]

    52nlp 回复:

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

    [回复]

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

    [回复]

    52nlp 回复:

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

    [回复]

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

    [回复]

    52nlp 回复:

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

    [回复]

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

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

    [回复]

    52nlp 回复:

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

    [回复]

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

    [回复]

    52nlp 回复:

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

    [回复]

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

    [回复]

    52nlp 回复:

    参考下面的回复。

    [回复]

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

    [回复]

    52nlp 回复:

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

    [回复]

  10. 更新下下载位置:)
    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 回复:

    抱歉,没有这方面的数据

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

    [回复]

    52nlp 回复:

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

    [回复]

    stormier 回复:

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

    [回复]

    52nlp 回复:

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

  12. […]   好了,这就是字标注方法的流程和分词结果,很遗憾,这个标注器的效果不太好,不过没关系,你可以设计更好的字标注器,英文词性标注的被老外研究的太充分了,什么HMM、TBL、最大熵、条件随机场、决策树等等等等,不仅仅是方法,连开源工具都给你提供,完全可以拿来主义。   那么又怎样拿来主义设计自己的字标注中文分词器呢?不知读者可记着Citar,不记得的话可以温习一下《HMM在自然语言处理中的应用一:词性标注6》,Citar是一个“Hidden Markov Model trigram POS tagger”,需要有标注好的语料来训练相应语言的词性标注器,其核心的HMM标注框架是不依赖于语言的,但是在处理未登录词时Citar是主要利用英文词缀信息进行标注的,因此其对于英文词性标注来说效果相对较好,对于其他语言,特别是中文这种没有词形变化的孤立语来说,其词性标注效果要打一点折扣。不过没关系,这里主要谈的是思想,而不是工程上的应用,因此暂时可以忽略这点影响,对于本文利用其所设计的字标注器来说,同样适用。   可是哪里有这样的训练语料呢?俗话说得好:自己动手,丰衣足食。虽然没有哪个组织提供这样的字标注语料库,但是我们有SIGHAN Bakeoff提供的icwb2-data,你完全可以利用自己熟悉的编程语言写一个前处理程序,将其转换为我们所需要的字标注训练语料库形式。下一节我们将以微软亚洲研究院提供的中文分词语料为例,利用Citar完成一个基于HMM trigram的字标注中文分词程序。 […]

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

    [回复]

    52nlp 回复:

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

    [回复]

    hulayama 回复:

    下载brown.zip解压后,去除不相关的文件,执行
    $ cat * | sed /^[[:space:]]*$/d | sed 's/^[ \t]*//g' > brown.corpus
    $ head -n 55340 brown.corpus > brown.train
    $ tail -n 2000 brown.corpus > brown.test

    [回复]

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

    [回复]

    52nlp 回复:

    抱歉,这个没有什么经验

    [回复]

发表回复

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