CRF++中文分词

来源:互联网 发布:透明计算造假 知乎 编辑:程序博客网 时间:2024/06/05 15:56

本文实现python的CRF++中文分词

  1. 预备工作 当然是下载CRF++

  2. CRF++
    Linux版本的安装方法是:
    i. 解压到某目录下
    ii. 打开控制台,将当前目录切换到解压目录
    iii. 依次输入命令:
    ./configure
    make
    su
    make install
    注:需要root权限才能成功安装。
    密码错误时可能是自己没有root账户

  3. 由于这里使用 python 工具包进行训练和测试,需要安装 python 工具包。进入 python 文件夹,运行以下命令安装:
    python setup.py build
    sudo python setup.py install


  4. 下面我讲一下我的思路:

由于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 codecsimport sysimport CRFPPdef 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_fileimport sysimport codecs# 2 tags for character tagging: B Idef 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

希望对跟我一样正在努力学习自然语言处理的童鞋们有帮助哦~

1 0