Migemo: ローマ字のまま日本語をインクリメンタル検索
最終更新日: 2001-02-17
Migemo とは
migemo はローマ字のまま日本語をインクリメンタル検索するため
のツールです。かな漢字変換してから検索するという重労働からあ
なたを解放します。現在のところ Emacs用のインターフェイス
(isearch へのラッパー) が用意されています。
最新版は
http://migemo.namazu.org/ から入手可能です。
目次
- 2001-02-17:
w3m
に Migemo を組み込もうという
ページ
が公開されました。
- 2001-02-17: migemo 0.21 を公開
- jrsearch から Migemo に改名しました
- 「'」 「=」 「`」 が検索できなかったバグを修正
- 実験的に migemo-dabbrev-expand を実装しました
ローマ字のまま日本語をdabbrevします (実験段階)
- ささやかなメーリングリストを作りました
- 2000-07-04: 最初の版を公開
「活発」をインクリメンタル検索しているところ。 "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)
- gzip -dc migemo-xxx.tar.gz | tar xvf -
でソースを展開し、 migemo-xxx ディレクトリへ移動。さらに
Lingua-Romakan ディレクトリへ移動。
- % perl Makefile.PL && make && make install
で Lingua::Romkan モジュールをインストール
- 1つ上のディレクトリに戻り、SKK-JISYO.L をカレントディレ
クトリにコピーする
- % ./configure && make && make
install
で migemo をインストール
- ~/.emacs に (load "migemo.el") を追加する
- migemo.el を読み込むと C-s, C-r
(isearch-{forward,backward}) でローマ字のまま日本語をインクリメンタル検索で
きるようになります
元に戻すには M-x
migemo-toggle-isearch-enable
- M-x migemo-forward
前方に migemo (ローマ字のまま日本語をインクリメンタル検索) する
- M-x migemo-backward
後方に migemo (ローマ字のまま日本語をインクリメンタル検索) する
- M-x migemo-toggle-isearch-enable
isearch-{forward,backward} へのラッパーを on/off
- M-x migemo-expand-pattern
カーソル位置の左側のローマ字列を migemo の正規表現に展開する
- ASCII の文字をインクリメンタル検索できる
"bb || !bb" のような文字列を普通に検索できる
- ひらがな、カタカナをインクリメンタル検索できる
"aiueo" で "あいうえお", "アイウエオ" をインクリメンタル検索できる
- いわゆる全角英数字に対応
"abc123=+-" で "abc123=+−" をインクリメンタル検索できる
- 英語の綴りでカタカナ語をインクリメンタル検索できる
辞書に登録されている単語だけです。例: software, internet
- 行をまたぐ検索ができる
- ローマ字はヘボン式と訓令式の両方に対応
のつもりだけど、完璧ではないでしょう。処理はどろどろしている。
- nn と n' に対応
「ん」は nn または n' と打てます。安全なときは n と打てます。例:
反応: hannnou, han'nou
漢字: kanji, kannji, kan'ji
- 用言の対応はいいかげん
活用は一文字だけ - 「耐え」はOKだけど「耐える」は駄目
検索対象はほとんど名詞だけなので、たいして問題にははならない
でしょう
- 辞書に載っていない単語は検索できない
ひらがな、カタカナ、英数字記号は大丈夫
- 複数の語からなる文字列は検索できない
たとえば「動詞の対応」
- 実用的な速度で動くが、やはりちょっと遅い
いまどきの計算機なら不満はない。
- いくつか不満は残るが、とことんやると、かな漢字変換器を作
るのと同じ仕事になってしまう
- isearch-backward が不安定
これは根が深い問題です。ラッパーを改良する必要があります。
- 行をまたぐ検索ができない
- 英語の綴りによる検索が不完全
"soft" まではいいが "softw" で失敗する。
仕組みは簡単です。利用者が 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超のテキストファイルを
頻繁に編集します)
- ASCII文字だけをインクリメンタル検索したいときは C-u C-s, C-u C-r で
isearch-regexp を使うと便利です
% cvs -d :pserver:anonymous@cvs.namazu.org:/storage/cvsroot login
CVS password: # Enter/Returnキーを叩く
% cvs -d :pserver:anonymous@cvs.namazu.org:/storage/cvsroot co sary
- migemo@namazu.org
-
Migemo に関する議論を行うメーリングリストです。
-
migemo メーリングリストへ参加(登録)するには、本文に
subscribe あなたの名前
(名前はローマ字で。例: Tarou Yamada) と書いたメールを migemo-ctl@namazu.org へ送ります。
-
退会するには本文の先頭に # bye とだけ書いたメールを
migemo-ctl@namazu.org に送ります。その際、 From: は
メーリングリストに登録しているアドレスに設定してください。
- 過去の記事
- Rubyにて書き直し。Migemoモジュールを作る。
- Migemoモジュールを用いて TCP/IP を喋るMigemoサーバを作る
HTTPがちょうどいいかな
- Migemoサーバを用いて いろいろなアプリケーションに応用する
- 複数の単語にまたがる検索に対応する
内部的に連文節のかな漢字変換を行う
- MakeRegex
のような処理を施す
MakeRegex はそのままでは日本語は通らない。例: (日本, 日翻)
- パターンを正規表現に展開する機構を応用する
URIや日付だけにマッチする正規表現を使って検索すると便利かも。
高林哲 (satoru@namazu.org)