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,aaa@qq.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,aaa@qq.com
重启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 "aaa@qq.com"
然后我们可通过命令 git config --list,查看是否设置成功。
第三步:
查看home目录下是否有.ssh目录,一般情况是没有的,需要我们敲命令生成这个目录,在终端输入
ssh-****** -t rsa -C "aaa@qq.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 台式机上,都没有遇到任何问题。
在执行./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 的全部命令。十分钟左右就可以安装好了。
之后就是安装两个依赖库:
最后将 OpenNMT 的代码库复制到电脑上:
这样就一切就绪了!
训练神经机器翻译模型
训练时,OpenNMT 已经将函数接口都做好,我们首先我需要提供四个文件,让程序进行预处理。四个文件分别是英文原文句子和翻译好的中文句子,即训练集,一般很大,还有用于验证的英文和对应的中文句子,即验证集,可以小一些,比如一万对。命令行:
这一步会生成三个文件,中文词典和英文词典,以及 torch 训练需要的数据:
接下来就是长时间的训练了:
这个步骤所花时间由数据量大小决定,模型保存为 demo-model,是文件夹,里面保存有每一轮训练后产生的模型,比如你训练十个 epoch,就有十个模型。
preprocess.lua,train.lua 这些脚本,都在复制过来的代码库根目录里,直接用 th 命令运行即可。更多的参数可参考文档:train.lua - OpenNMT
用神经网络训练机器翻译模型,还是非常费时间的,一万对中英文训练10轮都要花十几分钟,如果是1000万对,没有GPU肯定不行。一般中英文机器翻译,至少需要100万对以上的中英平行语料,训练的模型才具有基本可用性,当然,数据越多越好。
使用模型翻译文本
仍然是直接调用脚本,选择刚刚保存的一个模型 demo-model_epoch10_PPL.t7,表示使用第10个epoch后保存的模型,为了测试,你也许会试试之前的训练模型效果怎样,进行一下对比。
需要翻译的英文放在 data/src-test.txt 文件里,翻译好的中文讲保存到 pred.txt 中,一行英文对应一行中文。
总结
OpenNMT 的使用方式已经做到了极简,基本可以直接拿来做成后端服务,而且 OpenNMT 也提供了 Docker 容器,可直接安装使用。不过工具虽好,但中英文机器翻译数据集并不是很多,无论是 Google 还是 Facebook 都开源了预训练好的一些神经机器翻译模型,但中英文的却没有。所以如果需要使用神经机器翻译,有两种方式,一种是使用 Google 或 Baidu 的机器翻译,可找到民间自制的 API,进行调用,但免费的都有限定量,超过限额就需要收费,而且并不便宜。另一种就是自己收集中英文平行语料库数据,用 OpenNMT 这样的工具来训练,这样就可以自己随心所欲的使用了,不过一般来说,应该很难超越 Google 和 Baidu 的效果,但是如果特别针对某一领域的文本进行训练,也许可以获得比较好的结果。
上一篇: JSP textarea如何显示换行?