SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

「Web AI」ライブラリの使い方と内部仕様
- Web上のデータからJavaScriptだけで人工無脳を作成

ダウンロード sample.zip (16.7 KB)

「Web AI」実行のサンプル

Web検索

 それでは実際のソースコードです。まずは「Web AI」のサンプルの中から、最も典型的な処理を行うサンプルを掲載します。

Web検索のサンプル
Web検索のサンプル

 サンプルコードは、以下の処理を行います。

  1. 検索欄の文字列をGoogleでWeb検索。4ページ分のデータを一括取得
  2. 検索結果からキーワード配列を取得
  3. 1つ目のキーワードに対して、ブログ検索を実施。抽出した文章を出力
  4. 2つ目のキーワードに対して、ブログ検索を実施。抽出した文章を出力

 「Web AI」では、上記の処理を、メソッドチェーンとして記述できます。

 それではソースコードです。

外部JavaScriptの記述
<!-- Google API -->
<script src="http://www.google.com/jsapi" type="text/javascript"></script>

<!-- Web AI API -->
<script src="../webAi_1.1/crocro.webAi.min.js" type="text/javascript"
charset="UTF-8"></script>
JavaScriptのソース
/*
 *------------------------------
 * Googleからスクリプトをロード
 *------------------------------
 */
google.load("search", "1");
google.load("feeds",  "1");
google.load("jquery", "1.4.3");
/*
 * ロード中アニメ
 */
var loadAnmArr         // ロード中アニメ配列
= [".(^o^).", "(^o^)..", "^o^)..(", "o^)..(^", "^)..(^o", ")..(^o^", "..(^o^)"];
var loadAnmCnt = 0;    // ロード中アニメ・カウンター
/*
 *------------------------------
 * Web AI変数の初期化
 *------------------------------
 */
var $WA  = crocro.webAi;           // 短縮表記
var cWSrch   = new $WA.WebSrch();  // Web検索
var cJpKw    = new $WA.JpKw();     // 日本語キーワード
var cJpSntnc = new $WA.JpSntnc();  // 日本語文章
/**
 *------------------------------
 *  初期化処理
 *------------------------------
 */
cWSrch.ready(function(){
  // 検索ごとにインターバルを置きたい場合は数値か関数を指定
  //cWSrch.intrvl = 1000;
  //cWSrch.intrvl = function(){return (Math.floor(Math.random() * 5) + 1) * 100;};
  //
  cWSrch
  .brand("gglBrnd")       // Googleのブランド表示
  .init({
    type : "web",         // Web検索を初期化
    opt : function(obj) { // 検索オブジェクトを受け取り、設定を変更
      obj.setResultSetSize(google.search.Search.LARGE_RESULTSET);  // 8件
    }
  })
  .init({
    type : "blg",         // ブログ検索を初期化
    opt : function(obj) { // 検索オブジェクトを受け取り、設定を変更
      obj.setResultSetSize(google.search.Search.LARGE_RESULTSET);  // 8件
    }
  })
  .setEachCall(function(){  // ステップごとに呼び出される処理を追加
    drwLoadAnm(true);   // ロードアニメ描画
  })
  .start();   // 実行開始
});
/**
 *------------------------------
 *  @title  テスト
 *  @description
 *  ボタンを押した場合の処理。
 *------------------------------
 */
function test() {
  /*
   * 変数の初期化
   */
  var qStr = $("#q").val();       // 検索語
  var kwArr = [];   // キーワード配列
  // リセット
  cJpKw.reset();
  cJpSntnc.reset();
  // 検索語はキーワード対象外にする(「,」区切りで複数指定可能)
  cJpKw.avoidStr = qStr;
  /*
   *------------------------------
   * 検索のメソッド・チェーン処理
   *------------------------------
   */
  cWSrch
  .reset()  // 命令格納のリセット
  .srch({
    type : "web",
    page : 4,        // 検索を行うページ数を指定(8件×4ページで32件分)
                     // 指定がない場合は1ページ目だけ検索
                     // 結果は、検索したページの結果を全て連結した状態で得られる
    key : qStr,      // 検索キーワード
    res : function(res, cursor) {
      var outStr = "";
      if (cursor) {
        outStr += "検索数 : " + cursor.estimatedResultCount + "\n\n";
      }
      if (! res || res.length <= 0) {
        // 結果なし
        cWSrch.cmndsBreak();    // チェーン処理終了
        drwLoadAnm(false);      // ロードアニメ描画(停止)
      } else {
        // 結果あり
        for (var i = 0; i < res.length; i ++) {
          // 出力文字列の作成
          var r = res[i];
          outStr += "[" + i + "]\n"
            + r.titleNoFormatting + "\n"
            + r.unescapedUrl + "\n"
            + r.content + "\n\n";

          // キーワードの収集
          cJpKw.addSrc(r.titleNoFormatting);
          cJpKw.addSrc(r.content);
        }
      }
      $("#res1").val(outStr);
    }
  })
  .srch({
    init : function() {
      // 命令の初期化フェイズ
      // パラメータ付きで、キーワードを出力
      $("#res1Kw").val(cJpKw.getStrArr({prmAll: true}).join("\n"));
      // キーワードの取得
      kwArr = cJpKw.getStrArr();
    },
    type : "blg",
    loop : function() {
      // 検索のループ回数
      return (kwArr.length >= 2) ? 2 : kwArr.length;
    },
    key : function() {
      // キーワード
      return kwArr[cWSrch.loopCnt];
    },
    // ※「loop」や「key」などの引数は、固定値でも関数でもよい
    //   引数が関数なら、ループ毎に実行される
    res : function(res) {
      if (! res || res.length <= 0) return;   // 結果なし
      var outStr = "";
      for (var i = 0; i < res.length; i ++) {
        var r = res[i];
        outStr += "[" + i + "]\n"
          + r.titleNoFormatting + "\n"
          + r.unescapedUrl + "\n"
          + r.content + "\n\n";
        // 文章の収集
        cJpSntnc.addSntnc(r.content);
      }
      $("#res2_" + (cWSrch.loopCnt + 1)).val(outStr);
    }
  })
  .add(function() {
     // 抽出した文章を出力
     var outStr = cJpSntnc.getSntncArr({usePrfrd: false});   // 校正なしで文章取得
     $("#resSntnc").val(outStr.join("\n"));  // 出力
     // 検索の終了
     drwLoadAnm(false);    // ロードアニメ描画(停止)
  })
  .start();  // 実行開始
}
/**
 *------------------------------
 *  @title  ロードアニメ描画
 *  @description
 *  ロード中のアニメを描画する。
 *  @param  loading  ロード中か否か
 *  @return なし
 *------------------------------
 */
function drwLoadAnm(loading) {
  var dwStr = ""
  if (loading) {
    dwStr = "Now Loading... " + loadAnmArr[loadAnmCnt ++ % loadAnmArr.length];
  }
  $("#loading").text(dwStr);
}

 それでは、ソースコードを簡単に解説します。

 「Web AI」では、「Google AJAX API」を利用しています。そのため、外部JavaScriptとして「http://www.google.com/jsapi」を読み込んでいます。また、JavaScriptのソースコードの冒頭で、google.load("search", "1");google.load("feeds", "1");google.load("jquery", "1.4.3");と書いて、必要なライブラリを読み込むようにしています。

 これらの記述がない場合、「Web AI」は自動でこれらのライブラリを読み込んでから処理を行います。しかし、事前に読み込んでおいた方が無駄な処理がなくなるので、上記の書き方でライブラリを利用するようにしてください。

 次に「Web AI」の初期化ですが、本ライブラリには機能の違う5つの外部JavaScriptファイルが用意されています。それぞれに依存関係はないので個別に利用できます。また「crocro.webAi.min.js」という、1つにまとめて圧縮したファイル(30KB弱)もあります。こちらを利用すれば、全機能を使うことができます。上記のサンプルコードでは、「crocro.webAi.min.js」を利用しています。

 さて、上記のプログラムでは、crocro.webAi.WebSrchと、同cJpKwcJpSntncを利用しています。このうち、WebSrchが通信処理のメソッドチェーン化を行うオブジェクトになります。残りの2つは、日本語処理を行うオブジェクトです。上記のプログラムでは、WebSrchオブジェクトを初期化してcWSrch変数に格納しています。

 それでは以下、「Web AI」のメインオブジェクトになるWebSrchの基本的な使い方を解説します。WebSrchは、reset()メソッドで内部の命令バッファを空にします。そして、メソッドチェーンで命令を追加した後、start()メソッドで実際の処理を開始します。

 メソッドチェーン化できる命令には、検索(srch())、フィード取得(feed())、Google Suggest(sgst())、短縮URL(shrtUrl())などの通信系命令があります。また、単純処理を追加するadd()や、コールバック処理を追加するaddCallback()もあります。さらに、命令の実行途中に新たな命令を挿入するためのinsrtOn()insrtOff()といった命令もあります。

 またWebSrchには、メソッドチェーン化せずに、すぐに効果を発揮する命令もあります。このタイプの命令には、処理を途中で終了するcmndsBreak()や、ループを途中で打ち切って次の命令に移行するloopBreak()などがあります。

 これらの命令は全て「Web AI」のページに、リファレンスとしてまとまっています。また、余談ですが、「Web AI」のページに掲載してあるリファレンスは、JavaScript製のドキュメント作成ツールで生成しています。こちらのドキュメント作成ツール「easyJsDoc」も、同サイトでソースコード付きで公開していますので、必要な方はご利用ください。

 さて、これらのメソッドの細かな仕様については、コメント付きのソースコードを公開していますので、そちらをご覧下さい。ここでは、最もよく利用する検索命令srch()メソッドの引数について解説します。

 srch(arg)メソッドの引数argは連想配列です。連想配列の内容は以下の通りです。

srch()メソッドの引数
引数 内容
arg.init ループ実行前の処理を関数で指定
arg.loop ループの回数を指定
arg.page 検索結果を何ページ分取得するか指定
arg.key 検索するキーワードを指定
arg.res 検索結果を受け取る関数を指定

 これらの各値は、設定しなければデフォルト値が利用されます。

 上記のうち、arg.initarg.resは関数で指定します。arg.initに関数を指定した場合は、検索処理が開始される前に一度だけ呼び出されます。この命令は、必要がなければ特に書かなくてもよいです。

 arg.resに指定した関数は、ループ回数分、検索が終了するたびに呼び出されます。この命令は必ず必要です。なければ、検索結果を受け取れません。このarg.resが受け取る引数は、「Google AJAX Search API」の検索結果オブジェクトになります。

 検索は、arg.loopで指定したループ回数分繰り返されます(デフォルトは1)。また、検索結果は、arg.pageで指定したページ数分の結果を結合した形で受け取れます(こちらもデフォルトは1)。arg.keyは特に解説はいらないと思います。こちらは検索キーワードになります。

 これらの引数のうち、arg.looparg.pagearg.keyといった引数は、「固定値」もしくは「関数」が利用できます。もし、関数で指定した場合は、ループの処理が行われるごとに、自動的に関数が実行されて、その結果を引数として利用します。WebSrchのメソッドチェーン化された命令のほとんどは、こういった引数の自動展開の機能を持っています。そのためとても柔軟に、メソッドチェーン化した処理を記述できるようになっています。この仕組みについては後で詳しく解説します。

次のページ
命令の挿入

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

柳井 政和(ヤナイ マサカズ)

クロノス・クラウン合同会社 代表社員http://crocro.com/オンラインソフトを多数公開。プログラムを書いたり、ゲームを作ったり、記事を執筆したり、マンガを描いたり、小説を書いたりしています。「めもりーくりーなー」でオンラインソフト大賞に入賞。最近は、小説家デビューして小説も書いています(『裏切りのプログラム』他)。面白いことなら何でもOKのさすらいの企画屋です。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5567 2010/11/18 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー