全角カナ/半角カナを区別しない検索の方法
過去ログの中から任意の文字列を検索できる機能のついたPerl4&5のCGIで、例えば『2000』と入力して検索した場合は「2000」も「2000」もヒットし、逆に『2000』と入力して検索した場合も「2000」も「2000」もヒットするように組まれたものが手元にあります。
このCGIでは現在、『ジャンプ』などと半角カタカナでキーワードを入れると「ジャンプ」と全角で記録された記事はヒットしてくれないので、これを改造して、カタカナでも全角/半角を区別せず検索出来るようにしようとしています。
このCGIでは、「2000」も「2000」もヒットするようにする為に
'2','(?:2|二|弐|2)','二','(?:2|二|弐|2)','弐','(?:2|二|弐|2)','2','(?:2|二|弐|2)',
というような設定を記述して対応しているようなので、カタカナで同じような事をするには
'ン','(?:ン|ン)','ン','(?:ン|ン)',
半角↑ ↑半角
のような記述も加えてやれば実現するだろうと思い、やってみたのですが、その結果、たとえば全角で『ワン』と検索しても半角の「ワン」どころか全角の「ワン」もヒットしなくなってしまいました。
私は基本的にはCGIの知識は殆ど無いので、例えばこちらのサイトで質問を検索して見つかった
http://www.okweb.ne.jp/kotaeru.php3?q=56136
などを拝見しても、何をどうしていいのかがさっぱり解りません。
'ン','(?:ン|ン)','ン','(?:ン|ン)',
を書き換えて何とか対応することは出来ませんでしょうか?
仮にログの方を全て全角や半角に統一しても、サイトに来られる方が「半角カタカナではヒットしません」という注意に気づかずに検索したら結局検索漏れになってしまうので、何とか実現したいのです。
お解りの方がいらっしゃいましたら、どうかご伝授をお願い致します。
投稿日時 - 2002-04-26 16:24:13
このQ&Aは役に立ちましたか?
0人が「このQ&Aが役に立った」と投票しています
回答(2)
私は半角カナ&全角英数記号撲滅委員会(委員1名)なので、掲示板のデータを保存する前に、半角カナを全角カナに、全角英数記号を半角にして、同じ意味の文字が2つ存在しないようにしています。
変換する関数を作って対処しています。
あなたの場合は何もそこまでしなくても良いみたいなのですが、変換関数を作るところまでは目的にあっているみたいですね。
そうなると半角カナ+濁点半濁点が厄介です。
私は半角カナ+濁点半濁点の並びを1文字だと解釈し、それに対応する全角濁点半濁点付きカナがあれば、変換するようにしています。
今回はどちらかに統一することが目的ではないので、全角濁点半濁点付きカナを半角カナ+濁点半濁点文字に変換した方が、わかりやすいのではないでしょうか。
半角カナと全角カナは、Shift_JISでもEUCでもUTF-8でも、同じ並びになっていないので、かなり厄介です。
半角カナはァィゥェォアイウエオのように並んでいるのに、全角カナはァアィイゥウェエォオのように並んでいたりします。
そのへんの部分は、1つ1つ変換するものをハッシュテーブルにして
$data =~ s/$_/exists($table{$_} ? $table{$_} : $_)/eg foreach(keys %table);
そして、並んでいる部分は
$data =~ s/([\x90-\x9a])([....])/"\x70" . chr(ord($2) - 0x20)/eg;
↑この数字はチョー適当
などで記述しておきます。
全部ハッシュテーブルにしたら、かなり重いような・・・。
文字コードによってカナの番号が違うので注意してください。
あっ、しまった。わかんないかな・・・。
投稿日時 - 2002-05-02 16:10:29
ご回答、どうもありがとうございました!
> 私は半角カナ&全角英数記号撲滅委員会(委員1名)なので、
あ、私も委員にして下さい。(笑)
実は、ログの方はエディタを使って全角カナ+半角英数記号に統一して検索用ファイルとして専用ディレクトリに置くようにしているんですが、問題は、それを検索される訪問者の皆さんなんです。
ですから、検索の段階で、半角カナで検索をかけられても全角もヒットさせる検索システムを組もうとしています。
「半角カナではヒットしません」とか、「『CD-R』などは『CDーR』のようにカナの横棒が混入しているとヒットしません」と断っておいても、入力時に自分がカナの横棒を入れていることに気づかなかったり、カナは半角でしか入力できないと思っている初心者の方とかいらっしゃるので…。
> そのへんの部分は、1つ1つ変換するものをハッシュテーブルにして
なるほど、$data =~ s/$_/exists...というのを50音の数だけ繰り返して変換させるわけですね?
ハッシュテーブルがどうとかいう部分、Perlのリファレンスとかで読んでみても理解できなかったので、こちらの既存のCGIに挿入すれば良い文が丸ごと無いとちょっと実用までの道がかなり遠いんですが、おっしゃりたいことは解ります。
頂いたご回答を元に、もうちょっと何か模索したいと思います。
どうもお世話になりました。
投稿日時 - 2002-05-07 09:47:33
私もperlは詳しいほうじゃないので回答にはなりませんが…
単純な疑問として、cgi、html等の漢字コードは統一されていますでしょうか??
また、「半角カタカナは使用しないでください」という注意書きがなぜ書かれているのかご存知でしょうか?
そのあたりを理解できないようであれば半角カナは使用しないほうが良いと思いますよ。
>「半角カタカナではヒットしません」という注意に気
>づかずに検索したら結局検索漏れになってしまうので、
>何とか実現したいのです。
気になるようであれば、フォームのすぐ上に赤字で普通の大きさ、ボールド指定で書いてください。
入力された文字を全角に直すことも可能ですが、jcode.plを使いますし、漢字コードの問題もありますので…。
区別しないつもりなら…かわいそうなのでひらがなも混ぜてあげてください(^^)
投稿日時 - 2002-04-26 18:06:34