Apertium翻译.有没有办法获得原始短语

Alf*_*nda 5 translation nlp translate apertium

有没有一种方法在apertium翻译器中获得翻译的原始短语?

IE得到类似的东西:

phrase: {
  original: { Hola, buenos días},
  translated: {Hello, good morning}
}
Run Code Online (Sandbox Code Playgroud)

我需要这样做才能建立一种机制来改进翻译.

unh*_*mer 6

如果您通过命令行界面发送语料库,例如

xzcat corpus.sme.xz | sed 's/$/ ./' | apertium -f html-noent sme-nob > translated.nob.mt
Run Code Online (Sandbox Code Playgroud)

那你就可以试试

xzcat corpus.sme.xz | paste - translated.nob.mt
Run Code Online (Sandbox Code Playgroud)

然后获取输出旁边的输入.这假设您想要在换行符上拆分.这sed是为了确保单词不会跨越换行符(规则往往不会跨越句子边界).

这将是快速的,但它有点hacky并且有许多边缘情况.


如果您想要更多控制,一种方法是在本地安装JSON API并一次发送一个请求.

如果你有一个最近的Debian/Ubuntu(或正在使用其中一个aperts repos),你可以获得API

sudo apt install apertium-apy
sudo systemctl start apertium-apy   # start it right now
sudo systemctl enable apertium-apy  # let it start on next boot
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样翻译:

$ echo 'Jeg liker ikke ansjos' | curl --data-urlencode 'q@-' 'localhost:2737/translate?langpair=nob|nno'
{"responseDetails": null, "responseData": {"translatedText": "Eg likar ikkje ansjos"}, "responseStatus": 200}
Run Code Online (Sandbox Code Playgroud)

(或者来自Javascript标准的ajax请求,一些文档位于http://wiki.apertium.org/wiki/Apertium-apy/Debianhttp://wiki.apertium.org/wiki/Apertium-apy#Usage)

请注意,apertium-apy默认为/ usr/share/apertium/modes中的对提供服务; 如果您手动启动它(而不是通过systemctl),您可以将其指向不同的路径.


如果要生成示例中的JSON格式,最简单的方法是使用jq(sudo apt install jq),例如

$ orig="Jeg liker ikke ansjos"
$ echo "$orig" \
  | curl -Ss --data-urlencode 'q@-' 'localhost:2737/translate?langpair=nob|nno' \
  | jq "{phrase: {original:\"$orig\", translated:.responseData.translatedText }}"
{
  "phrase": {
    "original": "Jeg liker ikke ansjos",
    "translated": "Eg likar ikkje ansjos"
  }
}
Run Code Online (Sandbox Code Playgroud)

或在语料库上:

xzcat corpus.nob.xz | while read -r orig; do 
  echo "$orig" \
    | curl -Ss --data-urlencode 'q@-' 'localhost:2737/translate?langpair=nob|nno' \
    | jq "{phrase: {original:\"$orig\", translated:.responseData.translatedText}}";
done
Run Code Online (Sandbox Code Playgroud)

(500行的简单测试显示,这需要23.7秒的挂钟时间,而paste版本需要5.5秒.)