目次
サンプル・プログラムの実行例

サンプル・プログラム
BayesClassifier.php | サンプル・プログラム |
pahooTwitterAPI.php | Twitter APIを利用するクラス pahooTwitterAPI。 使い方は「PHPでTwitterに投稿(ツイート)する」などを参照。include_path が通ったディレクトリに配置すること。 |
サンプル・プログラムの流れ

コンストラクタでは、TwitterAPI の利用と、データベース SQLite の準備を行う。

本プログラムに $screen_name が渡された場合は、TwitterPI を使って対応するユーザーIDを取得。もしDB未登録であれば、これを登録する。
続いて、DBから、そのユーザーの最小・最大ツイートIDを取得する。これは、次に TwitterPI を使って複数ツイートを取得する際に、取得基準となるIDを指定するための作業である。もしDB登録がなければ、最新ツイートを取得する。取得したツイートは、DBに登録する。

自動処理かどうかを表すフラグ $auto が立っていなければ、登録されている全ユーザー情報を取得し、画面に表示する。
このとき、前回 TwitterPI コールからの経過時間をチェックし、一定時間が経過していなければアクションが起こせないようにしておく。これは、大量の呼び出しを受け付けないという TwitterPI の仕様があるためだ。

自動処理は、LinuxのcronまたはWindowsのタスクスケジューラを使い、バックグラウンドで学習データを収集するための仕組みとして用意した。詳細は、本節の最後に述べる。
準備
40: //出力ログ・レベル
41: define('LOG_LEVEL', 1); //0:エラーのみ,1:最小限の成功ログまで,2:全部
42:
43: //一度に取得するツイート数
44: define('NUM_TWEETS', 80);
45:
46: //一度に学習するツイート数
47: define('NUM_LEARN', 100);
48:
49: //TwitterAPI呼び出し間隔(秒)
50: define('TIME_INTERVAL', (10 * 60));
51:
52: //TwitterAPI呼び出しパラメタ(デバッグ用)
53: define('TWITTERAPI_VAR', 1);
54:
55: //SQLite DBファイル名;各自の環境に合わせて変更すること
56: define('DBFILE', './sqlite/usertimelines.sqlite3');
57:
58: //MeCab実行プログラム;各自の環境に合わせて変更すること
59: define('MECAB', 'C:\Program Files (x86)\MeCab\bin\mecab.exe');
60:
61: //ユーザー辞書;各自の環境に合わせて変更すること
62: define('FILE_UDIC_MECAB', 'C:\Program Files (x86)\MeCab\dic\user.dic');

あるユーザーのツイートを同時に複数取得するが、その最大数を決めるのが NUM_TWEETS である。TwitterPI の仕様上、最大200であるが、負荷をかけないよう少なめの数字としておこう。
また、前述のように、大量の呼び出しを受け付けないという TwitterPI の仕様を受け、呼び出し間隔を TIME_INTERVA で定義しておく。

収集した学習データはデータベース SQLite に格納する。
SQLite についは「PHPとデータベース」で紹介しているが、PHP5以上に組み込まれているものであり、とくに追加作業することなく使える。
データベースは単一ファイルに格納され、ファイル名を DBFILE に定義しておく。

Twitter APIを利用する関数群はユーザー定義クラス pahooTwitterAPI として別ファイル "pahooTwitterAPI.php" に定義してある。このファイルを require_once できるパスに配置すること。このクラスの内容については「PHPでTwitterに投稿(ツイート)する」などを参照いただきたい。
pahooLearningTweets クラス
135: // pahooLearningTweetsクラス =================================================
136: class pahooLearningTweets {
137: var $ptw; //pahooTwitterAPIクラス
138: var $pdo; //DBアクセス
139: var $error; //エラーフラグ
140: var $errmsg; //エラーメッセージ
141: var $table_logAPI = 'log_api'; //テーブル:TwitterAPI利用ログ
142: var $table_users = 'users'; //テーブル:ユーザー
143: var $table_tweets = 'tweets'; //テーブル:ツイート
144: var $table_vectors = 'vectors'; //テーブル:学習記録
145: var $fname_mylog = './log/'; //アプリケーション・ログファイル
146: var $level_mylog = LOG_LEVEL; //ログ出力レベル
147:
148: /**
149: * コンストラクタ
150: * @param なし
151: * @return なし
152: */
153: function __construct() {
154: $this->error = FALSE;
155: $this->errmsg = '';
156:
157: //アプリケーション・ログファイルの準備=プログラムファイル名.log
158: $arr = pathinfo($_SERVER['SCRIPT_NAME']);
159: $this->fname_applog = $this->fname_mylog . $arr['filename'] . '.log';
160:
161: //pahooTwitterAPIクラス
162: $this->ptw = new pahooTwitterAPI(TWITTERAPI_VAR);
163:
164: //SQLite準備
165: $this->pdo = NULL;
166: try {
167: $this->pdo = new PDO('sqlite:' . DBFILE);
168: $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
169:
170: //テーブル作成:TwitterAPI利用ログ
171: //user_id:ログID, dt:利用日時, count:取得ツイート数
172: $this->pdo->exec('CREATE TABLE IF NOT EXISTS ' . $this->table_logAPI . '(
173: id INTEGER PRIMARY KEY AUTOINCREMENT,
174: url TEXT,
175: count INTEGER,
176: dt TEXT
177: )');
178:
179: //テーブル作成:ユーザー情報
180: //user_id:ユーザーID, screen_name:スクリーンネーム,name:名前
181: //active:アクティブ・フラグ, dt:登録日時
182: $this->pdo->exec('CREATE TABLE IF NOT EXISTS ' . $this->table_users . '(
183: user_id TEXT PRIMARY KEY,
184: screen_name TEXT,
185: name TEXT,
186: active INTEGER(1) NOT NULL DEFAULT 1,
187: dt TEXT
188: )');
189:
190: //テーブル作成:ツイート内容
191: //id:メッセージID, user_id:ユーザーID, description:ツイート内容,
192: //flag:学習済みフラグ, dt:登録日時
193: $this->pdo->exec('CREATE TABLE IF NOT EXISTS ' . $this->table_tweets . '(
194: id TEXT PRIMARY KEY,
195: user_id TEXT,
196: description TEXT,
197: flag INTEGER,
198: dt TEXT
199: )');
200:
201: //テーブル作成:学習記録
202: //id:学習ID, user_id:ユーザーID, word:単語, count:出現回数
203: //dt:登録日時
204: $this->pdo->exec('CREATE TABLE IF NOT EXISTS ' . $this->table_vectors . '(
205: id TEXT PRIMARY KEY,
206: user_id TEXT,
207: word TEXT,
208: count INTEGER,
209: dt TEXT
210: )');
211:
212: } catch (PDOException $e) {
213: $this->error = TRUE;
214: $this->errmsg = 'Error SQLite: ' . $e->getMessage();
215: $this->putAppLog($this->errmsg, __LINE__, __FUNCTION__);
216: }
217: }

コンストラでは、前述のオブジェクト pahooTwitterAPI を生成する。
続いてデータベース SQLite の準備を行う。データベースがなければ、自動的に生成する。
テーブル定義
$table_users:ユーザー情報 | |||
---|---|---|---|
No. | 名前 | 型 | 内容 |
1 | user_id | テキスト | ユーザーID |
2 | screen_name | テキスト | スクリーンネーム |
3 | dt | テキスト | 登録日時 |
$table_tweets:ツイート内容 | |||
---|---|---|---|
No. | 名前 | 型 | 内容 |
1 | id | テキスト | ツイートID |
2 | user_id | テキスト | ユーザーID |
3 | description | テキスト | ツイート内容 |
4 | flag | 整数 | 学習済みフラグ |
5 | dt | テキスト | 登録日時 |
$table_vectors:学習記録 | |||
---|---|---|---|
No. | 名前 | 型 | 内容 |
1 | id | テキスト | 管理ID |
2 | user_id | テキスト | ユーザーID |
3 | word | テキスト | 単語 |
4 | count | 整数 | 出現回数 |
5 | dt | テキスト | 登録/更新日時 |
$table_logAPI:TwitterAPI利用ログ | |||
---|---|---|---|
No. | 名前 | 型 | 内容 |
1 | id | 整数 | 管理ID |
2 | url | テキスト | TwitterAPI URL |
3 | count | 整数 | 取得ツイート数 |
4 | dt | テキスト | 利用日時 |
アプリケーション・ログ
引数として、ログに書き出すメッセージ、出力レベル、行番号、関数名を与える。行番号は定数 __LINE__、関数名は定数 __FUNCTION__ で、それぞれ与えるといいだろう。

ログに付与するタイムスタンプは、 date で生成する。引数に DATE_W3C を指定することで、W3C形式の年月日時分秒からなる文字列を生成する。

ログファイルが無ければ、ディレクトリとパスを自動生成する。
なお、ログファイル名は、実行プログラム名の拡張子を '.log' に置換したものとなる。保存するディレクトリは、変数 $fname_mylog に指定しておく。
ユーザーID取得+DB登録
もしスクリーンネームが登録されていなければ TwitterPI を呼び出し、検索をかけ、その結果をデータベースに登録する。
ユーザーの最小/最大ツイートIDを取得
これは、メソッド getUserTweets で複数ツイートを取得する際、その基準ID――新しいメッセージを取得したいなら最大IDを、古いメッセージより最小IDを――を指定してやる必要があるからである。
ユーザーのツイートを取得+DB登録

なお、TwitterAPI は同時に大量の呼び出しができないため、メソッド getElapsedTime を使い、あらかじめ設定されたインターバル TIME_INTERVAL より短ければ、API呼び出しを行わないように制御している。
TwitterAPI 呼び出し待ち
クライアント側では JavaSript を使ったカウントダウンタイマを定義し、経過時間を超えるまで、ボタンを disabled にしている。
自動実行
ここでは、Windows タスクスケジューラに登録し、1時間ごとに実行する方法を紹介する。

まず、タスクの名前と説明を記入する。




引数の追加には、実行する "BayesClassifier.phop" をフルパスで指定する。
開始には、カレントディレクトリをフルパスで指定する。実行する "BayesClassifier.phop" と同じディレクトリを指定しておけばいい。


繰り返し間隔を「1時間」とすることで、開始時刻から1時間ごとに、本プログラムが実行されるようになる。
参考サイト
- PHPで機械学習(その1):ツイートを取得しDB格納:ぱふぅ家のホームページ
- PHPで機械学習(その2):ツイート内容を学習:ぱふぅ家のホームページ
- PHPで機械学習(その3):単純ベイズ分類機:ぱふぅ家のホームページ
- PHPとデータベース:ぱふぅ家のホームページ
- PHPでTwitterに投稿(ツイート)する:ぱふぅ家のホームページ
- 機械学習とは:sas
- ベイズの定理:高校数学の美しい物語
- ディープラーニングの無料学習講座:浜村拓夫の世界
- 数式無しで理解する機械学習(エンジニア向け):情強志向
- VPSサーバーにChainerをインストールしたらディープラーニングを超簡単に試せた:ゆるりの足あと
機械学習には、あらかじめ与える学習データの質と量が大切だが、ネット時代になり、家にいながらにして学習データが集められるようになった。
そこで今回は、PHPを使って機械学習の基本について紹介することにしよう。
機械学習は、大まかに分けて3つの段取りを踏む。
学習データは、複数ユーザのツイートを使うことにする。
今回は、まず、複数ユーザのツイートを学習デートして収集し、データベースに格納するところまでを紹介する。
(2021年7月11日)PHP8対応,リファラ・チェック改良