NLP(二十三)序列标注算法评估模块seqeval的使用
在NLP中,序列标注算法是常见的深度学习模型,但是,对于序列标注算法的评估,我们真的熟悉吗?
在本文中,笔者将会序列标注算法的模型效果评估方法和seqeval
的使用。
序列标注算法的模型效果评估
在序列标注算法中,一般我们会形成如下的序列列表,如下:
1 |
|
一般序列标注算法的格式有BIO
,IOBES
,BMES
等。其中,实体
指的是从B开头标签开始的,同一类型(比如:PER/LOC/ORG)的,非O的连续标签序列。
常见的序列标注算法的模型效果评估指标有准确率(accuracy)、查准率(percision)、召回率(recall)、F1值等,计算的公式如下:
准确率: accuracy = 预测对的元素个数/总的元素个数
查准率:precision = 预测正确的实体个数 / 预测的实体总个数
召回率:recall = 预测正确的实体个数 / 标注的实体总个数
F1值:F1 = 2 准确率 召回率 / (准确率 + 召回率)
举个例子,我们有如下的真实序列
y_true
和预测序列y_pred
,如下:
1 |
|
列表中一个有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:
1 |
|
输出结果如下:
1 |
|
例子2:
1 |
|
输出结果同上。
在Keras中使用seqeval
笔者一年多年写过文章:用深度学习实现命名实体识别(NER), 我们对模型训练部分的代码加以改造,使之在训练过程中能输出F1值。
在Github上下载项目DL_4_NER
,网址为:https://github.com/percent4/DL_4_NER
。修改utils.py中的文件夹路径,以及模型训练部分的代码(DL_4_NER/Bi_LSTM_Model_training.py)如下:
1 |
|
模型训练的结果如下(中间过程省略):
1 |
|
我们修改代码,在lstm_model.fit那一行修改代码如下:
1 |
|
此时输出结果为:
1 |
|
这就是seqeval的强大之处。
关于seqeval在Keras的使用,有不清楚的地方可以参考该项目的Github网址:https://github.com/chakki-works/seqeval 。
总结
感谢大家的阅读,本次分享到此结束。
欢迎大家关注我的微信公众号:NLP奇幻之旅
。
参考网址
- 序列标注的准确率和召回率计算: https://zhuanlan.zhihu.com/p/56582082
- seqeval官方文档: https://pypi.org/project/seqeval/0.0.3/
欢迎关注我的知识星球“自然语言处理奇幻之旅”,笔者正在努力构建自己的技术社区。