next up previous
Next: 2.3 どうすればいいか? Up: 2 日本語文書における検索 Previous: 2.1 まずは grep を使ってみよう

2.2 grep の問題点

しかし、grep (正確には日本語対応 grep) は日本語の文書に用いるには、 今一つ不十分なところがある。大きな問題点を二つほど説明しよう。

(1) grep は日本語の「形態素」を認識しない
オンライン・マニュアルによると grep は「パターンにマッチする行を表示す る」とある。要するに行単位で検索をしているわけである。 英語の場合はこれで特に問題は生じないのだが、日本語の場合は、 「単語」の途中で行が変わることがあるため、 grep では検索されないことがある。つまり
弁慶がな
ぎなたを

というテキスト・ファイルがあるとき、「なぎなた」という単語を grep で探し 出すことはできない。英語の場合は、行の中にびっしり文字を詰めなくても構わ ないので、適当な単語の終りで改行するようにのが普通である。 つまり (極端な例ではあるが)
I am
Katsurada.

のようにしてしまうわけである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 漢字」) という 文字コードで送受信されていて、 システムのメール・スプールにあるファイル ( \framebox{\tt /var/mail/ユーザー名} というファイル -- これは受信したままの状態でコードの変換等は一切行われていない) に対して grep をかけてもまともな検索はできない。 さらに (これは結構深刻なこと?) MIND で利用されている GraceMail では、 メイルの文字コードを ISO-2022JP のままで保存する。 だから、
多分うまく検索できない
isc-xas06% grep 日本語文字列 Mail/ginbox/*

のような検索 (日本語文字列としては自分の名字などを試してみるとよい) は、 実はうまく行かない。 上の例 (oyabun で桂田が「水戸」を検索した) が一見うまく行ったのは、 実はメールを日本語 EUC に変換して 保存するようなしかけを (一時期) していたことがあったからである。


next up previous
Next: 2.3 どうすればいいか? Up: 2 日本語文書における検索 Previous: 2.1 まずは grep を使ってみよう
Masashi Katsurada
平成20年10月18日