SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

目的に応じて適材適所で使うPHPライブラリ

文章の中のはてなキーワードをハイライトさせる

目的に応じて適材適所で使うPHPライブラリ(5)

新着キーワード検出クラスの作成

 php_mecabをインストールしたことでphpからMeCabを利用できるMeCab_Taggerというクラスが使えます。MeCab_Taggerを使うと次のようなコードでMeCabによる形態素解析結果を得られます。

MeCab_Taggerの利用例
$str = "2011年7月24日までにアナログテレビ放送は終了します。";
$t = new MeCab_Tagger();
$result = $t->parse($str);
echo $result;

 実行結果は以下のようになります。

MeCab_Taggerでの形態素解析実行結果
2011    名詞,数,*,*,*,*,*
年      名詞,接尾,助数詞,*,*,*,年,ネン,ネン
7       名詞,数,*,*,*,*,*
月      名詞,一般,*,*,*,*,月,ツキ,ツキ
24      名詞,数,*,*,*,*,*
日      名詞,接尾,助数詞,*,*,*,日,ニチ,ニチ
まで    助詞,副助詞,*,*,*,*,まで,マデ,マデ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
アナログ        名詞,一般,*,*,*,*,アナログ,アナログ,アナログ
テレビ  名詞,一般,*,*,*,*,テレビ,テレビ,テレビ
放送    名詞,サ変接続,*,*,*,*,放送,ホウソウ,ホーソー
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
終了    名詞,サ変接続,*,*,*,*,終了,シュウリョウ,シューリョー
し      動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
ます    助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
。      記号,句点,*,*,*,*,。,。,。

 今回のサンプルではMeCab辞書に登録したとおりに形態素解析結果を返却するというMeCab_Taggerクラスの特性を利用して、文章の中の新着キーワードを検出して配列で返却するクラスを作成します。

 MeCabはデフォルトではEUC-JPの文字コードで動作するため、形態素解析対象の文章をEUC-JPに文字コード変換して、結果をUTF-8で受け取れるようにします。

Utilクラス(抜粋)
function getKeywords($str)
{
    // 返却するキーワードを格納する配列
    $_return = array();
    
    // 改行を除く
    $str = ereg_replace("\r|\n","",$str);
    // EUC-JPへ文字コード変換
    $str = mb_convert_encoding ($str, "EUC-JP", auto );
    
    // 形態素解析の実行
    $t = new MeCab_Tagger();
    // 結果を1行単位に分割
    $m = explode("\n", $t->parse($str));
    
    foreach($m as $k=>$v){
        // UTF-8に文字コード変換
        $line = mb_convert_encoding ( $v, "UTF-8", auto );
        // 新着キーワード検出
        if(strstr($word, 'はてなキーワード') ){
            $keyword = explode("名詞", $word);
            $_return[] = trim($keyword[0]);
        }
    }
    return $_return;
}

 前項で紹介したように新着キーワードの形態素解析は以下のようになります。

新着キーワードの形態素解析
オタク中野要塞  名詞,固有名詞,キーワード,*,*,*,*,オタク中野要塞,オタク中野要塞,はてなキーワード

 解析結果に「はてなキーワード」があれば今回MeCabに登録した新着キーワードと判断して「名詞」より左のキーワードを返却します。上記の例のようにMeCab_Taggerクラスを利用するとMeCabに登録した辞書の書式で形態素解析結果からさまざまな処理を行うことができます。

HTML内の文章を形態素解析し、新着キーワードのハイライトを行う

 Ajaxを用いてHTML内の特定の箇所内の文章を形態素解析します。そのために必要なプロセスとして次の3つの作業が考えられます。

  1. HTML内の特定の箇所の文章を抜き出す
  2. 抜き出した文章をPHPに送信し、PHP内でキーワードの検出を行う
  3. PHPが出力した結果を受け取って表示処理を行う

 本記事ではAjaxライブラリprototype.jsを利用して上記3つの機能を実装します。prototype.jsはAjaxを利用するHTML内で次のように呼び出すだけで、同じHTML内で使用するJavascriptすべてでprototype.jsのメソッドが利用できるという利点があります。

prototype.jsの呼び出し
<script type="text/javascript" src="js/prototype.js"></script>

 サンプル実行時にはprototype.jp本家サイトよりversion 1.6.1をダウンロードしてサンプルフォルダ内のjsフォルダに配置してください。

 prototype.jsの主なメソッドは以下の通りです。

prototype.jsの主なメソッド
メソッド名 概要
$() document.getElementById()関数へのショートカット
$F() テキストボックスやドロップダウンリストのような、入力フォームフィールドの値を返却する
Ajax.Updater Ajaxで指定エレメントの内容を書き換える
Ajax.Request Ajaxリクエストを行う

 Ajax.Requestには以下のメソッドがあり、Ajax内でリクエストを行った後の処理も比較的容易に実装できます。

Ajax.Requestの主なメソッド
メソッド名 概要
onSuccess 通信が成功した時の処理
onFilure 通信が失敗した時の処理
onComplete 通信が完了した時の処理
onException 例外が発生した時の処理

 Ajax.Request内に各メソッドを配置したイメージは以下のようになります。

Ajax.Requestを利用する際の構造
Ajax.Requestを利用する際の構造

 以下の項よりAjax.Requestを利用して順を追ってAjaxによる形態素解析を説明します。

次のページ
HTML内の特定の箇所の文章を抜き出す

この記事は参考になりましたか?

目的に応じて適材適所で使うPHPライブラリ連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 片渕 彼富(カタフチ カノトミ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4991 2010/03/25 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー