トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   一覧 最終更新   ヘルプ   最終更新のRSS
 


動作確認ディストリビューション

PHP 5.3.2RC1にMeCab extensionを追加インストール

MeCab extensionのソースファイルを取得

# cd /usr/local/src
# wget http://www.opendogs.org/pub/php_mecab-0.3.0.tgz

展開

# tar zxvf php_mecab-0.3.0.tgz

コンパイル準備

# cd php_mecab-0.3.0
# phpize
# ./configure --with-php-config=/usr/local/bin/php-config --with-mecab=/usr/local/bin/mecab-config

PHP 5.3以上だと、make時にエラーになるみたいなので一部修正

# vi /usr/local/src/php_mecab-0.3.0/mecab.c
#define PM_BEGIN_ARG_INFO(name, pass_rest_by_reference) \
        static ZEND_BEGIN_ARG_INFO(arginfo_ ## name, pass_rest_by_reference)

#define PM_BEGIN_ARG_INFO_EX(name, pass_rest_by_reference, return_reference, required_num_args) \
        static ZEND_BEGIN_ARG_INFO_EX(arginfo_ ## name, pass_rest_by_reference, return_reference, required_num_args)

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 2) || PHP_MAJOR_VERSION > 5
# define MOGILEFS_ARG_INFO
#else
# define MOGILEFS_ARG_INFO static
#endif
#define PM_BEGIN_ARG_INFO(name, pass_rest_by_reference) \
        MOGILEFS_ARG_INFO ZEND_BEGIN_ARG_INFO(arginfo_ ## name, pass_rest_by_reference)
#define PM_BEGIN_ARG_INFO_EX(name, pass_rest_by_reference, return_reference, required_num_args) \
        MOGILEFS_ARG_INFO ZEND_BEGIN_ARG_INFO_EX(arginfo_ ## name, pass_rest_by_reference, return_reference, required_num_args)
php_set_error_handling(EH_THROW, ext_ce_InvalidArgumentException TSRMLS_CC);
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &index) == FAILURE) {
        php_std_error_handling();
        return;
}
php_std_error_handling();

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &index) == FAILURE) {
        return;
}
php_set_error_handling(EH_THROW, ext_ce_InvalidArgumentException TSRMLS_CC);
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &traverse) == FAILURE) {
        php_std_error_handling();
        return;
}
php_std_error_handling();

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &traverse) == FAILURE) {
        return;
}

コンパイル

# make

インストール

# make install
Installing shared extensions:     /usr/local/lib/php/extensions/no-debug-non-zts-20090626/

PHPの設定ファイルの書き換え

# vi /usr/local/lib/php.ini

以下の行を追加
extension=/usr/local/lib/php/extensions/no-debug-non-zts-20090626/mecab.so

Apacheの再起動

# service httpd restart

RhacoとMeCab extensionを使ったサンプルプログラム

PHPのフレームワークであるRhacoのRSSパーサ機能とMeCab extensionを利用して、「変な言葉生成プログラム」を作ってみました。
RSSの概要を抽出してきて、そこから「形容詞」+「名詞」のキーワードを作成するという、ごくごく単純なサンプルです。
なので、そこまで変な言葉が生まれなかったりもします。。。
ちなみに、このプログラムの開発途中で生まれた主なキーワードは、
「ずらり現金」、「おじさん鬼畜」、「フェロモンスパコン」、「ゲーム大学」、「さよならメガドラ」、「華々しく国会」、
「魔法大統領」、「祝痛み」、「iPadGoogle」、「民主得」、「できる全員」、「する圧力」、「無敵バカ」などなど。

<?php

require '/PATH_TO/Rhaco.php';
Rhaco::import('tag.feed.FeedParser');

class StrangeWordCreator {
	
	// MeCabのインスタンス
	private $_mecab;
	
	// RSSのURL
	private $_rssUrls;
	
	// 品詞IDの配列
	private $_hinshiIds;
	
	public function __construct() {
		// MeCabのインスタンスを生成
		$this->_mecab = mecab_new();
		
		// RSSのURLをセット
		$this->_setRssUrls();
		
		// 品詞IDをセット
		$this->_setHinshiIds();
	}
	
	public function __destruct() {
		// MeCabのインスタンスを破棄
		mecab_destroy($this->_mecab);
	}
	
	// RSSのURLをセット
	private function _setRssUrls() {
		$this->_rssUrls = array(
			'http://PATH_TO/xxx.xml' ,
			'http://PATH_TO/xxx.rdf' ,
		);
	}
	private function _getRssUrls() {
		return $this->_rssUrls;
	}
	
	// 品詞IDをセット
	private function _setHinshiIds() {
		$this->_hinshiIds = array(
			'meishi'    => array() ,
			'keiyoushi' => array() ,
		);
		
		// 名詞
		array_push($this->_hinshiIds['meishi'], '38');		// 名詞,一般

		// 形容詞
		array_push($this->_hinshiIds['keiyoushi'], '10');	// 形容詞,自立
	}
	
	// 品詞IDを取得
	private function _getHinshiIds($hinshi) {
		return $this->_hinshiIds[$hinshi];
	}
	
	// ランダムに配列の添え字を取得
	private function _getRandomIndex($arr) {
		$idx = rand(0, (count($arr)-1));
		return $idx;
	}
	
	// 変な言葉を取得
	public function _getStrangeWord($hinshi) {
		// 変な言葉の配列を初期化
		$strangeWords = array();
		
		// 変な言葉
		$strangeWord = null;
		
		while(!$strangeWord) {
			// RSSフィードの取得
			$rssFeedItems = $this->_getRssFeedItems();
			
			if (count($rssFeedItems)) {
				$idx = $this->_getRandomIndex($rssFeedItems);
				// RSSの概要を取得
				if ($node = mecab_sparse_tonode(
						$this->_mecab
						, @mb_convert_encoding(
							strip_tags(html_entity_decode($rssFeedItems[$idx]->description, ENT_QUOTES)), 'UTF8', 'auto'
						)
					)
				) {
					while ($node) {
						$nodes = mecab_node_toarray($node);
						
						$hinshiIds = $this->_getHinshiIds($hinshi);
						foreach($hinshiIds as $key => $val) {
							if ($nodes['posid'] == $val) {
								array_push($strangeWords, $nodes['surface']);
							}
						}
						$node = mecab_node_next($node);
					}
				}
			}
			
			if (count($strangeWords) > 0) {
				// 該当ありの場合は変な言葉を返す
				$idx = $this->_getRandomIndex($strangeWords);
				$strangeWord = $strangeWords[$idx];
			}
		}
		
		return $strangeWord;
	}
	
	// RSSフィードの取得
	private function _getRssFeedItems() {
		// RSSのURLの中から1件抽出
		$rssUrls      = $this->_getRssUrls();
		$idx          = $this->_getRandomIndex($rssUrls);
		$rssUrl       = $rssUrls[$idx];
		$rssFeedItems = FeedParser::getItem($rssUrl);
		
		// getItemの結果は連想配列になってるので配列のキーを「0」から振りなおす
		sort($rssFeedItems);
		
		return $rssFeedItems;
	}
}

$swc = new StrangeWordCreator();
$sw1 = $swc->_getStrangeWord('keiyoushi');
$sw2 = $swc->_getStrangeWord('meishi');

?>
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
<body>
 <div id="content">
 <span style="font-size:5em;">
  <span style="color:red;"><?php echo $sw1; ?></span><span style="color:blue;"><?php echo $sw2; ?></span>
 </span>
</div>
</body>
</html>

Last-modified: 2010-03-05 (金) 01:51:55 (3211d)