在NLP中,序列标注算法是常见的深度学习模型,但是,对于序列标注算法的评估,我们真的熟悉吗?
在本文中,笔者将会序列标注算法的模型效果评估方法和seqeval
的使用。
序列标注算法的模型效果评估
在序列标注算法中,一般我们会形成如下的序列列表,如下:
['O', 'O', 'B-MISC', 'I-MISC', 'B-MISC', 'I-MISC', 'O', 'B-PER', 'I-PER']
一般序列标注算法的格式有BIO
,IOBES
,BMES
等。其中,实体
指的是从B开头标签开始的,同一类型(比如:PER/LOC/ORG)的,非O的连续标签序列。
常见的序列标注算法的模型效果评估指标有准确率(accuracy)、查准率(percision)、召回率(recall)、F1值等,计算的公式如下:
准确率: accuracy = 预测对的元素个数/总的元素个数
查准率:precision = 预测正确的实体个数 / 预测的实体总个数
召回率:recall = 预测正确的实体个数 / 标注的实体总个数
F1值:F1 = 2 *准确率 * 召回率 / (准确率 + 召回率)
举个例子,我们有如下的真实序列y_true
和预测序列y_pred
,如下:
y_true = ['O', 'O', 'O', 'B-MISC', 'I-MISC', 'I-MISC', 'O', 'B-PER', 'I-PER']
y_pred = ['O', 'O', 'B-MISC', 'I-MISC', 'B-MISC', 'I-MISC', 'O', 'B-PER', 'I-PER']
列表中一个有9个元素,其中预测对的元素个数为6个,那么准确率为2/3。标注的实体总个数为2个,预测的实体总个数为3个,预测正确的实体个数为1个,那么precision=1/3, recall=1/2, F1=0.4。
seqeval的使用
一般我们的序列标注算法,是用conlleval.pl
脚本实现,但这是用perl语言实现的。在Python中,也有相应的序列标注算法的模型效果评估的第三方模块,那就是seqeval
,其官网网址为:https://pypi.org/project/seqeval/0.0.3/ 。
seqeval
支持BIO
,IOBES
标注模式,可用于命名实体识别,词性标注,语义角色标注等任务的评估。
官网文档中给出了两个例子,笔者修改如下:
例子1:
# -*- coding: utf-8 -*-
from seqeval.metri