实验CRF++

使用赵海博士的6 tags + 6 templates法,对bakeoff2005公开的语料进行实验。用python写了个简单的转换脚本,将UTF-8编码的训练语料转换为CRF++支持的格式。MSR的语料库转换之后是24M,训练模型花了大概26个小时,得到的模型为25M,对MSR的测试数据F-score可以达到96%(python的评估脚本),对PKU的测试数据只有82%多。PKU的语料库转换之后是11M,训练模型花了近13个小时,得到的模型有14M,对PKU的测试数据F-score有92%多,对MSR的测试数据也只有82%左右。看来MSR和PKU训练语料的分词风格有较大的差异,导致交叉测试的分数比较低。

另外,大概是C++的STL线程安全有问题,在Linux、Solaris和Mac OS上使用多线程都SEGFAULT了,所以都是单线程训练的。不敢想象如果用数百兆的语料,会花多长时间、用多少内存...

下面是特征模板的定义:

# Unigram
U00:%x[-1,0]
U01:%x[0,0]
U02:%x[1,0]
U03:%x[-1,0]/%x[0,0]
U04:%x[0,0]/%x[1,0]
U05:%x[-1,0]/%x[1,0]
# Bigram
B

13 thoughts on “实验CRF++

  1. GNU C 有些版本的 STL 在有些系统上多线程是有问题的(map,heap等),如果编译 GNU C 使用 --with-thread=single 那就更不用谈线程安全了。
    Sometimes, I would rather use other more than C++ STL.
    At least, I knew what the application doing and problems at. :)

  2. 佩服佩服,万分感谢,我以为是thread类写的有问题,结果是这里出错。

  3. 不过大数据量下,多线程的数据共享上好像是有问题,打了补丁之后还是无法多线程(我极端的用了10),能再看看吗?我的数据量41900个句子,9M的文件。另外,内存也是个问题,我根据另一个的算法加工了一下,具体在sites.google.com/site/popretcall/z

  4. sun老师你好,我是一名本科生,最近正在做一个CRFs的中文分词器,用的是CRF++.
    搜索到您的博客,对我实践很有帮助,十分感谢.

  5. @Hualin,opengram项目上应该已经有一个基于crf++的python实现了,是tchaikov同学实现的,有兴趣可以去看看,也欢迎加入我们的开发哦 :)

  6. 您好,我是一名南京理工大学的本科生,最近正在实现一个基于CRF的中文分词项目,目前正在用 CRF++和Python 建立原型.
    碰到如下问题,请求您的指点.
    //
    1.特征模板和语料库
    CRF++的训练文件的格式我已经明清楚,但是我没有见到PKU的语料库的训练数据只有段词,没有磁性标注等辅助信息,这意味着我的CRF++训练文件只能有两列,并且特征模板不能使

    用词性的特征.那么我看到的一些论文里运用了多套特征模板(词性,词频[2])是怎么实现的?难道要将CRF++的 learn 方法重新实现吗?我想在我的模板里面加入 domain knowledge

    和词表,就像论文[1]中所讲的一样.

    2.目前最主要的问题在于格式转换,因为我对Python和NLTK不熟悉,有不知道问题1.如何解决,所以我不知道该写怎么样的Python脚本来做预处理.当然问题1解决了,此问题就只是我

    个人的实践而已了.

    3.CRF++的文档里的训练部分似乎没有讲模型是否能够再进行训练,我的意思是,开始先训练后,能不能再拿新的数据进行训练.我看到一些论文如[1],[3]中提到根据分词后的置信度

    ,对模型的词库和特征进行添加和优化,我想CRF++能不能做到这点,还是我要自己实现这个.

    引用:
    [1].Chinese Segmentation and New Word Detection using Conditional Random Fields.Fuchun Peng 等
    [2].基于字位置概率特征的条件随机场中文分词方法.沈勤中 等.苏州大学
    [3].基于CRFs的中文分词和短文本分类技术(学位论文).滕少华.清华大学

  7. Sun老师您好。我是一名本科生,最近在尝试实现CRF,我在我的程序里面用的是template生成feature function的方法,在debug过程中,我发现是使用crf++ example里面chunking的模板和训练数据,按照crfpp上面写的方法,会生成41万个feature function,而同样的数据在crf++里面只生成15万个features,请问是否crf++会有什么减少Features的机制呢?谢谢。

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

To submit your comment, click the image below where it asks you to...
Clickcha - The One-Click Captcha