Migemo: ローマ字のまま日本語をインクリメンタル検索

最終更新日: 2004-06-28 (公開日: 2000-07-04)


Migemo とは?

Migemo はローマ字のまま日本語をインクリメンタル検索するため のツールです。かな漢字変換をすることなく日本語のインクリメン タル検索を快適に行うことができます。

新着情報

必要なもの

使い方

提供するもの

Emacs 側でのキャッシュを有効にする

Emacs 側でのキャッシュを有効にする場合は次のような設定を .emacs に加えます。

(setq migemo-use-pattern-alist t)
(setq migemo-use-frequent-pattern-alist t)

C/Migemo を利用する

C/Migemo を使う場合は次のような設定を .emacs に加えます。

(setq migemo-command "cmigemo")
(setq migemo-options '("-q" "--emacs" "-i" "\a"))
(setq migemo-dictionary "somewhere/migemo/euc-jp/migemo-dict")
(setq migemo-user-dictionary nil)
(setq migemo-regex-dictionary nil))

提供される関数

スクリーンショット

漢字の検索

「活発」をインクリメンタル検索しているところ。 "kap" の時点で到達。

[I-search: ] [I-search: k]
[I-search: ka] [I-search: kap]

連文節の検索

「連文節の検索」のような複数の文節にまたがる言葉を検索すると きは SKKと同様に "renbunsetuNoKensaku" のように文節の先頭を 大文字で入力します。

カタカナの検索

「カナブン」をインクリメンタル検索しているところ。"kana" の時点で到達。

[I-search: ] [I-search: k]
[I-search: ka] [I-search: kan]
[I-search: kana]

全角英数字の検索

"3a:"をインクリメンタル検索しているところ。ASCII の "3a:" で検索可能。

[I-search: ] [I-search: 3]
[I-search: 3a] [I-search: 3a:]

行をまたぐ検索

「検索」をインクリメンタル検索しているところ。

[I-search: ] [I-search: k]
[I-search: ke] [I-search: ken]
[I-search: kens]

英語の綴りでカタカナ語を検 索

「ソフトウェア」をインクリメンタル検索しているところ。

[I-search: ] [I-search: s]
[I-search: so] [I-search: sof]
[I-search: soft] [I-search: softw]

気が利いている点

既知の問題

仕組み

仕組みは簡単です。利用者が 1文字入力するたびに、ローマ字列か ら正規表現を生成して、それで検索するという力技な方法です。 ここでは "nez" を例として説明します。まず、辞書を引いて候補 を抽出します (実際には辞書引き以外の処理も施します)。次の正 規表現は候補をすべて"\|" でつないだものです。

    nez\|nez\|ねざ\|ネザ\|ねじ\|ネジ\|ねず\|ネズ\|ねぜ\|
    ネゼ\|ねぞ\|ネゾ\|ねっ\|ネッ\|根差\|根魚\|根崎\|寝醒め\|
    根差し\|寝惚\|寝相\|根津\|禰津\| 鼠\|鼡\|鼠色\|鼠男\|鼠
    達\|鼠取\|捻\|捩\|螺\|捻子\|螺子\|捩子\|ネジ\|拗\|捻じ伏
    \|捩じ込み\|根占\|捩じり鉢巻き\|捩り鉢巻き\|根城

この正規表現には、「鼠」「鼠色」「鼠男」のように「鼠」から始 まる候補がたくさんあります。これらは1つの「鼠」にまとめられ ます。また、「寝」「螺」のような 1文字の候補は文字クラスとし てまとめられます。このようにして正規表現を短くすると、 Emacs の [Regular Expression too big] というエラーを防げます。ほか の候補についても同様の処理を施すと、次の正規表現になります。

    [鼠捻螺拗捩鼡]\|nez\|nez\|ね[ざじずぜぞっ]\|ネ[ザジズ
    ゼゾッ]\| 根[魚差崎城占津]\|寝\([惚相]\|醒め\)\|禰津

行をまたぐ検索を実現するために、1文字ごとに "\s *" を埋めむと、次の正規表現ができあがります。

  [鼠捻螺拗捩鼡]\|n\s *e\s *z\|n\s *e\s *z\|ね\s *[ざじずぜ
  ぞっ]\|ネ\s *[ザジズゼゾッ]\|根\s *[魚差崎城占津]\|寝\s *\
  ([惚相]\|醒\s *め\)\|禰\s *津

Emacs の "\s " の意味はモードによって変わります。モードによっては行を またぐ検索ができないことがあります。

と、上のように正規表現を生成する処理を Ruby/Migemo が担当しま す。Emacs とは双方向パイプで通信します。辞書は SKKSKK-JISYO.L を加工したものを利用します。

高速化のために、"a", "k", "s", "t", n", "ka", "sa", "ta", "na" などの短い文字列に対しては、あらかじめ生成した正規表現 をキャッシュしています。

ところで、ローマ字のまま日本語をインクリメンタル検索する別の 方針として、検索するたびにバッファの内容全体をローマ字に変換 し、それに対して検索するという方法が考えられます。この方法は、 テキストが大きくなると破綻します。

KAKASI -Jj -Kj -Hj で 100 KB のテキストファイルをローマ字に 変換すると、Pentium MMX 266 MHzの手元の計算機では初回に約 4 秒、次回からは約 2秒かかります。isearch で2秒も待たされては ストレスがたまります。 (筆者は 100 KB超のテキストファイルを 頻繁に編集します)

豆知識

ダウンロード

関連リンク集

メーリングリスト

Migemo メーリングリスト案内ページ から参加できます。

文献


Satoru Takabayashi