Ubuntu下安装和使用OpenNMT翻译以及其中系统中遇到的问题

海量的数据背景下,人工翻译已经无法承载所有的翻译任务,机器翻译效果并不十分理想,但在有些情况下可以减少理解外语文本所需要的时间和精力。我本人出身英语专业,但是仍然感觉阅读英文文本所花费的时间和精力是中文文本的2-3倍,比如中文一分钟能够阅读600-1000字甚至更多,但英语文章书籍,一般也就200-300单词而已,而且时间长了,大脑更疲劳,难以有效获取信息。所以借助机器翻译,先大致浏览所需理解的外语文本,不失为一种节约时间精力的方式。随着机器翻译的效果越来越好,它的应用场景也越来越广泛,甚至可能彻底改变人类相互沟通的方式。

目前机器翻译已经基本都从传统的统计翻译,变成了神经网络机器翻译,效果有较大的提升,特别是西方语种之间,比如英德互译。而中英互译仍然有差距,不过我想达到令人满意的效果只是时间问题,Google 和 百度 的机器翻译,在某些类型的文档翻译上,已经几乎超过人类,比如科技类的论文,Google 的机器翻译效果尤其好。如果让一个译者去翻译一篇科技类的论文,成本非常高,有很多专业词汇,还有数学符号,懂的人并不多,翻译起来也费时费力,但机器翻译却对这类文本有着很高的效率,十分令人欣喜。

现前最流行的几种神经机器翻译框架中,GNMT 是 Google 做的,底层用 Tensorflow,Fairseq 是 Facebook 做的,底层用 PyTorch,而野生的 OpenNMT(GitHub:OpenNMT/OpenNMT),底层用的是 Torch 这个用 Lua 写的机器学习工具集,据称效率很高。

这三个NMT框架目前在GitHub都是1300-2000的star数,差不太多,但论易用性和亲民程度,还是OpenNMT更胜一筹。


安装 OpenNMT

在安装OpenNMT之前,首先要配置好Ubuntu系统和git,在配置的过程中会遇到如下问题 

1、Win7 SSH Secure connect Ubuntu: server responded algorithm negotiation failed

错误:win7 到ubuntu ssh连接不上

原因:服务器响应通过失败

修改ssh的配置文件:

sudo vi /etc/ssh/sshd_config


在配置文件中添加:

Ciphers aes128-cbc,aes192-cbc,aes256-cbc,aes128-ctr,aes192-ctr,aes256-ctr,3des-cbc,arcfour128,arcfour256,arcfour,blowfish-cbc,cast128-cbc
MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160,hmac-sha1-96,hmac-md5-96
KexAlgorithms diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group1-sha1,curve25519-sha256@libssh.org


重启sshd服务后(或者重启实例),即可正常连接:

sudo /etc/init.d/ssh restart

2、再使用 sudo 命令 出现unable to resolve host 解决方法

原因:Ubuntu环境, 假设这台机器名字叫abc(机器的hostname), 每次执行sudo 就出现这个警告讯息:
sudo: unable to resolve host abc
虽然sudo 还是可以正常执行, 但是警告讯息每次都出来,而这只是机器在反解上的问题, 所以就直接从/etc/hosts 设定, 让abc(hostname) 可以解回127.0.0.1 的IP 即可.

解决方法:

  在127.0.0.1 localhost 后面加上主机名称(hostname) 即可, /etc/hosts 内容修改成如下:

127.0.0.1       localhost abc  #要保证这个名字与 /etc/hostname中的主机名一致才有效
# 或改成下面这两行 
#127.0.0.1       localhost 

#127.0.0.1       abc

这样设完后, 使用sudo 就不会再有那个提示信息了。

3、安装Git的错误与解决方法(Unable to locate package)

新装的ubuntu系统,没有update的原因。进行update,输入命令:sudo apt-get update

4、安装github

第一步:

    安装git。打开终端输入命令

    sudo apt-get install git

第二步:

    配置本机git的两个重要信息,user.name和user.email,中终端输入如下命令即可设置

    git config --global user.name "Your Name"

    git config --global user.email "email@example.com"

    然后我们可通过命令 git config --list,查看是否设置成功。
第三步:

    查看home目录下是否有.ssh目录,一般情况是没有的,需要我们敲命令生成这个目录,在终端输入

    ssh-keygen -t rsa -C "youremail@example.com"

    邮箱就是刚刚第二步设置的。然后一路按回车,其实就是不设置密码。然后你就会看到home目录下
    多了.ssh目录。
第四步:
    进入.ssh目录你会看到两个文件id_rsa和id_rsa.pub,id_rsa是私钥,id_rsa.pub自然就是
    公钥啦。然后我们需要做的就是把id_rsa.pub文件中的内容拷贝一下。
第五步:
    进入你自己的网上github,进入Settings->SSH and GPG keys->New SSH key,然后在Key那
    栏下面将第四步拷贝的东西粘贴进去就可以了,最后点击 Add SSH key按钮添加。

完成以上操作之后就可以用git进行安装了:

使用 OpenNMT 的主要心理障碍在于安装 Lua 和 Torch,但令人惊异地是,Torch 的开发者已经将这些步骤简化成了脚本,复杂的安装过程变得十分简单而惬意,无论是在 MacBook Pro 还是 Ubuntu 台式机上,都没有遇到任何问题。

# 不带 sudo 运行以下命令:
git clone https://github.com/torch/distro.git ~/torch --recursive
cd ~/torch; bash install-deps;
./install.sh

在执行./install.sh会出一个问题 :/root/torch/install/bin/luajit: error while loading shared libraries: libreadline.so.7: cannot open shared object file: No such file or directory

可参考:http://blog.chinaunix.net/uid-26212859-id-3256667.html

原因一般有两个, 一个是操作系统里确实没有包含该共享库(lib*.so.*文件)或者共享库版本不对, 遇到这种情况那就去网上下载并安装上即可. 
另外一个原因就是已经安装了该共享库, 但执行需要调用该共享库的程序的时候, 程序按照默认共享库路径找不到该共享库文件

解决办法如果没有libreadline.so.7 安装:

$ apt-cache search readline

sudo apt-get install libreadline6 libreadline7-dev

如果已经安装好:
执行命令:sudo find / -name 文件名(libreadline.so.7)找到libreadline.so.7的文件拷呗所在的目录名

修改/etc/id.so.conf: 将libreadline.so.7所在的位置添加进去


执行 sudo ldconfig
再执行 ./install.sh命令即可
这就是安装 LuaJIT,LuaRocks,Torch 的全部命令。十分钟左右就可以安装好了。

之后就是安装两个依赖库:

luarocks install tds
luarocks install bit32    # 如果使用LuaJIT

最后将 OpenNMT 的代码库复制到电脑上:

git clone https://github.com/OpenNMT/OpenNMT
cd OpenNMT

这样就一切就绪了!


训练神经机器翻译模型

训练时,OpenNMT 已经将函数接口都做好,我们首先我需要提供四个文件,让程序进行预处理。四个文件分别是英文原文句子和翻译好的中文句子,即训练集,一般很大,还有用于验证的英文和对应的中文句子,即验证集,可以小一些,比如一万对。命令行:

th preprocess.lua -train_src data/src-train.txt -train_tgt data/tgt-train.txt -valid_src data/src-val.txt -valid_tgt data/tgt-val.txt -save_data data/demo

这一步会生成三个文件,中文词典和英文词典,以及 torch 训练需要的数据:

demo.src.dict
demo.tgt.dict
demo-train.t7

接下来就是长时间的训练了:

th train.lua -data data/demo-train.t7 -save_model demo-model

这个步骤所花时间由数据量大小决定,模型保存为 demo-model,是文件夹,里面保存有每一轮训练后产生的模型,比如你训练十个 epoch,就有十个模型。

preprocess.lua,train.lua 这些脚本,都在复制过来的代码库根目录里,直接用 th 命令运行即可。更多的参数可参考文档:train.lua - OpenNMT

用神经网络训练机器翻译模型,还是非常费时间的,一万对中英文训练10轮都要花十几分钟,如果是1000万对,没有GPU肯定不行。一般中英文机器翻译,至少需要100万对以上的中英平行语料,训练的模型才具有基本可用性,当然,数据越多越好。


使用模型翻译文本

th translate.lua -model demo-model_epoch10_PPL.t7 -src data/src-test.txt -output pred.txt
th translate.lua -model demo-model_epoch13_1.12.t7 -src data/src-test.txt -output pred.txt

仍然是直接调用脚本,选择刚刚保存的一个模型 demo-model_epoch10_PPL.t7,表示使用第10个epoch后保存的模型,为了测试,你也许会试试之前的训练模型效果怎样,进行一下对比。

需要翻译的英文放在 data/src-test.txt 文件里,翻译好的中文讲保存到 pred.txt 中,一行英文对应一行中文。


总结

OpenNMT 的使用方式已经做到了极简,基本可以直接拿来做成后端服务,而且 OpenNMT 也提供了 Docker 容器,可直接安装使用。不过工具虽好,但中英文机器翻译数据集并不是很多,无论是 Google 还是 Facebook 都开源了预训练好的一些神经机器翻译模型,但中英文的却没有。所以如果需要使用神经机器翻译,有两种方式,一种是使用 Google 或 Baidu 的机器翻译,可找到民间自制的 API,进行调用,但免费的都有限定量,超过限额就需要收费,而且并不便宜。另一种就是自己收集中英文平行语料库数据,用 OpenNMT 这样的工具来训练,这样就可以自己随心所欲的使用了,不过一般来说,应该很难超越 Google 和 Baidu 的效果,但是如果特别针对某一领域的文本进行训练,也许可以获得比较好的结果。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页