形態素解析で単語頻出度分析用のスクリプト

勢いでやらかした形態素分析ですが、思いつくままにbashPHPの強引な組み合わせで動かしてます


流れとしては

1. bashmecabの分析結果を受けとって一時ファイルに書き出し
2. PHPで一時ファイルから分析結果を取得して、集計してHTMLに書き出し

みたいな感じです。explode系の処理をbashで書くのがめんどくさかった&PHPのインチキ臭い連想配列動作*1が便利すぎなので、集計用の処理はPHPにぶんなげてみました。

業務じゃ使わないようなインチキコードがてんこもりです。


。。。どうやらPHPのMecab Extentionとやらもあるらしいので、そのうち(いつの日か)もう少し見た目のよろしい&まともなコードのWebアプリっぽいものを組んでみたいと思います。


フォームからテキスト流し込んで結果を出力。。。みたいな感じで


今回書いたスクリプトは下にかいときます。てきとーすぎ&コメントナッシングなので、暇つぶしにどうぞー

コマンドの引数として文章のファイル名を受け取ります

#!/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
    //変数初期化
    $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:配列キーにマルチバイトが使えるなんて!!!