前回、テキストの曖昧検索ができるようになったので、今回は自家製翻訳メモリを作っていきたいと思います。市販のツールと違って、高度なことはしませんので、「貧者の翻訳メモリ」(穷人的翻译记忆工具)とでも名付けて話を進めます。
例によって言語は Tcl/Tk を使います。この言語の日本でのユーザー数が多くないのは承知していますが、日曜プラグラマには大変便利な言語なので、興味のある方はこちらのリンク集を参考に関連サイトを訪問してみて下さい。
翻訳メモリは、過去に翻訳した文書のデータを蓄積し、次回翻訳を行う際にそのデータを活用するためのツールです。訳そうとしている文章と過去に訳した原文を照合し、類似するデータが存在すれば、対応する訳文を取り出してきてくれます。翻訳者は、過去の訳文と違う部分だけを翻訳すればいいので、翻訳作業の省力化が実現できるというわけです。似たような表現が数多く出現する法律やマニュアルのような文書の翻訳であれば、かなりの省力化が期待できます。
とりあえずこのくらいにしておきます。まずはシンプルに作って不便なところがあったら直し、追加したい機能があったら足していきます。
「貧者の翻訳メモリ」では豪勢なことはしません。扱えるデータはテキストファイルに限定します。
問題は過去翻訳データの書式ですが、これにはタブ区切り形式のテキストファイル(TSV)を採用します。原文と訳文をタブで区切っただけのシンプルな形式で、文字コードはUTF-8とします。TSV形式を採用する理由は、エクセルなどでデータの加工がしやすい、いざとなればエディタで編集できる、将来的にデータベースなどを使いたくなったときにデータの移行が楽、何よりプログラム的に扱いが楽、という感じです。
以下、原文と訳文をタブで区切り、1行1文となっているテキストファイルを走査し、指定した文と似ている文が存在するか確認する関数です。
#--------------------------------
# get_tm_from_file
# ファイルを走査して引数textに似ている原文を探す
# 近似度は引数percentで指定
#--------------------------------
proc get_tm_from_file {text percent} {
#データを保存しているファイル名
set tm_file_name "tm.dat"
#ファイルを開き、文字コードを指定する
set f [open $tm_file_name r]
fconfigure $f -encoding utf-8
#曖昧検索の下準備(引数のtextをbigramにする)
set len [bigrams $text]
#出力データを保存するリスト
set out [list]
#一行ずつデータを確認していく
while {[gets $f line] > 0} {
#原文と訳文に分割する
set tm_list [split $line \t]
set origin [lindex $tm_list 0]
set trans [lindex $tm_list 1]
#曖昧検索
set similarity [fuzzy_match $origin $len]
if {$similarity > $percent} {
#見つかったので出力用の変数に保存(近似度、原文、訳文)
#処理速度を上げる場合は、ここでbreakする。
lappend out [list $similarity $origin $trans]
}
}
close $f
return $out
}
この検索の肝となる関数fuzzy_matchとbigramsについては、こちらのソースを参照下さい。
さて、10行少々のコードですが、これで過去の訳文を検索することが可能になりましたので、早速簡単なツールを作り、実際に使ってみることにします。

ダウンロード:test.lzh(ソース同梱)
このツールの処理例は次の通りです。
原文の内、翻訳メモリ内に似た文章があったものは、青太字に強調表示され、その下に翻訳メモリから抽出された文が類似度の高い順に挿入されます。なお、似た文章が無かった場合、原文は薄い茶色で表示されます。青文字の原文の先頭には「#」が、薄茶文字の先頭には「*」が付加されますが、これは処理結果を外部ツール(エディタなど)で編集する際に、強調表示をしやすいように付加しています。
同梱の「tm.dat」は、翻訳メモリデータを登録するファイルとなります。このファイルは、UTF-8のテキストファイルですのでエディタなどで編集することが可能です。原文と訳文をタブで区切っただけのシンプルなもので、インストール時は中国の法律の中英対訳データ2件のみが登録されています。このファイルに対訳データを追加していくと、次回の処理からそのデータも比較対象になります。
以上がこのツールの概要です。非常に単純なツールですが、データを登録しておけば、過去の自分が現在の自分の翻訳作業をバックアップしてくれます(多分)。
処理速度が遅いのは、なかなか改良が難しそうです。処理対象の文章ごとに、翻訳メモリ内の全文章とマッチングを行っているので、「原文の大きさ×翻訳メモリに登録されているデータ量」に比例した時間がかかります。この部分は、かなり頭をひねる必要がありそうなので保留します*1。
対訳データの登録については、比較的簡単に解決できるかもしれません。検索で翻訳メモリが見つからなかった場合の処理も、ちょっと試してみたいことがあるので次はこの2つを改良してみたいと思います。
*1:翻訳メモリを全部読み込んでオンメモリで処理すると結構速くなると思いますが。
HTMLタグは適用されません。不適切と判断されたコメントはブロックされます。