试图更好地理解VITERBI算法

时间:2015-10-21 15:49:19

标签: machine-learning nlp tagging viterbi

我目前正在尝试在python中实现viterbi算法,更具体地说是在线课程中提供的版本。

目前,算法以这样的方式呈现: 给定一个带有K标记的句子,我们必须生成K标记。

我们假设标签K-1 =标签K-2 ='*',然后k从0到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可以通过标签的一次迭代计算(因为我们不能提出2个不同的标签,我们基本上必须找到q * e产品最大的标签T,然后返回)。这节省了大量时间,因为我们几乎处于线性时间的大O表示法,而不是指数复杂性,如果我们遍历所有可能的单词/标签组合,我们将获得指数复杂性。

我是否正确地获得了算法的核心,或者我错过了什么?

提前致谢

1 个答案:

答案 0 :(得分:0)

  

因为我们不能提出2个不同的标签,所以我们基本上必须这样做   找到q * e产品最大的标签T,然后返回

是的,听起来是对的。 q是三元组(过渡)概率,e被称为发射概率。正如您所说,在每个阶段的不同路径之间保持不变,因此最大值仅取决于其他两个路径。

每个标记序列应以位置-2-1处的两个星号开头。所以第一个假设是正确的:

如果我们假设是位置k的最后两个标记为uv的最大概率,则基于我们刚才所说的关于开头的内容星号,基本情况是

但是在一般情况下你有两个错误。排放概率是有条件的。同样在三元组中,重复两次,并且给出的公式不正确: