Hatena::ブログ(Diary)

=== SANDmark 19106 === beginning stress test このページをアンテナに追加 RSSフィード

2017年03月30日

続・OmegaT用: 正規表現のグループ参照を使って訳文を置き換えるスクリプトを書いたよ(GUI対応)


前回の記事からの続きです。

変更点

使い方

前提として、このスクリプト正規表現グループ参照を用いた置き換えを行うものです。通常の正規表現検索・置換はOmegaTのみで可能です。

regexp = /Sample segment named (.+) could be replaced with (.*)./
def replace(m) { "サンプル分節${m[1]}が${m[2]}に置き換えられます。" }

  • とある部分を変更し、検索に使う正規表現と置換後の文字列を設定します。
  • 『実行』をクリックするとプレビューウィンドウが出てきます。
  • メニュー -> 実行を選択すると、実際に置換を行います。

デフォルトでは

  • Sample segment named something could be replaced with RegExp.
  • Sample segment named whatever could be replaced with script.

上記パターンにマッチする分節すべてがそれぞれ

  • サンプル分節somethingがRegExpに置き換えられます。
  • サンプル分節whateverがscriptに置き換えられます。

と置換されます。

謝辞

OmegaTに含まれるGroovyスクリプトをおおいに参考にさせていただきました。感謝!

技術的な話

GUIなんてやるもんじゃない。
Groovy経由だからJavaほど構築が面倒なわけではないけど、やっぱりコード内でUIを定義しようとするとやっぱりすごいことになりました。長年見なかった感じのコードというか。ほとんどコピペなのでSwingなにそれな私でもなんとかなりました。いろんなサンプルを用意してくれるOmegaTプロジェクトに改めて感謝です。未だにimport staticの意味がわかってないけど許して。

ただ、他のスクリプトを見るとあんまりeachイテレータ使ってなくて、トラディショナルなforループが多いです。分節区切りを変更したらeachで拾えなくなる分節があったんですが、インデックスで参照してたら拾えてたのかな?

OmegaTスクリプトを書こうっていう人がどれくらいいるのかわかりませんが、書いてみると意外と簡単だったりします。現在のベータ版(4.1.1)ではシンタックスハイライトが実装されてたりするので、興味のある人は触ってみてくださいねー。

2017年03月29日

OmegaT用: 正規表現のグループ参照を使って訳文を置き換えるスクリプトを書いたよ


2017-03-30: 更新しました -> 続・OmegaT用: 正規表現のグループ参照を使って訳文を置き換えるスクリプトを書いたよ(GUI対応) - === SANDmark 19106 === beginning stress test

経緯と使い方

なんか前の記事から一年以上経ってて引きました。

最近は翻訳のお仕事をしているんですが、支援ツールとして翻訳メモリソフトOmegaTno title)を使ってます。Javaで書かれたオープンソースソフトウェアで、実はTRADOSの体験版ダウンロードしている最中に暇つぶしで触ってみたらそのまま実務用になってしまったという、脅威の機能性を持つあなどれないやつです。TRADOS体験版の試用期間はまだあるんだけど、多分触らないまま終わりそう。基本的な使い方はマニュアルが充実しているのでそっちに任せるとして、今回はややマニアックな需要です。

チャットログなんかを翻訳していると定型文が大量に引っかかるわけで、いくら参考訳文に出てきても200件あったら大変なわけですよ。もちろん置き換え機能はOmegaTにありますし、正規表現も使えるのだけど、これが "John talked to Jessie", "Jack talked to Jimmy" とか、そういうのが大量にあると単純には置き換えられない。

ので、スクリプトを書きました。ダウンロードしてOmegaTインストールディレクトリにあるscripts/にぶち込んでください。あとはOmegaTを起動してツール→スクリプト→regexp_replacement.groovy→実行です。コンソールにプレビューが表示されるので、キャンセルを繰り返しながら置き換え後の文章を確認しつつ、これだと思ったところで置き換えてください。操作は元に戻せないのでtmxファイルのバックアップを強く推奨します。自己責任でどうぞ。

Groovy自体はじめてだったのでいろいろ調べながらのわくわくさんクオリティでごめんなさい。自分でも相当使いづらいのでそのうち直します。

5行目が検索正規表現とグループ指定、6行目が置き換え後の文字列です。置き換え後の文字列がちょっと読みづらいですが仕様です。""でくくられた部分だけ編集しましょう。${m[1]}がひとつめの括弧、${m[2]}がふたつめの括弧…というように対応してます。

regexp = /(.*) talked to (.*)./
def replace(m) { "${m[1]}さんが${m[2]}さんに言いました。" }

/(.*) talked to (.*)./が例えば "(John) talked to (Jessie)" にヒットして、"JohnさんがJessieさんに言いました。" に置き換えられます。人名はがんばってください。

技術的な話

なんでハードコーディングしてるのかっていうと、OmegaTがグループマッチの部分参照に対応していないからです。どうもJavaのMatcherクラスが十分なメソッドを提供していないからっていう感じはしますが、Twitterでアドバイスをくれたエラリー・ジャンクリストフさんによると



とのことです。ひょっとすると将来的に実装されるかもしれませんが、現時点では他の機能のほうが需要が高い様子。まぁスクリプトでできたわけだしいいよね。

OmegaTはGroovyとJavaScriptの両方でスクリプトが書けますが、今回は好奇心もあってGroovyに挑戦しました。Rubyインスパイアされただけあってとりあえず書き下すのは楽でした。そのぶん処理の最適化とかまったくしていないコード(同じ処理を2回行う手抜き)なので、分節が10万とかになるとどうなるかわかりません。

置き換え後の文字列がStringじゃなくてクロージャになっているのは呼び出しの都合です。"_1さん_2さん"とかで参照したいんですが、面倒なので実装しません。

UIもハードコーディングでローカライズとかまったく考えてないんですが、よし海外ニーズがあったとしても、向こうにはもっといいものがあるでしょうきっと。