基于特定语料的HMM模型计算和Viterbi算法的实现

     HMM,它用来描述一个含有隐含未知参数的马尔可夫过程。其难点是从可观察的参数中确定该过程的隐含参数(后面要讨论到的Viterbi算法)。然后利用这些参数来作进一步的分析,例如模式识别。在中文信息处理方面,它主要用于词性标注,计算机并不知道一句话中某个词的具体词性,需要通过相应的模型和算法来使计算机能够识别出一句话中具体某个词的词性,那么模型就是某个HMM,算法就是在此模型上的Viterbi算法。

     我的工作是以北大1998年1月份的语料为基础,求出此HMM,然后在这个HMM的基础之上设计Viterbi算法,实现将一句已经分好词的句子进行词性自动标注。下面就将我的学习成果和大家一起分享,有不对的地方请大家指正

    HMM中包含的三个值分别是:初始分布、转移矩阵、发射矩阵。

    初始分布就是一个隐藏状态的初始概率分布。就词性标注来说,初始分布表示的是一句话中第一个词是什么词性的概率分布。

   转移矩阵:如果有N个隐藏了的状态(词性),那么转移矩阵就是一个N*N的矩阵,它的元素表示的是一种状态转化到另一种状态的概率。

   发射矩阵:有时也称为混淆矩阵,它的行表示的是状态(词性),它的列所表示的是(词语),它的元素表示在给定一个词性(n)的情况下,它是(中国)的概率。   

      维特比算法提供了一种有效的计算方法来分析隐马尔科夫模型的观察序列,并捕获最可能的隐藏状态序列。它利用递归减少计算量,并使用整个序列的上下文来做判断,从而对包含噪音的序列也能进行良好的分析。
  在使用时,维特比算法对于网格中的每一个单元(cell)都计算一个局部概率,同时包括一个反向指针用来指示最可能的到达该单元的路径。当完成整个计算过程后,首先在终止时刻找到最可能的状态,然后通过反向指针回溯t=1时刻,这样回溯路径上的状态序列就是最可能的隐藏状态序列了。

下面是我实现的Viterbi算法的核心代码
typedef struct viterBiNode
{
   double probity;
   int backpointer;   
}ViterBiNode;//算法需要用到的结构体
 for(int j=0;j<num;j++)//列或者是词
 {
  for(int i=0;i<N;i++)//行
  {   if(j==0)//第一个词
      vbNode[i][j].probity = mynode[i].probity*MyEmitArray[i][wordLocation];
       
      else//其他的词
       {
             double mymax=0.0f;
             int myloc=-1;
             for(int t=0;t<N;t++)//找出前一时刻局部概率和转移概率乘积最大的一个
             {
                double temp=0.0f;
                temp=vbNode[t][j-1].probity*ChangeResultArray[t][i];//局部概率和转移概率乘积
                if(mymax<temp)
                {
                      mymax=temp;//将乘下来的值最大的赋给mymax
                      myloc=t;//记录反向指针
                 }
              }
              vbNode[i][j].backpointer=myloc;//求得反向指针
              wordLocation=WordSearch(MyWordArray,tempstr,myWordnumber);
              vbNode[i][j].probity=mymax*MyEmitArray[i][wordLocation];
               //局部概率和转移概率和观察概率的乘积
               
              if(j>=num-1)//最后一个词语时可以算出结果
               {
                 if(pMax<vbNode[i][j].probity)
                  { 
                     pMax=vbNode[i][j].probity;
                      pPos=i;
                   }
             
               }
   
   
        }
  }
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个关于基于HMM的词性标注的实验任务,需要实现Viterbi算法,并编写评价程序计算准确率。下面是具体的实现步骤: 任务1: 1. 首先需要准备训练数据和测试数据。训练数据是已经标注好词性的语料库,测试数据是未标注词性的句子。 2. 然后需要统计训练数据中每个单词出现的频率以及每个单词在不同词性下出现的频率。这些频率信息将用于计算HMM模型中的转移概率和发射概率。 3. 接下来需要定义HMM模型的参数,包括状态集合、初始概率、转移概率和发射概率。状态集合指的是所有可能的词性,初始概率指的是在句子开始时,各个词性出现的概率。转移概率指的是在已知前一个词性的情况下,当前词性出现的概率。发射概率指的是在已知当前词性的情况下,当前单词出现的概率。 4. 然后使用Viterbi算法对测试数据进行词性标注。Viterbi算法的具体实现步骤为:首先初始化状态概率和路径概率,然后对于每个单词,计算到达该单词的最大路径概率和对应的状态,最后回溯路径,得到最优的词性序列。 任务2: 1. 对于每个测试句子,使用Viterbi算法得到词性序列。 2. 将得到的词性序列与测试数据中的正确词性序列进行比较,计算准确率。 3. 准确率的计算公式为:准确率 = 正确标注的单词数 / 总单词数。 以上就是基于HMM的词性标注的实现步骤。请根据上述步骤进行实验,如有疑问可以再问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值