我正在使用 Viterbi 算法在 Python 中编写概率词性标注器。在这种情况下,时间 t 处的维特比概率是上一个时间步 t-1 的维特比路径概率、从前一个词性标签到当前词性标签的转移概率和观察到的单词的发射概率的乘积POS 标签。我通过查看句子中的每个单词来计算这一点以上。可以在这里找到一个简单的伪代码实现。
重复乘以概率的一个实际问题是它可能导致下溢。文献中经常提出的一种解决方案是使用对数概率。据我了解,您应该这样做:
current_probability = math.log(emission_probability) + math.log(transition_probability) + previous_probability
代替
current_probability = emission_probability * transition_probability * previous_probability
假设这三个概率存储在相应的变量中。
然而,我发现难以掌握的一个问题是,当发射概率或转移概率为 0 时该怎么办。Michael Collins 写道:“新算法的一个问题是 log 0 = -∞。需要注意处理等于 0 的概率值。一个简单的解决方案是设置 log 0 = -B,其中 B 是一个大数。
我应该使用多大的数字?-math.inf
?