简介
本文主要是我学习使用CRF++进行中文分词的一个记录,因此并没有CRF的背景知识与CRF++安装的相关内容。本文主要是按照中文分词入门之字标注法4中的相关内容进行。
过程
本文中所使用backoff2005数据集中的原始数据格式与CRF++所要求的格式不符,因此首先需要对数据集格式进行修改。
msr_training数据格式转换
在原始的msr_training.utf8的文件中的数据格式为如下所示
“ 人们 常 说 生活 是 一 部 教科书 , 而 血 与 火 的 战争 更 是 不可多得 的 教科书 , 她 确实 是 名副其实 的 ‘ 我 的 大学 ’ 。
“ 心 静 渐 知 春 似 海 , 花 深 每 觉 影 生 香 。
而在CRF++中则要求为每个字一行,按列的形式写,句子之间空一行,后面的列则为标记。在本文中,B为单词开头,M为单词中间,E为单词结尾,S为一个字为一个词。形式如下
“ S
人 B
们 E
常 S
说 S
生 B
通过下述程序即可完成此步,从而得到符合CRF++格式要求的msr_training.tagging4crf.utf8
import codecs
import sys
def character_tagging(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 + "\tS\n")
else:
output_data.write(word[0] + "\tB\n")
for w in word[1:len(word)-1]:
output_data.write(w + "\tM\n")
output_data.write(word[len(word)-1] + "\tE\n")
output_data.write("\n")
input_data.close()
output_data.close()
if __name__ ==