Hatena::ブログ(Diary)

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

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

2012年04月01日

ひとりごと on 2012-04-01

ついったからno title経由で自動投稿されてます。


  • 09:36  ぐっすり眠れるようになったのはいいけど、少し効き目が強すぎるな…  #

  • 09:48  Schemeのシンボルがファーストクラスではないよ的な話を以前黒田さんがしてたけど、今はどうなんだろう。R7発表されたのかな。  #

  • 09:51  自分も黒田さんと同じくScheme最強だと思ってたクチでしたが、絶望してCommonLispに宗旨変えした者です。いや、使いこなせているわけではないんですけれども  #

  • 10:10  ジュンがエイプリルフールだからって嘘をついたのが衝撃 #どこでもいっしょ  #

  • 10:11  エイプリルフールねぇ……基本的にサイト巡回とかしない人間だから、気合いの入った面白いサイトまとめとかどっかにないかな。や、あっても見に行かない…か?  #

  • 10:13  Ubuntuアプリケーションウィンドウのメニューバーがパネルに行ってるのが気に食わない。MacOSインスパイアらしいけど、切り替えられないかなぁ  #

  • 10:34  matzさんが言ってたけど、「Lispは頭のいい人しか使えない」っていうのはあると思う。それはいろんな意味をはらんでいるけど、だからこそ僕はLispやその方言に憧れていて、実践CommonLispを翻訳したときも、絶望的なほどの壁を感じた  #

  • 12:16  #Lisp と #Scheme のシンボルについてちょっとだけまとめてみたよ http://t.co/32MvUM6H  #

  • 14:13  「実践CommonLisp」を翻訳したときのエピソードを書いてみたよ #lisp http://t.co/DI0jz9fg  #

  • 14:15  へーい、また朝ごはん食べてないじぇ。桜ご飯できたかなぁ  #

  • 14:58  桜ご飯になってなかった……梅干しは細切れにして混ぜ込むべきか  #

  • 15:07  キッチン周りの掃除を開始するでありますッ!!  #

  • 18:26  はぁー。掃除はキッチンまわりだけにするつもりが、いろいろ手を出してすでにこんな時間…  #

  • 18:29  3時間ずっと聞いてるけど特に中毒性はないです / “どこでもいっしょ レッツ学校! オープニング曲‐ニコニコ動画(ββ)” http://t.co/NxW7aRxj  #

  • 18:39  エイプリルフールネタサイトまとめ:ハムスター速報 http://t.co/8HiKG3Kt @hamusokuさんから まとめないかなってつぶやいてたらハム速がやらかしてた。民主党なかなかやるなwww  #

  • 18:47  あーあー、明日ゴミ出しだから今日のうちに行かないと……やっとコーディングできると思ったのにもー  #

  • 19:06  Welcome Dough-nut. hello! hello! You're welcomed.
    Hey! brother. you're lookin' great!
    Welcome Dough-nut. hello!
      #

  • 19:07  Main street is in a mess.
    Please pass that time of good one if you please in town.
      #

  • 19:07  というわけでごみ捨てに行ってきます…  #

  • 20:00  ごみ捨てついでに、先日玄関にこぼした大量の油も処理してきた。なんか今日は掃除デーだったな…。エイプリルフールだから普段やらないことしたんだろうな  #

  • 20:07  Hototの通知がlibnotifyじゃないのが気に入らないのでmikutterに戻すの巻  #

  • 20:14  AdBlockまでエイプリルフールネタかよwwwwwwwww  #

  • 20:52  capybara-webkitでfocusされたフィールドをテストするって力技しかないのかな  #

  • 21:05  CoffeeScriptに手を出してみよう -> https://t.co/Hfwbz0OE #Emacs  #

  • 21:10  ジュンが寝る瞬間を見たくて作業が進まない病 #どこでもいっしょ  #

  • 21:54  今更githubのwatchについて調べてる俺は完璧に情弱  #

  • 21:58  ぐああああああああああああ githubのフィード登録してたらジュンが寝てたあああああああああああ  #

  • 21:58  まぁいいや気を取り直してコーディングだ  #

  • 22:08  ざっと読んだだけだけど、JavaScriptの特異(かつ強力)なパラダイムを吸収し、気楽に書けて、資産を再利用できるというのは文字通り魔法のようだ / “今日から始めるCoffeeScript | …” http://t.co/lxzzQ1mJ  #

  • 22:10  JavaScript本もかつて読んだけど、クラスが関数って時点で感動こそすれ共感というか、馴染めなかったから、CoffeeScriptが半ば神格化されてるのも納得  #

  • 22:30  どこでもいっしょレッツ学校!のOP、Dough-nut Town's mapの歌詞&和訳。童謡みたいで楽しい / “ドーナッツタウンズマップ” http://t.co/sB8hUc8J  #

  • 23:06  さって、今日は掃除デーだったから明日がんばろっと  #

  • 23:07  TLが地震ツイートであふれているけど静岡県民の俺にはまったく感じられないのであった  #