1 ROUGE的安装过程
主要参考了这篇博客:Ubuntu安装配置ROUGE
1.1 普通用户的权限问题
网上给出的教程大都是使用Root权限安装的,无论是yum install
还是apt-get
都是无法在普通用户权限下使用的。下面先给大家讲述我在普通用户权限下为安装ROUGE做的一些失败的尝试,请大家切勿模仿,我也不会给出十分详细的过程。成功的教程请看下一节。
首先,安装ROUGE需要用到Perl解释器,而Perl在Linux上是系统自带的。由于DOM要求Perl的版本在5.6.0以上所以我们需要用以下命令查看以下Perl的版本:
$ perl -v # 我的结果是5.16.0,满足兼容性要求
那么如果使用这个版本的perl安装某个perl的包,接下来首先使用wget
命令在官网上下载这个包,然后使用tar -zxvf
命令解压,解压后进入到该目录下,使用perl安装三部曲:
$ perl MakeFile.PL
$ make
$ make install
如果你要安装的包下载下来解压后,文件夹中没有MakeFile.PL,那你需要使用./configure
命令替换三部曲中的第一个命令,关于这三步都是什么作用,可以参考这篇博客:./configure,make,make install的作用。那么问题来了,一般情况下会出现以下问题:
Can't locate ExtUtils/MakeMaker.pm in @INC
那么我们理所当然的应该去安装MakeMaker,在官网下载它的包,然后解压,重新三部曲安装,然后,你会在make install
的时候遇到问题,程序尝试在/usr
目录下的perl路径中写文件,但普通用户没有写权限。实际上如果你在install之前就做过make test
这时候也应该会报错的。那么网上就给出了解决方法,使用:
$ perl MakeFile.PL PREFIX=/home/username/some_location # 或者
$ ./configure --prefix=/home/username/some_location
这样就将安装位置重定向到了用户目录下,自然就解决了权限问题。安装好MakeMaker后,在安装其他包的时候又会出现之前的Can't locate ExtUtils/MakeMaker.pm in @INC
问题。这是因为我们虽然安装了MakeMaker,但root的perl仍然在默认的路径中寻找它。@INC是perl搜索安装工具的路径数组,默认路径都在root下,所以搜索不到。那么我们就需要修改@INC数组,网上又给出了N种方法。如果你感兴趣,这是比较全的一篇:6种方法配置perl的@INC变量。
然而,在普通用户权限下实际上是没有一种永久修改@INC的方法的,另外修改环境变量的方法是扯淡的。然后我想到一个办法,在查看@INC变量值后,发现数组中有个.
,这意味着它会搜索当前路径,所以我就把之前安装位置的ExtUtils文件夹直接拷贝了过来,果然又解决了几个包的安装,但总这样做也不是办法,最后又出现了一个无法解决的问题,大概是在make install
的时候出现了can’t locate的问题,这个问题原来都是在perl MakeFile.PL
那一步出现的,然而修改了@INC后,仍旧出现了这个问题,那就没有办法了,后来歪打正着遇到一个劝我重装perl-devel的。
思考了一阵人生之后,对啊,我为什么不重新安装一个perl啊,如果将perl安装在用户路径下不就问题都解决了吗?
1.2 在普通用户路径安装Perl
进入官网的下载界面:Download And Install Perl: ActivePerl 选择最新的5.26.3.2603版本Linux
(x86_64)的安装包,右键那个超链接,复制链接地址,这时你会得到:
https://www.activestate.com/products/activeperl/downloads/thank-you/?dl=https://downloads.activestate.com/ActivePerl/releases/5.26.3.2603/ActivePerl-5.26.3.2603-x86_64-linux-glibc-2.15-a701e55e0.tar.gz
如果直接wget
这个网址的话,下载下来的压缩包会是损坏的,将会提示:gzip: stdin: not in gzip format
。参考这篇博客:tar解压包的时候出现错误 gzip: stdin: not in gzip format,尝试一番后发现是压缩包下载过程中损坏。其实只需要将上面那个地址的第一个https地址删掉就好啦,这是一个经验:
$ wget https://downloads.activestate.com/ActivePerl/releases/5.26.3.2603/ActivePerl-5.26.3.2603-x86_64-linux-glibc-2.15-a701e55e0.tar.gz
解压后发现里面有个install.sh
,想必是安装文件的bash脚本,于是:
$ bash install.sh
根据提示,同意了用户协议,设置了安装路径后就大工告成,但如果这时候使用perl -v
查看版本,会发现当前的perl仍是root下built-in的perl。我们需要修改用户的环境变量来覆盖掉它。
vim ~/.bashrc
然后在.bashrc中加入如下:
# >>> perl init >>>
export PERL5LIB=/home/ursername/ActivePerl-5.26/bin # 这是你安装perl时设置的安装路径
export PATH=$PERL5LIB:$PATH
# <<< perl init <<<
然后使用命令source ~/.bashrc
或重新登录账户激活刚才的设置。到目前为止,前期铺垫就都做好啦,可以发现这个安装包中还自带了CPAN
等诸多工具,不需要手动安装,省了很多事
1.3 安装ROUGE的八个步骤
好心的博主已经给出了安装包的大合集,之后我们的步骤中将会用到。
step1: 安装XML::Parser
首先将上述百度网盘中的XML-Parser-2.44.tar.gz
下载到本地,使用Putty的pscp
之类的命令拷贝到服务器端。提着一句是因为网盘的下载是需要账号登录的,需要cookie,所以直接用wget
获取会很麻烦。
然后解压该安装包到当前路径:
$ tar -zxvf XML-Parser-2.44.tar.gz
进入解压得到的文件夹并开始安装
$ cd XML-Parser-2.44
$ perl Makefile.PL
$ make
$ make test
$ make install
在安装时我遇到了expat.h: No such file or directory
的问题,我们需要再额外安装expat这个包,在这个网站可以找到:expat_2.0.1.orig.tar.gz。在安装好这个包后,安装XML-Parser的时候还需要带上expat的安装路径:
$ perl Makefile.PL EXPATLIBPATH=/home/username/some_location/expat/lib/ EXPATINCPATH=/home/username/some_location/expat/include/
step2: 安装XML::RegExp
以下几步参考step1的步骤安装
step3: 安装LWP::UserAgent
LWP::UserAgent是libwww-perl中的一部分,所以可以直接安装libwww,你可以在这个网站找到安装包:libwww-perl_6.35.orig.tar.gz
step4: 安装XML::Parser::PerlSAX
这个模块是libxml-perl中的一部分,所以我们直接安装libxml这个包,你可以在这个网站找到安装包:XML-LibXML-2.0134.tar.gz
按照step1中的步骤安装,在第一步的时候遇到以下问题:
libxml2, zlib, and/or the Math library (-lm) have not been found.
Try setting LIBS and INC values on the command line
Or get libxml2 from http://xmlsoft.org/
If you install via RPMs, make sure you also install the -devel
RPMs, as this is where the headers (.h files) are.
于是我们需要安装libxml2,我在这个镜像网站找到了安装包:libxml2-2.9.9.tar.gz。但是在安装的make
步骤中又出现了这个错误:
libxml.c:14:20: fatal error: Python.h: No such file or directory
网上说这是缺少python-devel。于是我又递归地去安装python-devel。一共有两条路:yum install python-devel
肯定是走不通了,于是我在rpm镜像网站找到了对应的rpm包:python-devel-2.7.5-76.el7.x86_64.rpm。这里你还需查看一下linux的系统版本,这里给出的包默认是CentOS7的:
$ cat /etc/redhat-release # 结果是:CentOS Linux release 7.6.1810 (Core)
然后为了在普通用户权限下安装rpm包,你需要重定向安装路径:
$ rpm -i --prefix=/home/liushangyu/environment/python-devel python-devel-2.7.5-76.el7.x86_64.rpm
然后你就会得到错误信息:
error: package python-devel is not relocatable
是不是很有趣,这说明这个包是绝对不能再普通用户权限下安装的,打死都没办法。所以走到了死路,我们向上回溯,我尝试了下载更低版本的libxml2,调了各种安装路径和@INC之后貌似侥幸成功。但回到libxml的安装时,仍然毫不留情的报了原来的错,所以全是死路。经过一番思考人生,我决定用CPAN装这个包试一下,结果一试就成功了:
$ perl -MCPAN -e shell
进入CPAN的shell 中后,直接安装。成功后按q退出。
install XML::Parser::PerlSAX
step5: 安装XML::DOM
如果前面几个都没问题的话,到这里应该也能一遍过,继续参考step1的方法,资源在网盘里
step6: 安装DB_File
首先使用wget
获取压缩包,你也可以从网盘中下载:
$ wget http://www.cpan.org/authors/id/P/PM/PMQS/DB_File-1.835.tar.gz
接下来和step1一样解压和安装,但你会在make
那一步遇见如下问题:
DB_File.xs:155:20: fatal error: db.h: No such file or directory
# include <db.h>
^
compilation terminated.
make: *** [DB_File.o] Error 1
这时候根据参考博客给出的方法,需要安装libdb-dev。由于我的系统是CentOS,所以需要安装libdb-devel(libdb-dev是Ubuntu版本的)。但是在网上能找到的只有rpm包。在安装rpm包的时候你会遇到和上面安装python-devel时一样的问题,就是,你必须有root权限。可能所有以devel为后缀的包的安装都需要root权限吧。
这时按照上面的套路我们来到了CPAN方法,直接安装DBFile,结果报了相同的错误。于是仔细研究了libdb是什么。libdb其实就是Berkeley DB,是oracle公司开发的一种数据库。于是网上的教程推荐到官网上下载,结果发现需要oracle的账号,注册账号又十分麻烦,外网的下载速度又很慢,所以另寻他法。
找啊找,我找到了这篇宝贝博客:berkeley db和db4的安装。我们按照这篇博客来安装Berkeley DB:
$ wget http://download.oracle.com/berkeley-db/db-4.6.21.tar.gz
$ tar -zxvf db-4.6.21.tar.gz
$ cd db-4.6.21
$ cd build_unix
$ ../dist/configure --prefix=/home/username/some_location/berkeleydb --enable-cxx
注意这里的configure一定是db-4.6.21/dist/下的,其中的prefix换成自己的安装路径,–enable-cxx表示编译C++库。接下来:
$ make
$ make install
如果你幸运的话,这里就安装成功了,按照标准教程的说法,为了激活DB库的路径,你还要执行如下操作:
$ echo '/usr/local/berkeleydb/lib/' >> /etc/ld.so.conf
$ ldconfig
很显然,这个操作是root权限的。网上的博客说,之所以它是root权限是出于安全性的考虑,如果数据库人人都可修改,岂不是很可怕。所以这里我们做不了。下面就是我表演的时候了。重新安装DBFile,观察上文出现的那个错误。不是找不到头文件吗,于是我们把它从安装位置直接拷贝过来就好了:
$ cp /home/username/some_location/berkeleydb/include/db.h .
这样仍然不行,因为代码中的#include <db.h>
使用的是尖括号,会从系统指定的路径查找。于是我们每次运行,将报错文件的include都换成#include "db.h"
,大功告成。
另外一种可行的方案 回顾之前报错的具体信息,发现是在执行如下命令时出现的错误:
gcc -c -I/usr/local/BerkeleyDB/include -D_REENTRANT -D_GNU_SOURCE -DUSE_SITECUSTOMIZE -DPERL_RELOCATABLE_INCPUSH -fno-merge-constants -fwrapv -fno-strict-aliasing -pipe -fstack-protector -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -O2 -DVERSION=\"1.843\" -DXS_VERSION=\"1.843\" -fPIC "-I/home/liushangyu/ActivePerl-5.26/lib/CORE" -D_NOT_CORE -DmDB_Prefix_t=size_t -DmDB_Hash_t=u_int32_t version.c
这说明在编译DB_File文件夹下的version.c时,引入了路径/usr/local/BerkeleyDB/include
,显然这是不对的。那么我们只要把这个路径替换成正确的就可以了。这个命令是从哪里产生的呢?实际上,在perl Makeflie.PL
后,文件夹下产生了文件Makefile
。查看这个文件会发现里面有很多的参数配置,其中就包括了以上的路径。你可以通过这个命令查看它们都在哪:
$ cat Makefile | grep -n "BerkeleyDB"
在修改了Makefile文件中所有错误的路径后,重新make就通过了。
step7: 安装并设置ROUGE环境变量
下载ROUGE的时候发现,原博主给的网盘中唯独这个文件损坏了,总是下载一半的时候失败。那么我又找到另外一篇博客,其中给出了下载地址:GitHub。要单独下载工程中的这个目录,可以使用DownGit。下载后在.bashrc中设置环境变量:
export ROUGE_EVAL_HOME="$ROUGE_EVAL_HOME:/home/username/some_location/RELEASE-1.5.5/data"
step8: 测试安装是否成功
原博客中虽然没有提示,但我们想要测试,需要进入以上目录,新建一个名为sample-output文件夹。然后再新建一个自定义的文件夹,我这里叫test,并将runROUGE-test.pl拷贝到该文件下。还需要修改ROUGE-1.5.5.pl的执行权限,否则没法调用它。最后进入自定义的文件夹下,并运行测试。相关命令如下:
$ mkdir test
$ mkdir sample-output
$ cp runROUGE-test.pl test/
$ chmod +x ROUGE-1.5.5.pl
$ cd test
$ perl runROUGE-test.pl
然后先是报了DOM.pm中无法定位XML/Parser.pm
的错误,明明安装了却找不到就很奇怪。使用如下命令查看安装位置:
$ perldoc -l XML::Parser
得到对应的路径后,将它用use lib
的方式加入到DOM.pm中,这样这个错误就解决了。然后又开始报更奇怪的错误,是有关.so文件中有未定义符号的错误。网上说这是由于编译和执行使用的perl版本不同,然后我惊奇的发现在runROUGE-test.pl和ROUGE-1.5.5.pl中的第一句话:
\#! /usr/bin/perl -w
这句话实际上不完全是注释,它表明了编译这个程序使用的perl解释器的地址,于是我把这两个文件中的perl的路径改成了正确的路径。然后就报了如下的错误:
/home/liushangyu/ActivePerl-5.26/bin/perl: symbol lookup error: /home/liushangyu/ActivePerl-5.26/site/lib/auto/DB_File/DB_File.so: undefined symbol: db_version
我意识到,之前的小聪明并没有成功,我的Berkeley DB还是安装的有问题啊,看来必须使用root权限了。于是以上尝试以失败告终,没有ROUGE就更谈不上安装PyROUGE。坚持到底,请移步:从头再来:在虚拟机上搭建ROUGE和PyROUGE