命名实体识别的后处理
使用深度学习模型去做命名实体识别任务时,可能会出现效果不好等现象,此时可以使用一些规则对预测模型进行后处理,从而提高模型的表现。比如在姓名实体识别过程中可以加入百家姓字典辅助。
百家姓辅助字典代码实现
stop_name字典可以自己整一个,每行是一个姓氏
import codecs
import sys
def stop_words(path):
with open(path,'r',encoding='utf-8',errors='ignore') as f:
return [l.strip() for l in f]
def stop_name(input_file,output_file):
input_data = codecs.open(input_file, 'r', 'utf-8')
output_data = codecs.open(output_file,'w+','utf-8')
ss = []
sub = []
#按行读取代码
for line in input_data.readlines():
word_list = line.strip().split()
if len(word_list)==0:
pass
else:
word = word_list[0]
true_lab = word_list[1]
pred_lab = word_list[2]
sub.append(word)
sub.append(true_lab)
sub.append(pred_lab)
ss.append(sub)
sub = []
#使用规则过滤
for i in range(len(ss)):
if ss[i][2] == 'B-PER' and ss[i][0] not in stop_words('stop_name.txt'):
ss[i][2] = 'O'
if ss[i][2] == 'I-PER' and ss[i-1][2] == 'O':
ss[i][2] = 'O'
#写入文档
for word in ss:
name = ' '.join(word)
output_data.write(name+'\n')
input_data.close()
output_data.close()
效果如下