R语言实现viterbi算法

来源:互联网 发布:主人属下知错认罚规矩 编辑:程序博客网 时间:2024/04/30 17:41

数据集介绍

最近初学HMM(Hidden Markov Model),老师让我自己试着用Java去实现viterbi算法,结果试了一下,发现数据的输入太麻烦,因为数据集是一些各种字符串和标点符号的矩阵吧,然后才开始学习R语言的, 首先先看看数据集。

http://www.clips.uantwerpen.be/conll2000/chunking/

数据集是从上面这个网站下载的,有一个train.txt还有一个test.txt。

格式大概如下:

   He        PRP  B-NP   reckons   VBZ  B-VP   the       DT   B-NP   current   JJ   I-NP   account   NN   I-NP   deficit   NN   I-NP   will      MD   B-VP   narrow    VB   I-VP   to        TO   B-PP   only      RB   B-NP   #         #    I-NP   1.8       CD   I-NP   billion   CD   I-NP   in        IN   B-PP   September NNP  B-NP   .         .    O
这是一整句话的数据。 第一列我们称为symbol或者是word,第二列称为tag或者是标签(tag又称作状态state),第三列在这个算法中没用到,所以先不提及。
然后首先要知道viterbi算法的输入和输出,

算法输入输出

Input:

tp: transition probability matrix  (不同tag之间的转移概率矩阵, tp[i,j]表示从第i个标签,下一个单词的标签是第j个标签的概率 )

ep: emission probability matrix (表示tag和word之间的发射概率矩阵,ep[v,k]表示第v个标签下,这个标签会输出第k个单词(word/symbol)的概率 )

startp: start state probability vector (表示某个tag作为一句话开头的概率, starp[i]表示第i个tag作为句子sequence开头的概率)

test: the observation sequence need to be tagged (test 就是输入进去的一句话,是向量形式输入)

Output:

outp: it’s also a probability matrix, each row denotes each word(i.e. symbol) of thetest sequence and the column contains all the tags.(43 tags in all)

  Each element(outp[i,j]) in this matrix denotes the probability of the ithword would be tagged in the jth tag.

(我这里定义的输出可能和其他人的viterbi算法输出不太一样,这个输出了之后还要做一些后续的处理,这里的outp是一个矩阵,行是代表输入的test的每一个单词,列是代表每一个tag,然后outp[i,j]就表示第i个单词用第j个标签进行tag的概率,所以最后只需要再做一步统计每一行中最大的那一列就是这一行的那个单词的tag)

算法输入参数预测和计算

熟悉可以跳过下面这三个代码段,因为下面我要首先计算出 tp,ep,startp这三个矩阵里面的数值,首先是计算转移概率矩阵。


然后下面这部分计算输出概率矩阵

最后计算起始概率向量

Viterbi算法

然后就是重点的viterbi算法了,我用了一个function去表示这个算法。

因为是老师叫我写的自己练习练习的,当初就不知道R竟然有hmm包,然后后来用了hmm包发现结果也是差不多。
最后统计出的错误 tag:381个 在训练集中总共有47366个词,
所以准确率应该就是 381/47366= 99.19% 吧。

结尾

因为在这里我不太能区分准确率和召回率的概念,所以就简单的一除了,希望有能人帮我解答一下哈!!!

by the way, 原来发现java也有那个hmm的包,才发现自己实现和debug的时候是有多累啊。。
不过。欢迎讨论哈。。

还有整段代码都是可以运行的哈~~~


1 0
原创粉丝点击