固有名詞は、文脈によって訳語が変化するということがほとんどありません。「六价铬」は常に「六価クロム」と訳出されますし、「共产党」はいつだって「共産党」です。つまり、機械的に一対一で置換することが可能です。こうした電脳が得意とする分野の処理を電脳に任せられたら、人間は訳文の推敲などに集中できますし、同じ単語を繰り返し調べる必要がなくなります。
前回作成したツールでは、翻訳メモリの検索を実現しましたが、類似する訳文がないケースは完全に無視していたため、この部分の作業では「省力化」が実現できていませんでした。今回は、この類似する訳文がない原文のために、パターンファイルに基づく一括置換を実装します。単語と訳語の対訳データを用意し、それに基づいて一気に複数の置換処理を行うものです。
一括置換を実現する方法を考えてみます。一番簡単なのは、単語と訳語の間をタブで区切った1行1単語の形式のデータファイル(以下、「パターンファイル」とします)を作成し、それを順に読み込みながら、処理対象となる文章の置換処理を行うものです。
上記の処理で気をつけなければいけない点は、「長い単語を優先して検索、置換する」という点です。パターンファイルに「氧化」と「氧化铁」という単語が含まれ、それぞれ「酸化」と「酸化鉄」という訳語が定義されている場合、先に「氧化」の置換が行われると、「氧化铁」だった部分が「酸化铁」となってしまい、期待していた置換処理ができなくなるからです。
この問題は、パターンファイルを読み込んだ際に、単語と訳語のペアを降順に並び替えることで回避できます。
#パターンファイルのデータを読み込むための大域変数
set repdb ""
#パターンファイルを読み込み
proc initialize_repdb {} {
global repdb
#パターンファイルを指定
set fn "rep.db"
set f [open $fn r]
#パターンファイルの文字コードはUTF-8
fconfigure $f -encoding utf-8
set dat [read $f]
close $f
#先頭にBOMがあれば削除
if {[string index $dat 0] == "\ufeff"} {
set dat [string range $dat 1 end]
}
#ファイルの内容を改行ごとに分割してリストにする
set dat [split $dat "\n"]
#リストを降順に並び替え
set repdb [lsort -decreasing $dat]
return
}
#一括置換
proc batch_replace {str} {
global repdb
foreach line $repdb {
#tab記号で行を要素に分割
set line [split $line "\t"]
set origin [lindex $line 0]
set trans [lindex $line 1]
if {$origin == "" || $trans ==""} {continue}
regsub -all -- $origin $str "【$trans】" str
}
return $str
}
関数「initialize_repdb」では、指定したパターンファイル(rep.db)のデータを読み込み、降順に並び替えた上で、変数repdbに保存しています。もうひとつの関数「batch_replace」では、そのパターンファイルのデータを使って置換を行っています。変数repdbは、単語と訳語を1組の要素としたリストになっているので、それを順番に分解し、関数regsubを使って単語(origin)を訳語(trans)に置換する処理を行っています。
前回作成したツールに、上記関数を組み込みました。パターンファイルには単語と訳語のペアをいくつか登録してあります。ファイルメニューの「開く」から同梱の「demo.txt」を開き、画面上部の実行ボタンを押してみて下さい。読み込んだテキストに対して、翻訳メモリの検索と一括置換処理が行われます。出力時、原文の先頭には「#」が付き、青太字で出力され、その下に処理後のテキストが表示されます。
ダウンロード:qz.lzh(ソース同梱)
注意事項:
上記の一括置換処理によって、さらなる省力化が実現できましたが、非常に単純な手法を採用しているため、置換処理の結果が期待したものと異なる場合もあります。
例えば処理対象が「汽车和电子产业的结合同样面临着资源投入问题」という文章だったとします。パターンファイルに「合同→契約」という単語と訳語のペアが登録されている場合、一括処理の結果は「汽车和电子产业的结契約样面临着资源投入问题」となります。
人間の目で見れば、間違いは一目瞭然ですが、これを回避するプログラムを書くのはなかなか面倒です。「结合と「同样」の置換パターンを登録すれば回避できますが、同じような問題の起きる組み合わせは、これ以外にもたくさんありますので、そのすべてを登録するのは、現実的ではありません。「こういう問題も起こるから原文を良く確認しよう」と人間側が注意するしかないでしょう。*1
今回、おまけ機能として原文を削除する機能を付けましたが、次はこの機能を強化し、翻訳作業が終了し、原文を削除する際に原文と訳文を自動的に翻訳メモリとして保存する機能を付けたいと思っています。このほか、パターンファイルに簡単に単語を追加する方法や翻訳メモリの検索を改善することも検討します。
*1:この問題を本気でなんとかしたい場合は、形態素解析処理を行う必要があります。
はじめまして。
私もテキスト処理ツールを開発しています。
一括置換ではExcelファイルを対象とした「Replace Text in XLS」というツールを公開しています。
http://www15.big.or.jp/~t98907/replaceinxls/
単なる一括置換以上のことをしようとすると、
途端に難易度が上がりますよね。では。
Posted by t98907 at 2007-08-22 17:23:52
はじめまして。コメントありがとうございます(^^)
紹介いただいた「Replace Text in XLS」をはじめ、サイトで公開されていらっしゃる「Variant Detector」や「Wordbreaker」も大変興味深く、早速ダウンロードをさせていただきました。重ねてありがとうございます。
>単なる一括置換以上のことをしようとすると、
>途端に難易度が上がりますよね。
同感です。一番面白いところでもありますが、当方は能力が追いつかず、いつも頭を掻きむしっています(^^;
Posted by Ctrans at 2007-08-22 17:47:18
HTMLタグは適用されません。不適切と判断されたコメントはブロックされます。