简介
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,您可以轻松计算各种评价指标,并生成详细的分类报告。希望这些信息对您有所帮助!如果有任何具体问题或需要进一步的帮助,请随时提问。