基于一阶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
- 基于一阶HMM的中文词性标注(Java实现)
- 一阶HMM词性标注
- python实现的基于hmm模型的词性标注系统
- 转载 基于HMM模型的词性标注
- 基于一阶 HMM 标注序列算法的分词算法解析
- 中文词性标注的简单实现
- 自然语言处理基于java实现(2) 之 词性标注
- 词性标注的python实现-基于平均感知机算法
- 词性标注的python实现-基于平均感知机算法
- HMM算法-viterbi算法的实现及与分词、词性标注、命名实体识别的引用
- 简单感知器实现中文词性标注
- 基于HMM中文词性标记(一)——汉语词性对照表[北大标准/中科院标准]
- 中文词性标注
- 中文词性标注
- 基于HMM的中文分词模型实现
- HMM模型用在词性标注、分词
- viterbi用于中文词性标注
- 中文分词与词性标注
- STL-find,find_if函数
- tomcat 启动报错
- linux文件操作学习2
- POJ-3187(Backward Digit Sums)(全排列+dfs())
- leetcode 223. Rectangle Area
- 基于一阶HMM的中文词性标注(Java实现)
- HBase 完全分布式的安装
- bzoj3160 万径人踪灭 FFT+manacher
- Leetcode: 107. Binary Tree Level Order Traversal II(JAVA)
- 嵌入式linux:SDL ./config之后出现错误
- 使用open vswitch构建虚拟网络
- online_judge_1517
- 使用log4j获取SQL语句
- python学习:机器学习下的pybrain和多线程编程