hogehoge foobar Blog Style Beta

Web,Mac,Linux,JavaScript,Perl,PHP,RegExp,Git,Vim,Redmineなど技術的なことのメモや、ちょっと便利そうなものの紹介をしています。

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. 分析対象のテキストについて、ファイルから読み込むようにした。
  2. 文字が1文字のものもカウントする。
  3. 各項目をタブ区切りで出力
サンプルコード全体
#!/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列目 -> キーワードの長さ

になります。

標準出力する場合

デフォルトでは標準出力になります。
端末によっては文字化けが発生するので、「nkf」などで文字コードを変換してあげると良いです。

# perl ./kakasi_keyword_count.pl test.txt | nkf -w
hoge     2376    0
foo      132     2
bar      45      3
結果をファイルに書き込む場合

結果をファイルに書き込む場合は、リダイレクトで可能です。

# perl ./kakasi_keyword_count.pl test.txt > keyword.txt

今回参考にしたページ

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