最近在用BiLSTM+CRF做命名实体识别问题。关于模型效果评估,很多提到用conlleval.pl来实现,conlleval.pl是perl语言写的,原谅我没看懂。最后还是决定自己写个程序算一算准确率和召回率。

公式

准确率 = 预测正确的实体个数 / 预测的实体总个数

召回率 = 预测正确的实体个数 / 标注的实体总个数

F1 = 2 *准确率 * 召回率 / (准确率 + 召回率)

实现

1、获取实体:包括预测的全部实体标注的全部实体

对于一个标签序列,例如:'B-PER', 'I-PER', 'O', 'B-PER', 'I-PER', 'O', 'O', 'B-LOC', 'I-LOC'

实体对应的标签块是指:从B开头标签开始的,同一类型(PER/LOC/ORG)的,非O的连续标签序列

因此可以采用形如{(position, type): [label1, label2, ...]}这种格式的字典来存储实体,其中position为实体起始标签对应的序列下标索引,type为实体对应的类型,[label1, label2, ...]为实体对应的标签序列

从标签序列中抽取实体的代码如下:

def split_entity(label_sequence):entity_mark = dict()entity_pointer = Nonefor index, label in enumerate(label_sequence):if label.startswith('B'):category = label.split('-')[1]entity_pointer = (index, category)entity_mark.setdefault(entity_pointer, [label])elif label.startswith('I'):if entity_pointer is None: continueif entity_pointer[1] != label.split('-')[1]: continueentity_mark[entity_pointer].append(label)else:entity_pointer = Nonereturn entity_mark

2、获取预测正确的实体,进而计算准确率和召回率

得到标注的全部实体和预测的全部实体后,这两个字典中键和值均相等的元素,即为预测正确的实体。

统计标注的实体总个数、预测的实体总个数、预测正确的实体总个数,进而可以计算出准确率、召回率以及F1值。

代码如下:

def evaluate(real_label, predict_label):real_entity_mark = split_entity(real_label)predict_entity_mark = split_entity(predict_label)true_entity_mark = dict()key_set = real_entity_mark.keys() & predict_entity_mark.keys()for key in key_set:real_entity = real_entity_mark.get(key)predict_entity = predict_entity_mark.get(key)if tuple(real_entity) == tuple(predict_entity):true_entity_mark.setdefault(key, real_entity)real_entity_num = len(real_entity_mark)predict_entity_num = len(predict_entity_mark)true_entity_num = len(true_entity_mark)precision = true_entity_num / predict_entity_numrecall = true_entity_num / real_entity_numf1 = 2 * precision * recall / (precision + recall)return precision, recall, f1

补充

1、以上只简单计算了准确率和召回率,没有涉及到混淆和偏移等问题。如有错误和疏漏之处,请不吝指正。

2、代码写完后,在github上发现了conlleval的python版本o(╯□╰)o,附链接如下:

conlleval.py

python计算召回率代码_序列标注的准确率和召回率计算相关推荐

  1. python计算召回率_序列标注的准确率和召回率计算

    最近在用BiLSTM+CRF做命名实体识别问题.关于模型效果评估,很多提到用conlleval.pl来实现,conlleval.pl是perl语言写的,原谅我没看懂.最后还是决定自己写个程序算一算准确 ...

  2. python分析人口出生率代码_身份证号码各位数字的含义以及计算校验位的python代码...

    公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码. 其中前六位是地址码,通过百度百科我们很容易就 ...

  3. ner 评估指标_序列标注算法评估模块 seqeval 的使用

    在NLP中,序列标注算法是常见的深度学习模型,但是,对于序列标注算法的评估,我们真的熟悉吗? 在本文中,笔者将会序列标注算法的模型效果评估方法和seqeval的使用. 序列标注算法的模型效果评估 在序 ...

  4. bert pytorch 序列标注_序列标注:Bi-LSTM + CRF

    最近在做序列标注的相关任务,为了理解bi-lstm + crf的原理及细节,找了很多相关资料,以及代码实现,这里分享给大家并附上一些自己的理解. CRF 相关资料推荐 关于crf,我看了很多资料,这里 ...

  5. python矩阵求导代码_搞点枯燥的公式推导:深度学习中的矩阵求导

    最近看到一篇极视角转的文章算法推导核心!一次性梳理清楚,是时候搞定矩阵求导了!,想到前不久面试爱奇艺的时候一面的小哥一直让我手推全连接的公式推导,以及用Python+Numpy将过程实现,感觉自己对深 ...

  6. auc计算公式_图解机器学习的准确率、精准率、召回率、F1、ROC曲线、AUC曲线

    机器学习模型需要有量化的评估指标来评估哪些模型的效果更好. 本文将用通俗易懂的方式讲解分类问题的混淆矩阵和各种评估指标的计算公式.将要给大家介绍的评估指标有:准确率.精准率.召回率.F1.ROC曲线. ...

  7. python皮卡丘编程代码_再接再厉,用python编程13行代码解方程组(纯字符)

    因为是示例为主,我们将方程组限制在二元一次方程组:x,y两个变量,两个方程.类似这样: 每个方程有两个变量,x和y,形式为:ax+by+c=d 由于这次有了两个方程,我们提取参数的代码就适合提炼为一个 ...

  8. python怎么测试c代码_如何正确测试python中的C-API,C-API返回错误代码

    我的设置 我正在使用Python中的pytest和ctypes测试C库中的函数.C库中的每个函数调用一个嵌入式linux PCI板上的函数,然后C库函数返回一个整数,该整数映射到一组返回代码.如果函数 ...

  9. tensorflow计算网络占用内存_详细图解神经网络梯度下降法(tensorflow计算梯度)...

    1.什么是梯度 各个方向的偏微分组成的向量 ​ 举例说明,z对x的偏微分和对y的偏微分如下,则梯度是(-2x,2y)的这样一个向量 ​ 在光滑连续函数的每个点上,都可以计算一个梯度,也就是一个向量,用 ...

最新文章

  1. 老李推荐: 第8章4节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动AndroidDebugBridge 1...
  2. How HBO’s Silicon Valley built “Not Hotdog” with mobile TensorFlow, Keras React Native
  3. Linux中删除文件夹和文件的命令
  4. Extjs的数据读取器store和后台返回类型简单解析
  5. android启动过程之init.rc文件浅析
  6. linux重新识别逻辑卷,linux – 从已删除的LVM逻辑卷恢复ext4文件系统的任何方法?...
  7. DNE-1 测试方法
  8. mac下chrome浏览器设置ajax跨域调试
  9. 个人收藏的移动端网页布局rem解决方案
  10. 锐起无盘服务器只能是什么系统,安装锐起无盘客户机系统要注意什么
  11. 幸运红包娱乐微信小程序源码下载-多玩法安装简单
  12. Latex集合相关符号与关系操作
  13. win10计算机怎么拨号上网,win10如何设置宽带拨号连接
  14. 关于LTE网络质量的参数
  15. 12 项目收尾管理:项目验收、项目总结、系统维护、项目后评价
  16. Reader/Writer字符流概述和使用方法
  17. 覃超:Facebook的项目开发流程和工程师的绩效管理机制
  18. linux打开共享文件
  19. Description Resource Path Location Type Call requires API level 5 (解决方法)
  20. Could not connect to Redis at 127.0.0.1:6379:由于目标计算机积极拒绝,无法连接。

热门文章

  1. VMWare云计算初探
  2. DS90C385MTD一个芯片搞定LVDS 大分辨率LCD
  3. 面试题01.02 判定是否互为字符重排
  4. 数据治理需要注意什么问题
  5. 政务大数据需要避免三个误区
  6. CentOS查看硬件情况
  7. php表格无限扩展,php 无限级缓存的类的扩展
  8. java程序员_java程序员这个职业赚钱吗,看一线程序员怎么说
  9. R语言︱机器学习模型评价指标+(转)模型出错的四大原因及如何纠错
  10. 【递归】CCF201703-3 Markdown