1.背景

NLP中一个最基本任务就是分词,当我们分词完成之后怎么来评判分词结果的好坏呢?换句话来说就是我该如何对分词结果打分?这个分数怎么算法,依照的标准是什么?例如:

原句子:武汉市长江大桥
分词一:武汉 市长 江大桥
分词二: 武汉市 长江大桥

对于分词一和分词二的打分应该是多少呢?为了搞清楚这个问题,我们先来学习(回顾)一些机器学习中的常见分类评估标准。

2.机器学习中的分类评估

2.1 准确率

准确率(accuracy),是一个用来衡量分类器预测结果与真实结果差异的一个指标,越接近于1说明分类结果越准确。举个例子,比如现在有一个猫狗图片分类器对100张图片进行分类,分类结果显示有38张图片是猫,62张图片是狗,经与真实标签对比后发现,38张猫的图片中有20张是分类正确的,62张狗的图片中有57张是分类正确的,那么准确率是多少呢?显然就应该是

,即分对的数量除以总的数量就这么简单,这也是准确率好理解的原因之一。

同时可以发现,对于这100张图片来说,其真实标签为狗75张,猫25张。那么现在问题就来了,假如某分类器使坏,对于输入的任何让本其结果都输出为狗,那么从整个结果来看就是狗的照片全都分对,猫的照片全都分错,准去率为

。可是仔细想想这有意义吗?若是猫狗照片数量为10和90,你啥也不做,就这么一搞准确率就到
了,岂不无法无天?那我们应该这么避免这种情况呢?那就要轮到精确率和召回率登场了。

2.2 精确率、召回率与F-score

什么精确率(precision)与召回率(recall)呢?我们先用一个矩阵来把上面猫狗分类的结果给展示出来:

怎么去读这张表呢?首先从这张表可知:数据集中有25张猫的图片,75张狗的图片;同时对于左图20这个值,其含义是将猫预测为猫的数量为20,同理5表示将猫预测为狗的数量,18表示将狗预测成猫的数量,57表示将狗预测为狗的数量。衍生开就是,如右图所示:

  • True Positive(TP):表示将正样本预测为正样本,即预测正确;
  • False Positive(FP):表示将负样本预测为正样本,即预测错误;
  • False Negative(FN):表示将负样本预测为正样本,即预测错误;
  • True Negative(TN):表示将负样本预测为负样本,即预测正确;

图p0140这个矩阵就称为混淆矩阵(confusion matrix),同时我们可以得到如下计算公式:

注:当

时称为

可以看到,精确率计算的是预测对的正样本在整个预测为正样本中的比重,而召回率计算的是预测对的正样本在整个真实正样本中的比重。因此一般来说,召回率越高也就意味着这个模型找寻正样本的能力越强。但值得注意的是,通常在实际任务中,并不明确哪一类是正样本哪一类又是负样本,所以每个类别,都可以计算其各项指标:

对于猫来说:

对于狗来说:

对于上面的计算过程,也可以通过sklearn中的包来完成。

from sklearn.metrics import classification_report,confusion_matrix
y = [0]*25 + [1]*75
y_pre =[0]*20+[1]*5+[0]*18+[1]*57
print(confusion_matrix(y,y_pre))
print(classification_report(y,y_pre,target_names=['cat','dog']))>>
[[20  5][18 57]]precision    recall  f1-score   supportcat       0.53      0.80      0.63        25dog       0.92      0.76      0.83        75

此时,通过这三个指标,我们再来对比下面的极端情况:

对于猫来说:精确率、召回率、F1分别为:0,0,0

对于狗来说:精确率、召回率、F1分别为:0.75,1,0.86

只用准确率:准确率为0.75

还有一个问题就是,既然有了精确率和召回率那还搞了F1干啥?这当然也是为了避免一些极端情况。还是以上面的数据为例,试想一下假如某个分类器说对于猫的识别,它的召回率能做到1,那么这算是厉害还是不厉害呢?可能厉害也可能不厉害,厉害就是当猫狗所有类别都分类正确的情况下,但这是及其困难;还有一种作弊的方式就是将所有的样本都预测成猫,那么这样将会得到如下混淆矩阵:

此时对于猫来说,其精确率、召回率、F1分别为:0.25,1,0.4

总结就是,通过引入精确率,召回率能够明显的解决只用准确率的不足之处,同时加入F-score能够解决召回率和精确率的不足之处。

3.NLP中的精确率、召回率和F-score

前面说到的分类中的评估标准,但是在分词中标准答案和分词结果数不一定相等,因此要做一个思维转换。对于长为

的字符串,分词结果是一系列单词。设每个单词按照其在文中的起止位置可记作区间
,其中
。那么标准答案所有区间构成集合
作为正类,其它情况作为负类。同时,即分词结果所有单词构成的区间集合为
。那么:

因此相应的计算公式如下:

这样说可能有点晦涩,如下图所示:

可以发现,重合部分就是正确部分;因此,对于分词结果1来说,精确率和召回率均为0,因为没有重合部分。而对于分词结果2来说都为1。下面再来看个例子:

此时的精确率为:

,召回率为:

4. OOV Recall 与 IV Recall

OOV指的是“未登录词”(Out Of Vocabulary)的简称,也就是新词,已知词典中不存在的词。出现OOV的原因一方面可能确实是因为产生了有意义的新词而词典并没有收录;另一方面可能就是因为分词器产生的错误无意义的分词结果,这当然也不会出现在字典中。IV指的是“登陆词”(In Vocabulary),也就是已经存在字典中的词。而OOV Recall和IV Recall 分别指的就是OOV的召回率和IV的召回率。为了说明这两个召回率的具体含义,请先耐心看下面的详细例子:

标准分词 A:['结婚',' 的',' 和',' 尚未',' 结婚 ','的',' 都',' 应该',' 好好',' 考虑',' 一下',' 人生',' 大事']

标准区间 A:[1,2],[3,3],[4,4],[5,6],[7,8],[9,9],[10,10],[11,12],[13,14],[15,16],[17,18],[19,20],[21,22]

分词结果 B:['结婚',' 的','和尚','未结婚 ','的 ','都',' 应该',' 好好考虑',' 一下',' 人生大事']

分词区间 B:[1,2],[3,3],[4,5],[6,7,8],[9,9],[10,10],[11,12],[13,14,15,16],[17,18],[19,20,21,22]

重复词语 A∩B:['结婚',' 的',' 的',' 都',' 应该',' 一下']

重复区间 A∩B:[1,2], [3,3], [9,9],[10,10],[11,12],[17,18]

词典:['结婚', '尚未', '的', '和', '青年', '都', '应该', '好好考虑', '自己', '人生', '大事']

前面三项指标同第3节中的一样,不在赘述。从上面的计算过程可以看到,OOV召回率等于重复词区间未在词典中出现的词除以标准分词中未在词典中出现的词。需要注意的是重复词区间未在词典中出现的词就意味着未在字典中出现的新词是有意义的,只是字典没有收录而已;同理标准分词中未在词典中出现的词就更是如此。同时也可以将两者分别称为重复词区间有意义的新词所有有意义的新词。有意义的新词越多也就表示你用来分词的字典收录越不全(可能也会因为词语的颗粒度大小造成),而OOV recall越低也就意味着词典分词器对有意义新词的发现或者说查找能力越低。

同理,从IV 召回率的计算公式可以发现重复词区间在词典中出现的词指的就是分词得到的正确部分(即正样本);标准分词中在词典中出现的词指的就是所有正样本。因此,IV 召回率就可以来衡量词典中的词被正确找回的概率。如果IV召回率低,就说明字典分词器连词典中的词汇都无法百分之百的发现或者找回,说明其消歧能力不好。例如“商品,和服,服务”三个词都在词典中,词典分词依然可能分布对句子”商品和服务“。

 import re​def to_region(segmentation: str) -> list:"""将分词结果转换为区间:param segmentation: 商品 和 服务:return: [(0, 2), (2, 3), (3, 5)]"""region = []start = 0for word in re.compile("s+").split(segmentation.strip()):end = start + len(word)region.append((start, end))start = endreturn region​​def prf(gold: str, pred: str, dic) -> tuple:"""计算P、R、F1:param gold: 标准答案文件,比如“商品 和 服务”:param pred: 分词结果文件,比如“商品 和服 务”:param dic: 词典:return: (P, R, F1, OOV_R, IV_R)"""A_size, B_size, A_cap_B_size, OOV, IV, OOV_R, IV_R = 0, 0, 0, 0, 0, 0, 0A, B = set(to_region(gold)), set(to_region(pred))A_size += len(A)B_size += len(B)A_cap_B_size += len(A & B)text = re.sub("s+", "", gold)​for (start, end) in A:word = text[start: end]if word in dic:IV += 1else:OOV += 1​for (start, end) in A & B:word = text[start: end]if word in dic:IV_R += 1else:OOV_R += 1p, r = A_cap_B_size / B_size * 100, A_cap_B_size / A_size * 100return p, r, 2 * p * r / (p + r), OOV_R / OOV * 100, IV_R / IV * 100​​if __name__ == '__main__':dic = ['结婚', '尚未', '的', '和', '青年', '都', '应该', '好好考虑', '自己',  '人生', '大事']gold = '结婚 的 和 尚未 结婚 的 都 应该 好好 考虑 一下 人生 大事'pred = '结婚 的 和尚 未结婚 的 都 应该 好好考虑 一下 人生大事'print("Precision:%.2f Recall:%.2f F1:%.2f OOV-R:%.2f IV-R:%.2f" % prf(gold, pred, dic))

5. 总结

此处一共介绍了精确率、召回率、F-score、OOV召回率、IV召回率,其中前面三种指标可以用来衡量任意一种分词器分词结果的好坏;而后两种指标则是用来衡量基于词典分词模型好坏的一个评估指标。同时,一定需要明白的是:精确率计算的是预测对的正样本数占整个预测为正样本数的比重,而召回率计算的是预测对的正样本占整个真实正样本的比重,而F-score则是对两者的一个调和平均。

参考:

  • 《自然语言处理入门》,何晗

nlp 优缺点 混淆度_NLP中文分词的评估指标相关推荐

  1. NLP学习(二)中文分词技术

    运行平台: Windows Python版本: Python3.x IDE: PyCharm 一. 前言 这篇内容主要是讲解的中文分词,词是一个完整语义的最小单位.分词技术是词性标注.命名实体识别.关 ...

  2. NLP学习(二)—中文分词技术

    本次代码的环境: 运行平台: Windows Python版本: Python3.x IDE: PyCharm 一.    前言 这篇内容主要是讲解的中文分词,词是一个完整语义的最小单位.分词技术是词 ...

  3. 简易中文分词算法(python)_自然语言处理(NLP)中的的中文分词算法及 Python 实现...

    本 Chat 首先简单介绍了自然语言处理中中文分词的概念和应用场景.然后通过两个简单的小例子展示了算法的步骤.接着编写了 Python 代码,并在<红楼梦>上做了测试.最后,总结了我在写代 ...

  4. 【python 走进NLP】利用jieba技术中文分词并写入txt

    简单介绍: 近年来,随着NLP自然语言处理技术的日益成熟,开源实现的分词工具也越来越多,比如NLTK:其在英文分词较为成熟,分词效果较好,在处理中文分词方面则显得力不足:在处理中文分词时,Jieba这 ...

  5. NLP第2课:中文分词利器 jieba 和 HanLP

    前言 从本文开始,我们进入实战部分.首先,我们按照中文自然语言处理流程的第一步获取语料,然后重点进行中文分词的学习.中文分词有很多种,常见的比如有中科院计算所 NLPIR.哈工大 LTP.清华大学 T ...

  6. NLP第三周(中文分词,新词发现,tfidf)(1)

    正向最大匹配 其主要是目的是将一句话分成进行词语的划分,相当于看看这句话由哪些词语组成,最完美的解决方案是,我会准备一个词库,然后我输入进去一句话,刚好我用我词库里面的词语把这句话分成一个一个词,一个 ...

  7. java 中文分词 比较_中文分词工具评估:chinese-segmentation-evaluation

    作者:tiandi,小米AI实验室,智能问答.智能客服方向.

  8. NLP笔记:中文分词工具简介

    中文分词工具简介 0. 引言 1. jieba分词 1. jieba分词的基本用法 2. jieba分词的进阶版用法 1. 全模式的分词 2. 自定义领域词表加入 3. 使用jieba进行关键词抽取 ...

  9. jieba库 python2.7 安装_Python中文分词工具大合集:安装、使用和测试

    这篇文章事实上整合了前面两篇文章的相关介绍,同时添加一些其他的Python中文分词相关资源,甚至非Python的中文分词工具,仅供参考. 首先介绍之前测试过的8款中文分词工具,这几款工具可以直接在AI ...

最新文章

  1. 介绍三种绘制时间线图的方法
  2. 编译问题 文件查找失败: ‘vant‘
  3. 42.对话框插件——dialog
  4. js数组查找最接近_如何从javascript中的对象数组中获取最接近的先前id
  5. Kubernetes 架构(上)- 每天5分钟玩转 Docker 容器技术(120)
  6. oracle hibernate 自动创建表,自动创建表时,多了一张表hibernate_sequence,为什么?
  7. linux反汇编时乱码,Linux反汇编代码理解 标准例子 很好
  8. 企业如何从大数据系统中获益
  9. 使用selenium搭建网站自动化测试框架及selenium简介
  10. 全球前十大证券交易所在区块链领域的探索和布局
  11. 用html5写个炫酷的3d电子相册
  12. 解构淘宝SPM/SCM流量跟踪体系
  13. KEIL使用malloc函数申请堆空间失败的解决方法
  14. 是时候回答【我为什么要学习 Go 语言(golang)】这个问题了
  15. Kali-WIFI攻防(二)----无线网络分析工具Aircrack-ng
  16. Scale-Equalizing Pyramid Convolution for Object Detection论文阅读
  17. 6.4 深度负反馈放大电路放大倍数的分析
  18. 运算符-if语句-switch语句-循环语句-continue/break语句
  19. continu和break的区别
  20. 「博文视点」专访黄哲铿/ Mr.K:未来三年,如何努力?如何赚钱?如何发展?...

热门文章

  1. Linux 内核源代码分析 chap 2 存储管理 (5)
  2. 在报No suitable driver found for jdbc:mysql情况下,我是如何一步一步实现jmeter成功连接mysql...
  3. 在iOS端如何使用Charles用作http调试
  4. Citrix XenApp 6.0 发布应用程序时 ICO 错误的解决方法
  5. mysql100个优化技巧_MySQL 调优/优化的 100 个建议
  6. python bisect_Python中bisect的用法
  7. 适合数据科学小白的必备Python工具! ! !
  8. python中不可不知的一个重要的集合模块
  9. python爬图片_网络爬虫经验:反爬和反反爬
  10. python第三方库无法下载_无法使用从PyCharm中下载的第三方库