CRF++中文分词

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值