欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-01-16 23:13:46
...

海量的数据背景下,人工翻译已经无法承载所有的翻译任务,机器翻译效果并不十分理想,但在有些情况下可以减少理解外语文本所需要的时间和精力。我本人出身英语专业,但是仍然感觉阅读英文文本所花费的时间和精力是中文文本的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 台式机上,都没有遇到任何问题。

# 不带 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所在的位置添加进去

Ubuntu下安装和使用OpenNMT翻译以及其中系统中遇到的问题
执行 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 的效果,但是如果特别针对某一领域的文本进行训练,也许可以获得比较好的结果。

相关标签: opennmt uburto