自然语言处理学习笔记(八)———— 准确率

目录

1.准确率定义

2.混淆矩阵与TP/FN/FP/TN

3. 精确率

4.召回率

5.F1值

6.中文分词的P、R、F1计算

7.实现


1.准确率定义

        准确率是用来衡量一个系统的准确程度的值,可以理解为一系列评测指标。当预测与答案的数量相等时,准确率指的是系统做出正确判断的次数除以总的测试次数。

        在中文分词任务中,一般使用在标准数据集上词语级别的精确率、召回率与F1值来衡量分词器的准确程度。这三个术语借用自信息检索与分类问题,常用来衡量搜索引擎和分类器的准确程度。

2.混淆矩阵与TP/FN/FP/TN

        搜索引擎、分类器、中文分词场景下的准确率本质上都是4个集合的并集运算。分类预测与答案的四种组合:

预测/答案PN
PTPFP
NFNTN

(1) TP (true postive) :预测是P ,答案果然是真的P
(2) FP (false postive) : 预测是P ,答案是N ,因此是假的P
(3) TN (true postive) : 预测是N ,答案果然是真的N
(4) FN (false postive) : 预测是N ,答案是P,因此是假的P

上表在机器学习中被称为混淆矩阵,用来衡量分类结果的混淆程度。混淆矩阵有如下性质:

只要混淆矩阵确定了,三个准确指标就都确定了。

3. 精确率

        精确率(precision ,简称P值) 指的是预测结果中正类数量占全部结果的比率。正类的选择非常重要。

4.召回率

        召回率(Recall)指的是正类样本中能被找出来的比率。

        区分P值和R值的时候,只需记住两者分子都是真阳的样本数,只不过P值的分母是预测阳性的数量,而R值的分母是答案阳性的数量。

5.F1值

        一般而言,精确率和召回率难以平衡,召回率高的系统往往精确率低,反之亦然。

精确率和召回率的调和平均F1的值来作为综合性指标:

6.中文分词的P、R、F1计算

        在中文分词中,标准答案和分词结果的单词数不一定相等。而且混淆矩阵针对的是分类问题,而中文分词却是一个分块(chunking)问题。

        将分块问题转换为分类问题。对于长为 n 的字符串,分词结果是一系列单词。每个单词按它在文本中的起止位置可记作区间【i,j】,其中1\leqslant i\leqslant j\leqslant n。那么所有标准答案的所有区间构成一个集合 A,称为正类。此集合之外的所有区间构成另一个集合(A的补集),作为负类。同理,记所有分词结果的区间构成集合B。则:

例如:

7.实现

import re
from pyhanlp import *
from tests.test_utility import ensure_datadef 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 regiondef 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, 0with open(gold, encoding='utf-8') as gd, open(pred, encoding='utf-8') as pd:for g, p in zip(gd, pd):A, B = set(to_region(g)), set(to_region(p))A_size += len(A)B_size += len(B)A_cap_B_size += len(A & B)text = re.sub("\\s+", "", g)for (start, end) in A:word = text[start: end]if dic.containsKey(word):IV += 1else:OOV += 1for (start, end) in A & B:word = text[start: end]if dic.containsKey(word):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 * 100if __name__ == '__main__':print(to_region('商品 和 服务'))sighan05 = ensure_data('icwb2-data', 'http://sighan.cs.uchicago.edu/bakeoff2005/data/icwb2-data.zip')msr_dict = os.path.join(sighan05, 'gold', 'msr_training_words.utf8')msr_test = os.path.join(sighan05, 'testing', 'msr_test.utf8')msr_output = os.path.join(sighan05, 'testing', 'msr_output.txt')msr_gold = os.path.join(sighan05, 'gold', 'msr_test_gold.utf8')DoubleArrayTrieSegment = JClass('com.hankcs.hanlp.seg.Other.DoubleArrayTrieSegment')segment = DoubleArrayTrieSegment([msr_dict]).enablePartOfSpeechTagging(True)with open(msr_gold, encoding='utf-8') as test, open(msr_output, 'w', encoding='utf-8') as output:for line in test:output.write("  ".join(term.word for term in segment.seg(re.sub("\\s+", "", line))))output.write("\n")print("P:%.2f R:%.2f F1:%.2f OOV-R:%.2f IV-R:%.2f" % prf(msr_gold, msr_output, segment.trie))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/102918.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ECS通过DNAT将C非专线网段并网

1.问题描述 客户需求:ECS1需要访问140.131.208.0/24 ,由于140.131.208.0/24网段属于公网地址,在CSW侧为进行并网。 解决方案:故将ECS1发起的请求其在云内ECS2做DNAT,将该网段转换成CSW并网网段170.101.253.0/24&…

【JavaScript】JS语法入门到实战

文章目录 一、初识JavaScript1. 什么是JavaScript?2. JavaScript 和 HTML 和 CSS 之间的关系3. JavaScript的运行过程4. JavaScript的组成 二、JavaScript的书写形式三、变量1. 输入输出2. 变量的使用3. 数据类型 四、运算符五、分支和循环语句1. 分支语句2. 循环语…

20230831-完成登录框的按钮操作,并在登录成功后进行界面跳转

登录框的按钮操作&#xff0c;并在登录成功后进行界面跳转 app.cpp #include "app.h" #include <cstdio> #include <QDebug> #include <QLineEdit> #include <QLabel> #include <QPainter> #include <QString> #include <Q…

Linux:进程(概念)

学习目标 1.认识冯诺依曼系统 2.认识操作系统概念与定位 (系统调用接口) 3.理解进程的概念&#xff08;PCB&#xff09; 4.理解进程的状态&#xff08;fork创建进程&#xff0c;僵尸进程及孤儿进程&#xff09; 5.了解进程的调度&#xff08;优先级&#xff0c;竞争性&#xff…

LeetCode(力扣)46. 全排列Python

LeetCode46. 全排列 题目链接代码 题目链接 https://leetcode.cn/problems/permutations/ 代码 class Solution:def backtracking(self, nums, result, path, used):if len(path) len(nums):result.append(path[:])for i in range(len(nums)):if used[i]:continuepath.app…

53、springboot对websocket的支持有两种方式-------1、基于注解开发 WebSocket ,简洁实现多人聊天界面

基于注解开发 WebSocket –注解就是&#xff1a; OnOpen、 OnClose 、 OnMessage 、OnError这些 ★ WebSocket的两种开发方式 ▲ Spring Boot为WebSocket提供了两种开发方式&#xff1a; 基于spring-boot-starter-websocket.jar开发WebSocket 基于Spring WebFlux开发WebSoc…

C++(QT)画图行车

通过鼠标在窗口上点击形成多个点的连线&#xff0c;绘制一辆汽车沿着绘制的连线轨迹前进。要求连线点数大于20.可以通过清除按钮清除已经绘制的连线&#xff0c;并可以重新绘制一条轨迹连线。当车辆行驶到轨迹终点时&#xff0c;自动停止。&#xff08;汽车实在可用方块代替&am…

javaee spring aop实现事务 项目结构

spring配置文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:context"http://www.springframewo…

【数据结构】 七大排序详解(贰)——冒泡排序、快速排序、归并排序

文章目录 ⚽冒泡排序⚾算法步骤&#x1f3a8;算法优化&#x1f94e;代码实现&#xff1a;&#x1f3c0;冒泡排序的特性总结 &#x1f9ed;快速排序⚽算法思路&#x1f4cc;思路一&#xff08;Hoare版&#xff09;&#x1f4cc;思路二&#xff08;挖坑法&#xff09;&#x1f4c…

【MySQL系列】MySQL的事务管理的学习(一)_ 事务概念 | 事务操作方式 | 事务隔离级别

「前言」文章内容大致是MySQL事务管理。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、事务概念二、事务的版本支持三、事务提交方式四、事务常见的操作方式4.1 事务正常操作4.2 事务异常验证 五、事务隔离级别5.1 查看与设置隔离性5.2 读未提交&…

c语言实训心得3篇集合

c语言实训心得体会一&#xff1a; 在这个星期里&#xff0c;我们专业的学生在专业老师的带领下进行了c语言程序实践学习。在这之前&#xff0c;我们已经对c语言这门课程学习了一个学期&#xff0c;对其有了一定的了解&#xff0c;但是也仅仅是停留在了解的范围&#xff0c;对里…

软件测试/测试开发丨Python 深拷贝与浅拷贝

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27327 深拷贝与浅拷贝 浅拷贝&#xff1a;有4中实现方法&#xff1a;对象本身的copy方法&#xff0c;工厂方法&#xff0c;切片以及copy模块的copy方法。…