内部使用のためのラッピング翻訳サービス
ウェブサイトを公開するとき、あなたは異なる翻訳を提供したいかもしれません。自動翻訳者が嫌いな人もいます。自動翻訳は十分に優れており、何もないよりはましだと思います。自動翻訳者は、 NLP と ML.
一般的な翻訳サービスは、グーグル、ビング、ヤンデックスです。これらは、私たち自身の個人的な使用のためにラップしたい無料の階層を提供します。他にもあまり知られていないものがあります 翻訳サービス 、およびそれらのいくつかは、執筆時点でシャットダウンされています。
翻訳をキャッシュしたい場合は、リクエストされたテキストをより小さな文字列に分割して、将来のリクエストにヒットするのに十分な大きさになるようにする必要がありました。 NS トレード・オフ 小さい文の翻訳は文脈が少なく、翻訳の質が低下するということです。
翻訳されたテキストから元のテキストを再構築できるように、受信テキストをどのように分割するかは、かなりのトリックまたはハックです。翻訳サービスがそれを残すのに十分奇妙な文字列を見つけたい そのまま その出力で。私はのバリエーションを見つけました 段落文字 ほとんどの時間働くために
$this->misc['glue'] = ' ; ¶ ; ';
$this->misc['splitGlue'] = '/\s?;\s?¶\s?;?\s?/';
NSglue
文字列は連結に使用されます 全て 文字列(元のリクエストから分割) 一 たとえば、送信するアップストリーム翻訳リクエストの単一の本文。グーグル。 NSsplitGlue
代わりに、受信した翻訳をキャッシュする文字列に分割するために使用されます。ここで、文字列の分割はキャッシュだけでなく、 リクエストの数を減らすダウンストリームリクエストが多くの小さなクエリを実行する場合、アップストリームサービスで許可されている最大ペイロードサイズまでリクエストをマージするために機械を使用します。
複数のサービスをサポートするため 透過的に 私はこのAPIに落ち着いたインターフェースを書きました
function __construct(
Mtr &$mtr,
Client &$gz,
TextReq &$txtrq,
LanguageCode &$ld
);
function translate($source, $target, $input);
function genReq(array $params);
function preReq(array &$input);
function getLangs();
したがって、運用可能なサービスは、翻訳機能、リクエストの翻訳方法、およびサポートされている言語のリストを提供する必要があります。サポートされている言語のリストを使用して、特定の言語ペアをサポートするサービスの数がわかるようにマトリックスを作成して、 言語ペア サービスによって返される表現を共通に変換しますiso639-1
.
翻訳インスタンスの作成により、によって使用されるリクエストオプションを構成することもできます。Guzzle
たとえば、プロキシを使用してリクエストを実行できるようなクライアントインスタンス。サービスは キャッシュされた 一部のサービスでは初期トークンを生成する必要があり、毎回それらを再生成したくないため、これは最初に生成された後に役立ちます。
私も書いた golangのバージョン。 PHPバージョンはPHPプロジェクトにインポートすることで使用されますが、goバージョンはスタンドアロン(マイクロ)サービスとして機能します。 goバージョンは、厳密な型チェックが必要であり、一度に複数の文字列のクエリをサポートするため、さまざまな入力の組み合わせで機能するapiを公開する必要があり、goジェネリックがないため実装が非常に面倒になるため、はるかに冗長になりますが、並行処理であり、一般的にはるかに高速でした。
翻訳と相まって、私もサービスを構築しました HTMLをクリーンアップします 。一部のhtmlタグをホワイトリストに登録し、残りを破棄します。また、スパムのような重複する句読点や不明なhtml属性を削除し、リンクを適切なアンカータグにラップします。
セルフホスト:
最近は、joshuaまたはargosのいずれかが提供するセルフホストソリューションを使用するだけだと思います。最高の翻訳を目指しているわけではないので、摩擦なくナビゲートできるように、Webサイトに読みやすい翻訳を提供したいと思います。