≪最終回≫ 『googleに自動リンク』 〜テキスト、BBSを直接クリックで検索〜 おおっと、最終回とは、「最終の回」であるのかぁ〜?! その通り。だが、いつも と変わらぬ誌面で地味にお届けしよう。 ●検索窓へ入力ってウザすぎ 今回は、とっておきのアイディアを紹介する。知る限り、他では、ついぞ聞いたこと がない。 なに、簡単なことである。テキスト・ビューワや、BBSなどで、自動的にキーワー ドを抽出し、googleにリンクを張っておくというだけのアイディア。しかし、実 際やってみると、応用無限大の、実に画期的なアイディアであった。 ちょっといろいろなサイトをひとめぐりしよう。検索窓がぽっかり空いていて、キー ワードを入れれば、googleや、他検索エンジンで検索ができるという。 いや、待ってくれ。そうじゃない。検索窓に文字を入力するのがウザイんだ。コピペ もそう。文字を打つのが面倒ではなく、検索窓にカーソルを合わせてアクティブにする のがウザイのだ。 そこで、あの手、この手。その手、あの手で、便利ツールが開発されているのだが… …。でも、範囲コピーして、自動的に検索されるのも、別に有り難くないしぃ。だって 範囲コピーが面倒だから。 「そこまでして知りたくもないことを、クリック一発で調べられる気軽さ」。そうこれ 。これが欲しいのだ。キーッ! わざわざ調べなくてもいいようなキーワード全部に、検索エンジンへのリンクが最初 から張ってあったら、まあ、50個にひとつくらいは、クリックしてもいいかもしれな い、という、これは、そんな手抜きが前提のハナシなのである。 ●日本語キーワード抽出を数行で さて、ロボット型検索エンジンというのがある。常にネット上の情報を監視しつつ、 キーワード化を行ない続け、データベースを更新している、律儀なヤツである。 しかし、キーワードとはいっても、日本語の場合、単語は、どこからどこまでなのか 。英語と違い、とてもむずかしい問題だ。 検索エンジンの場合、どのような形であれ、日本語辞書をもつべきである。「わたし はつねつしている」が、「私、発熱している」で、「私は、"つねつ"している」では ないと判断できるのは、辞書の力である。 そういうのはどこかの頭イイ人達に任せておこう。ここでは、ほんの数行のスクリプ トで、実用に堪え得るキーワード判定を作ろうと言うのだ(カッコイー!)。 ●プログラムと使用法 先にソースを見よう。リスト1がそれだ。 すでに誌面で許されるギリギリの長さになってしまった。したがって、使用場面を限 定した。これを元に応用すれば、有用なスクリプトになる。 このcgiは、「sample.txt」というプレーン・テキストのテキスト・ビ ューワである。テキストを表示させると、キーワードを抽出し、googleへのリン クが張られる。 「sample.txt」以外のテキストを自由に選択できるようにしたり、BBS に仕込むなど、応用すれば、用途は、無限である。ぜひ、そのように活用していただき たい。※sample.txtの内容 リスト1のスクリプトをsjisで保存して、(webサーバで指定した)「cgi -bin」ディレクトリにコピーし、次に、「sample.txt」を用意したら、 それも同じディレクトリにコピーしてほしい。ブラウザで、「http://loca lhost/cgi-bin/keyjump.pl」をアクセスすれば、キーワード を自動抽出して、googleへのリンクが張られている。
※適切な文節に分けてリンクが張られている 試しに、キーワードをクリックしてみてほしい。検索窓にコピペしていた昔には、も う戻れない。 手動コピペ検索するのと較べ、ブラウザ上のキーワードをクリックするだけというの は、情報を指先だけで扱っている感じ。どのようなテキストでも、このような快適な自 動リンクが張られる。コレ、イイ。気付かなかった! ●google検索について googleには、自分のサイトに検索窓を設置する方法が記されている。少し工夫 すれば、検索窓を使わずに、直接、検索文字を指定できる方法を調べられるだろう。 答は、こう。「www.google.co.jp/search?q=なんとか& hl=ja&lr=lang_ja」というURLをアクセスすればいいのだ。この「 なんとか」の部分に、URLエンコードされたキーワードを入れるだけである。 なお、他の検索サイトでは、eucコード変換してからURLエンコードすべきサイ トなどもある。そうした応用をするには、コード変換用に「perl」+「jcode .pl」で、スクリプトを別に用意すれば良い。 さて。本来、このソースが役立つのは、専門掲示板とか、ニュース閲覧などの場合で ある。たとえば、「海の生物掲示板」などという、大学の研究BBSに応用した場合、 専門用語が頻出するので、「産卵ポテンシャル」とか、「種苗性」なんて言葉に、最初 からリンクが張ってあり、クリックだけで、別窓でgoogle検索……。わお。超便 利! ちょっと泣いてもいいですか? くく……。 しかし、専門用語ならまだ良いが、たとえば、「ホルモン」などという言葉の場合、 google検索では、ノイズに引っ掛かりすぎる。そこで、AND検索、OR検索が できるgoogleの性質を利用し、スクリプトの変数($orword)に、仮で「 日本 OR 音楽 OR 和 OR 伝統」を入れておいた。これらのキーワードのど れかと一致した場合のみ、検索にひっかかる仕様である。 先の例、「海の生物掲示板」の場合は、ここを「水産 OR 魚 OR 漁業」とす るだけで、検索件数が10分の1に絞り込まれる(「ホルモン」を検索した場合)。 なお、このand検索が必要ない場合は、「$orword=""」とすれば、an d検索は働かなくなる。
※別窓が開いて検索結果が! ●キーワード抽出 googleの検索法は分かった。では、プレーン・テキストから辞書なしでキーワ ードを抽出する方法は? このいい加減な抽出法を見よ! @「英語」「アルファベット」「ひらがな」「記号」は、キーワード対象から外す(対 象外の文字は、変数「$nonky1」を参照)。 A「漢字」「カタカナ」が3文字以上続いたらキーワードとする。 B「中黒」(・)は、位置で判断する。たとえば、「カレル・チャペック」などは、ひ とつのキーワードとして、「・柳家紫朝」は、中黒を取り、「柳家紫朝」だけをキーワ ードとする。 C「数字」は、キーワード化すると案外便利なことが多い。しかし、ヒット数が多すぎ る「数字のみ」「1984年」「2590円」などは、対象から外した。 残念ながら、これでは「穂積ぺぺ」は、キーワードにならないが、「小野ヨーコ」も 「ヨーコ・オノ」も、キーワードになるのだ。良かった。 できれば、アルファベットへの対応は欲しい。そして、「」や『』に入った文字は、 ひとかたまりのキーワードとしたい。だが、それを実現すると、スクリプトがとたんに 複雑になるので、涙を飲んで割愛した。 手法としては、1行の中に同じキーワードが2回以上登場する場合に備え、「spl it(/$key/,$line);」で、キーワードの前と後を確実に切り分けてい る。 しかし、たったこれだけの抽出方法で、誤マッチが多いながらも、充分実用に堪えら れるキーワード抽出が可能なのは、驚異的といってよく、これは、テキスト処理の得意 なperlのなせるワザだろう。 *** 本スクリプトは、実際に使ってみないと、まったく価値が分からないだろう。辞書を もたない日本語判定プログラムを組む場合、ミソは、ひらがなのキーワードを棄てるこ とに尽きる。この発想は、日本語記述の逆ポーランド・コンパイラ「Mind」 (http://www.scripts-lab.co.jp/)の発想を参考にした。 あるBBSで、この手法を組み込んだところ、今まで流し読みしていたログも、知ら ない書籍タイトルなどを気軽に調べられるようになり、以来、私は、ちょっと博識にな ってしまったようである。ふふふ〜ん(なんのノリだ?)。 *** 最後になりましたが、一年七カ月の長きに渡り、ご愛読、ありがとうございました。 (辻豊史) 「今日からCGIプログラマー」 http://www.geocities.co.jp/SiliconValley-Cupertino/6103/ リスト1 「keyjump.pl」 単語抽出しgoogleへ自動リンク #!C:/Perl/bin/MSWin32-x86-object/jperl #keyjump.pl #≪保存≫sjis+CRLFで保存する(win標準) #≪使用法≫あらかじめ保存された「sample.txt」を表示し、 #キーワード予測で自動リンクが貼られ、google検索をできる。 $nonky1 = "ぁ-ん@-S、-.:-!´-_/-〓∈-◯− a-zA-Z -\/:-~\t"; $nonky2 = $nonky1 . "・";$orword = "日本 OR 音楽 OR 和 OR 伝統"; print "Content-type: text/html\n\n <!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"> <HTML><HEAD><TITLE>googleジャンプ</TITLE> <META content=\"TEXT/HTML; charset=x-sjis\" http-equiv=CONTENT-TYPE> </HEAD><body bgcolor=#FFFFFF text=#000000 marginheight=0 marginwidth=0 link=#0066cc vlink=#ff0033 alink=#888888> <style type=text/css><!-- A {text-decoration:none;} A:hover {background:#88FF88;} // --></style>"; #---メイン open(IN, "< ./sample.txt"); while (<IN>) { $line = $_; while (1) {($ok,$key,$mae) = &keyword2($line); if ($ok) {$line =~ s/^$mae$key(.*)$/$1/; $mae =~ s/\\([\\\@\%\$\/])/$1/g;print "$mae\n";chomp($key); $urlkey = "$key $orword";$urlkey = &url_encode($urlkey); print "<A href=\http:\/\/www.google.co.jp\/search?q=$urlkey&hl=ja&lr=lang_ja TARGET=NONE>$key</A>\n";redo; } else { print "$line<BR>\n"; last;} } } print "</HTML>"; #---自動キーワード化 未処理部分にキーワードがあれば、処理 #使用例・($ok,$key,$mae) = &keyword2($line); #動作・判定、キーワード、キーワードより前の部分が返される sub keyword2 { local($line) = @_;local($ok) = 0;local($key,@x); local($mae) = ""; while (1) {($ok,$key) = &keyword1($line); #---キーワードがあった if ($ok) {@x = split(/$key/,$line); $mae .= $x[0];$mae =~ s/([\\\@\%\$\/])/\\$1/g; #---194とか1998年などは、キーワード失格なので、処理しない if (($key !~ /^[0-90-9]+$/) and ($key !~ /^[0-90-9]+[円年]$/)){ $ok++;last;} else { #キーワード失格ならもう一度 $mae .= $key;$line =~ s/^$mae(.*)$/$1/;redo;} } else { #---キーワードがなかった $mae = $line;$key = "";$ok = 0;last; } } return($ok,$key,$mae);} #---三文字以上nonkey以外が続いた最初の部分をキーワードにする sub keyword1 { local($line) = @_;local($ok) = 0;local($key); if ( $line =~ /([^$nonky2][^$nonky1]+[^$nonky2])/) {$ok++; $key = $1;#未処理部分から、最初のキーワードにマッチ } return($ok,$key)} sub url_encode { #jperlでのみ使用可 local($value) = @_;$value =~s/([^a-zA-Z0-9_@.\/-])/ (sprintf("%%%04X",unpack("S", "$1"))) eq "%0000" ? sprintf("%%%02X",unpack("C", "$1")) : sprintf("%%\?%04X\?%%", unpack("S", "$1")) /eg;#上記は、Jperlで二バイト文字も一文字として扱うことによる処理 $value =~s/\%\?([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])\?\%/\%$2\%$1/g; return($value);}