青山です。

ちょっと長くなりました。

On Tue, 14 Dec 1999 17:14:20 +0900,
nakajima kengo<ringo / hompo.co.jp> wrote:

>   自動翻訳サイトの基本構造は、CGIに対して、翻訳したいURLを渡すと
> そのページを自分で取ってきて翻訳して返す(幼児語化計画のノリ)。

これは、今朝流した HTML テキストの翻訳フィルタと、適当な http でデータ
を取得するコード等を組み合わせるという感じになるでしょうか。

利点は、url のチェックを入れれば、ruby-lang.org 以外を翻訳しようとする
余計なトラフィックを弾く事もできる。翻訳結果を体裁が整った状態で見る事
ができる。

欠点は、url をコピー&ペーストするのが面倒。ドキュメントやメーリングリ
スト等、web サイトに無いものは翻訳できない。原文と比較して読む場合、2
つのウィンドウを並べて読むなどする必要がある。


> または、HTML formの <textarea>を使って、翻訳してほしいテキスト
> 自体をPOSTして、それを訳すか。

同梱の CGI がこれです。eRuby ドキュメントなので、体裁は簡単に変更でき
ると思います。

利点は、すでにスクリプトが出来ている。ドキュメントやメーリングリスト等、
好きな物を翻訳できる。原文と比較するような出力になっているので、原文と
比較しながら読む事が容易。

欠点は、ruby-lang.org 以外の利用も引き込んでしまう可能性がある。コピー
&ペーストが面倒。体裁がくずれる。(体裁に関しては、インターフェイスを
変更する事により、段落単位程度には整える事もできます)


その他、自動翻訳 proxy というのも考えられますね。

利点は、コピー&ペーストが不要。英訳する url を限定する事もできる(たぶん)

欠点は、ユーザーに proxy の設定をしてもらう必要がある。英訳が不要な場
合も proxy 経由になってしまうので、トラフィックは増える。


あるいは、www.ruby-lang.org のトップのように、飛ばすというのも手ですね。
日本語ページに、Accept-Language: en でアクセスすると、そのページを自動
翻訳し、結果を送り出すとか。

利点は、コピー&ペーストが不要。ユーザーの設定も不要。

欠点は、これって、可能なんでしょうかね。www.ruby-lang.org のトップって、
CGI でしたっけ?  だとすると、翻訳が必要な全ページになんらかの仕掛けを
仕込む必要があるかも。


さらに、先のフィルタで、あらかじめ翻訳したページを用意。

利点は、アクセス時には通常のページと同じなので、多量のトラフィックにも
対応できる。問題がある翻訳部分を手作業で修正可能。

欠点は、用意したページしか見る事ができない。

ですが、あらかじめ変換をかけておくのは大した手間ではありませんし、問題
がある部分を手作業で修正できるのは便利だと思いますけど、いかがでしょう。

www.ruby-lang.org 内に関しては、トップのように ../en/ ../ja/ を用意す
るのをデフォルトとし、../en/ が無い場合は、自動翻訳で一括生成。時間が
ある、あるいは、問題の報告があった場合には、修正し、より良いドキュメン
トへとしていく。

そして、各スクリプトのドキュメントや、メーリングリスト等の翻訳の補助と
して、翻訳ページを提供。

こんな感じが実用的と思いますが、いかがでしょう。

また、場合によっては、自動翻訳をかけて ruby-list-en, ruby-talk-ja など
のメーリングリストを用意するという展開も面白いかもしれません。

> あと、翻訳魂がどういう機能をもっているのかまだ知らないのですが、
> Ruby関係の文章を訳すときに役にたつ外部辞書を追加できたりすると、
> 嬉しいと思います。
> さらに、その外部辞書をwebから補強できたりすると、素敵かもしれませんね。

外部辞書は追加できますが、辞書を扱うツールが無いので、作成も変更もでき
ません。気が付きませんでした。作成が間に合わなかったんでしょうかね。

> これで、何を訳すか、は解決したかな? あとは、どう訳すかですが、
> 上記のような多様で自由な入力を受けつけると、翻訳エンジンに何をどう
> 渡せばいいのか決めるのが難しくなりますね。 うーん。 とりあえず、
> 入力をエンジンに素通しするものをまず作ってみます。

翻訳エンジンには、まず trns_divide_sentence("text") で、まとまった文を
渡します。これが、段落、1文に分割した配列の配列を返しますので、その中
から、1文を取り出して、translate_one("sentence") で、翻訳します。

こんな感じです。

paragraphs = host.trns_divide_sentence(STDIN.read)
paragraphs.each do |paragraph|
  print "\n"  # 段落の区切り
  paragraph.each() do |sentence|
    print "\n"  # 1文の区切り
    print host.translate_one(sentence)
  end
end

trns_divide_sentence("text") は単に1文だけでなく、その文が1つの文章
なのか、単語のみなのか、あるいは他にも何か判断しているようなのですが、
そのあたりがプロトコル仕様書に書かれていないので、誤動作する可能性があ
ります。

しかも、データのターミネータの一覧さえ無いので、予想外の分割をしてくる
と、エラーとして検出する事もできず、そのままゴミデータとして気が付かな
いうちに原文や訳文に混ざります。

これは OMRON に問い合わせ中です。エラー番号とエラーメッセージの対応表
も無いんですよね。とりあえず、エラーログ等から抜き出しています。

その他、訳語の品詞選択などの細かな機能もあるようですが、これらは対話型
のクライアントでなければ使いようがありませんし、面倒なのでライブラリで
は対応していません。

(欲しい人がいれば、プロトコルに対応したメソッドは用意できると思います
が、きっとクライアントのインターフェイスを作るのが大変でしょう。)


-- 
青山 和光 Wakou Aoyama <wakou / fsinet.or.jp>