Perl + Kakasi でテキストファイル内のキーワードの出現回数をカウントする。
テキストファイルに含まれる単語やキーワードの出現回数をカウントするために「Perl + Kakasi」でやってみました。
Perlのスクリプトの部分は「【perlメモ】KAKASIを使った文章のわかち書き - KUMA TYPE」を参考にさせていただきました。(大変感謝です。)
Kakasi(namazu) のインストール
最初に分かち書き処理をおこなうために、「kakasi」とPerlモジュールの「perl-Text-Kakasi」をインストールします。
実際には「kakasi」と「perl-Text-Kakasi」は「namazu」パッケージに含まれるので、「namazu」をインストールすればOKになります。
但し、CentOSの場合は標準の yum リポジトリに「namazu」は含まれて居ないので、Fedora の yum リポジトリを追加してインストールします。
Fedora の yum リポジトリの追加設定
vim などで「/etc/yum.repos.d/dag.repo」を開きます。
# vim /etc/yum.repos.d/dag.repo
ファイルを開いたら、下記の内容をファイルに書き込み、ファイルを閉じます。
[dag] name=Dag RPM Repository for Fedora Core baseurl=http://ftp.riken.jp/Linux/dag/fedora/$releasever/en/$basearch/dries/ gpgcheck=0 enabled=0
これで、yum リポジトリの追加設定は完了です。
yum から Kakasi(namazu) をインストール
yum から「namazu」をインストールします。
インストールする際に「--enablerepo=dag」で、先程設定した Fedora の yum リポジトリを使用するように指定します。
インストールの際に「kakasi」と「perl-Text-Kakasi」がちゃんとインストールされていることを確認します。
# yum clean all # yum install namazu --enablerepo=dag 〜 (省略) 〜 Running rpm_check_debug Running Transaction Test Finished Transaction Test Transaction Test Succeeded Running Transaction Installing : kakasi 1/4 Installing : perl-File-MMagic 2/4 Installing : perl-Text-Kakasi 3/4 Installing : namazu 4/4 Installed: namazu.i386 0:2.0.16-1.fc6 Dependency Installed: kakasi.i386 0:2.3.4-22.fc6 perl-File-MMagic.noarch 0:1.27-1.fc5.rf perl-Text-Kakasi.i386 0:2.04-3.fc6 Complete!
インストールが完了したら、念の為「kakasi -v」で kakasi のバージョンを確認します。
# kakasi -v KAKASI - Kanji Kana Simple Inverter Version 2.3.4 Copyright (C) 1992-1999 Hironobu Takahashi. All rights reserved. Usage: kakasi -a[jE] -j[aE] -g[ajE] -k[ajKH] -E[aj] -K[ajkH] -H[ajkK] -J[ajkKH] -i{oldjis,newjis,dec,euc,sjis} -o{oldjis,newjis,dec,euc,sjis} -r{hepburn,kunrei} -p -s -f -c"chars" [jisyo1, jisyo2,,,]
「kanwadict」へのシンボリックリンクの作成
インストールしたままの状態で、Perl から 「perl-Text-Kakasi」を使用した際に、下記のようなエラーが発生します。
# perl ./kakasi_keyword_count.pl test.txt > keyword.txt /usr/share/kakasi/kanwadict: そのようなファイルやディレクトリはありません
「/usr/share/kakasi/kanwadict」が存在しないためエラーが発生します。
実際「kanwadict」は「/usr/local/share/kakasi/kanwadict」にインストールされているので、上記のエラーが発生した場所にシンボリックリンクを作成しておきます。
# ln -s /usr/local/share/kakasi/kanwadict /usr/share/kakasi/kanwadict
キーワード出現回数カウント用の Perl スクリプトの作成
ここまでで、環境設定が完了したので、最後に Perl スクリプトを作成します。
冒頭でも書いたとおり、今回のスクリプトは「【perlメモ】KAKASIを使った文章のわかち書き - KUMA TYPE」を参考にさせていただきました。
主に変更した点は以下のとおりになります。
- 分析対象のテキストについて、ファイルから読み込むようにした。
- 文字が1文字のものもカウントする。
- 各項目をタブ区切りで出力
サンプルコード全体
#!/usr/bin/perl use strict; use warnings; use utf8; use Carp; use Encode qw/from_to decode_utf8 encode_utf8 encode decode/; use Text::Kakasi; my $delimiter = "\t"; if( @ARGV != 1 ){ die "使用方法\n$0 fileName \n"; } my $fileName = shift; croak "$fileName don't exist $!" unless -f $fileName; open( IN, "<:utf8", $fileName ); my @ary_text = <IN>; close(IN); my $text = join(' ',@ary_text); chomp($text); $text = encode('cp932' => $text); my $res = Text::Kakasi::getopt_argv('-w'); my $str = Text::Kakasi::do_kakasi($text); my @ary_keywords = split(/( |\n)/,$str); my %hash_keywords =(); foreach my $keyword (@ary_keywords){ chomp($keyword); $keyword =~ s/^\s*(.*?)\s*$/$1/; $keyword =~ s/^ *(.*?) *$/$1/; $hash_keywords{"$keyword"}++; } foreach my $keyword ( sort { $hash_keywords{$b} <=> $hash_keywords{$a} } keys %hash_keywords){ my $len = length($keyword); if ( $len ne "" ){ print $keyword,$delimiter,$hash_keywords{$keyword},$delimiter,$len,"\n"; } }
実際にスクリプトを実行してみる
スクリプトの作成まで完了したので、実際に動作をさせてみます。
実行時は、コマンド引数として分析対象となる「ファイル名」を指定します。
結果として出力される文字列については、
- 1列目 -> キーワード
- 2列目 -> キーワードの出現回数
- 3列目 -> キーワードの長さ
になります。
今回参考にしたページ
【perlメモ】KAKASIを使った文章のわかち書き - KUMA TYPE
http://blog.kumacchi.com/2010/11/perlkakasi.html
Fedora8 namazuでサイト内検索 〜自(己満足)宅サーバー〜
http://jintaro.com/fedora8/f8_namazu.shtml
あーありがち - yum リポジトリで特定のパッケージだけを扱う
http://aligach.net/diary/20071029.html
質問BBS - Fedoraで自宅サーバー構築
http://fedorasrv.com/patio/patio.cgi?mode=res&no=2399&pno=0
namazu を使用した全文検索システムの構築.htm
http://www6.airnet.ne.jp/~dr_mkag/Linux/appli/namazu.html