Monday, February 27, 2012

スニペット


Word のオートコレクト機能は、スペルミスを修正するためのものだけど、それを、入力支援に使うこともできる。ただ、登録や管理が面倒なので、マクロやデータの直接編集などで対応できないかと、いろいろ考えてはいる(Wordのオートコレクトで用語変換)。


そちらの方は、まだ進捗がないのだけど、EmEditorのスニペット機能なら、登録や管理がもう少し楽な気がして、ちょっとやってみた。

スニペットも、ふつうは個別に登録していくのだけど、インポート/エクスポート機能があるので、このあたりで工夫できそうだ。試しに、今登録してあるスニペットデータをエクスポートしてみると、比較的単純なフォーマットになっている。なので、用語集のような簡単なデータを、スニペットのインポート用データに変換する方針でやってみた。

EmEditorのマクロ(JavaScript)を使ってもよいのだけど、どうせJavaScriptならということで、WSH上でやってみることにした。JavaScriptもWSHも勉強しはじめたところなので、「マンガで分かる JavaScriptプログラミング講座」(25)のコードを読みながら、というか、そこに載っているコードを修正して、なんとか動くものができた。

WSH用のスクリプトは、単に、VBScript だけとか、Jscript (JavaScript) だけでも書けるが、ファイルの関連付けなどで不具合が起きないように、講座では、"sample.wsf"から、"cmnFunc.js" を利用するやり方が紹介されている。簡単なコードなんだろうけど、自分にはまだ難しいので、"cmnFunc.js"をそのまま使わせてもらい、"sample.wsf"を修正することにした(ファイル名"snpgen.wsf")。

エラー処理もテストも不十分なので、公開するようなものではないのだけど、自分用のメモということで(笑)

[snpgen.wsf]
<job id="main">
  <script language="JavaScript" src="cmnFunc.js"></script>
  <script language="JavaScript">
    // グローバル変数
    var args;        // 引数
    var dropFilePath = "";  // ドロップ ファイルのパス
    var dropFileStr  = "";  // ドロップ ファイルの中身の文字列

    // メイン ルーチン
    init();      // 初期化処理
    main();      // メイン処理

    // 初期化処理
    function init() {
      args = WScript.Arguments;  // 引数のオブジェクト
      if (args.length >= 1) {
        dropFilePath = args(0);
        dropFileStr  = cmnFunc.readFile(dropFilePath);
      }
    }

    // メイン処理
    function main() {
      if (dropFilePath == "") {
        WScript.Echo("ドロップ ファイルなし");
      } else {
        var i, j, wkstr, pwkstr, pwlen, opstr, opfn, wfpath, tempstr, namelet, nameflgm;
        var opH1 ="<?xml version=\"1.0\"?>\n<!--EmEditor Snippets file-->\n<Snippets>\n<SnippetTree>\n\t<Folder Name="
        var opH2 = " Flags=\"1\" ConfigEdit=\"\" ConfigMacro=\"\" ConfigsAssociate=\"\">\n";
        var opM1 ="\t\t<Item Name=\""
        var opM2 ="\" Flags=\"4\" ConfigEdit=\"\" ConfigMacro=\"\" ConfigsAssociate=\"\\\" Text=\"";
        var opM3 ="\" Trigger=\"";
        var opM4 ="\" Tip=\"\" ShortcutKey=\"0\" ShortcutVirt=\"0\"/>\n"
        var opT ="\t"+"</Folder>"+"\n"+"</SnippetTree>\n</Snippets>";

        namelet = dropFilePath.split(".");
        nameflgm = namelet[0].split("\\");
        opfn = nameflgm[nameflgm.length - 1];
        wfpath = namelet[0] +".eesnip"

        opstr = opH1 + "\"" + opfn + "\"" +opH2;
        pwkstr = (dropFileStr + " ").split("\n");
        pwlen = pwkstr.length;
        wkstr = new Array(pwlen);
        for(i = 0; i < pwlen; i++) {
          wkstr[i]=pwkstr[i].split("\t");
          tempstr = wkstr[i][1];
          wkstr[i][1] = tempstr.slice(0, tempstr.length-1);
          opstr = opstr + opM1 + wkstr[i][0] + opM2 + wkstr[i][1] + opM3 + wkstr[i][0] + opM4;
        }
        opstr = opstr + opT;
        cmnFunc.writeFile(wfpath, opstr);
      }
    }
  </script>
</job>

お見苦しいコードで恐縮です。。


で、用語集のような元ファイルを、snpgen.wsfのアイコンにドラッグ&ドロップすると、スニペットデータが出来る(上記講座の"cmnFunc.js"も予めダウンロードしておく必要があります)。

元ファイルというのは、タブ区切りのテキストファイルで、例えば、

[test.txt]
tpi(タブ)the present invention
1e (タブ) first embodiment
2e (タブ) second embodiment
3e (タブ) third embodiment
wrt (タブ) with reference to
iaw (タブ) in accordance with

という感じ。各行の先頭に、トリガの符号を入れ、タブを打ってから、変換後の語句を入れ、行末に改行コード(当たり前か…)。なお、最終行の行末には、改行コードを入れない「仕様」になっています(苦笑)
このtest.txtを、snpgen.wsfにドラッグ&ドロップすると、こんなのが出来る。

[test.eesnip]
<?xml version="1.0"?> <!--EmEditor Snippets file--> <Snippets> <SnippetTree> <Folder Name="test" Flags="1" ConfigEdit="" ConfigMacro="" ConfigsAssociate=""> <Item Name="tpi" Flags="4" ConfigEdit="" ConfigMacro="" ConfigsAssociate="\" Text="the present invention" Trigger="tpi" Tip="" ShortcutKey="0" ShortcutVirt="0"/> <Item Name="1e" Flags="4" ConfigEdit="" ConfigMacro="" ConfigsAssociate="\" Text="first embodiment" Trigger="1e" Tip="" ShortcutKey="0" ShortcutVirt="0"/> <Item Name="2e" Flags="4" ConfigEdit="" ConfigMacro="" ConfigsAssociate="\" Text="second embodiment" Trigger="2e" Tip="" ShortcutKey="0" ShortcutVirt="0"/> <Item Name="3e" Flags="4" ConfigEdit="" ConfigMacro="" ConfigsAssociate="\" Text="third embodiment" Trigger="3e" Tip="" ShortcutKey="0" ShortcutVirt="0"/> <Item Name="wrt" Flags="4" ConfigEdit="" ConfigMacro="" ConfigsAssociate="\" Text="with reference to" Trigger="wrt" Tip="" ShortcutKey="0" ShortcutVirt="0"/> <Item Name="iaw" Flags="4" ConfigEdit="" ConfigMacro="" ConfigsAssociate="\" Text="in accordance with" Trigger="iaw" Tip="" ShortcutKey="0" ShortcutVirt="0"/> </Folder> </SnippetTree> </Snippets>

この test.eesnipを、EmEditorのスニペットインポート機能で取り込む。
すると、"tpi"+tab と打つだけで、"the present invention"と自動変換される。


それから、特許の場合には、構成要素に参照番号がついたものを入力することが多いので、それに特化したものも作った。

[snppat.wsf]
<job id="main">
  <script language="JavaScript" src="cmnFunc.js"></script>
  <script language="JavaScript">
    // グローバル変数
    var args;        // 引数
    var dropFilePath = "";  // ドロップ ファイルのパス
    var dropFileStr  = "";  // ドロップ ファイルの中身の文字列

    // メイン ルーチン
    init();      // 初期化処理
    main();      // メイン処理

    // 初期化処理
    function init() {
      args = WScript.Arguments;  // 引数のオブジェクト
      if (args.length >= 1) {
        dropFilePath = args(0);
        dropFileStr  = cmnFunc.readFile(dropFilePath);
      }
    }

    // メイン処理
    function main() {
      if (dropFilePath == "") {
        WScript.Echo("ドロップ ファイルなし");
      } else {
        var i, j, wkstr, pwkstr, pwlen, opstr, opfn, wfpath, tempstr, namelet, nameflgm;
        var opH1 ="<?xml version=\"1.0\"?>\n<!--EmEditor Snippets file-->\n<Snippets>\n<SnippetTree>\n\t<Folder Name="
        var opH2 = " Flags=\"1\" ConfigEdit=\"\" ConfigMacro=\"\" ConfigsAssociate=\"\">\n";
        var opM1 ="\t\t<Item Name=\""
        var opM2 ="\" Flags=\"4\" ConfigEdit=\"\" ConfigMacro=\"\" ConfigsAssociate=\"\\\" Text=\"";
        var opM3 ="\" Trigger=\"";
        var opM4 ="\" Tip=\"\" ShortcutKey=\"0\" ShortcutVirt=\"0\"/>\n"
        var opT ="\t"+"</Folder>"+"\n"+"</SnippetTree>\n</Snippets>";

        namelet = dropFilePath.split(".");
        nameflgm = namelet[0].split("\\");
        opfn = nameflgm[nameflgm.length - 1];
        wfpath = namelet[0]+".eesnip"

        opstr = opH1 + "\""+ opfn + "\""+opH2;
        pwkstr = (dropFileStr + " ").split("\n");
        pwlen = pwkstr.length;
        wkstr = new Array(pwlen);
        for(i = 0; i < pwlen; i++) {
          wkstr[i]=pwkstr[i].split("\t");
          tempstr = wkstr[i][1];
          wkstr[i][1] = tempstr.slice(0, tempstr.length-1);
          opstr = opstr + opM1+wkstr[i][0]+opM2+wkstr[i][1]+" "+wkstr[i][0]+opM3+wkstr[i][0]+opM4;
        }
        opstr = opstr + opT;
        cmnFunc.writeFile(wfpath, opstr);
      }
    }
  </script>
</job>

元データのサンプルは、こんな感じ。

[test2.txt]
100 (タブ) information processing apparatus
110 (タブ) imaging device
120 (タブ) A/D converter
130 (タブ) controller

これを、 snppat.wsfにドラッグ&ドロップすると、

[test2.eesnp]
<?xml version="1.0"?>
<!--EmEditor Snippets file-->
<Snippets>
<SnippetTree>
  <Folder Name="test2" Flags="1" ConfigEdit="" ConfigMacro="" ConfigsAssociate="">
    <Item Name="100" Flags="4" ConfigEdit="" ConfigMacro="" ConfigsAssociate="\" Text="information processing apparatus 100" Trigger="100" Tip="" ShortcutKey="0" ShortcutVirt="0"/>
    <Item Name="110" Flags="4" ConfigEdit="" ConfigMacro="" ConfigsAssociate="\" Text="imaging device 110" Trigger="110" Tip="" ShortcutKey="0" ShortcutVirt="0"/>
    <Item Name="120" Flags="4" ConfigEdit="" ConfigMacro="" ConfigsAssociate="\" Text="A/D converter 120" Trigger="120" Tip="" ShortcutKey="0" ShortcutVirt="0"/>
    <Item Name="130" Flags="4" ConfigEdit="" ConfigMacro="" ConfigsAssociate="\" Text="controller 130" Trigger="130" Tip="" ShortcutKey="0" ShortcutVirt="0"/>
  </Folder>
</SnippetTree>
</Snippets>

が出来る。これを、EmEditorにインポートすると、"100"+tab と打つだけで、"information processing apparatus 100" と、名称+参照符号の形式で入力される。

インポートしたスニペットは、1つのスニペットフォルダにまとまっているので、参照番号用のスニペットのように、案件単位でしか使わないものは、フォルダ単位ですぐに削除できるので、管理が簡単。

こんな稚拙なコードではなくて(笑)、標準でサポートしてもらえるといいんだけど。

Tuesday, February 14, 2012

テキストエディタとスペルチェック(EmEditor試用)

翻訳の際に、用語を一括置換すると、和英入り混じりの妙な文章ができる。で、長めの案件だと、Wordのスペルチェックが音を上げる。このところ、翻訳の準備作業として、Wordfastで原文訳文ペアを作るようにしているので、長さが倍になる。そのためかどうかわからないが、短めのファイルでも、スペルチェックが外れるようになった気がする。もっとも、最後のチェック工程で必ずスペルチェックをかけているので、あまり困ったことにはならないが…。

テキストエディタで作業する場合には、昔からの習慣というか…、スペルチェック機能はないという前提で、あまり気にもしなかった。普段使っている秀丸やWzエディタも、工夫すればスペルチェックできるように拡張可能かもしれないが、試してみたことはない。

それが、EmEditorの最新版では、標準でスペルチェックができると聞き、実際に使ってみることにした。かなり長いファイルで大量に用語置換しても、ふつうに赤線表示される。スペルチェック辞書も、Wordとあまり違わない感じ(よく調べてません…)。

コメントや用語集の編集など、これまでスペルチェックを気にせずに、テキストエディタを使っていたけど、やはりスペルチェックがあった方がよい。

前回書いたように、「Wordfast+ぱらぱら」という使い方が安定してきたのだけど、Wordをインストールしていないノートパソコンなど、Wordfastを使わないで作業することもあるので、そんなときにはEmEditorがよいかもしれない。

特殊文字や上付き下付きの処理など、最終的にWordで変換処理する必要があるので、そのあたりの連携を考えておく必要はあるだろう。今やっている仕事は、そういった問題がないので、あまり考えずに打ち込んでいる。

EmEditorは、他にもスニペット機能など、いろいろ充実していて面白そう。試用期間後は、おそらく送金することになるだろう。

マクロ機能には、WSHのエンジンを使っているということで、VBScriptとJavaScript (JScript) が使える。WSHの学習にもなるので、これから秀丸マクロに習熟するより、こちらに乗り換えようと思う。Wordマクロに慣れた人なら、VBScriptでやればいいんだろうけど、自分には、JavaScriptの方がわかりやすい感じなので、JavaScriptでやってみることにした。

まず、上書翻訳で必要な「行末まで削除」機能を自動記録してみた。
EmEditorのデフォルトもJavaScript になっていたので、自動記録のコードも JavaScript。実際に使ってみると、表示された1行単位で動くようになっている。自分の使い方としては、改行コード直前まで消した方が便利なので、リファレンスを見ながら、論理行で扱うように変更した。
document.selection.EndOfLine(true,eeLineLogical);
document.selection.Delete(1);
"eeLineLogical"で論理行を指定している。
このマクロを、「Ctrl + ;」に割り当てた。

あと、最低限、Webの検索をやろうと思い、
「Ctrl + :」   Google Scholar フレーズ検索
「Ctrl + Shift + :」Weblilo ,英辞郎 辞書検索
としてみた。

自分の場合、Google Scholar で表現をチェックするときと、辞書引きのときとで、タイミングが別になるので、辞書検索だけを串刺しにして、Scholarとは別にした。

くまさんの記事を参考に、Chrome のウィンドウを個別に開くように設定。専用のフォルダは、(Cドライブが窮屈なので)Dドライブに割り当てたが、問題なく動いた。いい加減なコードですが、こんな感じに…。

(Google Scholar フレーズ検索)
str = document.selection.Text;
WshShell = new ActiveXObject( "WScript.Shell" );
strch = str.replace(/ /g, "+");
WshShell.Run( "chrome.exe --user-data-dir=d:\chromedata01 http://scholar.google.com/scholar?hl=en&q=%22"+ strch +"%22" );
(Weblilo ,英辞郎検索)
str = document.selection.Text;
WshShell = new ActiveXObject( "WScript.Shell" );
strch = str.replace(/ /g, "+");
WshShell.Run( "chrome.exe --user-data-dir=d:\chromedata02 http://ejje.weblio.jp/content/"+ strch);
WshShell.Run( "chrome.exe --user-data-dir=d:\chromedata03 http://eow.alc.co.jp/"+strch+"/UTF-8/");
どちらも、3行目で、選択範囲のスペースを「+」に置換しているのだけど、この処理がやりっぱなしなので、選択範囲の最後にスペースがあれば、それも置換してしまう(笑)。工夫しようかと思ったけど、そのまま検索できたので、特に変えなかった。

それと、「範囲選択しない場合、カーソル位置の語を検索」、とかにすると親切だけど、自分ではそんな使い方はしないので、このまま使っている。

他にもいろいろやりたいことがあるけれど、仕事もしないといけないし、英語の勉強もあるので(笑)、今日はこのあたりに…。

Sunday, February 12, 2012

Wordfast+ぱらぱら


先日、lycaさんのブログにコメントしたときに、Wordfastのグロサリ機能を補完するのに、ぱらぱらXbenchが使えそうなことを、教えてもらった。ぱらぱらは、新田さんのサイトで見かけたことがあったので、とりあえずこれを試してみることにした。

最初にWordfastを使い、ToolsのTranslateコマンドで、「原文フィールド(隠し文字)+訳文フィールド」というバイリンガル形式に変換する。バイリンガルとはいっても、訳文フィールドに原文がそのままコピーされいているだけですが…。

ちなみに、Pandora's boxという設定画面で、これまでは、

  • CopySourceWhenNoMatch
  • Propagate1

を設定していたのだけど、今回は、用語一括置換に、ぱらぱらを使うので、Translate処理の前に、Propagate1の機能をOFFにしておく(Propagate_1というように、アンダースコアを入れればOFFになる)。

このバイリンガルファイルを、ぱらぱらで一括置換する。ぱらぱらの設定はよく調べてないのだけど、デフォルトでは、隠し文字を置換対象から除外しているらしく、原文フィールドは置換せずに、訳文フィールドだけを置換してくれた。

ぱらぱらの用語集フォーマットは、タブ区切りの単純なテキストファイルなので、これをそのまま、Wordfastのグロサリとして取り込める。

後は、Wordfastで、置換されていない元の原文を見ながら、用語置換済みの訳文フィールドを並べ替える方式で、快適に翻訳することができる。Wordfastの用語認識を心配することなく、きっちりと置換された用語で作業できる。

こうして、訳文フィールドに用語置換済の原文を入れているので、ふつうに作業していると、翻訳メモリは表示されない。でも、メモリがヒットすると、訳文フィールドの色が変わるので、
Ctrl+Alt+x
で、訳文フィールドを削除してから、(Alt+↑、Alt+↓とかで)もう一度訳文フィールドを開くと、メモリの内容が取り込まれる(もっと上手な設定があるかもしれませんが…)。

翻訳作業中に、置換したい用語を思いついたときには、
Ctrl+,
で、隠し文字を非表示にしてから、ふつうに置換すれば、原文フィールドはそのままで、訳文フィールドだけ用語置換される。
再度、
Ctrl+,
とすれば、隠し文字が再び表示される。

こんな操作方法でも、それなりに快適に使える。用語一括置換方式でやるか、翻訳メモリ方式でやるか、いろいろ悩んだのだけど、双方を無理なく統合する方向で、すり合わせていこうと思う。

それから、訳文フィールドの置換済み原文も、並べ替えに使ってもよいし、単に用語確認用に使うだけでもよい。Wordfastの自動認識がうまく働いている場合、用語や固定要素を、訳文フィールドに落としながら順次タイピングした方が、入力が早い。

ベタ打ちしていると、カーソル以後に、(用語置換済)原文が長いままぶら下がるので、マクロを併用する。これは、カーソル位置以後、改行コード直前までを削除するという単純なもので、
簡単に自動登録できる。今のところ、「Ctrl+;」に割り当てて、使っている。


Tradosも2007までのインターフェースなら、使った方がいいのかもしれないのだけど、OSやWordの新バージョンとの整合について、今後の展開が不透明な感じ。試すなら、やはりStarterだと思うけど、あのインターフェースはおそらく好きになれないだろうなぁ。

Wordfast(Classic)については、まだまだ知らないことも多いが、いろいろやってみて、それなりに手順が安定してきた。機能に限界はあるようだけれど、やはりシンプルなのがいい。

出版翻訳

以前の記事に書いたアルク翻訳コンテストの審査結果が出ていた。出版翻訳部門は、大賞も佳作も該当なしとのこと。訳文を読ませてもらえるといいのだけど、講評以外に情報はなかった。

昨年サイトで見かけて、ちょっと訳してみると、これが楽しかった。結局、当然ながら一次選考にも入らなかったのだけど、記念に記録しておこうと思う。

原文は、L. T. Fawkes "Early Eight" p.9

 Tiffany racked the balls, swearing to herself. I chalked my stick. I broke and the four ball dropped. I lined up on the three ball to the corner pocket. Tiffany suddenly appeared in my line of vision, twirling her stick. Distracted, I glanced at her, and in that glance I caught sight of a face in the crowd just over her shoulder. I went back to lining up my shot before I realized whose face it was. I stood up and looked again, but he had disappeared.
 I took a few steps toward the bar, craning my neck, trying to find him. I took a few more steps so that I could see down the back hall, but there was no sign of him. Danny, looking puzzled, had stepped up beside me. I said, “I thought I saw my brother. Berk. Did you see him?”
 He shook his head. “What would Berk be doing here? Are you sure it was him?“
 I wasn't. It'd been years since I'd seen Berk, and it'd been only a split-second glance. I shrugged it off and went back to the table, but I couldn't get my head clear. My shot went wide, and my cue ball didn't end up where I meant for it to, either. It was lined up to give Tiffany a bunny shot, eleven to the side. She made her shot, and three more, before she blew a bank shot and scratched.
(出題はここまでで、この後の一段落が、参照用に提示されていた。)

以下、文字通りの拙訳ですが、御笑読下さい。

 ティファニーは、悪態をつきながら的球をラックに並べた。おれはキューにチョークをこすりつけ、ブレイクショットを放って四球落とした。そして、3番をコーナーポケットに狙う。すると突然、ティファニーがキューを弄んでいるのが視界に入った。気が散ってそちらをちょっと見てみると、彼女の肩越しの人だかりに、一人の顔がよぎる。もとどおりに狙いを定めてから、その顔が誰かわかった。立ち上がってもう一度見てみたが、いなくなっていた。 
 バーの方へ歩み寄り、首を伸ばしてアイツを探す。ホールの奥を見通せるように、さらに進んだが、彼の気配はなかった。おどろいたダニーが、おれの傍まで来ていたので、「兄貴を見かけたと思うんだ。バークだよ。ヤツを見なかったかい」と聞いてみた。
 ダニーは首を振り、「バークがここで何してんだ。本当にアイツだったのか」と。
 どうだったかわからない。最後にバークと会ってから、何年も経ってるし、それに、ほんのちょっと目に入っただけだ。気にしないことにして、台に戻ったが、スッキリしない。おれのショットは逸れ、手玉も思った所に止まらなかった。おかげで、ティファニーは、イージーショットで、11番をサイドに狙える。彼女はそれを決めて、さらに三球ポケットしたが、バンクショットでしくじった。

「視界に入った」とか、「立ち上がって」のあたりで、もうダメらしいですね…。

仕事で扱うのは、特殊な文章ばかりだし、最近は英訳中心なので、和文を丁寧に書く機会も少なくなってしまった。なかなか、仕事にはならないだろうが、いつか、気に入った英文を、自分なりに和訳してみたいものだ。もっとちゃんと英語を勉強してからですが…(笑)

Tuesday, February 7, 2012

Word以外で

仕事は基本的に自宅の一室でやっているのだけど、ここ数日、デスクを離れて移動する必要があって、久しぶりにノートパソコンで作業してみた。持ち歩きやすいPCを選んだのだけど、よく考えると、Wordが入っていない。面倒なので、Wordなしでやることにした。テキストエディタでもよかったのだけど、下付き文字とか特殊記号が多かったので、LibreOffice をダウンロードし、Writer を使ってみた。

会社の合併などで、OpenOffice も迷走しているのかと思っていたけれど、新しい団体が立ち上がったようで、名前も、LibreOffice になったらしい。

検索や置換のときの正規表現が、標準的なものに近い感じでよかった。Wordのワイルドカードはなんだか特殊なので…。

最後は、デスクに戻り、念のためWordで読み込んでみた。特許の案件で、フォーマットが単純だったということもあり、頁番号のセンタリングが外れたこと以外は、互換性に問題はなかった。

オートコレクトも使えるので、Writerでも充分作業できる。もっとも、Wordfastは使えないし、マクロの蓄積もないので、とりあえずまっさらな感じで使うことになるけれど…。
Wordは、1台分だけで充分だな(笑)

それと、PCを持たずに移動して、出先のPCで作業する機会があったのだけど、そのときはGoogleDocsを使ってみた。思ったよりも使える感じ。マクロも、GoogleAppsScript (JavaScript) というので書けるらしい。ただ、今のところ編集記号を表示できないようで(よく調べてませんが…)、それがちょっと問題。ピリオドの後のスペース2つとか、はっきりわかった方が作業しやすいので。

PCが変わっても、シームレスに作業できるのは不思議な感覚。移動が多い時にはとても便利。将来的には、こういうやり方になるのかなぁ…。