PHPでマルチ翻訳を行う(MS版)

(1/1)
Tweeter や Facebook で国際間の会話が簡単に実現できるようになる一方で、コンピュータによる自動翻訳サービスのビジネスかは難しいようだ。3 年前に「PHP でマルチ翻訳を行う」で紹介したサイトは現在閉鎖されており、Google翻訳API も立ち上げ後まもなく中止してしまった。
そんな中、マイクロソフトの翻訳API が精度・速度ともに優れているということを耳にし、それを使った多言語翻訳プログラムを作ってみることにした。

サンプル・プログラム

Microsoft翻訳APIによる多言語間翻訳
使い方は画面のヘルプに示されているとおり。
日本語から英語だけでなく、プルダウンで示される言語の間での自動翻訳が可能。ハングル語なども文字化けすることなく表示できる。

ダウンロードしたファイルを解凍すると、iso639.csv というファイルが出てくるが、スクリプト本体と同じフォルダにおいてほしい。
このファイルは、「en→英語」「ja→日本語」というように、ISO 639 で定められている言語名の 2 文字略称を日本語名称に置き換える辞書テーブル・ファイルである。
今回の PHP スクリプトから参照する。

Microsoft Translator API は簡素

まず、Microsoft の Bing サービスにアクセスするための ID が必要だ。
Bing Developer Center からプログラム名などを登録する。Windows Live アカウントをお持ちの方は、そのまま利用できる。

今回利用するマイクロソフト翻訳API は、公式サイト「Microsoft Translator 開発者向けのサービス」に詳しいドキュメントがある。
使い方は極めてシンプルで、指定された URL に対し、先ほど取得したアプリケーション ID と原文などを GET 渡ししてやるだけ。戻り値は XML に似ているが、単純なタグ付きテキストなので、DOM XML や SimpleXML の知識がなくてもテキスト処理だけで十分だ。PHP の関数を利用するようなイメージで利用できる。

サンプル・プログラムの説明:初期化処理

0027: //BingアプリケーションID
0028: //http://www.bing.com/developers/appids.aspx にて登録のこと.
0029: define('APPLICATION_ID', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
0030: 
0031: define('INIT_FROM', 'ja');        //原文言語コード(初期値)
0032: define('INIT_TO',   'en');      //翻訳言語コード(初期値)
0033: //原文サンプル
0034: define('INIT_SOUR', 'PHP(Hypertext Preprocessor)は、オープンソースのサーバ・サイド・スクリプト言語である。サーバ・サイド・スクリプトとは、データベースサーバなどのサーバ群とWebブラウザ(クライアント)を結ぶインターフェースの役割をするもので、Webサーバ上で動作する。HTMLに比べて、動的なページを実現することができる。');
0035: 
0036: //リクエストURL
0037: //翻訳可能言語リスト取得API
0038: define('URL_LANGUAGES', 'http://api.microsofttranslator.com/V2/Http.svc/GetLanguagesForTranslate');
0039: //言語自動決定API
0040: define('URL_DETECT', 'http://api.microsofttranslator.com/V2/Http.svc/Detect');
0041: //翻訳API
0042: define('URL_TRANSLATE', 'http://api.microsofttranslator.com/V2/Http.svc/Translate');
0043: 
0044: //ISO 639 言語略称リストのファイル名
0045: define('FNAME_ISO639', 'iso639.csv');

まず、各種定数の説明をしておこう。
APPLICATION_ID
前節で紹介したアプリケーション ID を記述すること。:
INIT_FROM
原文言語の初期値を、ISO 639 の 2 文字略称で指定します。ここでは ja(日本語)を指定している。この値は画面上のプルダウンメニューから変更できる。:
INIT_TO
翻訳言語の初期値を、ISO 639 の 2 文字略称で指定する。ここでは en(英語)を指定している。この値は画面上のプルダウンメニューから変更できる。。:
INIT_SOUR
原文のサンプルを記述する。空文字にしておいて構わない。:
URL_LANGUAGES, URL_DETECT, URL_TRANSLATE
今回利用した Microsoft Translator API の URL。詳しい使い方は後述する。

サンプル・プログラムの説明:原文言語の自動確定

0113: /**
0114:  * 応答テキストから結果部分のみを取り出す
0115:  * @param string $res レスポンス
0116:  * @return string 翻訳テキスト
0117: */
0118: function _getResponse($res) {
0119:     $pat = "/<[^\>]+>/ui";        //応答テキストのパターン
0120:     if (preg_match($pat$res) == 0)    return FALSE;
0121: 
0122:     return preg_replace($pat, '', $res);
0123: }
0124: 
0125: /**
0126:  * Microsoft翻訳APIによるテキストの言語識別子の自動決定
0127:  * @param string $text テキスト(INTERNAL_ENCODE)
0128:  * @return string 言語識別子
0129: */
0130: function getAutoDetect($text) {
0131:     //WebAPIにパラメータをGET渡しする
0132:     $params = array(
0133:         'appid'   => APPLICATION_ID,
0134:         'text'    => urlencode($text)
0135:     );
0136: 
0137:     $url = URL_DETECT . '?';
0138:     foreach ($params as $key=>$val) {
0139:         $url .= $key . '=' . $val . '&';
0140:     }
0141: 
0142:     //翻訳処理実行
0143:     if(($res = file_get_contents($url)) == FALSE)   return FALSE;
0144:     $dest = _getResponse($res);
0145: 
0146:     return $dest;
0147: }

Microsoft Translator API には、送ったテキスト文の言語が何かを自動判定する機能が備わっている。定数 URL_DETECT で指定するリクエスト URL がそれだ。
呼び出しは

URL_DETECT?appid=APPLICATION_ID&text=URL エンコードした原文


のように行う。
結果は  file_get_contents  を使って一気に取り出せる。
この部分はユーザー関数 getAutoDetect に記述している。

結果文字列の中には XML のようなタグも含まれいるが、結果は下記のように単一のタグに囲まれているだけだ。
ユーザー関数 _getResponse を用意して、タグの中身だけ取り出せるようにした。

<string>結果</string>

サンプル・プログラムの説明:自動翻訳

0149: /**
0150:  * Microsoft翻訳APIによる多国語間翻訳
0151:  * @param string $sour 原文(INTERNAL_ENCODE)
0152:  * @param string $from 原文の言語識別子
0153:  * @param string $to   翻訳文の言語識別子
0154:  * @return string 翻訳文(INTERNAL_ENCODE)
0155: */
0156: function getTranslate($sour$from$to) {
0157:     //WebAPIにパラメータをGET渡しする
0158:     $params = array(
0159:         'appid'   => APPLICATION_ID,
0160:         'to'      => $to,
0161:         'from'    => $from,
0162:         'text'    => urlencode($sour)
0163:     );
0164: 
0165:     $url = URL_TRANSLATE . '?';
0166:     foreach ($params as $key=>$val) {
0167:         $url .= $key . '=' . $val . '&';
0168:     }
0169: 
0170:     //翻訳処理実行
0171:     if(($res = file_get_contents($url)) == FALSE)   return FALSE;
0172:     $dest = _getResponse($res);
0173: 
0174:     return $dest;
0175: }

自動翻訳の呼び出しは次のようにして行う。

URL_TRANSLATE?appid=APPLICATION_ID&text=URL エンコードした原文&from=原文言語略称&to=翻訳言語略称


この結果も  file_get_contents  を使って一気に取り出せる。

結果文字列の中には XML のようなタグも含まれいるが、結果は下記のように単一のタグに囲まれているだけだ。

<string>結果</string>

おまけ

0058: /**
0059:  * 指定したボタンが押されてきたかどうか
0060:  * @param string $btn  ボタン名
0061:  * @return bool TRUE=押された/FALSE=押されていない
0062: */
0063: function isButton($btn) {
0064:     if (isset($_GET[$btn]))     return TRUE;
0065:     if (isset($_POST[$btn]))    return TRUE;
0066:     return FALSE;
0067: }

WebAPI を利用するプログラムを作っていると、前の画面で押されたボタンや文字列を受け取る処理が多いので、そのためのユーザー関数を作ってみた。

isButton は、前画面で、name 属性で指定された名前の submit ボタンが押されたかどうかを判定するユーザー関数だ。form の action が get でも post でも動くようにした。

0069: /**
0070:  * 指定したパラメータを取り出す
0071:  * @param string $key  パラメータ名(省略不可)
0072:  * @param bool   $auto TRUE=自動コード変換あり/FALSE=なし(省略時:TRUE)
0073:  * @param mixed  $def  初期値(省略時:空文字)
0074:  * @return string パラメータ/NULL=パラメータ無し
0075: */
0076: function getParam($key$auto=TRUE$def='') {
0077:     if (isset($_GET[$key]))         $param = $_GET[$key];
0078:     else if (isset($_POST[$key]))   $param = $_POST[$key];
0079:     else                            $param = $def;
0080:     if ($auto)  $param = mb_convert_encoding($param, INTERNAL_ENCODING, 'auto');
0081:     return $param;
0082: }

もう 1 つの関数 getParam は、全画面で指定されたパラメータを取り出すもの。
form の action が get でも post でも動くようになっている

第1 引数は、name 属性で指定されたパラメータの名前で、省略はできない。
第2 引数は、パラメータがマルチバイト文字(日本語など)の場合、自動的にコード変換を行うなら TRUE を、しないなら FALSE を指定する。省略時には TRUE となる。
第3 引数は、パラメータが見つからなかった場合に返す値を指定する。省略時には空文字が返る。

戻り値はパラメータの値。指定した名前のパラメータがない場合には NULL または空文字が返る。

参考サイト

(この項おわり)
header