≪最終回≫ 『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);}