$value ) if( $value['eid'] == $eid ) return $value; return null; } function RecommendedEntry_updateIndexFile( $eid_updated, $eid, $direction ) { $filename = '/var/www/VirtualDomain/kenji00.com/blog/recommend_data'; is_dir( $filename ) || mkdir( $filename ); $filename .= '/'. substr( $eid_updated, -1 ); is_dir( $filename ) || mkdir( $filename ); $filename .= sprintf( '/%d.txt', $eid_updated); file_exists( $filename ) || touch( $filename ); $fp = @fopen( $filename, 'r+' ); if( $fp ) { if( flock( $fp, LOCK_EX | LOCK_NB )) { $ret = ''; $not_found = 1; while( !feof( $fp ) && ( $buf = fgets( $fp ))) { list( $_eid, $_n0, $_n1 ) = split( "[\t\r\n]", $buf ); if( $eid == $_eid ) { $not_found = 0; $direction ? $_n1++ : $_n0++; } $ret .= sprintf( "%d\t%d\t%d\n", $_eid, $_n0, $_n1 ); } if( $not_found ) $ret .= sprintf( "%d\t%d\t%d\n", $eid, 1 - $direction, $direction); rewind( $fp ); fwrite( $fp, $ret, strlen( $ret )); } fclose( $fp ); } } function RecommendedEntry_incoming() { $eid_prev = $_COOKIE['mtrcmnd_eid']; if( isset( $eid_prev )) { if( $eid_prev != 156 && RecommendedEntry_getEntryData( $eid_prev )) { RecommendedEntry_updateIndexFile( 156, $eid_prev, 0 /*incoming_from*/ ); RecommendedEntry_updateIndexFile( $eid_prev, 156, 1 /*outgoing_to*/ ); } } else { RecommendedEntry_updateIndexFile( 156, 156, 0 /*incoming_from*/ ); } } RecommendedEntry_incoming(); function RecommendedEntry_outgoing() { setcookie( 'mtrcmnd_eid', 156, time() + 2592000, '/' ); } RecommendedEntry_outgoing(); function RecommendedEntry_initialize( $mode = 0 ) { global $RecommendedEntry_table; $RecommendedEntry_table = array(); $filename = '/var/www/VirtualDomain/kenji00.com/blog/recommend_data/'. substr( '156', -1 ). '/156.txt'; $fp = @fopen( $filename, 'r' ); if( $fp ) { if( flock( $fp, LOCK_SH | LOCK_NB )) { while( !feof( $fp ) && ( $buf = fgets( $fp ))) { list( $_eid, $_n0, $_n1 ) = split( "[\t\r\n]", $buf ); if( 156 == $_eid ) continue; else if( $mode == 1 ) $RecommendedEntry_table{$_eid} = $_n0; else if( $mode == 2 ) $RecommendedEntry_table{$_eid} = $_n1; else $RecommendedEntry_table{$_eid} = $_n0 + $_n1; } arsort( $RecommendedEntry_table, SORT_NUMERIC ); } fclose( $fp ); } } function RecommendedEntry_GetEntry( $_index ) { global $RecommendedEntry_table; foreach( $RecommendedEntry_table as $eid => $count ) { if( --$_index ) continue; $entry = RecommendedEntry_getEntryData( $eid ); if( $entry ) $entry['count'] = $count; return $entry; } } ?> [memo][SEO]KH Coderで検索キーワードをテキストマイニング - 寝不足にて候(仮)
Aug
17
2008

[memo][SEO]KH Coderで検索キーワードをテキストマイニング

アンケートの自由回答データ入手できたので、業者にテキストマイニングを依頼。
数社の見積もりを取ったところ、簡易レポートつきで30万~50万くらい。
某電々系SIerに発注したところ、PPTのテンプレートだけがcoolなショボい納品物に眩暈がしたので、オープンソースなテキストマイニングツールを探してみた。

KH Coder

KH Coderとは、内容分析(計量テキスト分析)もしくはテキストマイニングのためのフリーソフトウェアです。新聞記事、質問紙調査における自由回答項目、インタビュー記録など、社会調査によって得られる様々な日本語テキスト型データを計量的に分析するために製作されました。

Windows版では、その他の必須ソフトウェア(ChaSen + MySQL + Perl + 各種Perlモジュール)はKH Coderの配布パッケージに同梱されています。また、これらの必須ソフトウェアの設定はKH Coderが自動的に行います。

なんか良さげなので、会社でインストール申請出す前に自宅でテスト。

とりあえずWindows版のバイナリで、このサイトの検索キーワードをマイニングしてみた。
元ネタは、Google Analyticsから。2,664種類のフレーズを.csvで入手。

[起動して]
113-KHcoder_1st.jpg

[ファイルを読み込んで]
111-KHcoder_2nd.jpg

[前処理を実行]
119-KHcoder_3rd.jpg

[処理完了]
123-KHcoder_4th.jpg

すると
[品詞別の出現回数]
121-demo0.jpg

[KWIC(keyword in context)]
125-demo2.jpg

[連関規則]
127-demo1.jpg

といったデータが簡単に解析できます。
その他にも、外部変数として読み込んだデータとのクロス集計やワードの出現回数分布、コロケーション(共起)統計もできちゃう。さらにExcel上で整形・グラフ化するためのマクロ付き。

外注すると30万の納品物があっという間にお手元に。

今回の様に検索キーワード解析だと、CVRの良いワードと相関の高いSEM入札/SEO用ワードを探したり...といった作業も楽に行えると思われ。

Perlのソースも配布されていることですし、コレでwebサービスしたら便利だと思うなぁ。

このエントリを読んだ人はこんなんも読んでいます

トラックバック(0)

トラックバックURL: http://blog.kenji00.com/MT/mt-tb.cgi/155

コメントする

過去のエントリ(一覧)

Powered by Movable Type 4.261
Creative Commons License
このブログはクリエイティブ・コモンズでライセンスされています。