header

PHPとKAKASIを使って単語に分解する(その1)

(1/3)

KAKASI という、 漢字かなまじり文を平仮名やローマ時に変換するプログラムがある。 これを利用すると、日本語テキストを単語に分解することができる。
PHP から外部プログラムを呼び出すサンプルとして、入力したコンテンツ(日本語テキスト)を 単語に分解するプログラムを作ってみることにする。

0001: <?php
0002: /** parsewords.php
0003:  * 単語に分解する
0004:  *
0005:  * @copyright (c)studio pahoo
0006:  * @author     パパぱふぅ
0007:  * @version     1.1  2007/09/09 1行取り出し処理を修正した
0008:  * @version     1.0  2006/01/28
0009: */
0010: mb_internal_encoding('SJIS');
0011: $myself = basename($_SERVER['SCRIPT_NAME']);
0012: 
0013: /**
0014:  * kakasiの実行パス
0015:  * @global string $Kakasi
0016: */
0017: $Kakasi = '/usr/bin/kakasi';                  //Linuxの場合(例)
0018: // $Kakasi = 'C:\\kakasi\\bin\\kakasi.exe';        //Windowsの場合(例)
0019: 
0020: /**
0021:  * kakasiを使って単語に分解する
0022:  * @param string $kakasi kakasiの実行パス
0023:  * @param string $str    分解するコンテンツ
0024:  * @param string $array  分解結果を格納する配列
0025:  * @return なし
0026: */
0027: function parsing($kakasi$str, &$array) {
0028:     //形態素解析をしたい文章を渡しつつ、kakasiへのハンドルオープン
0029:     $handle = popen("echo '$str' | $kakasi -w ", "r");
0030: 
0031:     //結果を1行ずつ取得
0032:     while ($get_kakasi = fgets($handle)) {
0033:         //kakasiの結果を分解
0034:         $result = split("[\t\r\n' ]", $get_kakasi);
0035:         //結果を配列に格納する
0036:         foreach ($result as $key=>$val) {
0037:             if ($val != '') {
0038:                 if (isset($array[$val]))      $array[$val]++;
0039:                 else                            $array[$val] = 1;
0040:             }
0041:         }
0042:     }
0043:     pclose($handle);
0044: }
0045: 
0046: // 表示処理 =================================================================
0047: echo <<< EOF
0048: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
0049:  "http://www.w3.org/TR/html4/loose.dtd">
0050: <html lang="ja">
0051: <head>
0052: <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
0053: <title>単語に分解</title>
0054: </head>
0055: <body>
0056: 
0057: EOF;
0058: // 【1】テキスト入力
0059: if (isset($_POST['text']) == FALSE) {
0060: echo <<< EOF
0061: <h1>■単語に分解</h1>
0062: <form method="post" action="$myself" enctype="multipart/form-data">
0063: 分解する文章<br />
0064: <textarea name="text" rows="10" cols="80"></textarea><br />
0065: <input type="submit" name="submit" value="分解実行" />
0066: </form>
0067: 
0068: EOF;
0069: // 【2】分解結果表示
0070: else {
0071: $contents = $_POST['text'];        //分解するコンテンツ
0072: $keywords = array();            //配列を用意しておく
0073: 
0074: //1行ずつ取り出して単語に分解する
0075: $str = strtok($contents, "\n");
0076: while ($str != FALSE) {
0077:     parsing($Kakasi$str$keywords);
0078:     $str = strtok("\n");
0079: }
0080: 
0081: arsort($keywords);     //出現回数の多い順に並び替え
0082: 
0083: echo <<< EOF
0084: ■分解した単語</h1>
0085: <table border="1">
0086: <tr><th>出現回数</th><th>単語</th></tr>
0087: 
0088: EOF;
0089: foreach ($keywords as $key=>$val) {
0090:     echo "<tr><td align=\"right\">$val</td><td>$key</td></tr>\n";
0091: }
0092: echo "</table>\n";
0093: }
0094: 
0095: echo <<< EOF
0096: </body>
0097: </html>
0098: 
0099: EOF;
0100: ?>

プログラムを実行する

プログラムをダウンロードする

(この項つづく)