如何用MeCab训练一套中文分词软件

MeCab是一套采用CRF算法的开源日文分词软件(内嵌CRF++),由于其使用算法的通用性,可以通过其他语言的语料词典和基于对语言了解所设定的模板,利用MeCab训练日文以外的语言分词软件。本文则以中文为例,记录训练的流程方法。

参考:https://zhuanlan.zhihu.com/p/86884557

MeCab原理和设计参考:日文分词器 Mecab 文档

MeCab设计结构:
在这里插入图片描述

1.准备

1.1 语料库准备

采用icwb2-data数据集中提供的中文词库

1.2 工作文件夹准备

首先在icwb2-data的同层次目录建立一个msr_mecab_test目录:
在这里插入图片描述
然后在这个目录下分别建立三个子目录:seed, final, script:
在这里插入图片描述

2.训练文件制作+训练

2.1 seed词典

需要将icwb2-data的词典转化为MeCab格式的,使用一个python脚本完成转化:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import codecs
import sys
 
def make_mecab_seed_data(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 = line.strip()
        output_data.write(word+ ",0,0,0,0,0,0\n")
    input_data.close()
    output_data.close()
 
if __name__ == '__main__':
    if len(sys.argv) < 3:
        print("pls use: python make_mecab_seed_data.py input output")
        sys.exit()
    input_file = sys.argv[1]
    output_file = sys.argv[2]
    make_mecab_seed_data(input_file, output_file)

2.2 配置文件

seed目录下准备5个最基础的配置文件,分别是dicrc,char.def,unk.def,rewrite.def,feature.def

dicrc(设定词典各种动作)

cost-factor = 800
bos-feature = BOS/EOS,*,*,*,*,*,*,*,*
eval-size = 6
unk-eval-size = 4
config-charset = UTF-8

char.def(定义未登陆词处理的文件)

DEFAULT 0 1 0 # DEFAULT is a mandatory category!
SPACE 0 1 0
CJK 0 0 2
# SPACE
0x0020 SPACE # DO NOT REMOVE THIS LINE, 0x0020 is reserved for SPACE
0x00D0 SPACE
0x0009 SPACE
0x000B SPACE
0x000A SPACE

unk.def(用于未登陆词的词典)

DEFAULT,0,0,0,unk,*,*
SPACE,0,0,0,unk,*,*
CJK,0,0,0,unk,*,*

rewrite.def(定义从特征列到内部状态特征列的转换映射)

[unigram rewrite]
*,*,* $1,$2,$3

[left rewrite]
*,*,* $1,$2,$3

[right rewrite]
*,*,* $1,$2,$3

feature.def(定义了从内部状态的素生列中抽取CRF的素生列的模板)

UNIGRAM W0:%F[6]
UNIGRAM W1:%F[0]/%F[6]
UNIGRAM W2:%F[0],%F?[1]/%F[6]
UNIGRAM W3:%F[0],%F[1],%F?[2]/%F[6]
UNIGRAM W4:%F[0],%F[1],%F[2],%F?[3]/%F[6]

UNIGRAM T0:%t
UNIGRAM T1:%F[0]/%t
UNIGRAM T2:%F[0],%F?[1]/%t
UNIGRAM T3:%F[0],%F[1],%F?[2]/%t
UNIGRAM T4:%F[0],%F[1],%F[2],%F?[3]/%t

BIGRAM B00:%L[0]/%R[0]
BIGRAM B01:%L[0],%L?[1]/%R[0]
BIGRAM B02:%L[0]/%R[0],%R?[1]
BIGRAM B03:%L[0]/%R[0],%R[1],%R?[2]
BIGRAM B04:%L[0],%L?[1]/%R[0],%R[1],%R?[2]
BIGRAM B05:%L[0]/%R[0],%R[1],%R[2],%R?[3]
BIGRAM B06:%L[0],%L?[1]/%R[0],%R[1],%R[2],%R?[3]

2.3 训练语料

中文分词训练语料来源于icwb2-data/training/msr_training.utf8 ,和词典格式是一样的,以下是一个可用于语料格式转换的脚本(make_mecab_train_data.py)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import codecs
import sys
 
def make_mecab_train_data(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()
        if len(word_list) == 0: continue
        for word in word_list:
            output_data.write(word+ "\t0,0,0,0,0,0\n")
        output_data.write("EOS\n")
    input_data.close()
    output_data.close()
 
if __name__ == '__main__':
    if len(sys.argv) < 3:
        print "pls use: python make_mecab_train_data.py input output"
        sys.exit()
    input_file = sys.argv[1]
    output_file = sys.argv[2]
    make_mecab_train_data(input_file, output_file)

得到corpus文件

2.4生成训练用的二进制词典

此时,我们训练用的词典,配置文件及训练语料已准备就绪:

  • seed 词典(CSV 格式文件集合,文件名:msr_words.csv)

  • 所有的配置文件 (char.def, unk.def, rewrite.def, feature.def)

  • 训练用的数据 (文件名: corpus)

我们在seed目录下执行以下命令,生成学习用的二进制词典

start C:\"Program Files (x86)"\MeCab\bin\mecab-dict-index.exe -t UTF-8 -f UTF-8

2.5 CRF模型参数训练

在seed目录下执行以下命令,训练CRF模型

start C:\"Program Files (x86)"\MeCab\bin\mecab-cost-train.exe -c 1.0 corpus model

2.6 生成用于发布的词典

在seed目录下执行以下命令,生成用于发布的词典

start C:\"Program Files (x86)"\MeCab\bin\mecab-dict-gen.exe -o D:\msr_mecab_test\final -m model

2.7 生成用于解析器的词典

进入到final目录下,执行以下命令

start C:\"Program Files (x86)"\MeCab\bin\mecab-dict-index.exe -t UTF-8 -f UTF-8

3. 测试

至此,MeCab中文分词所需的词典和模型文件准备就绪位于在final目录下,我们可以回到上一级目录输入以下命令测试下

 start C:\"Program Files (x86)"\MeCab\bin\mecab.exe D:\input.txt -d ./final/ -o D:\output.txt

分词结果:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值