使用赵海博士的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
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.
Hi,A.L.,除了Solaris,我在其他系统上使用的都是比较新的libstdc++,以及g++编译器
楼主治学很严谨,学习中...
这是个 CRF++ 的 bug,已经把 patch 发到 sf.net 上了。
https://sourceforge.net/tracker/?func=detail&aid=2875794&group_id=192973&atid=943559
不过 CRF++ 吃内存是以 giga 计的,时间是以天为单位,这个的确吃不消。=(
牛!tchaikov真是手到擒来呀!
佩服佩服,万分感谢,我以为是thread类写的有问题,结果是这里出错。
不过大数据量下,多线程的数据共享上好像是有问题,打了补丁之后还是无法多线程(我极端的用了10),能再看看吗?我的数据量41900个句子,9M的文件。另外,内存也是个问题,我根据另一个的算法加工了一下,具体在sites.google.com/site/popretcall/z
sun老师你好,我是一名本科生,最近正在做一个CRFs的中文分词器,用的是CRF++.
搜索到您的博客,对我实践很有帮助,十分感谢.
@Hualin,opengram项目上应该已经有一个基于crf++的python实现了,是tchaikov同学实现的,有兴趣可以去看看,也欢迎加入我们的开发哦
您好,我是一名南京理工大学的本科生,最近正在实现一个基于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的中文分词和短文本分类技术(学位论文).滕少华.清华大学
Sun老师您好。我是一名本科生,最近在尝试实现CRF,我在我的程序里面用的是template生成feature function的方法,在debug过程中,我发现是使用crf++ example里面chunking的模板和训练数据,按照crfpp上面写的方法,会生成41万个feature function,而同样的数据在crf++里面只生成15万个features,请问是否crf++会有什么减少Features的机制呢?谢谢。
不好意思,我自己写反了一个变量,搞好了。谢谢。