[Tokyo.pm] 単語を含む文字列の出現回数

taguti taguti @ secom-sis.co.jp
2002年 11月 17日 (日) 23:45:28 CST


田口です。

皆さんのお力添えをお願いしたいのですが...ヒントだけでも。

現在、インターネットアクセスのログ解析をしているのですが、
各文字列の出現回数を調べたいと思います。
各文字列とは、URLに現われる単語(\b\w+\b)の事です。
(スクリプトを見てもらったほうが早いかと思いますが)
URL内の各単語を数えてから、その単語で各URLを正規表現マッチ
掛けた時に何行ヒットするかを知りたいのです。

grep yahoo access.log |wc -l

とすると、www.yahoo.comもwww.yahooBB.comもヒットする。
そのヒット件数を知りたい。

URI.txtは1日分のアクセスログで300万件あります。
単語は5文字以上を対象としました。
下の実行ログでは、先頭600単語まで出てますが、
ここまでで約1時間かかってます。
単語の数が3392663なので、当分終わりません。
3392663 / 600 / 24 = 235日
で年内は無理みたいです。(^_^; 
これをもっと高速に出来ないでしょうか?
なにか良い方法あったら教えて下さい。

$ TEST2WORD.pl URI.txt
=== URI to WORD ===
$URIno=652389 $WORDno=3392663 $maxWordLen=140
start word sumarize...
100: 00000061 ...
200: 00000313 ...
300: 00000539x ...
400: 00000932 ...
500: 000014064375 ...
600: 000039 ...

#!/usr/bin/perl
#-----------------------------------------------------------
# file : TEST2WORD.pl
# func : URIから単語の出現数を計算
#-----------------------------------------------------------
use strict;
my ($outFileURI, $outFileWORD, $outFileWORDREX);
my (%URI, %WORD, %WORDREX);
my ($URIno, $WORDno, $WORDREXno);
my ($maxWordLen);
my ($uriList, $uriListSave);
my ($rec, $recT);
$outFileURI     = "URI2WORD.uri";
$outFileWORD    = "URI2WORD.wod";
$outFileWORDREX = "URI2WORD.wre";
print "=== URI to WORD ===\n";
#--------------------------------------------------
# ファイル読込み
#--------------------------------------------------
while (my $uri=<>) {
	chomp $uri;
	++$URI{$uri};
	$uri =~ s|(\w+)|++$WORD{$1} if length($1) >= 5|ge;
}
#--------------------------------------------------
# 単語の長短
#--------------------------------------------------
$maxWordLen = 0;
for my $w (keys %WORD) {
	$maxWordLen = length($w) if length($w) > $maxWordLen;
}
$URIno  = scalar keys %URI;
$WORDno = scalar keys %WORD;
print "\$URIno=$URIno \$WORDno=$WORDno \$maxWordLen=$maxWordLen\n";
#--------------------------------------------------
# 長いURI列の作成
#--------------------------------------------------
for my $u (sort keys %URI) {
	$uriListSave .= "\t" . $u . " " . $URI{$u};
}
#--------------------------------------------------
# 単語解析
#--------------------------------------------------
print "start word sumarize...\n";
$rec =$recT = 0;
for my $w (sort keys %WORD) {
	++$rec;
	++$recT;
	if ($recT >= 100) {
		$recT = 0;
		print STDERR "$rec: $w ...\n"
	}
	$uriList = $uriListSave;
	$uriList =~ s|\t\S*$w\S*\s(\d+)|$WORDREX{$w} += $1|ge;
}
$WORDREXno = scalar keys %WORDREX;
print "end \$WORDREXno=$WORDREXno\n";
#--------------------------------------------------
# ファイル出力
#--------------------------------------------------
print "save $outFileURI...\n";
open(OUT, ">$outFileURI");
for my $u (sort keys %URI) {
	print OUT $u, "\t", $URI{$u}, "\n";
}
print "save $outFileWORD...\n";
open(OUT, ">$outFileWORD");
for my $w (sort keys %WORD) {
	print OUT $w, "\t", $WORD{$w}, "\n";
}
print "save $outFileWORDREX...\n";
open(OUT, ">$outFileWORDREX");
for my $w (sort keys %WORDREX) {
	print OUT $w, "\t", $WORDREX{$w}, "\n";
}
print "All end.\n";
####

--
Hirosi Taguti
H-taguchi @ secom.co.jp



Tokyo-pm メーリングリストの案内