我正在使用Viterbi算法在Python中编码语音标记器的概率部分。在此背景下,时间t处的Viterbi概率是Viterbi路径概率从前一时间步骤t-1、从前一个POS标签到当前POS标记的转换概率以及给定POS标记的观察词的发射概率的乘积。我是通过在句子中的每个单词来计算这一点的,查看每个标记/状态在这个时候是可能的(从观察到的训练数据),然后为每个可能的标记计算到这个状态的最可能的路径,由上面解释的维特比概率给出。一个简单的psuedo代码实现可以找到这里。
重复增加概率的一个实际问题是,它可能导致潜流。文献中经常提出的解决方案之一是使用日志概率。据我所知,你应该这样做:
current_probability = math.log(emission_probability) + math.log(transition_probability) + previous_probability而不是
current_probability = emission_probability * transition_probability * previous_probability假设这三个概率存储在相应的变量中。
然而,我发现一个很难理解的问题是,当发射概率或跃迁概率为0时,该怎么办。迈克尔·柯林斯:“新算法的一个问题是log 0 =−∞,需要谨慎处理等于0的概率值。一个简单的解决方案是设置log0=−B,其中B是一个大数。”
我应该使用多大的号码?-math.inf
发布于 2022-10-09 12:10:45
处理这一问题的一种方法是添加一些平滑的方法,比如https://i.stack.imgur.com/LdNgP.png,
局部变量
word_tag :训练语料库中单词的计数。tag_total :标记为标签的单词的数量,如:I.E.P(word= TAG )
https://stackoverflow.com/questions/64369396
复制相似问题