形態素解析で単語頻出度分析用のスクリプト
勢いでやらかした形態素分析ですが、思いつくままにbashとPHPの強引な組み合わせで動かしてます
流れとしては
1. bashでmecabの分析結果を受けとって一時ファイルに書き出し
2. PHPで一時ファイルから分析結果を取得して、集計してHTMLに書き出し
みたいな感じです。explode系の処理をbashで書くのがめんどくさかった&PHPのインチキ臭い連想配列動作*1が便利すぎなので、集計用の処理はPHPにぶんなげてみました。
業務じゃ使わないようなインチキコードがてんこもりです。
。。。どうやらPHPのMecab Extentionとやらもあるらしいので、そのうち(いつの日か)もう少し見た目のよろしい&まともなコードのWebアプリっぽいものを組んでみたいと思います。
フォームからテキスト流し込んで結果を出力。。。みたいな感じで
今回書いたスクリプトは下にかいときます。てきとーすぎ&コメントナッシングなので、暇つぶしにどうぞー
- bash側
コマンドの引数として文章のファイル名を受け取ります
#!/bin/sh text=$1 #初期化 rm result.txt #解析対象の品詞IDを指定 for hid in 36 37 38 39 40 41 42 43 44 45 46 47 do #一時ファイルに書き出し /usr/local/bin/mecab -F"%m,%h\n" -E"EOS\n" $1 | grep ,${hid} >> result.txt done #PHP呼び出し /usr/bin/php -f total.php
- PHP側
スタイル、ファイルパスもべた書きのうんこコード、いきおいやっほー
<?php //変数初期化 $results_array = array(); $total_num = 0; //閾値を設定 $min = 5; //一時ファイル読み込み $lines = file("result.txt"); //頻出回数を集計 foreach($lines as $line) { $tmp_array = explode(',', $line); if(array_key_exists($tmp_array[0], $results_array)) { $results_array[$tmp_array[0]] += 1; } else { $results_array[$tmp_array[0]] = 1; } $total_num++; } //HTML整形 $content =' <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>mecab analyze</title> </head> <body style="font-size:16px;"> <div style="border:3px solid blue;width:570px;"> <ul style="width:570px;"> '; //タグクラウドっぽく書き出す処理 foreach($results_array as $key => $value) { //ここらへんのサイズ定義はてきとう $font_size = floor($value / $min) ; $list_width = $font_size * 75 ."px"; //閾値以下を切り捨て if(0 < $font_size) { $content .= '<li style="float:left;list-style:none;width:' . $list_width . ';font-size:' . $font_size . 'em;">' . $key . '<span style="font-size:16px;">(' . $value . ')</span></li>'; } } $content .=' </ul> <div style="clear:both;"></div> </div> </body> </html> '; //HTML書き出し file_put_contents('result.html', $content); ?>
*1:配列キーにマルチバイトが使えるなんて!!!