読者です 読者をやめる 読者になる 読者になる

Twitter BOT開発日記 Part2

PHP

今回はTLから取得したTweetを配列に代入します。その後、形態素解析をし、解析された形態素を同じように配列に代入します。詳しくはソースコードを見てもらえばわかると思います。*1

Twitter BOT開発日記 Part1は こちら

<?php
require_once('oauth.php');

// OAuth処理は省略します。Part1を参考にしてください。

$req = $to->get("statuses/home_timeline", array("count"=>"3"));
$tweets = simplexml_load_string($req);

// ここにTLから取得したTweetを格納させます。
$tweetLists = array();

foreach($tweets->status as $status) {
	$tweet = $status->text;
	$pattern = '/(http|https|ttp|ftp):[a-zA-Z0-9_\.\-\/\?\&\=\~]+|@[a-zA-Z0-9_]+|#[a-zA-Z0-9_-]+/';
	if(preg_match($pattern , $tweet)) {
		$replaced = preg_replace($pattern , '' , $tweet);
		$tweetLists[] = $replaced;
	} else {
		$tweetLists[] = $tweet;
	}
}

for($i=0; $i<count($tweetLists); $i++) {
	// Yahooの形態素解析APIを使用します。AppIDが必要になります。
	$yahooApi = "http://jlp.yahooapis.jp/MAService/V1/parse";
	$yahooApi .= '?appid=';
	$yahooApi .= '&results=ma';
	$yahooApi .= '&response=surface';
	$yahooApi .= '&sentence='.urlencode(trim($tweetLists[$i]));
	$morpheme = file_get_contents($yahooApi);
	$xmlMor = simplexml_load_string($morpheme);

	// ばらばらになった形態素を格納させます。
	$words = array();

	$surfaces = $xmlMor->ma_result->word_list;
	foreach($surfaces->word as $word) {
		$surfaces = $word->surface;
		$words[] = $surfaces;
	}
}

これで $words に形態素が配列されることになります。

コードを見てもわかるように、37行目の for() は $tweetLists に格納されたTweetを1つずつ取り出し、それをYahooのAPI形態素解析しています。今回はTLから3つのTweetを取得するだけなので、ほとんど問題はないのですが50や100というように数が大きくなると、処理が遅くなるだけではなく、負荷を与えてしまう可能性があると思います。

その解決策としてですが、形態素解析エンジンのMecabを使用することを考えています。解析速度も早く、独自のサーバで処理ができるためにそちらのほうが将来的にも有効かなと思います。といっても、まだ導入したことないのでそれをやってから、ですが…。

さて、次は解析された形態素MySQLで管理していきます。が、DBで管理したとしても、それらをどのように自然なマルコフ連鎖文を生成していくのか、が今の僕には少し難題なのでまだまだ時間が掛かりそうです…道は険しいですね、はい。

*1:2月8日に少し書き直しました