最終更新日: 2001-02-19
migemo はローマ字のまま日本語をインクリメンタル検索するため のツールです。かな漢字変換してから検索するという重労働からあ なたを解放します。現在のところ Emacs用のインターフェイス (isearch へのラッパー) が用意されています。 最新版は http://migemo.namazu.org/ から入手可能です。
「活発」をインクリメンタル検索しているところ。 "kap" の時点で到達。
![[I-search: k]](kanji-2.png)
「カナブン」をインクリメンタル検索しているところ。"kana" の時点で到達。
![[I-search: k]](katakana-2.png)
![[I-search: kan]](katakana-4.png)
"3a:"をインクリメンタル検索しているところ。ASCII の "3a:" で検索可能。
![[I-search: 3]](zenkaku-2.png)
「検索」をインクリメンタル検索しているところ。
![[I-search: k]](line-across-2.png)
「ソフトウェア」をインクリメンタル検索しているところ。
![[I-search: s]](english-2.png)
![[I-search: sof]](english-4.png)
仕組みは簡単です。利用者が 1文字入力するたびに、ローマ字列か ら正規表現を生成して、それで検索するという富豪 的 な方法です。これを「動的パターン展開」と呼んでいます。 ここでは "nez" を例として説明します。まず、辞書を引いて候補 を抽出します (実際には辞書引き以外の処理も施します)。次の正 規表現は候補をすべて"\|" でつないだものです。
nez\|nez\|寝\|寢\|根魚\|根崎\|寝醒め\|根差\|根差し\|
寝惚\|寝相\|根津\|禰津\|鼠\|鼡\|鼠色\|鼠男\|鼠達\|鼠取\|
捻\|捩\|螺\|捻子\|螺子\|捩子\|ネジ\|捻じ伏\|拗\|
捩じ込み\|根占\|捩じり鉢巻き\|捩り鉢巻き\|根城\|ねざ\|
ねじ\|ねず\|ねぜ\|ねぞ\|ねっ\|ネザ\|ネズ\|ネゼ\|ネゾ\|ネッ
この正規表現には、「鼠」「鼠色」「鼠男」のように「鼠」から始 まる候補がたくさんあります。これらは1つの「鼠」にまとめられ ます。また、「寝」「螺」のような 1文字の候補は文字クラスとし てまとめられます。このようにして正規表現を短くすると、 Emacs の [Regular Expression too big] というエラーを防げます。ほか の候補についても同様の処理を施すと、次の正規表現になります。
[寝鼠捻螺寢拗捩鼡]\|nez\|ねざ\|ねじ\|ねず\|ねぜ\|ねぞ\|
ねっ\|ネザ\|ネジ\|ネズ\|ネゼ\|ネゾ\|ネッ\|根魚\|根差\|
根崎\|根城\|根占\|根津\|禰津\|nez
行をまたぐ検索を実現するために、2 byte の文字の間に "\s *" を埋めむと、次の正規表現ができあがります。
[寝鼠捻螺寢拗捩鼡]\|nez\|ね\s *ざ\|ね\s *じ\|ね\s *ず\|
ね\s *ぜ\|ね\s *ぞ\|ね\s *っ\|ネ\s *ザ\|ネ\s *ジ\|
ネ\s *ズ\|ネ\s *ゼ\|ネ\s *ゾ\|ネ\s *ッ\|根\s *魚\|
根\s *差\|根\s *崎\|根\s *城\|根\s *占\|根\s *津\|
禰\s *津\|n\s *e\s *z
"\s " の意味はモードによって変わります。モードによっては行を またぐ検索ができないことがあります。
と、上のように正規表現を生成する処理を migemo.pl が担当しま す。Emacs とは双方向パイプで通信します。辞書は SKK のSKK-JISYO.L を加工したものを利用します。
高速化のために、"a", "k", "s", "t", n", "ka", "sa", "ta", "na" などの短い文字列に対しては、あらかじめ生成した正規表現 を migemo.pl に埋め込んでいます。
ところで、ローマ字のまま日本語をインクリメンタル検索する別の 方針として、検索するたびにバッファの内容全体をローマ字に変換 し、それに対して検索するという方法が考えられます。この方法は、 テキストが大きくなると破綻します。
KAKASI -Jj -Kj -Hj で 100 KB のテキストファイルをローマ字に 変換すると、Pentium MMX 266 MHzの手元の計算機では初回に約 4 秒、次回からは約 2秒かかります。isearch で2秒も待たされては ストレスがたまります。 (筆者は 100 KB超のテキストファイルを 頻繁に編集します)
% cvs -d :pserver:anonymous@cvs.namazu.org:/storage/cvsroot login
CVS password: # Enter/Returnキーを叩く
% cvs -d :pserver:anonymous@cvs.namazu.org:/storage/cvsroot co migemo
subscribe あなたの名前 (名前はローマ字で。例: Tarou Yamada) と書いたメールを migemo-ctl@namazu.org へ送ります。