前言:最近在做文本生成的任务,需要用到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’

或报错:

AttributeError: ‘Meteor’ object has no attribute ‘meteor_p’

补充:当我使用新的脚本计算nlg-eval时,还是会报错无法查询到java环境,参考这篇博客发现,这一问题涉及到步骤1.41.5中java环境遍变量的配置与激活的文件选取问题。我们选择在/etc/profile文件进行java环境变量的写入并对该文件进行激活,但该文件的问题在于它只在用户登入的时候执行一次。所以在执行其他的shell脚本时,java环境便无处可寻了。发现问题所在后,我们就要找一个能够在shell脚本每次调用时都会使用到的文件,向该文件中添加java环境变量。所以关于这一问题,一劳永逸的解决办法是:

1.4"/root/.bashrc"文件中追加如下代码

export JAVA_HOME=/opt/java/jdk-17.0.5/
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}

1.5 激活java环境

source /root/.bashrc

/etc/profile/root/.bashrc二者都是用户个性化设置文档,具有定制功能,但二者区别在于

  • /etc/profile文件只在登入的时候执行一次,这解释了为何打开新的shell就无法识别java环境这一现象;
  • /root/.bashrc文件可以设置路径,命令别名等,重点在于每次shell脚本的执行都会使用该文件。

第二步 下载 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 NLGEvalhyp=['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. 【异常】failed to run command `java’: No such file or directory
4. Linux安装NLG-Eval
5. 评估指标nlg-eval安装包踩坑

超详细!linux系统nlg-eval安装指南相关推荐

  1. 超简单超详细-Linux系统的使用 基础篇(下)

    Linux系统命令学习笔记: 上部. Linux系统命令学习笔记: 下部. 组管理 文件/目录 所有者 查看文件所有者 修改文件所有者 修改文件所在组 其他组概念 权限管理 权限介绍 rwx权限详解 ...

  2. 超详细Linux 安装Mysql

    超详细 Linux 安装Mysql 1.下载方式 1.1 Linux 内部下载(不推荐,比较慢) 1.2 本地下载,上传到linux 2.解压 3.创建MYSQL⽤户和⽤户组 4.配置my.cnf 5 ...

  3. Kali Linux系统正确完整安装指南教程

    Kali Linux系统作为白帽.黑帽最受欢迎的渗透测试系统,你如果是一个安全渗透专家或者网络安全管理员,必须要学会慎重并且合理地利用这个系统,因为对目标系统造成的实质伤害会带来法律的约束以及制裁! ...

  4. 《Linux篇》超详细Linux设置静态IP教程

    陈老老老板 这个是Linux篇 02最后的补充博客,设置静态IP, 网上服务器是不需要进行设置的,这个是使用VMware的服务器. 说明:我们目前安装的Linux操作系统,安装完毕之后并没有配置IP地 ...

  5. 超详细双系统安装指南

    摘要 我的电脑硬件信息: 联想,64位,内存4G,500G硬盘+8G SSD , win10系统.如今装完双系统后win10和ubuntu均运行流畅. 如果您想赶快用上ubuntu,推荐安装虚拟机,即 ...

  6. 一篇超详细的系统异常处理指南?

    1. 服务异常的处理流程 2. 负载 2.1 查看机器 cpu 的负载 top -b -n 1 |grep java|awk '{print "VIRT:"$5,"RES ...

  7. 超详细Linux搭建Java开发环境

    第一次玩Linux,一边配一边写,以防以后忘了,网上有好多过时或者有误的,在这里用的是比较新的 硬件 JDK1.8.0_121(截止2017-1-26最新) CentOS 7(截止目前最新版) 下载j ...

  8. 超详细 Linux 进程管理与工作管理解析与应用(人工翻译命令选项帮助)

      系统中,程序与命令的执行都通过进程来完成,通过学习Linux的进程管理可以方便地查看与管理计算机执行的任务.尤其是在仅有命令行的系统中,工作管理可以更好地方便管理者进行任务的统筹安排而不需要队列等 ...

  9. linux教程超详细,linux搭建node超详细教程

    linux 环境搭建详细步骤 1.访问官方网址:https://nodejs.org/en/download/ 2.选择和你服务器版本相关的压缩包,复制下载链接 3.服务器登录ssh,(这里我用的服务 ...

  10. 超详细linux基本命令学习以及hdfs命令详解

    前言: 本人刚接触linux不久但是就是这不久的接触使我爱上了linux的脚本 linux脚本就几十个基本命令但是就是这几十个基本命令经过简单的组合后可以创造出实现各种功能的强大命令如:同样是处理数据 ...

最新文章

  1. Windows 95被做成了App,可玩扫雷和纸牌
  2. 微软发布多项Azure Kubernetes服务更新,增加GPU支持
  3. Spring定时器的使用-多实例下定时重建索引
  4. 你不得不知的Safari 4
  5. 1.eclipse怎么样新建web项目,eclipse新建web项目
  6. Android中menu详解(转)
  7. QDU-Training-01
  8. 透明怎么弄_最新版微信如何设置透明背景?这样设置,效果令人惊喜
  9. 从头学习DirectDraw
  10. 大数据分析平台如何进行支出跟踪
  11. 跳跃游戏Ⅱ(C语言)
  12. IOS 世界标准时间UTC /GMT 转为当前系统时区对应的时间
  13. Dreamweaver CS6 新建站点
  14. 400+人支持的技能树又又又更新了,来看看对我们的学习有没有帮助呢?Python技能树评测
  15. 商城项目---(一)搭建
  16. 访问学者申请德国签证需提供护照吗?需注意些什么?
  17. 使用umi打包项目兼容低版本浏览器如safari,chrome等
  18. web测试bug清单
  19. 地平线与百丽国际达成战略合作 将联合打造智慧零售跨界合作标杆
  20. 【星辰傀儡线·命运环·卷一 血鸦】 6 四大长老

热门文章

  1. Kotlin 基础语法(《第一行代码(第三版)》第二章读书笔记)
  2. 手机辐射对人体的危害
  3. 体会视觉的震撼,从10亿光年到0.1飞米
  4. 上饶服务器租用 游戏服务器如何选择?
  5. 搜狗输入法 android 历史版本,搜狗输入法老版本下载
  6. RC有源滤波器之带通滤波器(四)
  7. Java 安全编程详解
  8. 程序员怎样才能达到编程的最高境界
  9. HPA控制器介绍以及实战案例
  10. #4259. 越野赛车问题