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: ?>
| 2007年09月09日更新 | ||
| <<前へ | <目次> | 次へ>> |
| 戻る | 【関連ページ】 | |