重新实现关于Mikolov的集成文本分类实验(详细过程)-

来源:互联网 发布:网络词鸡精是什么意思 编辑:程序博客网 时间:2024/06/03 23:42

前言:为了实现文本分类,将一个文本内容确定的分为积极或者消极,我们采用了Mikolov的文本分类方法,通过他在试验中的方法实现文本的二值分类。本文旨在如何重现他论文中实现的分类实验。论文参看Mikolov的ENSEMBLE OF GENERATIVE AND DISCRIMINATIVE TECHNIQUES FOR SENTIMENT ANALYSIS OF MOVIE REVIEWS


总的来说这次实验是磕磕绊绊,从配置环境,到改脚本命令,最后达到理想的实验结果。此文作为总结,将包含过程中使用到的方法、技术,以备后来使用。本文将分为四个部分来进行记录,将完成实验的总体步骤重新的合理部署一下,整个实验进行下来预计在3到5个小时,安装系统,下载相关文件要1个多小时,训练数据分类数据要2个多小时左右。在虚拟机上进行实验可能需要8个小时或者更多。


一、实验准备

本文实验重现的文章是Mikolov的关于Clssification的一篇Paper。Mikolov在文章中提供了他情绪分析-文本分类的实验代码,代码是在Linux环境下运行的,所以我们需要配置一个完整的适合该实验的环境。代码运用到了python,gcc环境,以及一些已有的算法分类器。由于他的代码是用到什么就下载什么,所以有的时候会出现下载错误的问题导致实验无法继续,所以我们需要事先下载好一些实验用到的算法包。以下将说明我们需要准备的一切工作:

1、Linux系统iso镜像(我使用的是Ubuntu14.04.3)

2、Liblinear-1.96.zip压缩包(我将提供在附件当中)百度即可下载

3、rnnlm-0.3e.tgz压缩包(我将提供在附件当中,此包经常会下载丢失,所以需要先下载好)百度即可下载

4、python numpy环境包,在http://sourceforge.net/projects/numpy/files中下载numpy包

5、虚拟机VMWare或者一台装了Linux的电脑(起初我用的是虚拟机,但是效率太低。所以最后借了一台电脑重新装了Ubuntu系统重新走了一遍该实验,实验效率瞬间提高)

二、Ubuntu下的环境配置

在虚拟机上安装系统或者装Linux系统我就不在此过多赘述,不是重点。

1、进入Ubuntu系统,调出终端Ctrl+Alt+T

2、输入sudo passwd回车会提示你输入你设置的系统密码,然后继续回车,此处自己设置新的root权限密码。

3、输入sudo apt-get install gcc/sudo apt-get install g++,下载并且安装gcc/g++环境。

4、将我们事先准备好的numpy包拷贝到系统中并且解压,通过cd命令进入解压后的路径,输入命令

sudo python setup.py install安装此包(注意空格),在此之前需要键入sudo apt-get install python-dev安装此包。

5、安装vim,输入sudo apt-get install vim

6、现在开始设置github的SSHkey,因为脚本中调用了github中的项目仓库中的代码。在终端中输入ssh-keygen

然后系统提示你保存SSH的位置,此时我们敲三次回车默认通过。然后系统会生成一个sshKey的文件保存在~/.ssh/id_rsa.pub。此时我们键入命令 vim ~/.ssh/id_rsa.pub打开文件,全选文件中的字符,从ssh -rsa开始到最后一个字符,复制到我们新建的.md文件中暂作保存。

接着拷贝.ssh/id_rsa.pub文件内的所以内容,将它粘帖到github帐号管理中的添加SSH key界面中。

打开github帐号管理中的添加SSH key界面的步骤如下:

1. 登录github

2. 点击右上方的Accounting settings图标

3. 选择 SSH key

4. 点击 Add SSH key

在出现的界面中填写SSH key的名称,填一个你自己喜欢的名称即可,然后将上面拷贝的~/.ssh/id_rsa.pub文件内容粘帖到key一栏,在点击“add key”按钮就可以了。

添加过程github会提示你输入一次你的github密码。

添加完成后再次执行git clone就可以成功克隆github上的代码库了。

三、实验步骤

1、将Mikolov提供的iclr15文件拷贝到Ubuntu系统当中。将我们准备好的Liblinear和rnnlm包拷贝到Ubuntu当中以备使用。

2、接下来我们修改一些脚本代码,因为原始代码会删除一些下载好的包,我们需要这些包所以需要修改。

首先进入iclr15/scripts,找到data.sh脚本打开,将其中包含rm的移除命令代码全部删除或者用#注释掉。

进入install_liblinear.sh文件,将wget一行代码删除或者注释掉,同时将rm命令代码删除或者注释掉。

进入rnnlm.sh文件,将wget一行代码删除或者注释掉,同时将rm命令代码删除或者注释掉。

进入paragraph.sh文件,将rm命令代码删除或者注释掉。

3、在iclr15文件夹所在目录建立一个新的文件夹命名为iclr15_run,在其中建立rnnlm文件夹。然后将liblinear包拷贝到iclr15_run目录下,将rnnlm包拷贝到rnnlm文件夹中。

4、调出终端,用cd命令进入到iclr15文件夹,键入chmod +x oh_my_go.sh。然后键入./oh_my_go.sh开始实验。

5、整个实验过程是,在斯坦福网站下载训练数据(影评数据),将下载好的分类数据分配到train,test,unsup文件夹中以备使用,调用rnnlm算法模型训练数据,并且测试数据。调用word2vec(作者基于此提出的paragraphVec分类方法)训练并测试数据。调用NB-SVM算法模型训练并测试数据,通过ensenmble整合测试效果,得出各个集成情况的评分。同时将集成的权重显示出来。更细致的集成过程此处没有讨论。

四、实验结果

五、关于训练好的分类器的使用

此处我用于测试的分类器使用的是Mikolov已经提出很久的rnnlm的分类器。当模型训练好之后,模型的相关参数会保存在后缀为xxx.output.txt的文件中,其中前面的xxx是你训练的模型保存的名字。

再次用此模型训练时在模型根目录下键入命令:./rnnlm -train train -valid valid -rnnlm model -hidden 15 -rand-seed 1 -debug 2 -class 100 -bptt 4 -bptt-block 10 -direct-order 3 -direct 2 -binary

测试文件时在模型根目录下键入命令:./rnnlm -rnnlm model -test test -debug 0 -nbest > modelScore

其中 -train:训练文件

-valid:校验集的名称(一般为训练文件中的一小部分)

-rnnlm:输出模型的名称

-hidden:隐含层神经元个数

-debug:控制开关,设置值不同会提供一些输出,设为2会输出运行时参数。

-bptt:控制通过环反向传播错误。

-class:指定单词的分类。100表示分为100类。

-test:测试文件。

-rand-seed:指定随机种子,用来初始化网络的权值的,比如指定为1,那么内部会执行srand(1),网络的权值会初始化为一堆随机小数,如果你指定为2,那么网络会被初始化为另一堆不同于值为1的随机小数。

 -direct-order:这个参数是指定rnn中me(最大熵模型)部分特征的阶数。最大是不会超过20的,超过20也会自动指定为20。

-binary:这个参数如果没有,则默认为text方式,区别在于binary是用二进制方式存储数据,text是以ascii方式,对于大量的浮点数来说,binary能更省文件大小,但是缺点是用文件打开,里面都是乱码。

-direct:这个参数的含义就比较技术细节了,它来指定网络输入层到输出层所存放权值的一维数组的大小,并且单位是一百万,比如现在指定的值为2,其内部大小是2000000。

0 0
原创粉丝点击