本文实现python的CRF++中文分词
预备工作 当然是下载CRF++
CRF++
Linux版本的安装方法是:
i. 解压到某目录下
ii. 打开控制台,将当前目录切换到解压目录
iii. 依次输入命令:
./configure
make
su
make install
注:需要root权限才能成功安装。
密码错误时可能是自己没有root账户由于这里使用 python 工具包进行训练和测试,需要安装 python 工具包。进入 python 文件夹,运行以下命令安装:
python setup.py build
sudo python setup.py install-
下面我讲一下我的思路:
由于Task2根目录下的_CRFPP.so没有引入
所以正常能运行的是文件夹Task2_B-I下的内容,此文件夹下对词语分类只有B I两种
首先我用msr_training.utf8 通过python程序 make_crf_train_data.py转化成训练语料需要的格式,即tag_train_data.utf8,
然后我开始训练模型,得到model 再利用CRF自带的python工具包,对输入文本分词,具体实现是通过python程序 crf_segment.py ,
最后就将msr_test.utf8 分词得到 crf_tag_result.utf8.
crf_segment.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
# crf_segmenter.py
# Usage:python crf_segmenter.py crf_model test_file result_file
# 利用CRF自带的python工具包,对输入文本进行分词
import codecs
import sys
import CRFPP
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.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)
if tag == 'B':
output_data.write(' ' + char)
elif tag == 'I':
output_data.write(char)
output_data.write('\n')
input_data.close()
output_data.close()
if __name__ == '__main__':
if len(sys.argv) != 4:
print("Usage: python crf_segmenter.py crf_model test_file result_file")
sys.exit()
crf_model = sys.argv[1]
input_file = sys.argv[2]
output_file = sys.argv[3]
tagger = CRFPP.Tagger("-m " + crf_model)
crf_segmenter(input_file, output_file, tagger)
make_crf_train_data.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
# make_crf_train_data.py
# 得到CRF++要求的格式的训练文件
# 用法:命令行--python dataprocess.py input_file output_file
import sys
import codecs
# 2 tags for character tagging: B I
def character_4tagging(input_file, output_file):
input_data = codecs.open(input_file, 'r', 'utf-8')
output_data = codecs.open(output_file, 'w', 'utf-8')
for line in input_data.readlines():
word_list = line.strip().split()
for word in word_list:
if len(word) == 1:
output_data.write(word + "\tB\n")
else:
output_data.write(word[0] + "\tB\n")
for w in word[1:len(word) - 1]:
output_data.write(w + "\tI\n")
output_data.write(word[len(word) - 1] + "\tI\n")
output_data.write("\n")
input_data.close()
output_data.close()
if __name__ == '__main__':
if len(sys.argv) != 3:
print ("Usage: python dataprocess.py inputfile outputfile")
sys.exit()
input_file = sys.argv[1]
output_file = sys.argv[2]
character_4tagging(input_file, output_file)
如果还是不明白的,可以看我的GitHub,网址:https://github.com/angelamin/Python_study/tree/master/Task2/Task2_B-I
希望对跟我一样正在努力学习自然语言处理的童鞋们有帮助哦~