EBWin4に付属の「ebwinc」、とても便利な辞書検索ツール

2016年06月30日

Windows用の辞書ブラウザ「EBWin4」には、「ebwinc」というコマンドラインツールが付いているのですが、その存在はあまり知られていないようです。かく言う私も、つい最近までまったく知りませんでした。でも、試しに使ってみたところ、マクロやスクリプトの開発で大いに役立つ、ものすごく便利な辞書検索ツールであることがわかりました。

そこでこの記事では、ebwincの特長と使い方について、自作の簡単なサンプルを交えてご紹介したいと思います。

ちなみに、今回紹介するサンプルの1つに、「英単語の活用形を原形に戻すAHK関数」というものがあります。お手持ちのAHK(AutoHotkey)スクリプトに組み込んでお使いいただけますので、よろしければお試しください。

ebwincとは

「ebwinc」とは、Windows用辞書ブラウザ「EBWin4」で利用できるEPWINGなどの辞書コンテンツを、コマンドプロンプト上で検索できるツールです(どちらもhishidaさん作)。EBWin4のバージョン4.1.4以降をインストールして、辞書を登録済みであれば、他に特別な設定をしなくても、ebwincで同じ辞書をそのまま検索できます。

試しに、ebwincを使って、EPWING版WordNet 3.1をコマンドプロンプトで検索してみると、次のようになります。

160623_ebwinc_cmd.png (クリックで拡大)

実は画期的な辞書検索ツール

上の実行例を見ても、ちっとも便利そうには思えないかもしれませんが、実はこれ、Windows用の辞書ツールとしてはかなり画期的です。何が画期的かというと、自作のマクロやスクリプトの中でこのツールを実行すれば、辞書の検索結果を文字列としてそのまま取り込むことができるからです。

これまで、Windows用の辞書ブラウザは、ウィンドウ上で操作することが前提のものばかりでした。したがって、自作のプログラムを使って辞書検索を自動化するとしても、辞書ブラウザに検索語句を送り込むところまでしか処理できませんでした。

でも、このebwincを使えば、検索結果に対する判別・加工・表示といった処理まで含めて、自作プログラムの中で制御できます。特に、次のような機能を実現したいときに、たいへん便利です。

  • 検索結果を辞書ブラウザ以外の場所に表示したいとき:たとえば、検索結果をポップアップ辞書のような形で表示したり、テキストエディタの中に取り込んだりできます。
  • 検索結果の中から特定のデータだけを抽出したいとき:たとえば、語義のみ、例文のみ、発音記号のみを取り出したいときに、正規表現を使って簡単に実現できます。(テキストの形式やプログラムの言語によっては難しい場合もありますが)。
  • 複数の単語に対する検索を一気に実行したいとき:たとえば、何十個もの単語をまとめて検索し、結果を1つのテキストファイルに取りまとめる、といったことも簡単です。

このように、自作のマクロやスクリプトの中で辞書の検索結果を直接制御したいときに、ebwincは絶大な威力を発揮します。(逆に言うと、通常どおりの検索結果を辞書ブラウザの画面上で見られればよいという話であれば、EBWin4本体で事足りるので、ebwincを使う必要は特にありません)。

ebwincの基本的な呼び出し方

ebwincの本体は、EBWin4のインストール先にある「ebwinc.exe」というEXEファイルです。次のような形で起動するだけで、検索を実行できます。

(EBWin4のインストールフォルダ)\ebwinc.exe [オプション] 検索語句

「オプション」で指定できる項目については、EBWin4のヘルプでご確認ください。特定の辞書1つで見出し語を単純に検索する場合であれば、「/G=グループ番号(またはグループ名) /#=辞書番号」というオプションだけを指定すれば済みます。

ただし、自作プログラムの中でebwinc.exeを呼び出すときには、次の2点に注意してください。

  • ebwinc.exeの検索結果は、「標準出力(stdout)」という仕組みを使って返されるのですが、Windows用のマクロ言語やスクリプト言語の場合、このstdoutの処理がややこしくなることがあります。クリップボードを簡単に使える言語の場合は、上記の形ではなく、下のような形で呼び出すと、検索結果がクリップボードに格納されますので、処理が楽だと思います。
    (冒頭の「cmd.exe /c」は「コマンドプロンプト経由で実行せよ」という意味、末尾の「 | Clip」は「実行結果をクリップボードに入れよ」という意味です)。
cmd.exe /c (EBWin4のインストールフォルダ)\ebwinc.exe [オプション] 検索語句 | Clip
  • 自作プログラムの中でebwinc.exeを実行するときには、「同期モード」の命令文を使ってください。
    (同期モードとは、そのプログラムの実行が終わるまで次の文に移らない、という意味です。たとえば、秀丸マクロなら runsync / runsync2 / runex[同期フラグ=1]、AHKなら RunWait が該当します)。

ebwincを使ったサンプルプログラム

ebwincの基本的な使い方は以上のとおりですが、これだけでは具体的なイメージがわかないと思いますので、参考までに、私が作ってみた簡単なサンプルプログラムを3つご紹介します。EPWING版WordNet 3.1EPWING版Wiktionary(どちらも大久保克彦さん作)を使用したサンプルです。

なお、サンプルコードを実際にお試しになる場合は、EBWin4本体と上記辞書のインストールを済ませたうえで、各サンプルコードの冒頭付近で赤字になっている2カ所を、お使いの環境に合わせて修正してください。1つはebwincのフルパス(「C:\Program Files (x86)\EBWin4\ebwinc.exe」)、もう1つは起動パラメータ(「/G=0 /#=0」等)です。

※起動パラメータの「/G=○」は辞書グループ番号です。1つ目のグループなら0、2つ目なら1、3つ目なら2、…というふうに指定します。また、「/#=0」は辞書番号です。グループ内の1つ目の辞書なら0、2つ目なら1、…というふうに指定します。

以下のサンプルコードは、WordNetは先頭グループの先頭の辞書(つまり「/G=0 /#=0」)、Wiktionaryは先頭グループの2番目の辞書(つまり「/G=0 /#=1」)、という想定となっています。

例1:AHKで作ったポップアップ辞書

AHK(AutoHotkey)とWordNetで作ってみた簡易ポップアップ辞書の例です。エディタやWebブラウザ等で英単語を選択した状態で、ホットキー「Win+U」を押すと、その単語をWordNetで検索し、語義の行だけをポップアップ表示する、というものです。そのような使い方がWordNetにふさわしいかどうかはさておき、辞書の検索結果を整形して表示する一例としてご覧ください。

160623_ebwinc_example1.png (クリックで拡大)

コードは次のとおりです。赤字の部分はお使いの環境に合わせて修正してください。

; これはAHKのコードです

; ebwincのフルパスと起動パラメータ(赤字の部分はお使いの環境に合わせて修正してください)
ebwinc := "C:\Program Files (x86)\EBWin4\ebwinc.exe"
param := "/G=0 /#=0"

#u::
    ; 選択中の文字列をCtrl+Cでクリップボードにコピーする
    clipbkup := ClipboardAll
    Clipboard := ""
    Send, ^c
    ClipWait, 0.1

    ; 上でコピーした文字列をebwinc.exeに送って辞書を検索し、結果を取り込む
    RunWait, % ComSpec . " /c """"" . ebwinc . """ " . param . " """ . Clipboard . """ | Clip""", , min
    result := Clipboard
    Clipboard := clipbkup

    ; 整形例:WordNetの検索結果から、語義以外の部分を削除し、1行ずつ間隔を空ける
    result := RegExReplace(result, "`am)^\[.+\R", "")
    result := RegExReplace(result, "`am)^count : [0-9]+\R", "")
    result := RegExReplace(result, "`am)\R+", "`r`n`r`n")

    ; 結果を表示する
    MsgBox, %result%

    return

※補足説明:ebwinc.exe は、RunWait という行で実行しています。この行にある ComSpec というのは、AHKの組み込み変数で、cmd.exe のフルパスが入っています。また、この行に引用符(")がたくさん並んでいるのは、ebwinc.exe のフルパスと検索語句を念のため引用符で囲みながら、文字列変数を結合しているからです。なお、検索結果は単純に MsgBox で表示していますが、ここをもう少し工夫すれば、もっと見やすく実用的なポップアップ辞書になるのではないかと思います。

例2:秀丸で単語リストを一括検索するマクロ

秀丸マクロとWordNetを使った例です。辞書で検索したい単語を、秀丸上で1行に1つずつ記述した状態で、このマクロを実行すると、すべての単語をWordNetで一気に検索し、語義の行だけを抜き出して、秀丸の新規ウィンドウに一覧表示するというものです。

160623_ebwinc_example2.png (クリックで拡大)

コードは次のとおりです。赤字の部分はお使いの環境に合わせて修正してください。

// これは秀丸マクロのコードです

// ebwincのフルパスと起動パラメータ(赤字の部分はお使いの環境に合わせて修正してください)
$ebwinc = "C:\\Program Files (x86)\\EBWin4\\ebwinc.exe";
$param = "/G=0 /#=0";

// 現在の文書の内容をebwinc.exeに順次送って辞書を検索し、結果を新規文書に取り込む
runex "cmd.exe /c \"for /f %i in ('find /v \"\"') do @(\"" + $ebwinc + "\" " + $param + " \"%i\" & echo --------------------------------)\""
    , 1      //同期フラグ
    , 1, ""  //標準入力フラグ
    , 4, ""  //標準出力フラグ(4=新規、7=アウトプット枠)
    , 0, ""  //標準エラー出力フラグ
    , 0, ""  //作業フォルダフラグ
    , 2      //表示フラグ
    , 1      //非描画フラグ
    , 0      //エンコード
    ;

// 整形例:WordNetの検索結果から、語義以外の部分を削除し、1行ずつ間隔を空ける
replaceallfast "^\\[.+\\n", "", regular;
replaceallfast "^\\ncount : [0-9]+\\n", "", regular;
replaceallfast "\\n", "\\n\\n", regular;

※補足説明:ebwinc.exe は、runex という文で実行しています。この行のコードが少々複雑な記述なのは、コマンドプロンプトの中で文書の中身を1行ずつ ebwinc.exe に渡すための“小細工”です。また、検索結果を新規文書に貼り付ける処理は、クリップボード経由ではなく、runex 文の機能(4番目のパラメータ)を使っています。(ちなみに、このパラメータを「7」に変えると、アウトプット枠に結果が表示されるようになります。その場合、結果の整形はできませんので、末尾の replaceallfast を3行ともコメントアウトしてください)。

例3:単語の活用形を原形に変換するAHK用関数

ここまでの2つとは毛色が違う例です。人間が語義や例文を見るためではなく、プログラムの中で単語の活用形を自動判別して原形に戻すために、Wiktionaryを検索するというものです。

仕組みはこうです。Wiktionaryの見出し語をよく見ると、変化形の単語(動詞の活用形や名詞の複数形など)も、規則活用・不規則活用を問わず、ほとんどが個別の見出し語として掲載されています。たとえば、「tells」「iPhones」「hottest」といった単語も見出し語にあり、語義はそれぞれ、「{{en-third-person singular of|tell}}」「plural form of iPhone」「{{en-superlative of|hot}}」となっています。

したがって、活用形の単語をWiktionaryで検索して、その結果の中から、「third-person singular of|******」「plural form of ******」などの「******」の部分を正規表現で抜き出せば、原形の単語が得られるはずです。そのような考え方で、活用形を原形に戻す処理を実現してみました。

ただし実際には、こうした活用形の表記方法がWiktionaryの中で必ずしも統一されていないようで、記述が微妙に異なるパターンがいくつも出てきます。なるべく網羅できるよう、複雑な正規表現をこしらえてみたのですが、完全には対応しきれていないため、正しく変換できない場合もあります。ご了承ください。

コードはAHKの関数として実装しました。変化形の英単語(動詞の活用形、名詞の複数形、形容詞の比較級等)を文字列として渡すと、その原形を文字列で返します。お手持ちのAHKスクリプトに組み込んでご試用ください。

なお、ご試用にあたっては、以下の点に留意してください。

  • 正しく変換できないケースもかなりあると思います。「うまくいかなくてもご愛嬌」くらいのつもりで使っていただけると幸いです。厳密な正確さが求められる用途での使用はご遠慮ください。
  • EPWING版Wiktionaryは、2016年2月版の英語版データ(wiktio-en-160203.zip)をお使いください。
  • 単語の品詞等は何一つ考慮せずに処理しています。(たとえば、単語 leaves を渡されたとき、動詞 leave の活用形なのか、名詞 leaf の複数形なのかは考慮せず、とにかく検索で最初に見つけた結果を返します)。
  • 私のパソコン(2013年頃のCore i5+SSD搭載機)では、実用上問題ないくらい瞬時に処理が完了しますが、お使いのマシンによっては、変換時に多少の待ち時間が生じるかもしれません。

コードは次のとおりです。関数ですので、お手持ちのAHKスクリプトに組み込んでご利用ください。赤字の部分はお使いの環境に合わせて修正してください。

; これはAHKのコードです
; 関数ですので、お手持ちのAHKスクリプトに組み込んでご利用ください

; 活用形の英単語を原形に戻す関数
Uninflect(word)
{
    ; ebwincのフルパスと起動パラメータ(赤字の部分はお使いの環境に合わせて修正してください)
    ebwinc := "C:\Program Files (x86)\EBWin4\ebwinc.exe"
    param_wiktionary := "/G=0 /#=1 /N=1"

    ; 引数で渡された単語をebwinc.exeに送ってWiktionaryを検索し、結果を取り込む
    clipbkup := ClipboardAll
    RunWait, % ComSpec . " /c """"" . ebwinc . """ " . param_wiktionary . " """ . word . """ | Clip""", , min
    result := Clipboard
    Clipboard := clipbkup

    ; 検索結果の中に、変化形であることを示す記述があるかどうかを調べ、その原形の部分を拾い出す
    if (RegExMatch(result, "`amS)^1\.(?!\(archaic|nonstandard|obsolete).*\{\{[^\|]+(?<!form|dialect|misspelling|initialism|acronym|abbreviation|alternative form) of\|(.+?)[\|#](?!lang=ang).*(?<!lang=ang)\}\}", match)
    || RegExMatch(result, "`amS)^1\.(?!\(archaic|nonstandard|obsolete).*\{\{en\-[^\|]+ of\|([^\|]+?)\}\}", match) 
    || RegExMatch(result, "`amS)^1\.(?!\(archaic|nonstandard|obsolete).*plural(?: form)? of (.+?)(?:\.|\R|\})", match)) {
        ; 無関係の文字列を誤って拾ってしまう場合があるため、念のため先頭1文字を照合したうえで、戻り値として返す(大文字小文字の違いを無視するよう = で比較)
        if (SubStr(match1, 1, 1) = SubStr(word, 1, 1)) {
            return match1
        }
    }

    ; 変化形が見つからなかった場合や、正しく判別できなかった場合は、引数で渡された単語をそのまま返す
    return word
}

※複雑な正規表現のあたりをはじめ、このコードはまだ改善の余地がかなりありそうな気がします。必要に応じて、順次修正していきたいと思いますので、お気づきの点などありましたらご連絡ください。

試しに、例1のポップアップ辞書にこの関数を組み込んでみると、活用形を原形に戻したうえでポップアップするようになります。
(例3のコードを例1の末尾にコピペしたうえで、例1の「RunWait, ...」という行に出てくる「Clipboard」を、「Uninflect(Clipboard)」に変えてください)。

160623_ebwinc_example3.png (クリックで拡大)

まとめ

このように、ebwincを使うと、これまでのマクロやスクリプトでは難しかった、辞書の検索結果そのものに対する処理を簡単に実装できます。辞書絡みのプログラムをいろいろ作ってきた身としては、まさにこういうのが欲しかった!と思えるツールです。今回は取り上げませんでしたが、串刺し検索や全文検索も取り入れれば、もっと多彩な活用方法が考えられそうです。

なお、検索結果に対して抽出や整形を行う部分では、正規表現が強力な武器になります。今回のサンプルではAHKスクリプトと秀丸マクロを使いましたが、たとえばRubyやPythonのように、テキスト処理に長けた言語を使えば、活用の幅がさらに広がるのではないかと思います。

※今回紹介した方法で辞書コンテンツを利用するときには、コンテンツの著作権を侵害することがないよう、各自の責任でご利用をお願いいたします。

posted by 内山卓則 at 21:18 | スクリプト・プログラム