next up previous
: どうすればいいか? : 日本語文書における検索 : 例1.

grep の問題点

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

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

弁慶がな
ぎなたを

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

I am
Katsurada.

のようにしてしまうわけである2。 このため、日本語でテキスト・ファイルを作成する場合に、 画面の右端近くに来ても改行をせずに、段落の変わり目でだけ、 改行 0x0a を入れるという流儀の人がいる (後の青空文書の実例を見よ)。 そのため、日本語テキスト・エディターには、 画面上での行と、 「改行 0x0a」で区切られた行、 という二つの「行概念」を持ち込み、 後者の行 (行と言うよりは段落) については、 非常に長いものを作成可能にしたものがある (不自然な苦し紛れをやっているのであって、 ここで説明していることが分からなくてもよい)。

 以上のことと少し関係するが3英語では単語の境界が空白というもので明らか (機械的に 判明する) であるが、 日本語ではそのようになっていない。 日本語の文章を 「形態素4」に分解することは、英文ほど単純にはできない。

 例えば (厳密には単語への分解とは違うが)、前回紹介した

  cat alice29.txt | /usr/ucb/tr -cs A-Za-z '\012'

のようなことを、日本語のテキスト・ファイルについて行なうにはどうすれば良 いか考えてみて欲しい。 機械的にやることは不可能で、 少なくとも日本語にどういう単語があるか知ることが必要で、 またそれだけでは十分でないことが分かるであろう。

(2) 日本語には複数の文字コードがある
一つのコンピューター・システムで、 普通どの文字コードを利用するかは決められていることが多いが、 実際の運用では完全に統一されているわけではない。 例えば、情報科学センターのワークステーションでは、 日本語文書はファイルに格納する際には日本語 EUC を使うのが普通であり、 システムに標準で備わっている grep 等のコマンドは日本語 EUC に対応しているが、 電子メイルは (既に述べたように) ISO-2022JP (いわゆる「JIS 漢字」) という 文字コードで送受信されていて、 システムのメール・スプールにあるファイル (\framebox {\tt /var/mail/ユーザー名} というファイル -- これは受信したままの状態でコードの変換等は一切行われていない) に対して grep をかけてもまともな検索はできない。 さらに、これは結構深刻なことだが、 情報科学センターにインストールされている日本語 MH の設定では、 メイルの文字コードを ISO-2022JP のままで保存する。 だから、 情報科学センターのシステムをデフォールトの設定のままで使っていると
\begin{itembox}[l]{多分うまく検索できない}\footnotesize {\tt waltz21\% }\underline{\tt grep 日本語文字列 Mail/inbox/*}
\end{itembox}

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



Masashi Katsurada 平成13年6月18日