有一段时间没有谈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
辛苦啦!
补充一个,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 回复:
10 12 月, 2009 at 19:57
谢谢!词性标注应该算的上机器学习分类方法的一个练兵场了!
[回复]
现在中文词性标注的正确率能到多少了?我想在此基础上搞点基于规则的句法分析,但如果词性标注本身正确率太低,我的基础就太弱了。
[回复]
52nlp 回复:
15 12 月, 2009 at 18:29
没看过这方面的文献,不太清楚,这个和标注器、语料库关系密切,可以用一些测试集测测你需要用的语料库的词性标注准确率。
或者找找可用的词性标注器,看看他们的文档中是否描述了准确率。
[回复]
关于HMM的前向后向算法的一个问题。如果标注好的语料,可以用最大似然估计直接统计产生(pi,A,B).但是用前向后向算法也需要标注好的语料啊,那么为何不用前者,原因在哪里?小弟刚开始做这方面的学习,理解掌握不足,望多指教。
[回复]
52nlp 回复:
6 1 月, 2010 at 19:23
前向后向算法本质上是不需要标注好的训练语料来学习HMM模型的,属于无监督的学习方法。但是如果有了标注好的训练语料,直接计算生成的HMM模型的效果会更好。不过并不是所有的语言都有标注好的训练语料的。
[回复]
博主你好,有个问题想请教下你。比如给出一句话,找出动词的发出者,不知道你有没这方面的经验,或者有不有相关的文献。谢谢
[回复]
52nlp 回复:
7 1 月, 2010 at 20:39
不太清楚这方面的情况,你可以考虑看一下句法分析或依存句法分析方面的内容。
[回复]
看52nlp有段时间了,挺好的,呵呵。最近有个问题,硕士开题结合信息检索(实验室偏重)和MT(这段时间看的比较多)哪个(些)点比较好呐,呵呵,问题可能有点大,没啥重点,希望师兄指导哈,不知师兄有没有啥想法,谢谢!
[回复]
52nlp 回复:
10 1 月, 2010 at 22:57
谈不上指导,不过信息检索加机器翻译似乎最好的应用就是“跨语言信息检索”了,MSRA周明老师的自然语言计算组好像研究这个。
[回复]
阅读你的文章受益良多!再次感谢咯!
[回复]
52nlp 回复:
18 3 月, 2011 at 21:21
不客气,欢迎常来看看!
[回复]
请教一个问题:
如果用HMM对中文进行标注,是需要先分词的吧?
如果是HMM分词标注一体化,那么在HMM里先对句子做全切分,然后针对每一种切分,找出对应的最好的标注序列(概率最大的),然后比较每一种切分的最大概率标注序列,再找最大的那个标注序列的概率,确定下它就是那个分词和标注的结果?
不知道我的理解是否正确。
多谢!!!!
[回复]
52nlp 回复:
25 8 月, 2011 at 20:41
HMM对中文进行标注,是需要进行切分的。
至于分词标注一体化,我稍微有点不太明白你的描述,尤其是利用分词,可以考虑利用语言模型来找合适的分词序列,直接的切分貌似很难。
[回复]
最近在研究nlp,想获得文中提到的citar-0.0.2.zip 和 browntest.zip,但链接的那个网站好像倒闭了,可否再传一下到我的邮箱?
[回复]
52nlp 回复:
9 12 月, 2011 at 09:23
果然出问题了,谢谢提醒,我会尽快找个新地方上传,请稍等一段时间,抱歉!
[回复]
博主,你在这个系列中提供的下载链接似乎都不能用啊?
[回复]
52nlp 回复:
27 3 月, 2012 at 22:30
参考下面的回复。
[回复]
博主,你好。我是自然语言的初学者,你的文章对我启发很大,非常希望你能把下载链接重新设置下,或者帮忙发到我的邮箱,谢谢了。
[回复]
52nlp 回复:
27 3 月, 2012 at 22:29
上传的微盘了,自行下载吧:
"citar-0.0.2.rar" http://vdisk.weibo.com/s/3xqWo
"brown.rar" http://vdisk.weibo.com/s/3xqTC
[回复]
hello博主,citar链接又连不上去了 请问能更新下吗?多谢啦~
[回复]
博主您好,
我想问一下,我下载到了citar文件,是个压缩文件,打开后是个文件夹,然后里面还有很多文件夹和文件,接下来如何make呢?是在windows下还是linux下?是用windows命令行吗?visual studio里面行不行?
[回复]
52nlp 回复:
16 10 月, 2013 at 11:14
make是在linux系统下用的,如果你想在windows下跑,最好装一个cygwin来试一下,可以google一下。
[回复]
更新下下载位置:)
citar:
https://github.com/danieldk/citar/tree/master/models/brown
brown语料:
http://nltk.github.com/nltk_data/packages/corpora/brown.zip
[回复]
52nlp 回复:
2 12 月, 2013 at 12:48
赞!
[回复]
李冰 回复:
4 12 月, 2013 at 16:22
您好!我向您的QQ邮箱和163邮箱发了一封求助邮件,想问您求一些语料库(网上找了很久,好像发现您有),具体情况请查看邮件。
[回复]
52nlp 回复:
6 12 月, 2013 at 15:32
很神奇的是,你怎么知道我的qq邮箱和163邮箱的?不过遗憾的是我没有163邮箱,qq邮箱也没收到任何信息。
李冰 回复:
6 12 月, 2013 at 16:24
好吧,那您该不是发这篇文章的人http://bbs.w3china.org/dispbbs.asp?boardID=62&ID=87169
不过,看您这个论坛是关于自然语言处理的,我是一名学生,最近在做中文垃圾短信检测系统实现,想找一些中文短信数据集(有垃圾短信和正常短信),但一直没找到,不知道您有没有关于这方面的资料信息?
52nlp 回复:
6 12 月, 2013 at 16:45
抱歉,没有这方面的数据
有一个问题想请教,如果是多机实现的baum-welch,也就是把语料库分割成多个,那么在每一台机器上用那一部分语料构造自己的模型参数,它们应该怎么合并呢?
[回复]
52nlp 回复:
9 12 月, 2013 at 10:48
你是想搞map-reduce吧,不过具体合并策略抱歉我也不太清楚。
[回复]
stormier 回复:
9 12 月, 2013 at 11:01
不是,就是自己实现一套并行计算机制,但是应该会建立起多个隐马尔科夫模型,不知道应该怎样合并在数学上是正确的。
[回复]
52nlp 回复:
9 12 月, 2013 at 20:39
抱歉,这个不太清楚,你自己找一下并行方面相关的论文吧。
[…] 好了,这就是字标注方法的流程和分词结果,很遗憾,这个标注器的效果不太好,不过没关系,你可以设计更好的字标注器,英文词性标注的被老外研究的太充分了,什么HMM、TBL、最大熵、条件随机场、决策树等等等等,不仅仅是方法,连开源工具都给你提供,完全可以拿来主义。 那么又怎样拿来主义设计自己的字标注中文分词器呢?不知读者可记着Citar,不记得的话可以温习一下《HMM在自然语言处理中的应用一:词性标注6》,Citar是一个“Hidden Markov Model trigram POS tagger”,需要有标注好的语料来训练相应语言的词性标注器,其核心的HMM标注框架是不依赖于语言的,但是在处理未登录词时Citar是主要利用英文词缀信息进行标注的,因此其对于英文词性标注来说效果相对较好,对于其他语言,特别是中文这种没有词形变化的孤立语来说,其词性标注效果要打一点折扣。不过没关系,这里主要谈的是思想,而不是工程上的应用,因此暂时可以忽略这点影响,对于本文利用其所设计的字标注器来说,同样适用。 可是哪里有这样的训练语料呢?俗话说得好:自己动手,丰衣足食。虽然没有哪个组织提供这样的字标注语料库,但是我们有SIGHAN Bakeoff提供的icwb2-data,你完全可以利用自己熟悉的编程语言写一个前处理程序,将其转换为我们所需要的字标注训练语料库形式。下一节我们将以微软亚洲研究院提供的中文分词语料为例,利用Citar完成一个基于HMM trigram的字标注中文分词程序。 […]
博主您好,您预处理过的browntest.zip,下载不了,可以重新上传或给发一下吗?谢谢啦LD130330@yeah.net
[回复]
52nlp 回复:
8 1 月, 2014 at 05:59
抱歉,很久很久之前处理的,不知道放哪里了。不过这个是citar和brown的副产品,应该比较好生成的,你可以按介绍自己处理一下。
[回复]
hulayama 回复:
9 9 月, 2018 at 15:54
下载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
[回复]
请问,如果我想训练HMM模型。词性有20个,word有50万,那么如果判断需要标注多少语料?谢谢
[回复]
52nlp 回复:
30 3 月, 2015 at 11:03
抱歉,这个没有什么经验
[回复]
看了文章和评论,很有帮助,楼主加油
[回复]
你好,可以给我发一下原码和语料吗?非常感谢
[回复]
52nlp 回复:
11 9 月, 2020 at 09:18
10年前的文章了,很多都没了
[回复]