词性标注程序探讨

        程序设计主要分为五个部分,即词频统计和词性符号统计、状态转移概率的计算、发射概率的计算、词性标注、性能评价。

词频统计包括训练样本中所有词(含词性)及其出现的频率的统计,用哈希表来存储,记为hash3。词性符号统计包括训练样本中每个词的词性符号及其出现的频率的统计,还包括训练样本中相邻每两个词的词性符号及其出现频率的统计,分别记为hash1hash2。最后用一个字符串数组统计出训练样本中所有不同的词性符号,在给出的训练样本中共有34个不同种类的词性,记为table_pos[]

状态转移概率,我采用的是两个for循环来计算的,即对table_pos[i]中每个词性,循环遍历table_pos[j],计算p(ji)的概率,这里p(ji)的值为hash2中含有j,i相邻的词性符号的值/hash1j所在词性符号的值。将状态转移概率的值存储在double型数组中,记为status[][]。为提升计算精度,在计算过程中,存储的值都是取对数后的值,便于后面词性标注的计算。

发射概率,同样是同两个for循环来实现的,首先将测试文本中的所有词存储在test[]数组中,对test[]中的每个词,计算该词在词性table_pos[j]下的概率。在hash3中分别查找该词和table_pos[j]同时出现的次数,再除以hash1j所在词性符号的值即可得到发射概率。将发射概率的值存储在double型数组observe[][]中。同样,存储的值都是取对数后的值。

词性标注,是采用Viterbi算法来实现的。这里用了三个for循环。对测试文本中的每一个词,遍历所有的词性,对每一个词性,计算该词性对应的最大概率并记录其位置,这里的最大概率为前一个词所对应的概率乘以到该词的转移概率及发射概率。将最大概率存储在double数组path[][]中,将单个词性所对应的最大概率的位置存储在int数组backpointer[][]中。最后在回溯遍历,即可找出概率最大的路径,将结果输出。

性能评价,采用和标准测试集相匹配的方式,统计标注正确的个数,再除以总标注的个数即可得到。

欢迎大家讨论留言!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值