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
分词结果: