Mar 20

使用赵海博士的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

11 Responses to “实验CRF++”

  1. A.L. says:

    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. Yong Sun says:

    Hi,A.L.,除了Solaris,我在其他系统上使用的都是比较新的libstdc++,以及g++编译器 :(

  3. gavin.tu says:

    楼主治学很严谨,学习中…

  4. tchaikov says:

    不过 CRF++ 吃内存是以 giga 计的,时间是以天为单位,这个的确吃不消。=(

  5. yongsun says:

    牛!tchaikov真是手到擒来呀!

  6. flaky says:

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

  7. flaky says:

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

  8. Hualin says:

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

  9. yongsun says:

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

  10. Hualin says:

    您好,我是一名南京理工大学的本科生,最近正在实现一个基于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的中文分词和短文本分类技术(学位论文).滕少华.清华大学

Leave a Reply

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