超详细!linux系统nlg-eval安装指南

news2025/7/9 18:08:38

前言:最近在做文本生成的任务,需要用到bleu等评价指标,看到其他研究工作中都在用nlg-eval这个github库,就想把它拿过来用,然而安装过程并不是一帆风顺的,谨以此篇博客记录之,为后来者提供一些经验,少走一些弯路。

注:本博客适用于满足 ①linux系统因网络原因无法通过命令行nlg-eval --setup下载所需文件 以上两个条件的用户~

第一步 安装 java

1.1 到Oracle官网下载Java SE安装包,这里注意,根据github要求,安装版本要在1.8.0以上。我下载的安装包是jdk-17_linux-x64_bin.tar.gz(如下)

在这里插入图片描述
我的linux系统是Ubuntu,参考这个ubuntu安装Java教程安装java并配置环境变量。CentOS等其他系统小伙伴自行百度一下安装方法。

1.2 首先将安装包拷贝到/opt目录下,然后切换到该目录下,创建java目录并更改目录所有权

cd /opt
sudo mkdir java
sudo chown user java
sudo chgrp user java

1.3 将刚刚下载的jdk-17_linux-x64_bin.tar.gz安装包解压至创建的/opt/java/目录下

​tar -zxvf jdk-8u251-linux-x64.tar.gz -C /opt/java/

1.4 配置环境变量,在/etc/profile文件中追加如下代码

#set java environment
export JAVA_HOME=/opt/java/jdk-17.0.5
export PATH=${JAVA_HOME}/bin:${PATH}

1.5 激活java环境

source /etc/profile

1.6 验证java环境是否安装成功

java -version

在这里插入图片描述


若缺少此步骤,则会报错:

FileNotFoundError: [Errno 2] No such file or directory: ‘java’: ‘java’

第二步 下载 nlg-eval-master 安装包

2.1 网络原因,使用命令pip install git+https://github.com/Maluuba/nlg-eval.git@master无法成功下载安装包,所以去github把nlg-eval-master安装包手动下载下来之后放到linux服务器上,我的存放路径是/root/nlg-eval/(如下,这里我把nlg-eval-master 重命名为 nlg-eval)。这个路径之后会用到,大家留意自己的安装包下载路径。

存放路径
2.2 下载安装包后,使用命令行cd /root/nlg-eval/进入nlg-eval文件夹中,执行语句python setup.py install

在这里插入图片描述在这里插入图片描述


若缺少此步骤,则会报错:

nlg-eval command not found

2.3 使用命令conda list nlg-eval 初步验证nlg-eval已经存在于当前环境中:
在这里插入图片描述

第三步 本地下载所需文件,并上传至linux对应路径

3.1 由于网络原因,手动下载所有的文件到本地。需要下载的文件列表在刚刚下载好的安装包的"/root/nlg-eval/bin/nlg-eval"文件中可以找到,一共有10个文件,亲测都可以使用手动下载完成,大概7个GB。以下是下载路径汇总:

  • word2vec(2个文件)
    https://raw.githubusercontent.com/robmsmt/glove-gensim/4c2224bccd61627b76c50a5e1d6afd1c82699d22/glove2word2vec.py
    http://nlp.stanford.edu/data/glove.6B.zip

  • Skip-thoughts data(7个文件)
    http://www.cs.toronto.edu/~rkiros/models/dictionary.txt
    http://www.cs.toronto.edu/~rkiros/models/utable.npy
    http://www.cs.toronto.edu/~rkiros/models/btable.npy
    http://www.cs.toronto.edu/~rkiros/models/uni_skip.npz
    http://www.cs.toronto.edu/~rkiros/models/uni_skip.npz.pkl
    http://www.cs.toronto.edu/~rkiros/models/bi_skip.npz
    http://www.cs.toronto.edu/~rkiros/models/bi_skip.npz.pkl

  • multi-bleu.perl(1个文件)
    https://raw.githubusercontent.com/moses-smt/mosesdecoder/b199e654df2a26ea58f234cbb642e89d9c1f269d/scripts/generic/multi-bleu.perl

3.2 将本地下载好的文件上传到服务器,各文件上传的路径如下:(/root/替换成自己服务器对应的路径)

  • glove2word2vec.py 文件上传至 /root/nlg-eval/nlgeval/word2vec/ 目录下
  • multi-bleu.perl 文件上传至 /root/nlg-eval/nlgeval/multibleu/ 目录下
  • 其余8个文件上传至 /root/.cache/nlgeval/ 目录下

直接在/root/nlg-eval/目录下使用 nlg-eval --setup 命令下载上述文件会因为网络原因报错,例如:

requests.exceptions.ConnectionError: HTTPSConnectionPool(host=‘raw.githubusercontent.com’, port=443): Max retries exceeded with url: /moses-smt/mosesdecoder/b199e654df2a26ea58f234cbb642e89d9c/scripts/generic/multi-bleu.perl (Caused by NewConnectionError(‘<urllib3.connection.HTTPSConnection object at 0x7f74f2072e80>: Failed to establish a new connection: [Errno -3] Temporary failuname resolution’,))

若缺少此步骤或路径保存不当,则会报错,例如:

FileNotFoundError: [Errno 2] No such file or directory: ‘/root/nlg-eval/uni_skip.npz.pkl’

第四步 生成剩余文件

到这里,需要下载的文件已经全部上传至服务器,但是还有3个和word2vec相关的文件需要生成,这里用到 /root/nlg-eval/bin/nlg-eval 这个文件中的部分代码如下:

from nlgeval.word2vec.generate_w2v_files import generate
with ZipFile(os.path.join(data_path, 'glove.6B.zip')) as z:
    z.extract('glove.6B.300d.txt', data_path)
generate(data_path)

这里的data_path就是glove.6B.zip所在目录,我这里是 /root/.cache/nlgeval/ 。我们也可以提前把glove.6B.zip文件使用unzip命令解压缩之后直接使用下面代码:

from nlgeval.word2vec.generate_w2v_files import generate
generate(data_path)   # data_path="/root/.cache/nlgeval/"

执行结果如下:
在这里插入图片描述

上图中用红框标出来的就是刚刚生成的3个相关文件夹及其所在路径。


若缺少此步骤,则会报错:

FileNotFoundError: [Errno 2] No such file or directory: ‘/root/.cache/nlgeval/glove.6B.300d.model.bin’

至此,我们就完成所有文件的准备工作啦~
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

为节省大家的下载时间,在这里给出第三步和第四步所需的全部文件下载链接(夸克网盘),伙伴们按需自取~

链接:https://pan.quark.cn/s/449a7fc79f17
提取码:gKJ9

下载下来后直接放到对应的路径下就可以啦~

第五步 修改数据存放路径

由于我们把下载好的文件存放在目录下,所以要修改数据调用时的目录。修改方法如下:找到自己当前环境中的nlg_eval-2.3-py3.6.egg/nlgeval/utils.py文件,我的文件完整路径为/root/anaconda3/envs/torch/lib/python3.6/site-packages/nlg_eval-2.3-py3.6.egg/nlgeval/utils.py,在文件中会发现以下代码:

def get_data_dir():
    if os.environ.get('NLGEVAL_DATA'):
        if not os.path.exists(os.environ.get('NLGEVAL_DATA')):
            click.secho("NLGEVAL_DATA variable is set but points to non-existent path.", fg='red', err=True)
            raise InvalidDataDirException()
        return os.environ.get('NLGEVAL_DATA')
    else:
        try:
            cfg_file = os.path.join(XDG_CONFIG_HOME, 'nlgeval', 'rc.json')
            with open(cfg_file, 'rt') as f:
                rc = json.load(f)
                if not os.path.exists(rc['data_path']):
                    click.secho("Data path found in {} does not exist: {} " % (cfg_file, rc['data_path']), fg='red', err=True)
                    click.secho("Run `nlg-eval --setup DATA_DIR' to download or set $NLGEVAL_DATA to an existing location",
                                fg='red', err=True)
                    raise InvalidDataDirException()
                return rc['data_path']
        except:
            click.secho("Could not determine location of data.", fg='red', err=True)
            click.secho("Run `nlg-eval --setup DATA_DIR' to download or set $NLGEVAL_DATA to an existing location", fg='red',
                        err=True)
            raise InvalidDataDirException()

可以直接重写get_data_dir()函数,把上述代码改成如下并保存。

def get_data_dir():
    data_path = "/root/.cache/nlgeval/"
    return data_path

(这里另一种解决方法是修改环境变量NLGEVAL_DATA的值,如果想使用这种方法可以参考底部的资料:Linux安装NLG-Eval)


若缺少此步骤,则会报错:

FileNotFoundError: [Errno 2] No such file or directory: ‘/root/.config/nlgeval/rc.json’

第六步 测试nlg-eval的使用

运行下述代码

from nlgeval import NLGEval

hyp=['this puppy is so cute!']  # ,'He is such a cutie!','I also want one dog like this!'
ref1=['It is such a cutie!','What breed is this dog?','Where can I get one puppy like this?','What kind of dog it is?','Where can I get such a cutie?','Look at his adorable tail!']
lis=[[r] for r in ref1]

nlgeval_=NLGEval()
ans=nlgeval_.compute_metrics(hyp_list=hyp,ref_list=lis)
print(ans)

顺利得到结果~

{'Bleu_1': 0.5999999997600003, 'Bleu_2': 1.224744870871073e-08, 'Bleu_3': 3.684031496941645e-11, 'Bleu_4': 2.2360679763351715e-12, 'METEOR': 0.1333333333333333, 'ROUGE_L': 0.2, 'CIDEr': 0.0, 'SkipThoughtCS': 0.8338306, 'EmbeddingAverageCosineSimilarity': 0.859627, 'EmbeddingAverageCosineSimilairty': 0.859627, 'VectorExtremaCosineSimilarity': 0.704425, 'GreedyMatchingScore': 0.690544}

写在最后:有些坑还是要自己蹚一遍才印象深刻……之前同学帮忙装了一次,但是他毕业了哈哈,这次只能自己来喽!希望小伙伴们都可以一次安装成功~


参考资料

1.https://github.com/Maluuba/nlg-eval
2. ubuntu安装Java教程
3. Linux安装NLG-Eval
4. 评估指标nlg-eval安装包踩坑

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【菜菜的sklearn课堂笔记】逻辑回归与评分卡-重要参数penalty C

视频作者&#xff1a;菜菜TsaiTsai 链接&#xff1a;【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili 正则化是用来防止模型过拟合的过程&#xff0c;常用的有L1正则化和L2正则化两种选项。这个增加的范式&#xff0c;被称为“正则项”&#xff0c;也…

11个开源测试自动化框架,如何选?

以下为作者观点&#xff1a; 如果你正在考虑建立你自己的测试自动化框架&#xff0c;请再想一想。在大多数情况下&#xff0c;你最好可以考虑一个或多个可用的开源选项。 这是因为&#xff0c;一般来说&#xff0c;框架是一套可以跨团队使用的最佳实践、假设、通用工具和库。…

操作符详解(C语言)

算术操作符(运算符)&#xff1a; - * / % 在算术运算符中&#xff0c; - * 跟我们数学中的运算是一样的 在这里主要说一下 / 跟 % 这两个操作符 1、/ &#xff08;除法&#xff09; 在除法运算中&#xff0c;若除号两边的操作数都为整型&#xff0c;则结果…

布隆过滤器(Bloom Filter)

[TOC](布隆过滤器(Bloom Filter)) &#xff08;1&#xff09;什么是布隆过滤器 &#xff08;1&#xff09;布隆过滤器的简单介绍 布隆过滤器&#xff08;Bloom Filter&#xff09;是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以…

Python中的print()

本专栏为学习B站杨淑娟老师视频所记&#xff0c;仅做个人笔记使用&#x1f60b;&#x1f60b;&#x1f60b; &#x1f449;杨淑娟老师视频课&#x1f448; Python 职位方向 一、chapter1 1.使用print函数进行简单的输出 a100 # 变量a,值为100 b50 # 变量b,值为50print(90) …

【Linux实验】软中断通信

实验目的&#xff1a; 1&#xff0e;了解什么是信号&#xff0c;熟练掌握signal&#xff08;&#xff09;&#xff0c;wait&#xff08;&#xff09;&#xff0c;exit&#xff08;&#xff09;&#xff0c;kill&#xff08;&#xff09;函数。 2&#xff0e;熟悉并掌握Linux系统…

Learning to Enhance Low-Light Image via Zero-Reference Deep Curve Estimation

学习目标&#xff1a; Learning to Enhance Low-Light Image via Zero-Reference Deep Curve Estimation&#xff08;零参考深度曲线估计&#xff09; 个人体会&#xff1a; 本文的特色就是使用了PA和CA,对不同通道和不同像素做不同处理,虽然本文的实现过程懂了,但是实现去雾…

缝纫机牙架的数控工艺工装设计与编程

目 录 绪 论 1 2.差动牙架的工艺设计 3 2.1 机械加工工艺规程概述 3 2.2.1 零件的技术条件 4 2.2.2 加工表面及其要求 5 2.2.3零件的材料 6 2.3毛坯的选择 6 2.3.1毛坯的种类 6 2.4 基准的选择 8 2.5 机械加工工艺路线的拟订 10 3 差动牙架的工装设计 17 3.1 夹具概述 17 3.2 …

牛客CM11 - 链表分割【环形链表雏形】

看来真的不能乱割呀~一、题目描述二、思路分析三、代码详解【保姆级教学】四、环形链表的疑难解惑五、整体代码展示六、总结与提炼一、题目描述 描述 现有一链表的头指针 ListNode* pHead&#xff0c;给一定值x&#xff0c;编写一段代码将所有小于x的结点排在其余结点之前&am…

数据库-范式

目录 完全函数依赖部分函数依赖传递函数依赖码主属性非主属性第一范式(1NF)第二范式(2NF)第三范式(3NF)例题完全函数依赖 每一个属性都有用,缺一个都不能决定。 部分函数依赖 部分属性用不到,也可以决定 传递函数依赖

抽象类和(上)

大家好&#xff0c;又见面了&#xff0c;今天和大家浅谈一下抽象类 抽象类存在的意义就是被继承 抽象类 &#x1f437;1.抽象类的定义 &#x1f431;‍&#x1f680;2.抽象类的语法 &#x1f49a;3.抽象类的概念 &#x1f680;4.抽象类的作用 1.抽象类的概念 什么是 好…

[附源码]java毕业设计基于个性化的汽车购买推荐系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

如何在Ubuntu 22.04上安装Linux 内核 6.0?

内核是任何基于 Linux 的操作系统的核心部分&#xff0c;它充当计算机系统软件和硬件之间的桥梁&#xff0c;还提供用户和应用程序与计算机交互所需的接口。内核提供了许多功能&#xff0c;包括进程调度、资源分配、设备管理、中断处理、内存管理和进程。 在撰写本文时&#x…

轻松学会jQuery选择器的用法

文章目录⛳️ 选择器✨ 属性选择器✨ 包含选择器✨ 位置选择器✨ 过滤选择器✨ 反向选择器⛳️ 快速投票⛳️ 选择器 本篇重点讲解jQuery中丰富的选择器&#xff0c;以及他们的基本用法。CSS的选择器均可以用jQuery的$进行选择&#xff0c;部分浏览器对CSS3的选择器支持不全&am…

大道至简,凯里亚德酒店成为酒店投资圈万众瞩目的“新”星

作为近年酒店市场的热门领域&#xff0c;中端酒店行业的发展一直颇受关注。随之而来的就是中端酒店品牌的不断增加&#xff0c;以及中端商旅、度假型酒店规模的不断扩大&#xff0c;经行业资深人士分析&#xff0c;未来中端酒店将成为酒店市场的主力产品。鉴于市场的发展趋势&a…

Netty中的缓存Bytebuf

首先我们来明确一下Buffer&#xff08;缓存&#xff09; JavaNIO中的Buffer、Netty中的Buffer、Netty中的Bytebuf这是3个不同的类&#xff0c;但实现的内容和完成的功能几乎一致&#xff0c;最原始的是JavaNIO中的Buffer实现&#xff0c;最先进的是Netty中Bytebuf的实现&#x…

10 分钟, 带你彻底掌握 SQL 多表查询

1.前言 多表查询&#xff0c;也称为多表连接查询&#xff1b;作为关系型数据库最主要的查询方式&#xff0c;在日常工作中被广泛使用 常见的多表查询操作包含&#xff1a;子查询、内连接、左外连接、右外连接、完全连接、交叉连接 本篇文章将利用一个实例逐一介绍这些操作 …

【华为OD机试真题 python】 太阳能板最大面积【2022 Q4 | 100分】

■ 题目描述 给航天器一侧加装长方形或正方形的太阳能板&#xff08;图中的红色斜线区域&#xff09;&#xff0c;需要先安装两个支柱&#xff08;图中的黑色竖条&#xff09;&#xff0c;再在支柱的中间部分固定太阳能板。 但航天器不同位置的支柱长度不同&#xff0c;太阳能…

做一名既有宽度也有深度的测试!

一名好的测试人员&#xff0c;在工作中&#xff0c;不仅要做到有宽度更要有深度&#xff01; 何为宽度&#xff1f;测试用例的覆盖面更广更全。 测试人员设计测试用例的时候可以分为这几种类型&#xff1a; 一&#xff1a;将prd的需求描述copy到测试用例。 二&#xff1a;细…

Java线程安全与对象头结构信息

文章目录一 线程安全问题1.1 什么是线程安全问题&#xff1f;1.2 自增运算真的线程安全吗&#xff1f;1.3 Synchronized锁表现三种形势&#xff1f;1.3.1 synchronized同步方法1.3.2 synchronized同步代码块1.3.3 synchronized静态方法1.3.4 总结二 Java对象结构与内置锁2.1 Ja…