PerlScriptの日本語処理バグ ― 2012年12月01日 14:59
Windows版のPerlであるActivePerlをインストールすると、WSH上で動作する言語エンジンの一つであるPerlScriptが使えるようになる。これによって、サクラエディタのマクロをPerl構文で書けるので重宝している。
ただし、PerlScriptには日本語処理に関するバグがある。文字数とバイト数の区別がごっちゃになっているために、スクリプト内に日本語が入っていると、その分だけスクリプトの最後のほうが読み込まれなくなるらしい。何年も前からバグ報告されているようだが、最近のバージョン(ActivePerl 5.16.1)でも状況が変わっていない。
現象や対策について書かれている記事をいくつか引用しておく。
http://undine.sakura.ne.jp/diary/d200608b.html#r18-1
http://miau.s9.xrea.com/blog/index.php?itemid=397
http://miau.s9.xrea.com/blog/index.php?itemid=659
http://aragger.blogspot.jp/2010/03/sleipnirperl.html
その場しのぎには、スクリプトの最後に、切り落とされてもいい文字列を多めにパディングしておけば誤魔化せることが多い。
もっと確実に動作させるには、require()関数で日本語混じりスクリプトを外部ファイルとして読み込めばよい。そのようなrequire()関数の入ったファイルを自動生成するPerlスクリプトを書き、pl2bat.batでバッチファイルに変換し、ドラッグ&ドロップで処理できるようにしている。
なお、これはPerlScript(拡張子.pls)で生じる問題であり、Perl本体(拡張子.pl)では問題ない。PerlScriptを使い始めの頃、この問題でかなりつまずいた記憶があるが、アドホクとはいえバグ回避方法があるので使い続けている。
ただし、PerlScriptには日本語処理に関するバグがある。文字数とバイト数の区別がごっちゃになっているために、スクリプト内に日本語が入っていると、その分だけスクリプトの最後のほうが読み込まれなくなるらしい。何年も前からバグ報告されているようだが、最近のバージョン(ActivePerl 5.16.1)でも状況が変わっていない。
現象や対策について書かれている記事をいくつか引用しておく。
http://undine.sakura.ne.jp/diary/d200608b.html#r18-1
http://miau.s9.xrea.com/blog/index.php?itemid=397
http://miau.s9.xrea.com/blog/index.php?itemid=659
http://aragger.blogspot.jp/2010/03/sleipnirperl.html
その場しのぎには、スクリプトの最後に、切り落とされてもいい文字列を多めにパディングしておけば誤魔化せることが多い。
もっと確実に動作させるには、require()関数で日本語混じりスクリプトを外部ファイルとして読み込めばよい。そのようなrequire()関数の入ったファイルを自動生成するPerlスクリプトを書き、pl2bat.batでバッチファイルに変換し、ドラッグ&ドロップで処理できるようにしている。
なお、これはPerlScript(拡張子.pls)で生じる問題であり、Perl本体(拡張子.pl)では問題ない。PerlScriptを使い始めの頃、この問題でかなりつまずいた記憶があるが、アドホクとはいえバグ回避方法があるので使い続けている。
OmegaTプロジェクトを開くAutoHotkeyスクリプト ― 2012年12月06日 11:04
OmegaTでプロジェクトを開くためにCtrl+Oを押すとファイル選択ウィンドウが表示されるが、すぐにアローキーを使ってファイルを選択できないモードになっている。そのため、いったんShift+Tabを押してアローキーを有効にするか、またはマウスでダブルクリックすることになる。
そこでAutoHotkeyを使って、すぐにアローキーとEnterでファイルを選択できるようにした。選択ウィンドウが開いてからスペースを押すのは、最上位の項目を選択状態にするため。
; Ctrl+Shift+OでOmegaTプロジェクトを開くAutoHotkeyスクリプト
+^o::
IfWinActive, OmegaT
{
Send, ^o
WinWaitNotActive, OmegaT
Send, +{Tab}{Space}
}
return
打鍵やマウス操作を減らすことで手首の疲労軽減になる。
そこでAutoHotkeyを使って、すぐにアローキーとEnterでファイルを選択できるようにした。選択ウィンドウが開いてからスペースを押すのは、最上位の項目を選択状態にするため。
; Ctrl+Shift+OでOmegaTプロジェクトを開くAutoHotkeyスクリプト
+^o::
IfWinActive, OmegaT
{
Send, ^o
WinWaitNotActive, OmegaT
Send, +{Tab}{Space}
}
return
打鍵やマウス操作を減らすことで手首の疲労軽減になる。
OmegaTプロジェクトパス名の取得 ― 2012年12月06日 16:00
OmegaTのエディタ機能を補完するために、OmegaTとサクラエディタとの間でデータをやりとりする仕組みを作った。特に用語集を使いやすくする必要性から、試用・改良を進めている。
OmegaTには、作業中の原文および訳文セグメント(分節)をテキストファイルとしてエクスポートする機能が用意されている。各セグメントを開いたときやプロジェクトを保存したときにファイルが更新され、プロジェクトを終了するとファイルは空になる。
テキストファイルがエクスポートされるディレクトリはOSによって異なり、マニュアルに記載されている。文字コードはUTF-8だ。この機能を利用すれば、OmegaTの作業対象セグメントを外部のアプリで処理しやすい。
もう1つ必要な情報は、作業中プロジェクトのパスであり、それを足掛かりにしてtmxファイルや用語集などに外部アプリからアクセスできる。YU-TANGさんのブログを参考に、見よう見まねで、作業中プロジェクトのパスをテキストファイルに書き出すgroovyスクリプトを書いた。
import javax.swing.JOptionPane;
def prop = project.getProjectProperties()
def folder = prop.getProjectRoot()
if (folder == null) {
def title = "open project folder"
def msg = "Open a project."
JOptionPane.showMessageDialog(null, msg, title, JOptionPane.INFORMATION_MESSAGE);
} else {
def fw=new File("c:\\project_path.txt").newWriter()
fw.writeLine(folder)
fw.close()
}
エクスポートするファイルの保存場所"c:\\project_path.txt"は適宜変更する。原文・訳文セグメントのほかにプロジェクトパスも書き出す機能がOmegaTの標準仕様になれば、一部のユーザにとっては便利だろう。
テキストエディタで処理した結果は、AutoHotkeyを介し、クリップボード経由でOmegaTに戻す(ほかのやり方を知らないので)。
こうしたアクセス手段を得たうえで、テキストエディタ上でどのような処理をするのか、別記事に記そうと思う。
OmegaTには、作業中の原文および訳文セグメント(分節)をテキストファイルとしてエクスポートする機能が用意されている。各セグメントを開いたときやプロジェクトを保存したときにファイルが更新され、プロジェクトを終了するとファイルは空になる。
テキストファイルがエクスポートされるディレクトリはOSによって異なり、マニュアルに記載されている。文字コードはUTF-8だ。この機能を利用すれば、OmegaTの作業対象セグメントを外部のアプリで処理しやすい。
もう1つ必要な情報は、作業中プロジェクトのパスであり、それを足掛かりにしてtmxファイルや用語集などに外部アプリからアクセスできる。YU-TANGさんのブログを参考に、見よう見まねで、作業中プロジェクトのパスをテキストファイルに書き出すgroovyスクリプトを書いた。
import javax.swing.JOptionPane;
def prop = project.getProjectProperties()
def folder = prop.getProjectRoot()
if (folder == null) {
def title = "open project folder"
def msg = "Open a project."
JOptionPane.showMessageDialog(null, msg, title, JOptionPane.INFORMATION_MESSAGE);
} else {
def fw=new File("c:\\project_path.txt").newWriter()
fw.writeLine(folder)
fw.close()
}
エクスポートするファイルの保存場所"c:\\project_path.txt"は適宜変更する。原文・訳文セグメントのほかにプロジェクトパスも書き出す機能がOmegaTの標準仕様になれば、一部のユーザにとっては便利だろう。
テキストエディタで処理した結果は、AutoHotkeyを介し、クリップボード経由でOmegaTに戻す(ほかのやり方を知らないので)。
こうしたアクセス手段を得たうえで、テキストエディタ上でどのような処理をするのか、別記事に記そうと思う。
OmegaTの用語集とtokenizer ― 2012年12月08日 14:24
後記(2013/4/26):OmegaT 3.0ベータ版では、tokenizerが標準で組み込まれて使いやすくなった。日本語用tokenizerを使用したときの用語集ヒットに関する下記の状況も改善された。開発チームに感謝。
-----------------------------------------
OmegaTには用語集機能があるが、これを有効に活用するにはtokenizerと呼ばれるプラグインを導入する必要がある。それによって、原文が英語の場合に用語集のヒット率が良くなることについては、下記のブログ記事に解説がある。
http://dirtysexyquery.blogspot.jp/2012/10/omegat-tokenizer-plugin-usage.html
では、原文が日本語の場合はどうだろうか。次の例について検討してみる。
原文は:
机の上にペンとペンダントがあり、机の下にはクロネコがいます。
用語集項目は:
机 = desk
ペン = pen
ペンダント = pendant
ネコ = cat
だとする。
1.tokenizerなしの場合
ヒットするのは
ペンダント = pendant
ペン = pen
机 = desk
であり、「ネコ」はヒットしない。「クロネコ」のように他のカタカナ用語との合成語になっているとヒットしないようだ。同様に、例えば原文が「大阪府大阪市」の場合、「大阪府」と「大阪市」がそれぞれ用語集にあってもヒットしない。
2.LuceneCJKTokenizerを使用した場合
OmegaTで使える日本語用tokenizerは、LuceneCJKTokenizerというものらしい。これを使ってヒットするのは
ペンダント = pendant
ペン = pen
ネコ = cat
であり、「机」はヒットしない。一文字の用語集項目はヒットしないアルゴリズムようだ。
3.SnowballEnglishTokenizerを使用した場合
英語用tokenizerであるSnowballEnglishTokenizerを使った場合にヒットするのは、
ペンダント = pendant
ペン = pen
机 = desk
ネコ = cat
であり、期待するすべての項目がヒットする。
このことから、用語集のヒット率を良くするという観点では、原文が日本語の場合でも英語用tokenizerを使うとよさそうにも見える。しかし実際のジョブで試すと、余計な項目までヒットするという問題に遭遇する。上の例だと、用語集に
コネ = connection
という項目があれば、それまでヒットしてしまう。
そこで、OmegaTの枠組みから離れて独自に用語集のマッチングを行う仕組みを試作した。これについては別記事に記そうと思う。
-----------------------------------------
OmegaTには用語集機能があるが、これを有効に活用するにはtokenizerと呼ばれるプラグインを導入する必要がある。それによって、原文が英語の場合に用語集のヒット率が良くなることについては、下記のブログ記事に解説がある。
http://dirtysexyquery.blogspot.jp/2012/10/omegat-tokenizer-plugin-usage.html
では、原文が日本語の場合はどうだろうか。次の例について検討してみる。
原文は:
机の上にペンとペンダントがあり、机の下にはクロネコがいます。
用語集項目は:
机 = desk
ペン = pen
ペンダント = pendant
ネコ = cat
だとする。
1.tokenizerなしの場合
ヒットするのは
ペンダント = pendant
ペン = pen
机 = desk
であり、「ネコ」はヒットしない。「クロネコ」のように他のカタカナ用語との合成語になっているとヒットしないようだ。同様に、例えば原文が「大阪府大阪市」の場合、「大阪府」と「大阪市」がそれぞれ用語集にあってもヒットしない。
2.LuceneCJKTokenizerを使用した場合
OmegaTで使える日本語用tokenizerは、LuceneCJKTokenizerというものらしい。これを使ってヒットするのは
ペンダント = pendant
ペン = pen
ネコ = cat
であり、「机」はヒットしない。一文字の用語集項目はヒットしないアルゴリズムようだ。
3.SnowballEnglishTokenizerを使用した場合
英語用tokenizerであるSnowballEnglishTokenizerを使った場合にヒットするのは、
ペンダント = pendant
ペン = pen
机 = desk
ネコ = cat
であり、期待するすべての項目がヒットする。
このことから、用語集のヒット率を良くするという観点では、原文が日本語の場合でも英語用tokenizerを使うとよさそうにも見える。しかし実際のジョブで試すと、余計な項目までヒットするという問題に遭遇する。上の例だと、用語集に
コネ = connection
という項目があれば、それまでヒットしてしまう。
そこで、OmegaTの枠組みから離れて独自に用語集のマッチングを行う仕組みを試作した。これについては別記事に記そうと思う。
Windows版OmegaTの日本語入力の不具合 ― 2012年12月24日 15:33
後記(2013/4/26):下記のバグはOmegaT 3.0ベータ版で解消した。開発チームに感謝。
-----------------------------------------------
日本語を入力する際、通常は、変換対象の区切りや確定状況を表す下線が表示される。しかし、Windows版OmegaTで日本語を入力した場合、この下線が表示されない(正確には、入力の瞬間だけ表示され、すぐに消える)。Windows 7でもWindows 8でも試したが結果は同じだった。ちなみに、Macintosh版OmegaTでは問題なく下線が表示される。
なお、これは「Editor」画面で生じる問題であり、「Text Search」画面では正常に下線が表示される。
下線が表示されなくても日本語は入力できる。しかし、変換の区切りを変えるときなどに状況がわかりにくく、文字列が確定されたのかも確認しにくい。OmegaT上で長い日本語を入力をする方は不便を感じるかもしれない。自分は長い日本語を入力するときはテキストエディタ上に移して作業することが多いので、影響が緩和されていると思う。バグ報告済みなので、いずれ改善されるものと期待している。
バグ報告:
http://sourceforge.net/tracker/?func=detail&aid=3596178&group_id=68187&atid=520347
-----------------------------------------------
日本語を入力する際、通常は、変換対象の区切りや確定状況を表す下線が表示される。しかし、Windows版OmegaTで日本語を入力した場合、この下線が表示されない(正確には、入力の瞬間だけ表示され、すぐに消える)。Windows 7でもWindows 8でも試したが結果は同じだった。ちなみに、Macintosh版OmegaTでは問題なく下線が表示される。
なお、これは「Editor」画面で生じる問題であり、「Text Search」画面では正常に下線が表示される。
下線が表示されなくても日本語は入力できる。しかし、変換の区切りを変えるときなどに状況がわかりにくく、文字列が確定されたのかも確認しにくい。OmegaT上で長い日本語を入力をする方は不便を感じるかもしれない。自分は長い日本語を入力するときはテキストエディタ上に移して作業することが多いので、影響が緩和されていると思う。バグ報告済みなので、いずれ改善されるものと期待している。
バグ報告:
http://sourceforge.net/tracker/?func=detail&aid=3596178&group_id=68187&atid=520347
Windows 8評価版の試用 ― 2012年12月25日 09:56

Windows 8評価版をインストールしてみた。部屋の掃除と並行作業で、インストール・設定に3時間ほど要した。手順については下記サイトに丁寧な説明がある。
http://news.mynavi.jp/articles/2012/08/17/win8evaluation/index.html
スタート画面でデスクトップを表示させれば、Windows 7と似たような使い勝手になる。Windows 8といえばタッチパネル操作が売りのようだが、それに関心があるというわけではない。Windows 7まではIMEのオン/オフ状態がアプリケーションごとに保存されていたのに対し、Windows 8ではグローバルに保存されるようになった点に関心がある。
テキストエディタ、翻訳支援ソフト、辞書検索ソフト、webブラウザなど様々なアプリを頻繁に切り替え、かつIMEのオン/オフも頻繁に切り替える使い方をしているので、IMEオン/オフが全アプリ共通で切り替わるほうが状況を把握しやすい。Macintoshでは当たり前のこの機能が、Windows 8でようやく実現したのは朗報だ。一方で、従来通りアプリごとにIMEのオン/オフ状態を保持するようにも設定できる。
ただしWindows 8に本格的に乗り換えるには、OSと主要アプリの動作を1つずつ確認する必要があり、道のりは長そうだ。Windows 7でもIMEのオン/オフをグローバルに切り替えられる手軽なツールがないかと探しているのだが、ご存知の方にはご教示を賜りたい。
最近のコメント