用CRF++进行词性标注

先从HMM讲起,HMM有三个用途:评估、解码和学习。评估就是给定一个HMM模型求观察序列的概率;解码就是给定一个观察序列求最有可能生成该观察序列的隐藏状态序列;学习就是根据观察序列生成生成HMM模型。而CRF是一种HMM的扩展,它与HMM正好相反,HMM是根据隐藏状态序列求观察状态序列的概率,CRF则是根据观察状态序列求隐藏状态序列的概率。所以,CRF同样可以完成评估、解码与学习三个功能。

本文只是讲下如何使用CRF++这个开源工具来进行词性标注,并不涉及具体的算法理论(一方面是因为我自己也还没搞懂),如果想具体了解HMM和CRF可以自己google下相关文章或论文。

前几天在做项目的时候,由于之间同事生成的crf model已经不适用了,而他当时离职时跟我交接这个项目的时候,也没跟我讲这个model是如何生成的,用到的训练数据是什么样的,模板文件是怎么写的。我后来也没找到训练数据和模板文件以及生成model的那部分代码。于是就自己上网搜了,由于之前用过CRF++进行过中文分词,所以对它的一些用法已经知道一些了。下面主要来讲下训练数据的格式和模板文件的格式。

整个CRF++工作流程大概是这样的:先用我们进行词性标注过的训练数据和模板文件训练出一个model,然后再用CRF++提供的解码工具对测试文本进行解码,得到解码出来的文件。我们得到的解码出来的文件就是进行词性标注过的文件,也就是我们最后想要的结果。所以整个流程看起来其实也不复杂,事实上也是如此。

由于我们要做的是进行词性标注,所以训练数据就是对许多文本进行词性标注。标注完之后,接下来就是特征模板的编写了。关于特征模板的解释,可以看最后的参考文章,里面解释地很清楚,只不过并没有讲解特征模板是如何编写的。事实上,我也不知道它为什么要这么写,到底有什么含义。而且奇怪的是,我第一次用的特征模板是CRF++自带例子中的其中一个例子里的特征模板文件:

# Unigram
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]

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]

# Bigram
B

后面训练模型的时候,提示模板文件格式出错!这个问题不知有大神可以解答下吗?下面是我的训练数据格式:

凭 0
有效证件 0
到 0
机场 0
乘机 0
, PAUSE
感谢 0
乘坐 DO
南航 BUYLOCATION
航班 FLIGHTNUMBER_FLAG
。 END

南航 BUYLOCATION
咨询电话 PHONE_FLAG
: CONNECT
020 PHONE
- PHONE
95539 PHONE
转 PHONE
4 PHONE

训练数据是两列的,后面那个就是标注词性,这个是自己定义的词性。后来我用了一个简单版本的特征文件:

# Unigram
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]
# Bigram
B

这时候才顺利训练出model。

QQ图片20140523112355

训练出model之后,就可以对测试文本进行解码了。这里在对测试文本解码之前,还需要对它进行中文分词。解码用到CRF++的"crf_test -m model test_file>output_file"命令,这里的model、test_file和output_file,分别对应你自己训练出来的model、测试文本(已经分词过)和输出结果文本(解码之后的文本)。最后得到的解码之后的文本大概是这样的:

03 FLYDATE_MONTH
月 FLYDATE_MONTH_FLAG
30 FLYDATE_DAY
日 FLYDATE_DAY_FLAG
07 FLYTIME
: FLYTIME
20 FLYTIME
从 DO
杭州 STARTCITY
至 CITY_FLAG
大连 REACHCITY
. END

但解码出来的文本并不一定准确,它有一定的错误率,错误率的高低取决于训练数据的大小和质量以及特征模板的编写(关于特征模板我也很疑惑)。

Reference:
http://blog.csdn.net/felomeng/article/details/4288492

Tagged on: , ,

4 thoughts on “用CRF++进行词性标注

  1. liu

    后面训练模型的时候,提示模板文件格式出错!这个问题不知有大神可以解答下吗?下面是我的训练数据格式:

    例子里面数据是三列吧

    1. Jorbe Post author

      不好意思,这个恐怕不行,因为那些数据是公司的,不是我个人的,实在抱歉不能帮到你,不过你也可以自己写个爬虫到订票网站上爬一些相关数据。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>