您的位置:首页 > 其它

CRF++中文分词

2016-10-02 12:01 141 查看

本文实现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

希望对跟我一样正在努力学习自然语言处理的童鞋们有帮助哦~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  CRF++ 分词