•  untoreh-light

MTR:多种翻译

包装翻译服务供内部使用

发布网站时,您可能希望提供不同的翻译。有些人不喜欢自动翻译器,我认为自动翻译器已经足够好了,总比没有好,而且随着翻译技术的进步,自动翻译器变得越来越好 自然语言处理 机器学习.

常见的翻译服务有google、bing、yandex。这些提供了一个免费层,我们希望将其打包以供我们个人使用。还有其他鲜为人知的 翻译服务 ,其中一些在撰写本文时已关闭......

缓存文本

如果我们想缓存翻译,我们需要将请求的文本拆分成更小的字符串,这样它们就足够小,以便为将来可能的请求提供命中。这 权衡 是较小句子的翻译上下文较少,从而降低了翻译质量。

我们如何拆分传入的文本,以便我们可以从翻译的文本中重建原始文本,这是一个相当大的技巧……或者是一个黑客。我们想要找到一个足够奇怪的字符串,以至于翻译服务会离开它 照原样 在其输出中。我发现了 段落字符 大部分时间都在工作

$this->misc['glue'] = ' ; ¶ ; ';
$this->misc['splitGlue'] = '/\s?;\s?¶\s?;?\s?/';

glue 字符串用于连接 全部 字符串(从原始请求拆分)到 我们发送到的上游翻译请求的单一主体,例如谷歌。这splitGlue 相反,用于将接收到的翻译拆分为我们要缓存的字符串。我们在这里看到字符串拆分不仅对缓存有用,而且对 减少请求数量 ,因为万一我们的下游请求执行许多小查询,我们使用我们的机器合并请求,直到上游服务允许的最大有效负载大小。

界面

为了支持多种服务 透明地 我写了一个接口来解决这个api

function__construct(
    Mtr &$mtr,
    Client &$gz,
    TextReq &$txtrq,
    LanguageCode &$ld);
functiontranslate($source, $target, $input);
functiongenReq(array$params);
functionpreReq(array &$input);
functiongetLangs();

因此,要运行的服务必须提供翻译功能、如何翻译请求,并提供支持的语言列表。通过支持的语言列表,我们可以创建一个矩阵,以便我们知道有多少服务支持特定的语言对,用于解析 语言对 我们将服务返回的表示转换为通用的iso639-1.

翻译实例的创建还允许配置所使用的请求选项Guzzle 客户端实例,例如我们可以使用代理来执行请求。服务是 缓存 第一次生成后,这很有用,因为有些服务需要生成一些初始令牌,我们不想每次都重新生成它们。

Go 版本

我也写了一个 golang中的版本 . PHP 版本将通过在您的 PHP 项目中导入来使用,而 go 版本作为独立(微)服务工作。 go 版本更加冗长,因为它需要严格的类型检查,并且由于我们支持一次查询多个字符串,我们必须公开适用于不同输入组合的 api,并且缺乏 go 泛型使得实现非常痛苦,但它提供了并发处理,并且通常要快得多。

清洁输入

加上翻译,我还建立了一个服务 清理html .我们将一些 html 标签列入白名单并丢弃其余标签。我们还删除了类似垃圾邮件的重复标点符号和未知的 html 属性,并将链接包装到适当的锚标签中。

自托管:

结论

现在我想我只会使用由 joshua 或 argos 提供的自托管解决方案,因为我的目标不是最好的翻译,我想为网站提供可读的翻译,以便它可以毫无障碍地导航。

帖子标签: