まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

タグ:wordpress

以前に「ノーツデータベースをまるごと IBM Watson に学習させて、問い合わせを行うサンプルアプリ」を作って紹介しました。なかなかに反響があり、タダで配布しなければよかった、と・・・調子に乗って同様のワードプレス環境向けサンプルを作ってみました。

ワードプレスは世界中で使われているオープンソースの CMS(コンテンツ管理システム)です。ちょっとデータが古いのですが、2014 年時点での 1000万サイトを対象にした調査によると CMS としてのシェアは約60%で、何よりも驚くのは全ウェブページ中の 26.6% がワードプレスを使って作られている、ということです(もう少し新しい情報持ってる人がいたら教えてください):
https://w3techs.com/technologies/overview/content_management/all

2016081201


と、それだけ利用者の多いワードプレスのデータをコグニティブエンジンである IBM Watson に学習させて、かつその学習データを使った問い合わせまでを実現できるようなプラグインを開発しました。 ぶっちゃけ、まだ「動作確認レベル」の段階ですが、このタイミングで一度公開して、多くの人に使ってみていただこうと思っています。


このプラグインを使うには、大きく2つの前提条件が必要です:
1. IBM Bluemix 環境
2. データの入ったワードプレス環境


まず 1. IBM Bluemix 環境です。IBM Bluemix にサインアップし、有効なアカウントを所有している必要があります。IBM Bluemix はアカウント作成から 30 日間は無料で利用することが出来、また有償以降後にもサービスに無料枠が設けられていて、無料または安価に利用することが可能です。

この IBM BLuemix にログインして、Watson の Natural Language Classifier (以下 NLC)サービスを作成します。このサービスを使ってデータの学習および問い合わせを行います:
2016081202


ちなみに NLC サービスの 2016/Aug/12 時点での料金は以下の様になっています。サービスインスタンスを1つだけ作成し、一ヶ月の中で学習機能を4回、問い合わせ機能を 1000 回以内使うぶんには(有償契約移行後であっても)無料枠に収まるので料金はかかりません。これらを越えて利用した場合の料金の目安にしてください:
2016081204


作成したサービスの「サービス資格情報」を確認し、このサービスを利用するためのユーザー名(username)とパスワード(password)を確認します。これらの情報は後で利用するので、このページを残しておくかメモするなりして入力できる状態にしておいてください:
2016081203


次に 2. データの入ったワードプレス環境ですが、ワードプレスの中にある文書とカテゴリを使って学習させるため、それなりの学習データを用意しようとすると、それなりの文書量が必要になります。またそのワードプレス環境にプラグインをインストールする等、管理者アカウントでログインできる権限も必要になります。


実際にプラグインを導入する手順を紹介します。プラグインは GitHub 上に用意しました:
https://github.com/dotnsf/wordpress_watson_nlc

2016081301


上記ページの "clone or download" と書かれた緑のボタンをクリックし、メニューから "Download ZIP" を選択してプラグインの ZIP ファイル(wordpress_watson_nlc-master.zip)をダウンロードします:
2016081302


ダウンロードした ZIP ファイル(wordpress_watson_nlc-master.zip)は、ワードプレスの管理画面の プラグイン - 新規追加 から「プラグインのアップロード」をクリックしてインストールできます:
2016081303


追加するプラグインファイルを指定する画面が表示されたら、ダウンロードした ZIP ファイル(wordpress_watson_nlc-master.zip)を指定して「今すぐインストール」ボタンをクリックします:
2016081304


インストールが成功したら「プラグインを有効化」をクリックして、このプラグインを有効な状態にします:
2016081305


プラグインが有効になると管理メニューの中に「NLC 設定」という項目が追加されます。このページをクリックして表示し、Username と Password に上記の NLC サービス設定時のサービス資格情報ページで取得したユーザー ID とパスワードを入力し、「変更を保存」ボタンをクリックします:
2016081306


Username と Password が設定されました。これで NLC プラグインのインストールと設定が完了です:
2016081307


では実際にこのプラグインを使ってみましょう。このプラグインで出来ることは2つあります:
(1) この(プラグインを導入した)ワードプレス環境内に格納されたデータを IBM Watson に学習させる
(2) (1) で用意した学習データを使って、問い合わせを行い、その返答内容を確認する


それぞれ順に説明します。(1) の学習機能ですが、ワードプレスに格納された投稿データの本文及びタイトルとカテゴリーの情報をもとに学習します。例えば以下の様な内容の投稿データがあったと仮定します:
 
タイトルBLUEMIX 上の SPARK を利用して、ブラウザー内で気象データを分析する
本文Apache Spark は、まったく新しい機能の数々をデータ・サイエンティスト、ビジネス・アナリスト、アプリケーション開発者に初めて利用できるようにする、次世代の分散データ処理エンジンです。Analytics for Apache Spark は IBM Bluemix に用意されている一般的なツールと連動することから、この Analytics for Apache Spark を使用することで、瞬く間にこの Apache Spark の能力をフル活用できるようになります。このチュートリアルでは、Spark API を使用する IPython Notebook を利用して、実際の気象に関するロー・データを分析する方法を紹介します。この例をベースとして使用すれば、Bluemix 上の他のアナリティクスも簡単に利用することができます。
カテゴリーcloud


Watson は初期状態では何も学習していません。そこにこの投稿データのカテゴリーである cloud について学習させたいとします。初期状態では cloud が何なのかを理解していませんが、cloud の例としてこのデータのタイトルと本文の内容を与えて「これが cloud の例だ」という形で学習させます。

これだけですとまだ1データだけですが、実際には cloud カテゴリーに属している投稿データ(のタイトルと本文の内容)を全て「cloud の例」として与えます。すると Watson は与えられた全データから cloud というものによく出てくる単語や言い回しの傾向などを自分で見つけて、「cloud にはどういった特徴があるか」を学習します。

対象のワードプレスデータには他にも色々なカテゴリーのデータが存在していることを想定しています。そして全てのカテゴリーと、そのカテゴリーに属している全レコードを使って、それぞれのカテゴリー内容を学習させます。例えばデータベース内に6つのカテゴリーが設定されている場合は6つのカテゴリーを学習させることになります。

その学習を実行するにはプラグインページの「学習」ボタンをクリックします:
2016081301


このデータベース内の情報を使って学習データを更新する、という確認メッセージが表示されます。更新するとこれまでの学習データが存在している場合も一旦削除されて、新たに現在の全投稿データを使った学習が行われます。「OK」をクリックすると続行します:
2016081302


学習処理が成功すると「データは学習中です」というメッセージが表示されます。これでデータは学習状態になりました。この直後はまだ学習中で問い合わせができない状態になりますが、しばらくすると (2) の問い合わせが可能になります:
2016081303


この学習によって、ワードプレス内に用意された各カテゴリーのキーワードを、そのカテゴリーに紐付けられた投稿データ(のタイトルと本文の内容)を基に学習します。そして学習後の問い合わせでは、与えたテキストの内容が各カテゴリーのどの内容にどの程度近いのか、という分類結果を返してくれるようになります。


では (2) の学習データに対する問い合わせ処理を紹介します。管理画面の NLC 設定ページから Query と書かれたテキストフィールドに何かテキストを入力します。ここで入力する内容は上記で学習させたカテゴリーのいずれかに関する内容となるようにしてみてください。以下の例では「Bluemix は IBM の PaaS プラットフォームです」と入力しました。この内容を Watson に問い合わせてみます。「問い合わせ」ボタンをクリックしてください:
2016081301


先ほど実行した学習処理がまだ完了していない場合、"Training" と表示されます。この場合はもうしばらく(15分~1時間程度)お待ちいただいた上で再度実行してみてください:
2016081302


Watson の学習が完了していれば問い合わせに対する回答とその confidence (自信度)が表形式で以下のように表示されます(この例文に対しては "cloud" と返してほしかったけど、このワードプレス内のデータによると "web" なのだそうだ。まあ間違いではないけど・・・):
2016081401


問い合わせに使った「Bluemix は IBM の PaaS プラットフォームです」という文章には "Web" や "Cloud" という直接的なキーワードは含まれていません。にも関わらず、(学習させたデータを元に)この内容が "Web" や "Cloud" に関係している可能性が高い、と判断できたことになります。


以上がこのプラグインが実装している機能の紹介です。注意事項が2点あります:

このプラグイン内の実装では複数のワードプレスデータには対応していません。同じ Username と Password の組では1つの(最新の)学習データしか持てません。複数のデータを同時に学習させる場合は複数の NLC サービスインスタンスを作成し、それぞれ Username と Password を取得して学習させる必要があります(無料枠内ではなくなります)。

もう1点。この NLC プラグインが不要になった場合は管理画面の「インストール済みプラグイン」の一覧から "Watson NLC" プラグインを探して、停止してください(今後も不要であればプラグインを削除してください)。
2016081403


と、こんなことができるサンプルプラグインです。ワードプレス環境をお持ちで、投稿データにある程度のカテゴリー分類ができている方は是非その環境で試してみていただきたいです。


なお、このプラグインの中で実装している機能は全てここで紹介されている NLC API を使って実装しています。この API を使うと学習させたデータを使った別のカスタマイズを行ったり、(ワードプレス以外の)別のアプリケーションから呼び出したりすることも可能です。興味あるデベロッパーの方は参照して、併せてチャレンジしてみてください:
Natural Language Classifier - API


WordPress のデータベースから SQL でデータを取り出すシリーズ(?)の応用編。今回のテーマは
 ポストした本文とタイトルと、その文書に付与されたカテゴリの一覧だけを取り出す
というものです。

最初に結論を書いておきます。この SQL で目的を達成できるはず(公開データと未公開データの両方を取り出しています):
select wp_posts.post_content as content, wp_posts.post_title, wp_terms.name as category
 from wp_posts, wp_terms, wp_term_relationships
 where wp_posts.post_type = 'post' 
 and ( wp_posts.post_status = 'publish' or wp_posts.post_status = 'draft' )
 and wp_posts.ID = wp_term_relationships.object_id
 and wp_term_relationships.term_taxonomy_id = wp_terms.term_id;

説明する上で、WordPress のテーブルの相関関係を理解しておく必要があります。関連図についてはこちらを参照ください:
データベース構造 - WordPress Codex 日本語版


まず WordPress にポストしたレコードデータは wp_posts テーブル内に格納されています。特に(固定ページなどではなく)ポストデータは
 post_type = 'post'
となっているものが該当します。

そして今回は公開済みレコードと未公開(ドラフト)レコードの両方を取り出すことにしました。公開状況は同テーブルの post_status に格納されており、
 post_status = 'publish' or post_status = 'draft'
のいずれかの条件を満たしているものを取り出し、そこから本文(post_content)とタイトル(post_title)を取りだせばよい、ということになります。もしもドラフトが不要な場合はこの行の or 以降は不要です。

取り出すレコードの選別はこれだけです。次に各レコードに紐付けられたカテゴリ名称を取り出す必要があります。

カテゴリーのデータは wp_terms テーブルに(カテゴリ名は name 列に)含まれています。そしてどの文書がどのカテゴリに属しているのか、というリレーションは wp_term_relationships テーブルに格納されており、同テーブル内の object_id が wp_posts.ID 、term_taxonomy_id が wp_terms.term_id に該当しています。

例えば、wp_term_relationships テーブルに以下のようなレコードが存在していた場合、
object_idterm_taxonomy_id
41
61
82

wp_posts テーブルの ID が 4 の文書と 6 の文書は、wp_terms テーブルの term_id = 1 のカテゴリに属していて、ID が 8 の文書は term_id = 2 のカテゴリに属している、ということになります。

これらの関係を1つの SQL に書き直すと上記の SQL になります。
2016070701


WordPress に使っているデータベース(一般的には MySQL のデータベースだと思います)から、SQL を使って、ブログの名称や説明文を取り出す方法です:

2016070501
↑この図の赤枠部分がブログの名称、青枠部分が説明文です。


前提として、データベース作成時のテーブルのプレフィックスはデフォルトの 'wp_' をそのまま使っているものとします。つまりデータベース内には wp_posts とか wp_terms といったテーブルが存在している状態で利用中のものとします:
2016070502


で、ブログの名称は wp_options テーブル内に option_name の値が 'blogname' であるレコードの option_value 値として格納されています。したがってブログ名称を取り出す際の SQL は以下になります:
select wp_options.option_value as name from wp_options where wp_options.option_name = 'blogname';

2016070503
↑取り出せました


同様に、説明文は option_name の値が 'blogdescription' であるレコードの option_value 値です。したがって SQL だと以下になります:
select wp_options.option_value as name from wp_options where wp_options.option_name = 'blogdescription';
2016070504


この辺りがわかっていると、SQL でブログタイトルや説明を無理やり書き換える、ということも可能になります。


IBM Bluemix 上に WordPress 環境を構築する方法の 2015/06/28 版を紹介します。

具体的な内容紹介の前に少し補足を。実は同様の内容を過去2回ほど紹介したことがありました:
IBM Bluemix 上で WordPress 環境を構築する(2014/06/28)
IBM Bluemix で無料の WordPress 環境を構築する(2015/02/21)

前者は自分で必要なサービスを選んで組み合わせていく、という今回の内容に近い方法です。ただ残念ながら IBM Bluemix の環境が変わり、この時に紹介した方法では現在は正しく構築できないことが分かっています。そんなこともあって今回、新しい方法を紹介しようと思いました。

後者の方法は IBM Bluemix のボイラープレートと呼ばれるテンプレート機能を使う方法で、こちらは現在でも使えます。ただこの方法で提供される MySQL データベースは ClearDB の無料プランで、その容量は 5MB しかありません。本格的に使うにはさすがに不十分だと思っています。

という背景もあって、
 ・2015/06/28 現在でも有効に使えて、
 ・そこそこな容量の MySQL データベースを持つ
WordPress 環境を Bluemix 上に構築する方法を紹介します。おおまかな流れとしては上記前者の方法に近いのですが、ちょっとした追加設定を行うことになります。


まず、最初は普通に Bluemix 上に PHP サーバーと MySQL データベースサーバーを用意してバインドします。最初は PHP サーバーを作ります。ダッシュボードから「アプリの作成」:
2015062801


アプリサーバーの種類として「PHP」を選択:
2015062802


アプリサーバーの名前(ホスト名の一部になる名前)を指定して「完了」:
2015062803


これで PHP サーバーは完成です。続いて MySQL サーバーを追加してバインドします。「サービスまたは API の追加」を選択:
2015062804


「データ管理」カテゴリを選択します。ClearDB の MySQL を選択してもいいのですがデフォルトで与えられる容量が少ないので画面下部の「Bluemix Labs Catelog」をクリックしてオープンソース版の MySQL を探します:
2015062805


オープンソースデータベースの一覧が表示されるので、ここから「MySQL」を選択:
2015062806


プランの選択肢から好きなプランを選びます(画面では 500MB まで使えるプランを選択しています)。アプリに自分が先程作った PHP アプリの名称が表示されていることを確認して「作成」:
2015062807


これで Bluemix 上に PHP アプリサーバーと MySQL データベースサーバーが1つずつ作成されました。MySQL データベースに接続するための情報はメニューの「環境変数」を選択すると表示されます:
2015062808


おそらくこのような JSON テキストが表示されます。この情報は後で WordPress の設定内容として必要になるので保存しておくか、メモしておきます:

#オープンソース版 MySQL サービスを選択した場合、ポート番号がデフォルトの 3306 ではなく、3307 になる点に注意
{
   "mysql-5.5": [
      {
         "name": "mysql-n7",
         "label": "mysql-5.5",
         "plan": "300",
         "credentials": {
            "name": "(データベース名)",
            "hostname": "(MySQL サーバーのIPアドレス)",
            "host": "(MySQL サーバーのIPアドレス)",
            "port": 3307,
            "user": "(MySQL サーバーのユーザー名)",
            "username": "(MySQL サーバーのユーザー名)",
            "password": "(MySQL サーバーのパスワード)",
            "uri": "mysql://(MySQL サーバーのユーザー名):(MySQL サーバーのパスワード)@(MySQL サーバーのIPアドレス):3307/(データベース名)"
         }
      }
   ]
}

ではこの環境を使って WordPress 環境を構築します。

まずは cf ツールをインストールします。こちらのサイトから自分の環境にあった cf コマンドラインツールをダウンロードしてインストールしておきます:
cloudfoundry/cli


次に WordPress をダウンロードします。WordPress の(日本語)公式ページから最新版の WordPress モジュールの zip ファイルをダウンロードします(2015/06/28 時点では wordpress-4.2.2-ja.zip が最新でした。以下このファイルを使う前提で紹介します):
2015062801


ダウンロードしたファイルを展開して、ローカルディスク内の任意のフォルダ(例えば c:\tmp\wordpress)内に保存します:
2015062802


まずは WordPress に必要なフォルダを作成します。モジュールを展開したフォルダの wp-content フォルダに以下のサブフォルダを追加で作成します:
 - upgrade
 - uploads
2015062803


また、モジュール展開フォルダ内にある wp-config-sample.php ファイルを wp-config.php にリネームします:
2015062804


加えて、リネーム後の wp-config.php ファイルをテキストエディタで開き、先程メモした接続情報を使って以下の様な内容に書き換えます(最終行の FS_METHOD の行は丸々追加):
  :
  :
// ** MySQL 設定 - この情報はホスティング先から入手してください。 ** //
/** WordPress のためのデータベース名 */
define('DB_NAME', '(MySQL サーバーのデータベース名)');

/** MySQL データベースのユーザー名 */
define('DB_USER', '(MySQL サーバーのユーザー名)');

/** MySQL データベースのパスワード */
define('DB_PASSWORD', '(MySQL サーバーのパスワード)');

/** MySQL のホスト名 */
define('DB_HOST', '(MySQL サーバーのIPアドレス):3307');


/** データベースのテーブルを作成する際のデータベースの文字セット */
define('DB_CHARSET', 'utf8');

/** データベースの照合順序 (ほとんどの場合変更する必要はありません) */
define('DB_COLLATE', '');

define('FS_METHOD','direct');
  :
  :

実は今まではこれだけの設定で WordPress が使えたのですが、現在はこれだけだと使えなくなっています。理由は PHP ランタイム側に変更が加わり、デフォルト状態では MySQL や mbstring モジュールが無効にされており、その結果 WordPress の環境条件が満たされずにエラーとなってしまうようです。

このエラーを回避するため、ドキュメントルート直下に .bp-config というフォルダを作り、その下に options.json というテキストファイル(つまり .bp-config/options.json)を以下の内容で作成します。このファイルを作っておくと、PHP ランタイムに MySQL や mbstring のモジュールが組み込まれ、利用可能になり、上述のエラーを回避することができるようになります:
{
      "PHP_EXTENSIONS": [ "bz2", "zlib", "curl", "mcrypt", "mbstring", "mysql", "pdo", "pdo_mysql" ]
 }
2015062805


(2015/06/30 追記)
これだけだと足りませんでした。この後の cf push コマンドを成功させるには更に1ファイルがドキュメントルート直下に必要でした。

ドキュメントルート直下に composer.json というファイルを用意し、その中身を {} だけで作成します:
{}
(2015/06/30 追記終わり)


ではローカルマシンに作ったこの WordPress 環境を Bluemix 上の PHP サーバーにプッシュします。プッシュの作業には上述の作業でインストールした cf ツールを使います。コマンドラインやコンソールを起動後、以下のようなコマンドを指定します:
> cd (WordPress のフォルダ)

> cf login -a https://api.ng.bluemix.net/ -u (Bluemix のログインID)

※データセンターが英国を使っている場合は https://api.eu-gb.bluemix.net を指定する

(パスワード入力を求められるので指定) > cf push (Bluemix で作成時に指定したアプリ名)


プッシュが正しく終了すると WordPress モジュールが PHP サーバーのドキュメントルートに送られ、ウェブから WordPress が利用できるようになります:
2015062806



というわけで、PHP のビルドパック内の mbstring や MySQL モジュールを有効にすることで WordPress が使えるようにする、という例の紹介でした。
 

来たる5月19日&20日に IBM テクノロジーの祭典「IBM XCITE SPRING 2015」がグランドプリンスホテル新高輪で開催されます:
https://ibmxcite.jp/

この初日、5月19日にエンジニア向けのサブイベント dev@XCITE が併催されます。
http://ibmxcite.jp/dev/
2015050701


特にアプリケーション開発者を対象とした同イベントではアプリケーション開発基盤やホットワードになりつつある IoT(Internet of Things) をテーマとしたセッション等が予定されています。

実はその中のお昼のセッションの中で私が担当する時間が用意されています:
ライブコーディングで見せます!Bluemix アプリの作り方(11:50-12:35)

予定している内容としては IBM Bluemix を使って WordPress 環境を構築し、更にその WordPress 環境を IBM の人工知能エンジンの1つである AlchemyAPI の顔認識 API を使ってカスタマイズします。そして WordPress 内に添付された写真に人が映っているか?写っていた場合、その性別と年齢層はどのくらいか? を識別するようなカスタマイズを加えて公開する、というところまでをライブコーディングでお届けする予定です。

(完成イメージ WordPress コンテンツ内の画像内の顔を検出して性別、年齢、有名人の場合は誰かを認識させる機能をカスタマイズで追加します)
2015050700


ライブコーディング、つまりこの与えられた 45 分の中で実際にこのカスタマイズのコーディングをする、ということです。WordPress のカスタマイズなので言語としては PHP になりますが、Alchemy API は REST なので、普段は他の言語をお使いの方でもさほど混乱なく理解できる内容であると思っています。 

しかし 45 分って大丈夫か、俺!? まあヤバそうだったら最後はコピペするけど・・・

IBM Bluemix に興味ある方、AlchemyAPI の人工知能 API に興味ある方、自分でも顔認識 API を使ってみたいと思っているエンジニアの方、最近人工知能の話題をよく聞くけどどんなもんだろうと思っている方、僕のリアルなソースコードを見てみたい方、お昼の時間がヒマだなあという方、などなど、ちょっとでもこんな内容のセッションに興味があれば是非ご参加ください。




 

このページのトップヘ