锁定老帖子 主题:词性标注程序探讨
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-03-07
程序设计主要分为五个部分,即词频统计和词性符号统计、状态转移概率的计算、发射概率的计算、词性标注、性能评价。 词频统计包括训练样本中所有词(含词性)及其出现的频率的统计,用哈希表来存储,记为hash3。词性符号统计包括训练样本中每个词的词性符号及其出现的频率的统计,还包括训练样本中相邻每两个词的词性符号及其出现频率的统计,分别记为hash1和hash2。最后用一个字符串数组统计出训练样本中所有不同的词性符号,在给出的训练样本中共有34个不同种类的词性,记为table_pos[]。 状态转移概率,我采用的是两个for循环来计算的,即对table_pos[i]中每个词性,循环遍历table_pos[j],计算p(j→i)的概率,这里p(j→i)的值为hash2中含有j,i相邻的词性符号的值/hash1中j所在词性符号的值。将状态转移概率的值存储在double型数组中,记为status[][]。为提升计算精度,在计算过程中,存储的值都是取对数后的值,便于后面词性标注的计算。 发射概率,同样是同两个for循环来实现的,首先将测试文本中的所有词存储在test[]数组中,对test[]中的每个词,计算该词在词性table_pos[j]下的概率。在hash3中分别查找该词和table_pos[j]同时出现的次数,再除以hash1中j所在词性符号的值即可得到发射概率。将发射概率的值存储在double型数组observe[][]中。同样,存储的值都是取对数后的值。 词性标注,是采用Viterbi算法来实现的。这里用了三个for循环。对测试文本中的每一个词,遍历所有的词性,对每一个词性,计算该词性对应的最大概率并记录其位置,这里的最大概率为前一个词所对应的概率乘以到该词的转移概率及发射概率。将最大概率存储在double数组path[][]中,将单个词性所对应的最大概率的位置存储在int数组backpointer[][]中。最后在回溯遍历,即可找出概率最大的路径,将结果输出。 性能评价,采用和标准测试集相匹配的方式,统计标注正确的个数,再除以总标注的个数即可得到。 欢迎大家讨论留言! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-03-06
最后修改:2012-03-06
不知道楼主还在么
我测试结果 正确标注词性数:839 标注的总词数:2838 正确率:29.5630725863284% 不一样啊 |
|
返回顶楼 | |
浏览 3278 次