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

taguti taguti @ secom-sis.co.jp
2002年 11月 19日 (火) 00:02:58 CST


田口です。反応おそくて済みません。

maeda> > 置換しないでコードだけ実行する書き方が判んないです。
maeda> 
maeda> いや、だから、while(m//g)……。

やっと、理解しました。whileを使うのかー。(って、私はPerl何年生?)
結果は、$uriList =~ s|\t\S*$w\S*\s(\d+)|$WORDREX{$w} += $1|ge;
と同じになることも確認しました。でもm//gのほいうが若干早い。

で、昨日のプログラムを少し書き直しました。
でもs///gからm///gのほかは、さほど変わってません。
036:   my %thisWord;          # ここに、このURLの重複を省いた単語一覧を作成
040:   while ($uriString =~ m|\b(\w+)\b|g) { ++$thisWord{$1} if length($1) >= 5 }
で、同じURLの同じ単語を省いたくらいです。

$ grep yahoo URL_5M.txt |wc -l
   6892
で、結果は正しそうです。(未だ全部見てないけど)

URLのファイル件数で、
1万件で31秒
5万件で500秒
です。
1日のアクセス件数が300万から500万件なので、1日分だとやはり
当分終わりません。


i16> i16(愛一郎)@CGIメーリングリスト です(^^)/

CGIメーリングリストは私もお世話になってます。ロムばっかですが。(^_^)ゞ

i16> それより僕もログ解析はすることあるんで
i16> 部分単語のヒット数をどうして知りたいのかのほうに
i16> 僕は興味があるんですけどナゼ?(^^;;

今のところ、それほど重要な目的はありません。_(-_-;_

今度の仕事は、社員のインターネット・アクセス監査なんです。
使うのは会社の人事部あたり。
社員番号で検索して、その人のアクセスしたURL一覧を表示するとか、
ある文字列を入力して、その文字列を含むアクセス一覧を表示したり。
ア〇〇〇サイトばっか見ている社員を特定したいらしい。
社員が数万人いて、1日のアクセスが数百万件あるので、応答時間が
とても気になるんです。で、応答時間を計測するのに、単語とヒット件数
の一覧が欲しくなったのです。
入力は単語とは限らず、yahooでなくてyahoかもしれないけど。
今私が作成しているプログラムでは、応答時間はヒット件数にかなり
左右される事がわかっています。それで...

愛一郎さんが示してくれたプログラムは未だ試していません。

Hirosi Taguti
H-taguchi @ secom.co.jp


------------------------------------------------------------ 1万件で31秒
13:37:39 $ TEST3WORD.pl URL_1M.txt
=== URI to WORD (3) ===
end reading IN file. $rec=10000 $URIno=4383
end extracting WORD, $WORDno=4192
start word sumarize in URI...
1000: __tn_rue ...
2000: h_link03_on ...
3000: nth_theme_business_modern_gray_stroke_bg ...
4000: train_accindents ...
end $WORDREno=4192
save URI3WORD.uri...
save URI3WORD.wod...
save URI3WORD.wre...
All end, $secTaken=31
13:38:11 $
------------------------------------------------------------ 5万件で500秒
13:40:45 $ TEST3WORD.pl URL_5M.txt
=== URI to WORD (3) ===
end reading IN file. $rec=50000 $URIno=18717
end extracting WORD, $WORDno=15080
start word sumarize in URI...
1000: 17140_s ...
2000: 7hn32fczqiwz61ucse8888qa4 ...
3000: a0024858 ...
4000: bgbluebottom ...
5000: consumptionjunction ...
6000: ft_copyright_w ...
7000: ic_nt ...
8000: keepoint ...
9000: masthead_01 ...
10000: new_ill_now03d ...
11000: pt_3_01 ...
12000: shinoda ...
13000: taraba_mini ...
14000: topichumor ...
15000: yum_15_s ...
end $WORDREno=15080
save URI3WORD.uri...
save URI3WORD.wod...
save URI3WORD.wre...
All end, $secTaken=500
13:49:15 $

yahoo	6892

$ grep yahoo URL_5M.txt |wc -l
   6892

------------------------------------------------------------

プログラムソース

001: #!/usr/bin/perl
002: #-----------------------------------------------------------
003: # file : TEST3WORD.pl (m///g方式)
004: # func : URIから単語の出現数を計算
005: #-----------------------------------------------------------
006: use strict;
007: my ($outFileURI, $outFileWORD, $outFileWORDRE);
008: my (%URI, %WORD, %WORDRE);
009: my ($URIno, $WORDno, $WORDREno);
010: my ($maxWordLen);
011: my ($wordList, $wordListSave);
012: my ($uriList, $uriListSave);
013: my ($rec, $recT, $staTime, $secTaken);
014: $outFileURI    = "URI3WORD.uri";
015: $outFileWORD   = "URI3WORD.wod";
016: $outFileWORDRE = "URI3WORD.wre";
017: print "=== URI to WORD (3) ===\n";
018: $staTime = time;  # スタート秒
019: #--------------------------------------------------
020: # ファイル読込み、URLをサマリー (URL : 出現回数)
021: #--------------------------------------------------
022: $rec = 0;
023: while (my $uri=<>) {
024:   ++$rec;
025:   chomp $uri;
026:   ++$URI{$uri};
027: }
028: $URIno = scalar keys %URI;
029: print "end reading IN file. \$rec=$rec \$URIno=$URIno\n";
030: #--------------------------------------------------
031: # 単語の抽出
032: #--------------------------------------------------
033: for my $uri (keys %URI) {
034:   my $uriString = $uri;      # URLの文字列
035:   my $uriNum    = $URI{$uri};    # URLの出現回数
036:   my %thisWord;          # ここに、このURLの重複を省いた単語一覧を作成
037: 
038:   #  $uriString =~ s|\b(\w+)\b|++$thisWord{$1} if length($1) >= 5|ge;
039: 
040:   while ($uriString =~ m|\b(\w+)\b|g) { ++$thisWord{$1} if length($1) >= 5 }
041: 
042:   for my $w (keys %thisWord) {
043:     $WORD{$w} += $uriNum;
044:   }
045: }
046: $WORDno = scalar keys %WORD;
047: print "end extracting WORD, \$WORDno=$WORDno\n";
048: #--------------------------------------------------
049: # URI列の作成
050: #--------------------------------------------------
051: for my $u (sort keys %URI) {
052:   $uriListSave .= "\t" . $u . " " . $URI{$u};
053: }
054: #--------------------------------------------------
055: # 単語のヒット件数の計算(URLに含まれる単語)
056: #--------------------------------------------------
057: print "start word sumarize in URI...\n";
058: $rec =$recT = 0;
059: for my $w (sort keys %WORD) {
060:   ++$rec;
061:   ++$recT;
062:   if ($recT >= 1000) {
063:     $recT = 0;
064:     print STDERR "$rec: $w ...\n"
065:   }
066:   #  $uriList = $uriListSave;
067:   #  $uriList =~ s|\t\S*$w\S*\s(\d+)|$WORDRE{$w} += $1|ge;
068: 
069:   while ($uriListSave =~ m|\t\S*$w\S*\s(\d+)|g) { $WORDRE{$w} += $1 }
070: }
071: $WORDREno = scalar keys %WORDRE;
072: print "end \$WORDREno=$WORDREno\n";
073: #--------------------------------------------------
074: # ファイル出力
075: #--------------------------------------------------
076: print "save $outFileURI...\n";
077: open(OUT, ">$outFileURI");
078: for my $u (sort keys %URI) {
079:   print OUT $u, "\t", $URI{$u}, "\n";
080: }
081: print "save $outFileWORD...\n";
082: open(OUT, ">$outFileWORD");
083: for my $w (sort keys %WORD) {
084:   print OUT $w, "\t", $WORD{$w}, "\n";
085: }
086: print "save $outFileWORDRE...\n";
087: open(OUT, ">$outFileWORDRE");
088: for my $w (sort keys %WORDRE) {
089:   print OUT $w, "\t", $WORDRE{$w}, "\n";
090: }
091: $secTaken = time - $staTime;
092: print "All end, \$secTaken=$secTaken\n";
093: ####



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