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


**動作確認ディストリビューション [#oa81165b]
-[[CentOS]] [[5>CentOS/5/VMware Server]]
*PHP 5.3.2RC1に&color(Black){M};eCab extensionを追加インストール [#je5cb491]

&color(Black){M};eCab 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と&color(Black){M};eCab extensionを使ったサンプルプログラム [#v44154f7]
PHPのフレームワークであるRhacoのRSSパーサ機能と&color(Black){M};eCab extensionを利用して、「変な言葉生成プログラム」を作ってみました。
&br;
RSSの概要を抽出してきて、そこから「形容詞」+「名詞」のキーワードを作成するという、ごくごく単純なサンプルです。
&br;
なので、そこまで変な言葉が生まれなかったりもします。。。
&br;
ちなみに、このプログラムの開発途中で生まれた主なキーワードは、
&br;
「ずらり現金」、「おじさん鬼畜」、「フェロモンスパコン」、「ゲーム大学」、「さよならメガドラ」、「華々しく国会」、
&br;
「魔法大統領」、「祝痛み」、「i&color(Black){P};adGoogle」、「民主得」、「できる全員」、「する圧力」、「無敵バカ」などなど。
 <?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>
-参考サイト
--[[php_mecab-0.3.0.tgzのコンパイルが通りません:http://q.hatena.ne.jp/1252300304]]
-関連ページ
#ls2(PHP/,compact);
#ls2(eAccelerator,compact);
#ls2(Xcache,compact);
#ls2(MeCab/,compact);