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

2023/11/30 10:06:27

前言:最近在做文本生成的任务,需要用到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.jnnr.cn/a/133285.html

相关文章

retrofit网络框架源码解析

App应用程序通过Retrofit 请求网络&#xff0c;实际上是使用Retrofit接口层封装请求参数&#xff0c;之后由OkHttp完成后续的请求操作。在服务器返回数据之后&#xff0c;OkHttp将原始的结果交给Retrofit&#xff0c;Retrofit根据用户的需求对结果进行解析。 一、retrofit框架网…

简单实用的Python图像处理库Pillow

Pillow图像处理Pillow 库的安装图象处理基本知识图像的RGB 色彩模式像素阵列Image 模块打开和新建混合透明度混合处理遮罩混合处理复制和缩放复制图像缩放像素缩放图像粘贴和裁剪粘贴裁剪图像图像旋转格式转换covert()transpose()分离和合并分离合并滤镜其他内置函数ImageFilte…

【附源码】计算机毕业设计JAVA教学辅助系统

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

Mysql之视图、索引【第五篇】

大纲&#xff1a; 一、视图 1、什么是视图&#xff1f; 1) MySQL 视图(View)是一种虚拟的表&#xff0c;是从数据库中一个或多个表中导出来的表。视图由列和行构成&#xff0c;行和列的数据来自于定义视图的查询中所使用的表&#xff0c;并且还是在使用视图时动态生成的。 …

【面试题】 TypeScript 前端面试题 由浅到深

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 基本类型介绍 1.Boolean&#xff0c;Number&#xff0c;String 声明:类型 类型对应变量 let flag:boolean true let …

项目经理如何搞懂难缠的客户【静说】

作为乙方的项目经理&#xff0c;是否经常遇见难缠的客户&#xff0c;现环境下&#xff0c;大部分都是甲方强势&#xff0c;乙方弱势&#xff0c;双方处于一种不对等的基础上&#xff0c;项目经理如何生产&#xff0c;成功交付项目呢&#xff1f; 流程机制上如何应对&#xff1…

动态树的最值

一 问题描述 一棵树有 N 个节点&#xff0c;每个节点都有一个权值 Wi &#xff0c;有 4 种操作。 ① 1 x y &#xff0c;在两个节点 x、y 之间添加一条新边。因此&#xff0c;在这种操作之后&#xff0c;两棵树将连接成一棵新树。 ② 2 x y &#xff0c;在树集合中找到包含节…

java计算机毕业设计ssm+vue工商学院办公用品管理信息系统

项目介绍 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时…

基于python的驾校管理系统的设计与实现

摘 要 随着信息化时代的到来&#xff0c;系统管理都趋向于智能化、系统化&#xff0c;驾校管理系统也不例外&#xff0c;但目前国内的有些驾校仍然都使用人工管理&#xff0c;驾校规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人工管理显然已无法应对时代的变化…

精彩回顾:CACTER邮件数据防泄露EDLP亮相2022世界互联网大会

2022年世界互联网大会乌镇峰会于11月11日胜利闭幕。 本届峰会是世界互联网大会国际组织成立后的首届年会&#xff0c;以“共建网络世界 共创数字未来—携手构建网络空间命运共同体”为主题&#xff0c;共设置1场全体会议和20场分论坛&#xff0c;围绕全球网络空间热点问题展开讨…

MySQL自连接和内连接和外连接_左外连接+右外连接

自连接&#xff1a;将一张表看作两张表 练习&#xff1a;查询员工id&#xff0c;员工姓名及其管理者的id和姓名select emp.employee_id,emp.last_name,mgr.employee_id,mgr.last_name from employees emp,employees mgr where emp.manager_id mgr.employee_id;内连接 只是把左…

Celery快速使用(定时任务、Django中使用Celery、秒杀逻辑、双写一致性)

文章标题一、Celery快速使用二、Celery包结构三、Celery异步任务 延时任务 定时任务四、Django中使用Celery五、秒杀逻辑六、双写一致性1&#xff09;路飞项目接口加缓存2&#xff09;Celery定时任务实现双写一致性一、Celery快速使用 简单介绍Celery Celery官网:http://www.…

基于docker部署redis多主多从集群

在docker中部署redis多主多从集群&#xff0c;准备部署三对一主一从服务&#xff0c;共6个 首先获取镜像 这里使用的是6.0.8版本 docker pull redis:6.0.8 启动六个容器 docker run -d --name redis-node1 --net host --privilegedtrue -v /usr/local/redis/node1:/data red…

网站攻击技术,一篇打包带走!

大家好&#xff0c;今天给大家介绍一下&#xff0c;Web安全领域常见的一些安全问题。 1. SQL 注入 SQL注入攻击的核心在于让Web服务器执行攻击者期望的SQL语句&#xff0c;以便得到数据库中的感兴趣的数据或对数据库进行读取、修改、删除、插入等操作&#xff0c;达到其邪恶的…

API安全防护解决方案

究竟什么是API 常规定义下&#xff0c;API是应用程序接口&#xff08;Application Programming Interface&#xff09;的简称&#xff0c;其含义比较宽泛&#xff0c;泛指一组定义、程序及协议的集合。随着技术领域的细分和前后端分离架构模式的推广&#xff0c;App应用、小程…

VBA调用宏的方式总结大全

文章目录背景方式一 : Excel菜单执行宏方式二 : 按钮绑定宏1. 插入按钮2. 绑定宏方式三 : 窗体绑定宏1. 插入窗体2. 拖入按钮3. 绑定按钮点击事件触发宏(写代码)方式四 : 事件绑定宏背景 很多小伙伴在拿到模型之后, 看着满屏的代码, 却不知道如何下手使用这些代码. 这篇文章就…

06 在MSYS2中编译树莓派裸机程序,并在QEMU中运行

作者将狼才鲸创建日期2022-11-14 Gitee源码和工程地址&#xff1a;才鲸嵌入式 / 开源安防摄像机&#xff08;嵌入式软件&#xff09; CSDN文章地址&#xff1a;项目介绍&#xff1a;开源安防摄像机&#xff08;嵌入式软件&#xff09; 4&#xff09;完整的环境安装步骤 写在前…

湖北银行冲刺上市:不良率高于行业均值,有公司欠5亿元未能追回

撰稿|汤汤 来源|贝多财经 最近&#xff0c;湖北银行正式向A股递交申请材料&#xff0c;准备在上海证券交易所上市。 据贝多财经了解&#xff0c;湖北银行股份有限公司&#xff08;下称“湖北银行”&#xff09;于2022年11月4日在证监会预披露招股书&#xff0c;计划在上交所…

矩池云如何自定义端口,访问自己的web项目

本文将向您介绍如何在矩池云租用服务器的时候自定义端口&#xff0c;并将您的 web 项目部署到自定义端口&#xff0c;最后实现在本地通过自定义端口对应链接访问服务。 上传代码和数据 首先&#xff0c;您需要将本地的项目代码和数据上传到矩池云网盘。这里为了方便您测试使用…

SoC-ZCU106求解非线性方程(一):环境安装

一、大家好久不见&#xff0c;本次给大家带来的是SoC求解非线性方程问题。计划发布三篇文章&#xff0c;这是第一篇----环境安装。 主要的解决的问题是&#xff1a;PL侧给PS传输数据&#xff0c;然后PS将数据作为已知量求解非线性方程&#xff0c;为了简化问题复杂度&#xff…
最新文章