一、资源下载
需要用到的所有资料已经上传,下载地址为:使用CRF++工具进行人名识别
资料包括:
1.CRF++工具 2.语料库、程序、文档、实验结果等 2.1 语料库 2.2 语料库划分后的训练集、测试集 2.3 训练集,测试集进行处理后的结果 2.4 crf_learn用到的模板 2.5 crf_learn生成的model 2.6 crf_test生成的result 2.7 对语料库、训练集、测试集进行处理的程序 2.8 对result进行分析的程序 2.9 《实验报告》,包括实验步骤,结果分析等
二、步骤
1. 对语料进行预处理。
按照8:2比例,将数据划分为训练数据和测试数据。方法:按行读取文件,
当行号为0,5,10,15等时,分到测试集中。当行号为1-4,6-9,11-14等,分到训练集中。
#数据预处理:每5行的第1行放到测试数据集中,其余4行作为训练数据集
f1 = open("train_old.data",'w+')
f2 = open("test_old.data",'w+')
f = open("data_nr.txt")
i = 0;
while True:
line = f.readline()
if line :
if i%5 == 0:
f2.writelines(line)
else:
f1.writelines(line)
i = i+1
else:
break
f.close()
f1.close()
f2.close()
2.分别将训练数据集和测试数据集进行处理。
增加分词的BMES标记和人名的BI标记。处理后的结果分别为 test.data、test.data。注意:在处理时,每一句话之间要有一个空行隔开,所以不能使用Python的read()来读取文件。
#对训练数据进行处理
f1 = open("train.data",'w+')
f = open("train_old.data")
while True:
line = f.readline()
if line:
list = line.split() #根据空格隔开
for i in list:
if (i.endswith("/nr") == False): #不是人名
if(len(i)==1): #只有一个字符
f1.write(i + ' ' + 'S' + ' '+'O'+'\n')
else: #超过两个字符 比如3个 天安门
f1.write(i[0] + ' '+ 'B'+ ' '+'O' +'\n') #天 B O
for j in range(1,len(i)-1): #2~3 安 M O
f1.write(i[j] + ' '+ 'M'+' '+ 'O' +'\n')
f1.write(i[len(i)-1] + ' '+ 'E'+' '+ 'O' +'\n') #门 E O
else: #是人名
if(len(i)==1): #只有一个字符 毛
f1.write(i + ' ' + 'S' + ' '+'B'+'\n')
else: #超过两个字符 比如3个 习近平
f1.write(i[0] + ' '+ 'B'+' '+ 'B' +'\n') #天 B O
for j in range(1,len(i)-1-3): #2~3 安 M O
f1.write(i[j] + ' '+ 'M'+' '+ 'I' +'\n')
f1.write(i[len(i)-4] + ' '+ 'E'+' '+ 'I' +'\n') #门 E O
f1.write('\n')
else:
break
f.close()
f1.close()
#对训练数据进行处理
f1 = open("test.data",'w+')
f = open("test_old.data")
while True:
line = f.readline()
if line:
list = line.split() #根据空格隔开
for i in list:
if (i.endswith("/nr") == False): #不是人名
if(len(i)==1): #只有一个字符
f1.write(i + ' ' + 'S' + ' '+'O'+'\n')
else: #超过两个字符 比如3个 天安门
f1.write(i[0] + ' '+ 'B'+ ' '+'O' +'\n') #天 B O
for j in range(1,len(i)-1): #2~3 安 M O
f1.write(i[j] + ' '+ 'M'+' '+ 'O' +'\n')
f1.write(i[len(i)-1] + ' '+ 'E'+' '+ 'O' +'\n') #门 E O
else: #是人名
if(len(i)==1): #只有一个字符 毛
f1.write(i + ' ' + 'S' + ' '+'B'+'\n')
else: #超过两个字符 比如3个 习近平
f1.write(i[0] + ' '+ 'B'+' '+ 'B' +'\n') #天 B O
for j in range(1,len(i)-1-3): #2~3 安 M O
f1.write(i[j] + ' '+ 'M'+' '+ 'I' +'\n')
f1.write(i[len(i)-4] + ' '+ 'E'+' '+ 'I' +'\n') #门 E O
f1.write('\n')
else:
break
f.close()
f1.close()
3.下载安装CRF++
Windows版本不用安装,可以直接运行。
4.编写template
# Unigram
U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U05:%x[-1,0]/%x[0,0]
U06:%x[0,0]/%x[1,0]
U07:%x[-1,0]/%x[0,0]/%x[1,0]
U10:%x[-2,1]
U11:%x[-1,1]
U12:%x[0,1]
U13:%x[1,1]
U14:%x[2,1]
U15:%x[-2,1]/%x[-1,1]
U16:%x[-1,1]/%x[0,1]
U17:%x[0,1]/%x[1,1]
U18:%x[1,1]/%x[2,1]
U20:%x[-2,1]/%x[-1,1]/%x[0,1]
U21:%x[-1,1]/%x[0,1]/%x[1,1]
U22:%x[0,1]/%x[1,1]/%x[2,1]
# Bigram
B
5.训练
训练命令为:crf_learn –a MIRA –f 3 –c 1.5 template train.data model
执行结果如下:
执行完成后会生成model文件。
注意:一定要增加“-a MIRA”参数,否则可能是因为数据量太大,中间回报错。
6.测试
命令:crf_test –m model test.data >result
7.对结果进行分析。
执行analize.py程序,对结果进行分析。
三、结果分析:
根据结果可以看到:
准确率达到:99.95%
召回率到达:98.50%