Next: 2.3 どうすればいいか?
Up: 2 日本語文書における検索
Previous: 2.1 まずは grep を使ってみよう
しかし、grep (正確には日本語対応 grep) は日本語の文書に用いるには、
今一つ不十分なところがある。大きな問題点を二つほど説明しよう。
- (1) grep は日本語の「形態素」を認識しない
- オンライン・マニュアルによると grep は「パターンにマッチする行を表示す
る」とある。要するに行単位で検索をしているわけである。
英語の場合はこれで特に問題は生じないのだが、日本語の場合は、
「単語」の途中で行が変わることがあるため、
grep では検索されないことがある。つまり
というテキスト・ファイルがあるとき、「なぎなた」という単語を grep で探し
出すことはできない。英語の場合は、行の中にびっしり文字を詰めなくても構わ
ないので、適当な単語の終りで改行するようにのが普通である。
つまり (極端な例ではあるが)
のようにしてしまうわけである3。
このため、日本語でテキスト・ファイルを作成する場合に、
画面の右端近くに来ても改行をせずに、段落の変わり目でだけ、
改行 '\n' 0x0a を
入れるという流儀の人がいる (後の青空文書の実例を見よ)。
そのため、日本語テキスト・エディターには、
画面上での行と、
「改行 0x0a」で区切られた行、
という二つの「行概念」を持ち込み、
後者の行 (行と言うよりは段落) については、
非常に長いものを作成可能にしたものがある
(不自然な苦し紛れをやっているのであって、
ここで説明していることが分からなくてもよい)。
以上のことと少し関係するが4、
英語では単語の境界が空白というもので明らか (機械的に
判明する) であるが、
日本語ではそのようになっていない。
日本語の文章を
「形態素5」に分解することは、英文ほど単純にはできない。
例えば (厳密には単語への分解とは違うが)、前回紹介した
cat alice29.txt | /usr/ucb/tr -cs A-Za-z '\012'
|
のようなことを、日本語のテキスト・ファイルについて行なうにはどうすれば良
いか考えてみて欲しい。
機械的にやることは不可能で、
少なくとも日本語にどういう単語があるか知ることが必要で、
またそれだけでは十分でないこと6が分かるであろう。
- (2) 日本語には複数の文字コードがある
- 一つのコンピューター・システムで、
普通どの文字コードを利用するかは決められていることが多いが、
実際の運用では完全に統一されているわけではない。
例えば、情報科学センターのワークステーションでは、
日本語文書はファイルに格納する際には日本語 EUC を使うのが普通であり、
システムに標準で備わっている grep 等のコマンドは日本語 EUC に対応しているが、
電子メイルは (既に述べたように) ISO-2022JP (いわゆる「JIS 漢字」) という
文字コードで送受信されていて、
システムのメール・スプールにあるファイル
(
というファイル
-- これは受信したままの状態でコードの変換等は一切行われていない)
に対して grep をかけてもまともな検索はできない。
さらに (これは結構深刻なこと?) MIND で利用されている GraceMail では、
メイルの文字コードを ISO-2022JP のままで保存する。
だから、
多分うまく検索できない |
isc-xas06% grep 日本語文字列 Mail/ginbox/*
|
のような検索 (日本語文字列としては自分の名字などを試してみるとよい) は、
実はうまく行かない。
上の例 (oyabun で桂田が「水戸」を検索した) が一見うまく行ったのは、
実はメールを日本語 EUC に変換して
保存するようなしかけを (一時期) していたことがあったからである。
Next: 2.3 どうすればいいか?
Up: 2 日本語文書における検索
Previous: 2.1 まずは grep を使ってみよう
Masashi Katsurada
平成20年10月18日