WordPress Japanese AutoTagプラグインが動かない (2) プラグインの改造


Japanese AutoTagプラグインは、ブログエントリーのタイトルや本文の文字列を解析して、
自動的にタグを付けてくれる便利プラグインである。
 
前回紹介したように、プラグインがYahooの日本語形態素解析APIに渡すURL長が長すぎる場合、
すなわちブログ本文が長い場合に、日本語形態素解析APIからエラーが返り、タグ付ができないことがあることが判明した。
また、対処法として、ブログ本文ではなくタイトルのみをタグ付けの対象とする方法を紹介した。

別のアプローチとして、今回はプラグイン自体を改造して対処してみた。



japanese-autotag.phpに実装されている主な関数を紹介する。

関数名 概要
get_tags() ブログ内容をget_word_array()またはget_keyphrase_array()に渡す
get_word_array() Yahooの日本語形態素解析API結果を返す
get_keyphrase_array() Yahooのキーフレーズ抽出API解析結果を返す
プラグイン設定でkeyphraseを有効にするとこちらのAPIが使用される。筆者は使用していないため未確認。

 
改造ポイントとしてはget_tags()にて、ブログ内容を分割してget_word_array()またはget_keyphrase_array()に渡し、
解析結果を結合すればよい。

次に分割処理を実施する改造コードを紹介する。

get_tags() の 改造


before

	function get_tags( $post_id ) {
			
		$options = $this->get_options();
		
		if( !$options['appkey'] ) {
			return null;
		}
		
		$noise = explode('|', $options['noiselist']);
				
		$p = get_post( $post_id );
		
		$t = $p->post_title;
		
		if( $this->parse_body === 'on' ){
			$t .= ' ' . strip_tags($p->post_content); 
		}
		
		$wordclasses = $this->get_word_class( $options );
		
		// Tokenize		
		return ( $this->keyphrase_enabled  === 'on' ?
			$this->get_keyphrase_array(
				$options['appkey'], 
				$t,
				$noise,
				str_replace('\\\\', '\\', $options['expattern']) )
			:
			$this->get_word_array(
				$options['appkey'], 
				$t,
				$wordclasses,
				$noise,
				str_replace('\\\\', '\\', $options['expattern']) )
		
		);
	
	}

after

	function get_tags( $post_id ) {
			
		$options = $this->get_options();
		
		if( !$options['appkey'] ) {
			return null;
		}
		
		$noise = explode('|', $options['noiselist']);
				
		$p = get_post( $post_id );
		
		$t = $p->post_title;
		
		if( $this->parse_body === 'on' ){
			$t .= ' ' . strip_tags($p->post_content); 
		}
		
		$wordclasses = $this->get_word_class( $options );
		
		// Tokenize		
		if(false){

			return ( $this->keyphrase_enabled  === 'on' ?
				$this->get_keyphrase_array(
					$options['appkey'], 
					$t,
					$noise,
					str_replace('\\\\', '\\', $options['expattern']) )
				:
				$this->get_word_array(
					$options['appkey'], 
					$t,
					$wordclasses,
					$noise,
					str_replace('\\\\', '\\', $options['expattern']) )
			
			);
		}else{
			$tmp = array();		//YahooAPIによる抽出結果(1回の実行結果)
			$result = array();	//YahooAPIによる抽出結果(結合後)
			$input = $this->mb_str_split($t, 1024);//適当に1024文字で切る
			for ($i = 0; $i < count($input); $i++){
				$tmp =
					$this->keyphrase_enabled  === 'on' ?
					$this->get_keyphrase_array(
						$options['appkey'], 
						$input[$i],
						$noise,
						str_replace('\\\\', '\\', $options['expattern']) )
					:
					$this->get_word_array(
						$options['appkey'], 
						$input[$i],
						$wordclasses,
						$noise,
						str_replace('\\\\', '\\', $options['expattern']) );
				$result = array_merge($result, $tmp);
			}
			array_unique($result);//重複を除外する
			return $result;
		}
	}

39~62行目の部分で分割処理を実施している。
ちなみに22行目のfalseをtrueにすれば改造前と同じ動作をする。
 
なお、str_split()のマルチバイト版であるmb_str_split()は以下から拝借した。
マルチバイト文字列を指定文字数毎に分解

	function mb_str_split($str, $split_len = 1) {

	    mb_internal_encoding('UTF-8');
	    mb_regex_encoding('UTF-8');

	    if ($split_len <= 0) {
	        $split_len = 1;
	    }

	    $strlen = mb_strlen($str, 'UTF-8');
	    $ret    = array();

	    for ($i = 0; $i < $strlen; $i += $split_len) {
	        $ret[ ] = mb_substr($str, $i, $split_len);
	    }
	    return $ret;
	}


改造コードの適用は、くれぐれも自己責任にて実施して下さい。
以下が注意点です。
・ブログ投稿時の待ち時間が長くなります。(API複数回コール、タグ登録処理が増えるため)
・割りと大量にタグが付くので上手に整理する必要がある。(本記事に付いた割りと大量のタグを参照。よい整理方法があれば教えて下さい。)

1件のコメント

  1. “WordPress Japanese AutoTagプラグインが動かない (2) プラグインの改造 | 夏研ブログ” http://t.co/IEgb5W9B

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です