seqeval详解

简介

seqeval 是一个用于评估序列标注任务(如命名实体识别 NER)的 Python 库。它提供了一种方便的方式来计算各种评价指标,如准确率(Precision)、召回率(Recall)、F1 分数等。seqeval 支持多种标签格式,并且可以处理多标签的情况。

其他知识点补充
  • IOB1
  • IOB2
  • IOE1
  • IOE2
  • IOBES
  • BILOU

以上几个是字体的标注格式,主要是给机器使用的,便于机器识别,这是一种规范。

IOB2:
  • I表示实体内部,O表示实体外部,B表示实体开始
  • B/I-XXX,XXX表示具体的类别
IOBES
  • I表示实体内部,O表示实体外部,B表示实体开始,E表示实体结束,S表示一个词单独形成一个命名实体
  • 有时也会使用M代替I,但本质是同一含义
    例子:
标记说明
B-Person人名开始
I-Person人名中间
B-Organization组织名开始
I-Organization组织名中间
O非命名实体

安装 seqeval

首先,您需要安装 seqeval 库。可以通过 pip 命令轻松安装:

pip install seqeval

基本用法

1. 导入库
from seqeval.metrics import precision_score, recall_score, f1_score, classification_report
2. 准备数据

假设您有两个列表,一个包含真实标签(ground truth),另一个包含模型预测的标签。

true_labels = [
    ['O', 'O', 'O', 'B-MISC', 'I-MISC', 'I-MISC', 'O'],
    ['B-PER', 'I-PER', 'O']
]

pred_labels = [
    ['O', 'O', 'B-MISC', 'I-MISC', 'I-MISC', 'I-MISC', 'O'],
    ['B-PER', 'I-PER', 'O']
]
3. 计算评价指标

精确率(Precision)

accuracy = accuracy_score(true_labels, pred_labels)
print(f'accuracy: {accuracy:.2f}')
precision = precision_score(true_labels, pred_labels)
print(f'Precision: {precision:.2f}')

召回率(Recall)

recall = recall_score(true_labels, pred_labels)
print(f'Recall: {recall:.2f}')

计算 F1 分数,也称为平衡 F 分数或 F 测量值。

f1 = f1_score(true_labels, pred_labels)
print(f'F1 Score: {f1:.2f}')

分类报告
classification_report 提供了更详细的报告,包括每个类别的精确率、召回率和 F1 分数。

report = classification_report(true_labels, pred_labels)
print(report)

输出示例
假设您运行了上述代码,输出可能如下所示:

Precision: 0.80
Recall: 0.80
F1 Score: 0.80
             precision    recall  f1-score   support

        B-MISC       1.00      1.00      1.00         1
        I-MISC       0.75      1.00      0.86         3
        B-PER       1.00      1.00      1.00         1
        I-PER       1.00      1.00      1.00         1
           O       1.00      1.00      1.00         3

    micro avg       0.80      0.80      0.80        10
    macro avg       0.95      1.00      0.95        10
 weighted avg       0.90      1.00      0.94        10

处理多标签情况
seqeval 也支持多标签的情况。假设每个 token 可以有多个标签:

true_labels = [
    ['O', 'O', 'O', ('B-MISC', 'B-PER'), 'I-MISC', 'I-MISC', 'O'],
    ['B-PER', 'I-PER', 'O']
]

pred_labels = [
    ['O', 'O', 'B-MISC', ('I-MISC', 'B-PER'), 'I-MISC', 'I-MISC', 'O'],
    ['B-PER', 'I-PER', 'O']
]

report = classification_report(true_labels, pred_labels)
print(report)

自定义标签格式
seqeval 默认使用 BIO 标签格式(B- 表示开始,I- 表示内部,O 表示非实体)。如果您使用的是其他标签格式,可以通过 suffix 参数进行配置。

from seqeval.scheme import IOB2

true_labels = [
    ['O', 'O', 'O', 'MISC', 'MISC', 'MISC', 'O'],
    ['PER', 'PER', 'O']
]

pred_labels = [
    ['O', 'O', 'MISC', 'MISC', 'MISC', 'MISC', 'O'],
    ['PER', 'PER', 'O']
]

report = classification_report(true_labels, pred_labels, scheme=IOB2)
print(report)

其他功能
seqeval 还提供了一些其他功能,例如:

  • accuracy_score:计算准确率。
  • performance_measure:返回一个字典,包含 TP(真阳性)、FP(假阳性)、FN(假阴性)和 TN(真阴性)的数量。

算法讲解

上面介绍了使用api获取准确率等数据,那么它算法是怎么实现的了

算法介绍:
  • 准确率: accuracy = 预测对的元素个数/总的元素个数
  • 查准率:precision = 预测正确的实体个数 / 预测的实体总个数
  • 召回率:recall = 预测正确的实体个数 / 标注的实体总个数
  • F1值:F1 = 2 *准确率 * 召回率 / (准确率 + 召回率)

预测对的元素个数、总的元素个数、预测正确的实体个数、预测的实体总个数,这些数值是如何获取的了
例子:

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’] 预测结果

y_true和y_pred列表中都是有9个元素,其中预测对的元素个数为6个,那么准确率为2/3。标注的实体总个数为2个(MISC,PER),预测的实体总个数为3个(‘I-MISC’, ‘B-PER’, ‘I-PER),预测正确的实体个数为1个(‘B-PER’, ‘I-PER),那么precision=1/3, recall=1/2, F1=0.4。

总结
seqeval 是一个非常实用的库,特别适合评估序列标注任务的性能。通过简单的 API,您可以轻松计算各种评价指标,并生成详细的分类报告。希望这些信息对您有所帮助!如果有任何具体问题或需要进一步的帮助,请随时提问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值