有一段时间没有谈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
相关文章:
辛苦啦!
补充一个,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 回复:
十二月 10th, 2009 at 19:57
谢谢!词性标注应该算的上机器学习分类方法的一个练兵场了!
[回复]
现在中文词性标注的正确率能到多少了?我想在此基础上搞点基于规则的句法分析,但如果词性标注本身正确率太低,我的基础就太弱了。
[回复]
52nlp 回复:
十二月 15th, 2009 at 18:29
没看过这方面的文献,不太清楚,这个和标注器、语料库关系密切,可以用一些测试集测测你需要用的语料库的词性标注准确率。
或者找找可用的词性标注器,看看他们的文档中是否描述了准确率。
[回复]
关于HMM的前向后向算法的一个问题。如果标注好的语料,可以用最大似然估计直接统计产生(pi,A,B).但是用前向后向算法也需要标注好的语料啊,那么为何不用前者,原因在哪里?小弟刚开始做这方面的学习,理解掌握不足,望多指教。
[回复]
52nlp 回复:
一月 6th, 2010 at 19:23
前向后向算法本质上是不需要标注好的训练语料来学习HMM模型的,属于无监督的学习方法。但是如果有了标注好的训练语料,直接计算生成的HMM模型的效果会更好。不过并不是所有的语言都有标注好的训练语料的。
[回复]
博主你好,有个问题想请教下你。比如给出一句话,找出动词的发出者,不知道你有没这方面的经验,或者有不有相关的文献。谢谢
[回复]
52nlp 回复:
一月 7th, 2010 at 20:39
不太清楚这方面的情况,你可以考虑看一下句法分析或依存句法分析方面的内容。
[回复]
看52nlp有段时间了,挺好的,呵呵。最近有个问题,硕士开题结合信息检索(实验室偏重)和MT(这段时间看的比较多)哪个(些)点比较好呐,呵呵,问题可能有点大,没啥重点,希望师兄指导哈,不知师兄有没有啥想法,谢谢!
[回复]
52nlp 回复:
一月 10th, 2010 at 22:57
谈不上指导,不过信息检索加机器翻译似乎最好的应用就是“跨语言信息检索”了,MSRA周明老师的自然语言计算组好像研究这个。
[回复]
阅读你的文章受益良多!再次感谢咯!
[回复]
52nlp 回复:
三月 18th, 2011 at 21:21
不客气,欢迎常来看看!
[回复]
请教一个问题:
如果用HMM对中文进行标注,是需要先分词的吧?
如果是HMM分词标注一体化,那么在HMM里先对句子做全切分,然后针对每一种切分,找出对应的最好的标注序列(概率最大的),然后比较每一种切分的最大概率标注序列,再找最大的那个标注序列的概率,确定下它就是那个分词和标注的结果?
不知道我的理解是否正确。
多谢!!!!
[回复]
52nlp 回复:
八月 25th, 2011 at 20:41
HMM对中文进行标注,是需要进行切分的。
至于分词标注一体化,我稍微有点不太明白你的描述,尤其是利用分词,可以考虑利用语言模型来找合适的分词序列,直接的切分貌似很难。
[回复]
最近在研究nlp,想获得文中提到的citar-0.0.2.zip 和 browntest.zip,但链接的那个网站好像倒闭了,可否再传一下到我的邮箱?
[回复]
52nlp 回复:
十二月 9th, 2011 at 09:23
果然出问题了,谢谢提醒,我会尽快找个新地方上传,请稍等一段时间,抱歉!
[回复]