基于一阶HMM的中文词性标注(Java实现)

来源:互联网 发布:淘宝卡宾代购店铺 编辑:程序博客网 时间:2024/05/01 21:34
关于HMM模型,这里不多做讲解,推荐几篇个人认为不错的文章。

http://blog.csdn.net/likelet/article/details/7056068
这篇文章从数学和算法的详细地讲述了什么是隐马尔科夫模型以及相关应用和对应的算法。
http://www.yanyiwu.com/work/2014/04/07/hmm-segment-xiangjie.html
这篇文章抛开了繁杂的数学公式,以中文分词为例简明扼要地讲述了基于HMM的viterbi算法如何实现。

看完上面的文章,你一定能够理解HMM并有了viterbi算法的实现思路。
我打算说的是在用Java实现一阶HMM词性标注的过程中我认为一些值得注意的地方。
1.对于中文词性标注ObservedSet,TransProbMatrix,EmitRobMatrix,InitStatus是已知的,求解的是状态值序列StatusSet
采用何种数据结构存储已知条件?
ObservedSet就是做好分词的单句,用string存放即可;词性种类已知且较少,因此TransProbMatrix,InitStatus可以用数组存储。
EmitRobMatrix是个稀疏矩阵,且查找时需要索引。所以用HashMap[]方便快捷。
2.如何获得TransProbMatrix,EmitRobMatrix,InitStatus的值?
获得这三个矩阵的统计数据,我们需要一个做好词性标注的训练语料,依据这三个矩阵的定义进行统计。依据不同的语料库的格式,字符串处理上有细微差别。
3.如何处理未登录词?
如果不处理未登录词,在回溯求解状态序列时可能导致程序崩溃。因为据统计大多数未登录词都属于名词,因此我将n作为了未登录词唯一可能的词性返回。
也可以按照未登录词的统计规律返回词性可能情况。
4.语料库不够大时产生的all StatusSets impossible的问题
如果语料库不够大,可能产生即使处理未登录词之后,仍然产生所有状态组都不可能的情况。我在做一阶HMM分词的时候遇到过这种情况。
这时可以采用一种“妥协”的办法防止程序崩溃:忽略EmitRobMatrix,即在最初出现不可能问题的观察值处,认为所有的状态下都有可能出现该观察值且是等可能的。但这并不是一种很好的解决方法。我认为最好的办法就是换一个足够大的语料库进行训练。
5.封闭集测试正确率问题
实验中我发现提高EmitRobMatrix的权重,能够提高封闭集测试正确率。(仅对我所用的训练语料而言)但是没有做过更深入的研究。欢迎感兴趣的朋友前来指点或探讨。
源代码和测试语料,训练语料见:https://github.com/jimth001/NLP-participle-and-speech-tagging

转载请注明出处
0 0
原创粉丝点击