開発の背景
「Web AI」は、サーバーにデータベースを持たず、またCGIを一切利用することなく、人工無脳的なWebアプリを構築するためのJavaScriptのライブラリです。しかし、なぜ私はこういったライブラリを作成することになったのでしょうか? その背景を少し書いておこうと思います。
私は数年前に「オートペディア」や「全自動4コマ」といった、Web上の情報を収集してコンテンツを自動生成するWebアプリを作りました。これらはユーザーの人気は高かったものの、サーバーにけっこうな負荷をかけるといった問題がありました。
そこで、負荷を軽減させるために、サーバーへのアクセスを最小限にするための方法を色々と模索してきました。その試行錯誤の結果として、サーバーへの負荷をかけずに「JavaScriptだけで動作する」人工無脳向けのライブラリを開発しました。
人工無脳の「無」は、「人工知能に対する人工無能」という意味です。「Web AI」では、それだけでなく、「データベースを持たない」「サーバー側の処理が必要ない」という意味での「無サーバー」も目指しています。
「Web AI」は、JavaScriptが正しく実行できるブラウザがあれば、パソコンだけでなく携帯デバイス内でも動作できます(CPU速度や、メモリ搭載量の制限はあるでしょうが、それも技術の進歩が解決してくれます)。また、処理がJavaScriptだけで記述できるので、ローカルで使う際には、簡単に手元で処理を書き換えて利用できます。
「Web AI」は、人間が普段行っている「検索」→「判断」→「再検索」...といった一連の処理を、アルゴリズムとして記述して利用することを想定しています。そういった意味で、非常にインテリジェントな処理を実現するライブラリになっています。「Web AI」は、私のサイトで公開しているようなジョークアプリだけでなく、さまざまな分野に応用できるライブラリです。
それではこれから、「Web AI」の概念と使い方、内部的な仕様について、駆け足で見て行きたいと思います。以下、簡単な目次です。
| タイトル | 内容 |
| 「Web AI」の概念 | 「Web AI」の3種類の機能と収録ファイルの解説 |
| 「Web AI」実行のサンプル | 利用方法とソースコードのサンプル |
| 検索のメソッドチェーン化の仕組み | 内部仕様の技術的な解説1 同期/非同期処理の直列化の方法について |
| 自動展開引数の仕組み | 内部仕様の技術的な解説2 引数のオブジェクト種類によって自動で処理を変える関数の構築について |
| クエリー圧縮によるデータの保存 | URLクエリーの圧縮と解凍についての解説 |
| 日本語処理 | キーワード抽出、文章校正抽出、マルコフ連鎖についての解説 |
「Web AI」の概念
Web上に公開されている人工無能的なアプリケーションは、多くの場合CGIとして提供されています。しかし、CGIは設置やメンテナンスが大変で、気軽に作って公開する用途にはあまり向いていません。
JavaScriptで全てのプログラムを書くことができ、サーバーにデータベースを持つ必要がなければ、サーバーサイドのプログラムが必要なくなります。また、実行結果のデータをURLのクエリー内に圧縮して格納できれば、サーバー側でデータを保存する必要もなくなります。この「データの読み出し」と「データの書き込み」が不要になれば、CGIのプログラミングは一切行わなくてよくなり、サーバーへの負荷も最小限に留めることができるようになります。
また、こういった仕組みは、公開やメンテナンスを非常に容易にしてくれます。HTMLファイル内に全てのコードを記述すれば、そのファイル1つをアップロードするだけで、Webアプリケーションを簡単に公開することができるようになります。メンテナンスも、このファイルを書き換えるだけで済むようになります。
「Web AI」には、そういった処理を行うための機能も収録されています。以下に、「Web AI」の3つの主要な機能を掲載します。
- 通信処理のメソッドチェーン化
- クエリーの解析と構築、圧縮と解凍
- 雑多な日本語文章からのキーワード抽出、校正済み文章の抽出、マルコフ連鎖
それでは、これらの機能について説明していきます。
通信処理のメソッドチェーン化
「通信処理のメソッドチェーン化」は、非同期処理の結果に応じて「次の処理を動的に決定していくプログラム」を簡単に書くための仕組みです。非同期処理には、Web検索や、RSS/Atomフィードの取得などの通信処理があります。
jQueryに代表されるAjaxを使った通信処理は、サーバーとのやり取りを簡潔に書くことができます。jQueryのajaxメソッドは、連想配列を引数に取ります。この引数の最小セットは、「URL」と「結果を受け取る関数」で構成されています($.ajax({ url: "hoge.cgi", success: function(dat){} }))。この命令は非常に簡潔で便利です。しかし、関数で結果を受け取った後に、「新たな通信処理」を「連続的」に行いたい場合には、コーディングが少々面倒になります。
「Web AI」は、こういった連続的な非同期処理を、メソッドチェーンとして記述できます。
例えば「入力キーワードについて検索する」→「検索結果から、関連すると思われる単語を収集する」→「それらの単語について、それぞれ検索して Web上のインデックス数を調べる」→「最もインデックス数の多かった単語について、ニュースを検索する」→「キーワードを入力したユーザーに、これらのニュースも参照した方がよい、とリストを提出する」。「Web AI」では、こういった一連の処理を、メソッドチェーンとして記述できます。
またそれだけでなく、「Web AI」では、処理途中で新たな命令を挿入したり、非同期処理の一部をループ処理にしたり、非同期処理のメソッドチェーンの間に同期処理を差し挟んだりといったこともできます。さらに、通信負荷を減らすために、通信処理の間にインターバルを設けることも可能です。
「Web AI」には標準で、Web検索、ニュース検索、画像検索、ブログ検索、RSS/Atomフィード取得、Google Suggest取得、短縮URL取得の機能が用意されています。また、検索系命令では、複数ページの一括取得もサポートしています。
