Fork me on GitHub

CRF++简单使用

工具的简单介绍

  对该工具的安装及介绍我这里就不再赘述,请参考官方文档或者国内一些翻译后的中文版.也还比较清楚.

我只介绍一下crf++在命名实体识别中的一些用法,这些都建立在你了解crf++的一些最基本概念的基础上,目的在于清楚自己该如何制定自己的特征模板.

  假如有如下的训练文件

他    r    O
说    v    O
,    w    O
由    p    O
一    m    O
家    q    O
法国    ns    U_loc
大    a    O
饭店    n    O
举办    v    O
专题    n    O
系列    n    O
活动    vn   O

组成:句子(每个句子间通过空行隔开)或者叫训练样列

  每行是句子的组成词,本样例中每行共有3列,第一列是词语,第二列是词语的语性(这个在实际应用中有不同的设计规则),第三列是需要用该工具进行预测的(就像本例所说的人名:per,地名:loc,组织机构名称:org等).当然本例中都是事先定义好的(可以理解为标准答案).若经过分析后得到如下的结果

他    r    O  O 
说    v    O  O 
,    w    O O  
由    p    O O 
一    m    O O  
家    q    O  O
法国    ns    U_loc  U_loc
大    a    O  O
饭店    n    O  per
举办    v    O  O
专题    n    O  O
系列    n    O  O
活动    vn    O  O

  和上面比较的结果显示,这里多了一个第四列.那么这里的第四列就是系统分析后预测的结果.后面计算的准确率,召回率,F-score均是比较后两列的相似程度进行计算的.具体程序是怎么推算出第四列那是根据我们定义的特征模板templete来决定的,模板不一样,一般出来的结果不一样,当然最后计算的准确率什么的也不一样.

  注意上面有一红色标记的行,这就代表系统识别出来的和标准答案是不一样的,这就是计算准确率,召回率,以及F-score的依据. 

特征模板的制定

  同样以上面的例子,我们想识别出其中的一些命名实体(如per,loc,org)等.我们就得去定义一些特征模板.特征模板文件如下面的格式:

U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U05:%x[-1,0]/%x[0,0]
U06:%x[0,0]/%x[1,0]

   其中的每一行都是一个模板,我们需要做的就是利用不同的特征模板组合来识别出给定训练语料中存在的命名实体.通过不断改进我们特征模板,力求达到较高的识别效率.

如有下面的用法(我们的目的只是识别出给定语料中的人名,地名,机构名):

第一种特征模板:

U00:%x[0,0]  #当前词

 什么意思呢??----我们就想通过当前token的词就能确定这个词的类别(人名,地名,机构名等等).  #%x[0,0]代表当前token的0行,0列,即词语.可以利用一些辅助软件计算一下目前得到的准确率,召回率以及F-score.

第二种特征模板:

U00:%x[0,0]  #当前词
U01:%x[0,1]   #当前词词性

这个又是什么意思呢??----同上,我们想通过当前词以及当前词的词性来预测它的第三列(及词的类别). 

第三种特征模板:

#当前词的上上个词及词性
U00:%x[-2,0] U01:%x[-2,1]
#当前词的上一个词及词性 U02:%x[-1,0] U03:%x[-1,1]
#当前词及词性 U04:%x[0,0] U05:%x[0,1]
#当前词下一个词及词性 U06:%x[1,0] U07:%x[1,1]
#当前词下下一个词及词性 U08:%x[2,0] U09:%x[2,1]

当然,通过上面两个模板的理解,就很容易知道这个模板想表达的意思了.就是通过一系列词以及他们的词性组合来推导当前词的类别. 一般情况下,以上三种模板的精确率是递增的.

第n种模板:

U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U05:%x[-1,0]/%x[0,0]
U06:%x[0,0]/%x[1,0]

U10:%x[-2,1]
U11:%x[-1,1]
U12:%x[0,1]
U13:%x[1,1]
U14:%x[2,1]
U15:%x[-2,1]/%x[-1,1]
U16:%x[-1,1]/%x[0,1]
U17:%x[0,1]/%x[1,1]
U18:%x[1,1]/%x[2,1]

U20:%x[-2,1]/%x[-1,1]/%x[0,1]
U21:%x[-1,1]/%x[0,1]/%x[1,1]
U22:%x[0,1]/%x[1,1]/%x[2,1]

U23:%x[0,1]

其实就是跟多的组合条件,跟上面的几种模板是一致的.到这里差不多就能定义自己的模板了...

求解准确率,召回率以及F-score

  当然目前互联网上应该是有很多的计算工具,就单独针对本实验所说的命名实体识别来说.识别后的结果 无非就是下面的格式:

Rockwell    NNP    B    B
International    NNP    I    I
Corp.    NNP    I    I
's    POS    B    B
Tulsa    NNP    I    I
unit    NN    I    I
said    VBD    O    O
it    PRP    B    B
signed    VBD    O    O
a    DT    B    B
tentative    JJ    I    I
agreement    NN    I    I
extending    VBG    O    O
its    PRP$    B    B
contract    NN    I    I

 特点:固定的格式4列,我们的工作就是比较后两列.

 算法:

  不管是任何语言,我相信这也是一个很简单的问题吧?咱们的工作就是取出第三列和第四列中我们需要的信息即可,这里我们需要的是(per,loc,org).统计一下他们分别出现的频率.最后套用公式计算一下就OK了.

posted @ 2013-04-19 11:08  Poised_flw  阅读(445)  评论(0编辑  收藏  举报