1. 基本概念

概念:一般来说,NER的标注列表为['O' ,'B-MISC', 'I-MISC', 'B-ORG' ,'I-ORG', 'B-PER' ,'I-PER', 'B-LOC' ,'I-LOC']。其中,一般一共分为四大类:PER(人名),LOC(位置),ORG(组织)以及MISC,而且B表示开始,I表示中间,O表示单字词。

评估指标:一般看Acc、Precision、Recall、F1值和ROC、AUC。但是由于在很多场景中,'O'的这个label出现次数是最多的,所以光看Acc肯定是没用的咯!

CRF学到的constrains:

1. 句子首个单词接下来的不是“B-“ 就是 “O”, 而非 “I-“

2. “B-label1 I-label2 I-label3 I-…”中的label1, label2, label3 … 应该是相同的实体标签。

3. 等等很多标签的搭配问题。

2. 数据清洗

1. 控制句子长度,100左右吧。

2. 符号清理。

3. 舍去全是‘O’的标注句子。

4. 如果对数字识别不做要求,干脆转换成0进行识别,做成统一符号。

3. 模型

当前来讲,主流的有两种:一种是BiLSTM+CRF的;另一种是BERT直接预测的。当然,对于BERT模型来说,在其上层也是可以再加CRF进行限制一下的。不过本人还没进行实战的试验,后续把结果整理整理。

4. 评估指标代码

对于评估的指标,上面已经说到是Acc、Precision、Recall和F1值。但是对于多个分类时,理论上要一个类别一个类别地去计算对应的Acc、Precision、Recall和F1值。其中需要了解的理论是混淆矩阵(confusion matrix)的概念,如下所示:

confusion matrix.png

如有150个样本数据,这些数据分成3类,每类50个。分类结束后得到的混淆矩阵为上图所示。第一行第一列中的43表示有43个实际归属第一类的实例被预测为第一类,同理,第二行第一列的2表示有2个实际归属为第二类的实例被错误预测为第一类。

所以通过混淆矩阵来得到各个评估指标,拿precision这个指标来举例,其他的同理:

from tensorflow.python.ops.metrics_impl import _streaming_confusion_matrix

def precision(labels,

predictions,

num_classes,

pos_indices=None, ## 这里表示要计算指标的label对应的index

weights=None,

average='micro'):

cm, op = _streaming_confusion_matrix(labels, predictions, num_classes, weights)

pr, _, _ = metrics_from_confusion_matrix(cm, pos_indices, average=average)

op, _, _ = metrics_from_confusion_matrix(op, pos_indices, average=average)

return (pr, op)

def metrics_from_confusion_matrix(cm, pos_indices=None, average='micro', beta=1):

num_classes = cm.shape[0]

if pos_indices is None:

pos_indices = [i for i in range(num_classes)]

if average == 'micro':

return pr_re_fbeta(cm, pos_indices, beta)

elif average in {'macro', 'weighted'}:

precisions, recalls, fbetas, n_golds = [], [], [], []

for idx in pos_indices:

pr, re, fbeta = pr_re_fbeta(cm, [idx], beta)

precisions.append(pr)

recalls.append(re)

fbetas.append(fbeta)

cm_mask = np.zeros([num_classes, num_classes])

cm_mask[idx, :] = 1

n_golds.append(tf.to_float(tf.reduce_sum(cm * cm_mask)))

if average == 'macro':

pr = tf.reduce_mean(precisions)

re = tf.reduce_mean(recalls)

fbeta = tf.reduce_mean(fbetas)

return pr, re, fbeta

if average == 'weighted':

n_gold = tf.reduce_sum(n_golds)

pr_sum = sum(p * n for p, n in zip(precisions, n_golds))

pr = safe_div(pr_sum, n_gold)

re_sum = sum(r * n for r, n in zip(recalls, n_golds))

re = safe_div(re_sum, n_gold)

fbeta_sum = sum(f * n for f, n in zip(fbetas, n_golds))

fbeta = safe_div(fbeta_sum, n_gold)

return pr, re, fbeta

else:

raise NotImplementedError()

##TODO: 这里是对单个类别计算指标的核心代码

def pr_re_fbeta(cm, pos_indices, beta=1): # for example: pos_indices= [2]

"""Uses a confusion matrix to compute precision, recall and fbeta"""

num_classes = cm.shape[0]

neg_indices = [i for i in range(num_classes) if i not in pos_indices]

cm_mask = np.ones([num_classes, num_classes])

cm_mask[neg_indices, neg_indices] = 0

diag_sum = tf.reduce_sum(tf.diag_part(cm * cm_mask))

cm_mask = np.ones([num_classes, num_classes])

cm_mask[:, neg_indices] = 0

tot_pred = tf.reduce_sum(cm * cm_mask)

cm_mask = np.ones([num_classes, num_classes])

cm_mask[neg_indices, :] = 0

tot_gold = tf.reduce_sum(cm * cm_mask)

pr = safe_div(diag_sum, tot_pred)

re = safe_div(diag_sum, tot_gold)

fbeta = safe_div((1. + beta ** 2) * pr * re, beta ** 2 * pr + re)

return pr, re, fbeta

def safe_div(numerator, denominator):

"""Safe division, return 0 if denominator is 0"""

numerator, denominator = tf.to_float(numerator), tf.to_float(denominator)

zeros = tf.zeros_like(numerator, dtype=numerator.dtype)

denominator_is_zero = tf.equal(denominator, zeros)

return tf.where(denominator_is_zero, zeros, numerator / denominator)

5. 对ROC的理解

先结合下图二分类的混淆矩阵,阐述一下含义:

混淆矩阵.png

这里的T表示真实和预测完全匹配了;而F表示真实和预测的不匹配了。而且,第一列用P表示预测为正,第二列用N表示预测为负。

对于ROC曲线,是通过TPR和FPR这两个指标来衡量综合得到的:

TPR=TP/(TP+FN):表示预测为正实际为正的占总正样本的比例。

FPR=FP/(FP+TN):表示预测为正实际为负的占总负样本的比例。

则在ROC曲线中,横坐标是FPR,纵坐标是TPR

ROC.png

理解以上图,需要结合二分类中的阈值来阐述:当分类阈值变大时候,预测为正类的样本会减少,那么带来TP、FP这两个都是预测为正的指标也变小,所以最后TPR=0,FPR=0;当分类阈值变小时候,预测为正类的样本会增加,那么带来TP、FP这两个都是预测为正的指标也变大,所以最后TPR=1,FPR=1。

所以最终会有图上两个极端的点(0,0)和(1,1),那么对于(0,1)这个点来说,表示的是TP=1、FP=0的情况,这是分类模型想要达到的最为理想的情况。所以如果ROC曲线上的某一点距离理想点(0,1)最近,那么就是设定分类模型中阈值最合适的点。

ROC的作用很大,不仅以上说的可以调节出最优的分类阈值,还可以解决类别不平衡现象。一个类别的样本数量增加很多倍时,ROC曲线基本是保持不变的。

5. 对AUC的理解

AUC (Area Under Curve) 被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。而它的作用是:使用AUC值作为评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应AUC更大的分类器效果更好。

ner 评估指标_2019-03 NER命令实体识别归纳相关推荐

  1. Python深度学习-NLP实战:命名实体识别(NER)之分词与序列标注、实体识别任务简介

    系列文章目录 Python深度学习-NLP实战:深度学习系列培训教程 Linux服务器软件的简单使用 Linux命令的简单使用 训练集.测试集.验证集的介绍及制作 字向量的训练与生成 文本分类之SVM ...

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

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

  3. NLP-文本处理:基本技术【命名实体识别、分词、拼写纠错、停用词、词性标注】、文本序列化、文本向量化、文本语料的数据分析、文本特征处理(Ngram特征添加、文本长度规范)、数据增强

    分词(tokenization):英文通过空格或者标点符号,就可以将词分开:而中文的分词会涉及很多问题(未登录词问题.分词歧义问题.分词不一致问题),所以会有各种不同分词的算法. 清洗:我们需要对文本 ...

  4. 【NLP】一文了解命名实体识别

    导读:从1991年开始,命名实体识别逐渐开始走进人们的视野,在各评测会议的推动下,命名实体识别技术得到了极大地发展,从最初的基于规则和字典的方法,到现在热门的注意力机制.图神经网络等方法,命名实体识别 ...

  5. 一文了解命名实体识别

    导读:从1991年开始,命名实体识别逐渐开始走进人们的视野,在各评测会议的推动下,命名实体识别技术得到了极大地发展,从最初的基于规则和字典的方法,到现在热门的注意力机制.图神经网络等方法,命名实体识别 ...

  6. 论文阅读:(2020版)A Survey on Deep Learning for Named Entity Recognition 命名实体识别中的深度学习方法

    A Survey on Deep Learning for Named Entity Recognition 命名实体识别中的深度学习方法 目录 A Survey on Deep Learning f ...

  7. 序列标注 | (5) 命名实体识别技术综述

    本文是对 <命名实体识别技术综述>的摘录和笔记. 论文链接 文章目录 1. 简介 2. 研究难点 3. 主要方法 4. 研究热点 5. 数据集和评价指标 6. 参考文献 1. 简介 命名实 ...

  8. 命名实体识别的两种方法

    作者:Walker 目录     一.什么是命名实体识别     二.基于NLTK的命名实体识别     三.基于Stanford的NER     四.总结 一 .什么是命名实体识别? 命名实体识别( ...

  9. python 命名实体识别_命名实体识别的两种方法

    作者:Walker 目录 一.什么是命名实体识别 二.基于NLTK的命名实体识别 三.基于Stanford的NER 四.总结 一 .什么是命名实体识别? 命名实体识别(Named Entity Rec ...

最新文章

  1. Multi task learning多任务学习背景简介
  2. 基于SAAS模式的报销管理系统!
  3. KVM(CentOS7.2)
  4. jira webhook 事件触发并程序代码调用jenkins接口触发构建操作
  5. 插入和shell排序
  6. Boost:获取随机数的实例
  7. 全代码实现ios-4
  8. C语言-附加-给一个数求最大质数(完整代码)
  9. cheat engine 将选中目标的函数_EXCEL函数与公式剖析:IF
  10. iview tooltip自动消失_实现自动驾驶,为什么要对汽车、行人的轨迹进行预测?它与物体检测、追踪和路径规划间的关系是什么?...
  11. YUV格式详解【全】
  12. 32 usb电路_【干货】快速创建基于热敏电阻的精确温度检测电路
  13. 闪耀光栅 (DMD) 的衍射效应
  14. 电脑通过android手机上网
  15. 数据管理与数据库 大学课程_根据数据,这50种最好的免费在线大学课程
  16. 虚拟滚动列表和css虚拟滚动【有思考】
  17. 【OSX】MAC下能用的炒股软件_我是亲民_新浪博客
  18. openmp多线程简单编程
  19. 重心法-判断一点是否在三角形内
  20. arduino计时器程序

热门文章

  1. 阿里云数字乡村建设解决方案,乡村环境、设施、大数据综合管理系统
  2. 树莓派伴侣–Mate One
  3. WPS中编辑的公式显示不全之解决方案,实测有效
  4. 使用Canvas(画布)完成一个时钟
  5. 联想R7000笔记本在linux上触摸板无法使用的解决办法
  6. win10关闭内存压缩
  7. pythondistinct教程_【python】用asq实现count(distinct cln)
  8. 计算机连接不上蓝牙鼠标,笔者为您win7系统蓝牙鼠标连接不上的具体步骤
  9. 【解决方案】Microsoft Visual C++ 14.0 is required
  10. 一个人可以无聊到什么程度?