通过CRF++工具 进行 人名识别(命名实体识别)

一、资源下载

需要用到的所有资料已经上传,下载地址为使用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%

猜你喜欢

转载自blog.csdn.net/pengchengliu/article/details/81012646