我目前正在尝试用python实现维特比算法,更具体地说就是在线课程中介绍的版本。
现在,算法是这样给出的:给定一个带有K个标记的句子,我们必须生成K个标记。
我们假设标签K-1 =标签K-2 = '*',那么对于从0到K的K,我们设置令牌的标签如下: tag(WORD_k) = argmax(p(k-1,tag_k-2,tag_k-1) * e( word_k,tag_k) * q(tag_k,tag_k-1,tag_k-1))
根据我的理解,这很简单,因为p参数已经在每一步上计算(我们从1开始,我们已经知道p0),e和q参数的max可以通过一次迭代标签来计算(因为我们不能想出两个不同的标签,所以我们基本上必须找到q*e乘积最大的标签T,然后返回它)。这节省了很多时间,因为我们在大O符号方面几乎是线性时间,而不是指数复杂度,如果我们迭代所有可能的单词/标签组合,就会得到指数复杂度。
我是正确地理解了算法的核心,还是遗漏了什么?
提前感谢
发布于 2015-10-22 16:10:34
由于我们不能想出两个不同的标签,我们必须找到Q*e乘积最大的标签T,并返回该标签T
是啊,听起来不错。q是三元组(转换)概率,e是发射概率。如你所说

在每个阶段的不同路径之间是不变的,因此最大值仅依赖于其他两个路径。
每个标签序列应以位置-2和-1处的两个星号开头。所以第一个假设是正确的:

如果我们假设

位置k的最后两个标签是u和v的最大概率,根据我们刚才所说的开始星号,基本情况是

。
不过,在一般情况下,您有两个错误。发射概率是有条件的。同样在三元组中,
重复两次,给出的公式不正确:
https://stackoverflow.com/questions/33263758
复制相似问题