条件随机场之crf++源码详解-预测(代码片段)

duma duma     2023-03-03     354

关键词:

  这篇文章主要讲解CRF++实现预测的过程,预测的算法以及代码实现相对来说比较简单,所以这篇文章理解起来也会比上一篇条件随机场训练的内容要容易。

预测

  上一篇条件随机场训练的源码详解中,有一个地方并没有介绍。 就是训练结束后,会把待优化权重alpha等变量保存到文件中,也就是输出到指定的模型文件。在执行预测的时候会从模型文件读出相关的变量,这个过程其实就是数据序列化与反序列化,该过程跟条件随机场算法关系不大,因此为了突出重点源码解析里就没有介绍这部分,有兴趣的朋友可以自己研究一下。

  CRF++预测的入口代码在crf_test.cpp的main函数中,最终会调用tragger.cpp的int crfpp_test(const Param &param)函数,期间会做一些输入参数的处理、异常处理、读取模型文件等操作。一切准备就绪就会打开待预测的文件,进行预测。正式探讨预测代码之前,我们先看下预测的理论基础。条件随机场的预测用到了维特比算法,公式如下:

eginaligned y^* &= arg max_yP_w(y|x) \ &=  arg max_yfrac exp left sum_k=1^Kw_kf_k(y,x) ightZ_w(x) \ &=  arg max_y exp left sum_k=1^Kw_kf_k(y,x) ight \ &= arg max_y sum_k=1^Kw_kf_k(y,x) endaligned

从公式我们可以看出,我们求的概率最大值就是要求代价最大。接下来就看下CRF++的源码,代码在tragger.cpp的crfpp_test函数中:

while (*is) //is是打开的测试文件,可以输入多个测试文件做预测
      tagger.parse_stream(is.get(), os.get()); 


bool TaggerImpl::parse_stream(std::istream *is,
                              std::ostream *os) 
  if (!read(is) || !parse()) //read函数在特征篇讲过,不再赘述,调用parse函数进行预测
    return false;
  
  if (x_.empty()) 
    return true;
  
  toString(); //格式化输出,-v 会输出每个词预测为某个label的概率,-n会输出预测序列概率最大的前n个,如果理解上一篇训练过程,再看这个函数就比较容易理解,无非就是概率计算,这里不再赘述
  os->write(os_.data(), os_.size()); //输出到输出文件
  return true;

bool TaggerImpl::parse() 
  CHECK_FALSE(feature_index_->buildFeatures(this)) //构建特征,同特征篇代码,不再赘述
      << feature_index_->what();

  if (x_.empty()) 
    return true;
  
  buildLattice(); //构建无向图,因为要计算代价最大的序列,训练篇讲过,不再赘述
  if (nbest_ || vlevel_ >= 1) 
    forwardbackward(); //前向后向算法,为了计算单词节点的概率,训练篇讲过,不再赘述
  
  viterbi();  //维特比算法, 做预测的代码
  if (nbest_) 
    initNbest();
  

  return true;

void TaggerImpl::viterbi() 
  for (size_t i = 0;   i < x_.size(); ++i)  //遍历每个词
    for (size_t j = 0; j < ysize_; ++j)  //遍历每个词的每个label
      double bestc = -1e37;
      Node *best = 0;
      const std::vector<Path *> &lpath = node_[i][j]->lpath;
      for (const_Path_iterator it = lpath.begin(); it != lpath.end(); ++it)  //从前一个词到当前词的代价之和 = max(前一个节点的代价 + 前一个节点的边代价 + 当前节点代价)
        double cost = (*it)->lnode->bestCost +(*it)->cost +
            node_[i][j]->cost;
        if (cost > bestc)  //记录截止当前节点最大的代价, 以及对应的前一个节点
          bestc = cost;
          best  = (*it)->lnode;
        
      
      node_[i][j]->prev     = best; //记录前一个几点
      node_[i][j]->bestCost = best ? bestc : node_[i][j]->cost; //记录最大的代价值, 如果best = 0代表第一个词,没有左边,最大代价就是节点的代价node_[i][j]->cost
    
  

  double bestc = -1e37;
  Node *best = 0;
  size_t s = x_.size()-1;
  for (size_t j = 0; j < ysize_; ++j)  //遍历最后一个词的节点,截止到最后一个词的代价最大值就是整个句子的最大代价
    if (bestc < node_[s][j]->bestCost) 
      best  = node_[s][j];
      bestc = node_[s][j]->bestCost;
    
  

  for (Node *n = best; n; n = n->prev) //记录代价最大的预测序列
    result_[n->x] = n->y;
  

  cost_ = -node_[x_.size()-1][result_[x_.size()-1]]->bestCost;

 预测的核心代码就看完了,大部分复用了训练过程的逻辑。可以看到预测的过程跟公式是一致的,无非就是求能够让代价最大的label序列(标记序列),这就是维特比算法。

总结

  至此,我们的条件随机场之CRF++源码详解系列就结束了,主要涵盖了特征处理、训练以及预测三个核心过程。结合CRF++源码我们可以更形象的、更通俗的去理解条件随机场模型。以后想起条件随机场模型,我们脑海浮现的不再是一堆公式,而是一个无向图,在图上进行代价计算、前向后向计算、期望值的计算以及梯度的计算等一系列的过程。希望这个系列对于正在学习条件随机场的朋友能有帮助,如果本文阐述的有歧义、不通俗、不容易理解的地方,欢迎留言区交流,我将及时更正、回复,希望我们一起提高。

 

条件随机场之crf++源码详解-开篇

介绍  最近在用条件随机场做切分标注相关的工作,系统学习了下条件随机场模型。能够理解推导过程,但还是比较抽象。因此想研究下模型实现的具体过程,比如:1)状态特征和转移特征具体是什么以及如何构造2)前向后... 查看详情

条件随机场入门条件随机场的预测算法

...预测问题是给定模型参数和输入序列(观测序列)x,求条件概率最大的输出序列(标记序列)$y^*$,即对观测序列进行标注。条件随机场的预测算法同HMM还是维特比算法,根据CRF模型可得:egin{aligned}y^*&=argmax_yP_w(y|x)\&= ... 查看详情

tensorflow学习(十四):条件随机场crf(代码片段)

参考:Module:tf.contrib.crf还有一些其他的函数可以到官方文档里面查看和使用.Ⅰtf.contrib.crf.crf_log_likelihoodcrf_log_likelihood(inputs,tag_indices,sequence_lengths,transition_params=None)在一个条件随机场里面计算标签序列的log-likelihood参数:in 查看详情

nlp入门使用crf++实现命名实体识别(ner)(代码片段)

CRF与NER简介??CRF,英文全称为conditionalrandomfield,中文名为条件随机场,是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型,其特点是假设输出随机变量构成马尔可夫(Markov)随机场。??较为简单的条件随机场... 查看详情

条件随机场(crf)-基础

  条件随机场(conditionalrandomfields,简称CRF,或CRFs)下文简称CRF,是一种典型的判别模型,相比隐马尔可夫模型可以没有很强的假设存在,在分词、词性标注、命名实体识别等领域有较好的应用。CRF是在马尔可夫随机场的基础... 查看详情

ml-13-5条件随机场(crf-conditionalrandomfield)

目录知识串讲HMMVSMEMM从随机场到马尔科夫随机场条件随机场(CRF)MRF因子分解定理线性链条件随机场(Linear-CRF)一句话简介:条件随机场(ConditionalRandomFields,以下简称CRF)是给定一组输入序列条件下另一组输出序列的条件概率分布模型... 查看详情

ml-13-6条件随机场的三个问题(crf-conditionalrandomfield)

目录条件随机场CRF——前向后向算法评估标记序列概率条件随机场CRF——模型参数学习条件随机场CRF——维特比算法解码一、条件随机场CRF——前向后向算法评估标记序列概率  linear-CRF第一个问题是评... 查看详情

条件随机场(crf)占坑,待补充

CRF看了好久,一直感觉理解不太透彻,今天按照52自然语言处理运行了一下CRF++,先占坑,等忙完毕设,好好整理一下CRF与HMM(20181026)  查看详情

crf条件随机场

CRF的进化https://flystarhe.github.io/2016/07/13/hmm-memm-crf/参考:http://blog.echen.me/2012/01/03/introduction-to-conditional-random-fields/ 标记偏置问题:MEMM最大熵马尔可夫模型  路径1-1-1-1的概率:0.4*0.45*0.5=0 查看详情

nlp——图模型条件随机场(conditionalrandomfield,crf)

...rkovrandomfield,无向图模型)简单回顾   (二)条件随机场(Conditionalrandomfield,CRF)    这篇写的非常浅,基于[1]和[5]梳理。感觉[1]的讲解很 查看详情

条件随机场(crf)-1-简介(转载)

转载自:http://www.68idc.cn/help/jiabenmake/qita/20160530618222.html   首先我们先弄懂什么是“条件随机场”,然后再探索其详细内容。        于是,先介绍几个名词。马尔可夫链    & 查看详情

条件随机场(crf)-2-定义和形式(转载)

    转载自:http://www.68idc.cn/help/jiabenmake/qita/20160530618218.html     参考书本:《2012.李航.统计学习方法.pdf》     书上首先介绍概率无向图模型,然后叙述条件随机场的定义和 查看详情

条件随机场摘要

条件随机场(ConditionalRandomFields,以下简称CRF)是给定一组输入序列条件下另一组输出序列的条件概率分布模型,在自然语言处理中得到了广泛应用。HMM引入了马尔科夫假设,即当前时刻的状态只与其前一时刻的状态有关,HMM是一种... 查看详情

条件随机场crf介绍

...示 逐帧softmax并没有直接考虑输出的上下文关联 条件 查看详情

条件随机场

...calT$上进行对数似然函数$mathcalL$的极大化。根据上一篇《条件随机场(三)》,我们知道线性链CRF的模型为egin{equation}p_{vec{lambda}}(vecy|vecx)=frac1{Z_{vec{lambda}}(vecx)}exp( 查看详情

条件随机场

概述条件随机场(conditionalrandomfield,CRF)是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型,其特点是假设输出随机变量构成马尔可夫随机场。条件随机场可以用于不同的预测问题,本章主要讲述线性链(linearc... 查看详情

浅谈分词算法基于字的分词方法(crf)

目录前言目录条件随机场(conditionalrandomfieldCRF)核心点线性链条件随机场简化形式CRF分词CRFVSHMM代码实现训练代码实验结果参考文献前言通过前面几篇系列文章,我们从分词中最基本的问题开始,并分别利用了1-gram和HMM的方法实... 查看详情

隐马尔可夫(hmm)/感知机/条件随机场(crf)----词性标注(代码片段)

笔记转载于GitHub项目:https://github.com/NLP-LOVE/Introduction-NLP7.词性标注7.1词性标注概述什么是词性在语言学上,词性(Par-Of-Speech,Pos)指的是单词的语法分类,也称为词类。同一个类别的词语具有相似的语法性质,所有词性的集合称为... 查看详情