Linux版本
1)下载
下载CRF++的linux版本,http://taku910.github.io/crfpp/ 注意 下载tar.gz的才是linux的,自己下错了,折腾好久。
2)解压
命令格式:tar -zxvf 压缩文件名.tar.gz;解压缩后的文件只能放在当前的目录。
3)安装gcc 还有g++
yum install gcc 查看是否安装成功 gcc -v
yum install gcc-c++
4)安装CRF++ (编译)
cd 到解压的路径下
以下我全部用的sudo
./configure
make
sudo make install
5) 运行模型
crf_learn template train.data model
如果crf_learn没有放在指定目录下,可以指定路径后././crf_learn 之后再运行(路径写的估计不对),我还是复制到运行的路径下吧,这样更好。
6)Python接口
线上有了新数据后,不可能每次都使用crf_test敲命令行进行预测,所以需要可以运行的脚本,故写个Python接口。(注意安装的要为2.7版本的python ,如果不是就在Linux上多装一个,记得把环境变量修改过来 Python -v 查看Python版本)
进入子目录Python中 (CRF++中的文件)
(1)python setup.py build
(2)python setup.py install
进入python解释器,import CRFPP测试是否安装成功
若出现ImportError: libcrfpp.so.0: cannot open shared object file: No such file or directory 。
解决方法:(未解决的话,见下方方法,亲测有效)
ln -s /usr/local/lib/libcrfpp.so.0 /usr/lib/
6.重新import试试看,是否成功。
ImportError: libcrfpp.so.0: cannot open shared object file: No such file or directory
可用下面的方法解决
sudo vim /etc/ld.so.conf (其中是l不是i)
添加
include /usr/local/lib
保存后加载一下
sudo /sbin/ldconfig -v
以上主要来自于 https://blog.csdn.net/u010004460/article/details/77198389Windows 版本
1)下载
下载CRF++的linux版本,http://taku910.github.io/crfpp/ 注意 下载.zip结尾的是Windows的,下载下来看一下,里面的内容,保证没有问题。
2)训练
基本的训练操作与Linux相同。
3)Python接口
pip install crfpp
- Python模型预测代码
import CRFPP
import codecs
模型加载
tagger=CRFPP.Tagger(r'-m C:\Users\secoo\Desktop\CRF++\model')
加载测试文件
input_data = codecs.open(r'C:\Users\secoo\Desktop\CRF++\shangde.txt', 'r', 'utf-8')
word_str=input_data.readlines()
word_str=''.join(word_str)
模型预测结果
print(tagger.parse(word_str))
'-----------------网上的使用方法----------------------'
def crf_segmenter(input_file, output_file, tagger):
input_data = codecs.open(input_file, 'r', 'utf-8')
output_data = codecs.open(output_file, 'w', 'utf-8')
for line in input_data.readlines():
tagger.clear() ##没计算完一个句子(一篇文章)就清掉,毕竟是依赖上下文做预测
for word in line.strip():
word = word.strip()
if word:
tagger.add((word + "\to\tB").encode('utf-8')) ##将要预测的文章中的字添加到tagger中
tagger.parse() ##进行预测
size = tagger.size() ##输入的一篇文章中字的个数
xsize = tagger.xsize() ##输入的文章的个数
for i in range(0, size):
for j in range(0, xsize):
char = tagger.x(i, j).decode('utf-8') ##获取指定位置的测试的文字
tag = tagger.y2(i) ##获取指定位置的文字的预测的Tag
if tag == 'B':
output_data.write(' ' + char)
elif tag == 'M':
output_data.write(char)
elif tag == 'E':
output_data.write(char + ' ')
else:
output_data.write(' ' + char + ' ')
output_data.write('\n')
input_data.close()
output_data.close()