文本评估指标 BLEU,METEOR,ROUGE

文本评估指标

这里注意库包的版本,亲测这个很包敏感,所以一定要调好库版本
nltk == 3.6.3 如果这个包的版本不对会报错,很难理解的那种
rouge==1.0.1

在这里插入图片描述

定义函数

import jieba
from rouge import Rouge
from nltk.translate.meteor_score import meteor_score
from nltk.translate.bleu_score import sentence_bleu, SmoothingFunction
from IPython import embed
ref_tokens  = list(jieba.cut("这个是什么东西,狗吗"))
cand_tokens  = list(jieba.cut("这个不像是狗,更像是猫"))

def process_text(ref_tokens, cand_tokens):
    return list(jieba.cut(ref_tokens)), list(jieba.cut(cand_tokens))

def calculate_bleu(ref_tokens, cand_tokens):
    weights_1 = (1.0, 0, 0, 0)
    weights_2 = (0.5, 0.5, 0, 0)
    weights_3 = (0.33, 0.33, 0.33, 0)
    bleu_1 = sentence_bleu([ref_tokens], cand_tokens, weights=weights_1, smoothing_function=SmoothingFunction().method1)
    bleu_2 = sentence_bleu([ref_tokens], cand_tokens, weights=weights_2, smoothing_function=SmoothingFunction().method1)
    bleu_3 = sentence_bleu([ref_tokens], cand_tokens, weights=weights_3, smoothing_function=SmoothingFunction().method1)
    # print(f"bleu_1:{bleu_1} bleu_2:{bleu_2}: bleu_3:{bleu_3}")
    return bleu_1, bleu_2, bleu_3


def calculate_meteor(ref_tokens, cand_tokens):
    # embed()
    meteor = meteor_score([" ".join(ref_tokens)], " ".join(cand_tokens))
    # print(f"meteor_score:{meteor}")
    return meteor


def calculate_rouge_l(ref_tokens, cand_tokens):
    rouge = Rouge()
    scores = rouge.get_scores(' '.join(cand_tokens), ' '.join(ref_tokens))
    rouge_l = scores[0]['rouge-l']['f']
    # print(f"rouge_l:{rouge_l}")
    return rouge_l

使用说明

import re
import os
import cv2
import torch
import pydicom
import numpy as np
import pandas as pd
from tqdm import tqdm
import numpy.random as random
import torch.utils.data as data
from sklearn.utils import shuffle
from torchvision import transforms

class Dataset:
    def __init__(self, xlsx_file):
        self.df = pd.read_excel(xlsx_file)
        self.examples = []
        for index, row in self.df.iterrows():
            report_description = row['description']
            report_diagnosis = row['diagnosis']
            if not isinstance(report_description, str):
                report_description = ''
            if not isinstance(report_diagnosis, str):
                report_diagnosis = ''
            report = report_description + "\n" + report_diagnosis
            self.examples.append(report)

dataset_path = "path/to/file.xlsx"
dataset = Dataset(xlsx_file=dataset_path)
samples = shuffle(dataset.examples, random_state=42)[:5000]
bleu_scores_1_list = []
bleu_scores_2_list = []
bleu_scores_3_list = []

meteor_scores = []

rouge_l_scores = []

for sample in tqdm(samples,total=len(samples)):
    # 随机选择一个样本进行比较
    compare_sample = np.random.choice(samples)
    # print(sample)
    # print(compare_sample)

    sample,compare_sample = process_text(sample,compare_sample)
    # 计算指标
    bleu_score_1, bleu_score_2, bleu_score_3 = calculate_bleu(sample, compare_sample)
    embed()
    meteor_score_tmp = calculate_meteor(sample, compare_sample)
    rouge_l_score = calculate_rouge_l(sample, compare_sample)
    
    bleu_scores_1_list.append(bleu_score_1)
    bleu_scores_2_list.append(bleu_score_2)
    bleu_scores_3_list.append(bleu_score_3)
    
    meteor_scores.append(meteor_score_tmp)
    rouge_l_scores.append(rouge_l_score)

    # print(f"bleu_1: {bleu_score_1} bleu_2:{bleu_score_2} bleu_3:{bleu_score_3} meteor:{meteor_score_tmp} rouge_l:{rouge_l_score}")

bleu_scores_1_=np.mean(bleu_scores_1_list)
bleu_scores_2_=np.mean(bleu_scores_2_list)
bleu_scores_3_=np.mean(bleu_scores_3_list)
meteor_scores_=np.mean(meteor_scores)  
rouge_l_scores_=np.mean(rouge_l_scores)  
print(f"bleu_1: {bleu_scores_1_} bleu_2:{bleu_scores_2_} bleu_3:{bleu_scores_3_} meteor:{meteor_scores_} rouge_l:{rouge_l_scores_}")

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CrossOver玩游戏会损害电脑吗 CrossOver玩游戏会卡吗 Mac玩游戏 crossover24免费激活

CrossOver是一款可以在macOS上运行Windows应用程序的软件,它利用了Wine技术,无需安装虚拟机或双系统,可以直接在苹果系统下运行Windows游戏。那么,使用CrossOver玩游戏会损害电脑吗?CrossOver玩游戏会卡吗?…

java中:print与println的区别

目录 区别 区别 print是直接打印输出 println是输出后自动回车到下一行 例如 public class test {public static void main(String[] args){System.out.println("换行");System.out.print("不换行");System.out.println();}}——————————————…

Scala第十五章节(递归的相关概述、Scala阶乘案例、Scala斐波那契数列案例、Scala打印目录文件案例)

章节目标 了解递归的相关概述掌握阶乘案例掌握斐波那契数列案例掌握打印目录文件案例 1. 递归 递归指的就是 方法自己调用自己的情况 . 在涉及到复杂操作时, 我们会经常用到它. 在使用递归时, 要注意以下三点: 递归必须有出口, 否则容易造成 死递归 .递归必须要有规律.构造…

跑spark的yarn模式时RM连不上的情况

在linux控制台跑spark on yarn一个测试案例,日志中总显示RM连yarn服务的时候是:0.0.0.0:8032 具体情况如下图: 我问题出现的原因,总结如下: 1.防火墙没关闭,关闭 2.spark-env.sh这个文件的YARN_CONF_DIR…

爱上数据结构:二叉树的基本概念

​ ​ 🔥个人主页:guoguoqiang. 🔥专栏:数据结构 ​ 一、树的基本概念 1.概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起…

鸿蒙OS开发案例:【ArkTS类库多线程CPU密集型任务Worker】

使用Worker进行长时间数据分析 通过某地区提供的房价数据训练一个简易的房价预测模型,该模型支持通过输入房屋面积和房间数量去预测该区域的房价,模型需要长时间运行,房价预测需要使用前面的模型运行结果,因此需要使用Worker。 …

【C++】C++入门第二课(函数重载 | 引用 | 内联函数 | auto关键字 | 指针空值nullptr)

目录 前言 函数重载 概念 重载函数的条件 C支持重载函数的原理--名字修饰 引用 概念 特性 常引用(const引用) 使用场景 传值,传引用效率比较 引用和指针的区别 内联函数 概念 特性 auto关键字(C11) a…

golang grpc和protobuf的版本降级问题(version4 -> version3)

最后更新于2024年3月28日 10:57:52 简中没查到类似的文章。一点小事闹麻了,搞了一天,特意发出来造福大家。 所谓的版本就是下面这个东西proto.ProtoPackageIsVersion4或者proto.ProtoPackageIsVersion3: 目的 为了适配旧代码&#xff0c…

C语言之位段

1.位段的声明 位段的声明和结构是类似的,有两个不同: 1.位段的成员必须是 int、unsigned int 或signed int 。 2.位段的成员名后边有一个冒号和一个数字。 比如: struct A {int _a:2;int _b:5;int _c:10;int _d:30; }; A 就是一个位段类型…

阿里云服务器安装SSL证书不起作用的解决方案

阿里云服务器安装SSL证书不起作用的解决方案 在阿里云安装SSL证书后,访问无效,各种检查证书安装没有问题。忽然想到阿里云默认连80端口都没开启,443端口应该也没开启。 登录阿里云控制台 - 云服务器 ECS - 网络与安全 - 安全组 - 管理规则 - …

【Redis】Redis 内存管理,Redis事务,bigkey和hotkey

目录 Redis 内存管理 缓存数据设置过期时间? Redis 是如何判断数据是否过期的呢? 过期删除策略 内存淘汰机制 主从模式下对过期键的处理? LRU和LFU的区别 Redis事务 定义和原理 Redis 事务的注意点? 为什么不支持回滚&a…

C++析构函数

当对象的生存期结束时,系统就会自动执行析构函数清除其数据成员所分配的内存空间。 析构函数的定义格式为: ~类名();//没有返回值,没有参数 注: (1)析构函数名是由“~”加类名组成的。 (2&#…

[HackMyVM]靶场Flossy

难度:Medium kali:192.168.56.104 靶机:192.168.56.142 端口扫描 ┌──(root㉿kali2)-[~/Desktop] └─# nmap 192.168.56.142 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-01 21:01 CST Nmap scan report for 192.168.56.142 Host is up (0.00018s latency).…

linux shell命令(进程管理、用户管理)

一、进程的概念 主要有两点: 1.进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)…

ASCII编码的全面介绍

title: ASCII编码的全面介绍 date: 2024/4/1 20:05:52 updated: 2024/4/1 20:05:52 tags: ASCII定义编码原理编码表结构扩展编码应用场景优势与局限安全考量 1. ASCII编码的定义和历史 ASCII(American Standard Code for Information Interchange)是一…

Linux安装JDK及配置环境变量保姆级教程

文章目录 前言一、JDK下载一、Linux安装JDK及配置环境变量1.创建JDK的安装目录2.上传下载好的JDK安装包3.解压缩4.配置环境变量(根据自己jdk的实际安装位置进行配置)5.加载配置文件6.查看java版本(此时jdk就已将安装完成) 前言 JD…

基于SSM+Jsp+Mysql的固定资产管理系统

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包…

嵌入式网络硬件方案

一. 简介 本文来了解一下嵌入式有些网络中,涉及的网络硬件方案。 注意:本文说明的是有些网络。 提起网络,我们一般想到的硬件就是“网卡”,“网卡”这个概念最早从电脑领域传出来,顾名思义就是能上网的卡。在电脑领…

UE4_动画基础_ 瞄准偏移1D(Aim Offset Blend Space 1D)

瞄准偏移1D基本上可以完成角色的向左看向右看或者向上看向下看,像混合空间1D一样只有一个轴向可用。 操作步骤: 1、新建第三人称模板项目。 2、右键——动画——瞄准偏移1D 选取骨骼 双击打开 3、瞄准偏移混合的是姿势,我们需要创建姿势。 …

ALPHA开发板上PHY网络芯片LAN8720

一. 简介 正点原子的开发板 ALPHA开发板,有线网络硬件方案所使用的也是最常用的一种方案,IMX6ULL芯片内部是自带 MAC网络芯片的,所以,也就是采用 "SOC内部集成网络MAC外设 PHY网络芯片方案"。 ALPHA开发板使用的PHY网…