python使用crf++,非系统调用
安装了半天,步骤如下:
1、首先安装crf++
1 2 3 4 5 |
tar zxvf CRF++-0.58.tar.gz cd CRF++-0.58 ./configure make make install |
此步骤我未遇到问题
2、安装python的扩展
解压后的源代码文件里面有python文件夹
打开README,告知:
1 2 |
python setup.py build python setup.py install |
因为我的python是2.7.6编译安装的,按该步骤来,会出现如下错误:
cc1plus: warning: command line option “-Wstrict-prototypes” is valid for Ada/C/ObjC but not for C++
问题原因:
大概是python中的distutils在自动设置编译器选项时出了些问题。
解决办法:
(1)、下载补丁文件
http://bugs.python.org/issue1222585中的python-2.7-distutils-C++.patch
连接地址:http://bugs.python.org/file32218/python-2.7-distutils-C%2B%2B.patch
(2)、进入到python2.7.6的源代码文件夹中执行:
原因是.patch文件指定的是相对路径。
1 2 |
cd /你的路径/Python-2.7.6 patch -p0 < python-2.7-distutils-C++.patch |
补丁执行完成后,我的是提示有一个文件更新失败。不管他了~
打完补丁当然要重新安装一下python喽~
我的方法非常的不专业,这是个问题,暂时身边没有很清晰的人问。TODO。
我对Python-2.7.6的源码进行了:
1 2 |
make make install |
这样就更新了python
3、重新安装python的扩展
1 2 3 4 |
cd CRF++-0.58/python/ rm -rf /build #如果存在 python setup.py build python setup.py install |
没有报错了~
4、运行test.py检测是否安装成功
#python test.py
这时候我的机器又报错了:
libcrfpp.so.0: cannot open shared object file: No such file or directory
意为无法找到libcrfpp.so.0模块。
1 2 3 4 5 6 |
#建立软连接 ln -s /usr/local/lib/libcrfpp.so.* /usr/lib/ #更新lib库 /sbin/ldconfig -v #再次运行 python test.py |
报错:
RuntimeError: feature_index.cpp(193) [mmap_.open(model_filename)] mmap.h(153) [(fd = ::open(filename, flag | O_BINARY)) >= 0] open failed: ../model
查看test.py代码:
其中: tagger = CRFPP.Tagger(“-m ../model -v 3 -n2”)在寻找 ../model的文件。
这时候你需要一个train出来的model文件放知道对应目录即可
快速获得方法:
找到example/basenp/exec.sh文件,用#号注释掉rm -f model改行。
运行exec.sh,当前目录下会产生一个model文件,移动该model文件,放置到相对于test.py的../model位置。
再次运行#python test.py 发现,执行成功了。
5、既然成功了,下面就是看其文档了
总结:
我发现,可能要跪,晚上这俩小时权捣鼓怎么能成功运行test.py了呢,我以为这个成功就可以使用python直接调用crf的一些功能了,而不需要执行系统命令,还得读文件写文件的麻烦。但是,我发现,貌似test.py给出的函数竟然需要训练好的model文件,最后还是读文件嘛。。。接口感觉好不完善呀,最后还得系统调用,来回用文件来交换数据~~~今天晚了,明天再深入了解吧。