[Tokyo.pm] Re: 単語を含む文字列の出現回数
shin honda
dev @ license.to
2002年 11月 20日 (水) 06:00:45 CST
まこと@仕事中です。
何度もソースを送ってしまいすみません。
> こんな4行のテキストを、単語「yahoo」で検索することを考え
> ますと、grep なら 3 行ヒットするわけです。
> 田口さんのスクリプトでも $WORDRE{"yahoo"} は 3 になります。
> まことさんのだと、$WORDRE{"yahoo"} が 1 になりませんか?
構文が通るかもチェックしてませんでしたm(__)m
とりあえず、もとのものに比べれば格段に早くなってるんではないかと^^;
あとは自力でがんばってください^^;>田口さん
#!/usr/bin/perl
use strict;
#######################################
# 定数定義
my(%URI,%WORD,%WORDC,%WORDRE);
my $N = 5;
my $outFileURI = 'URI3WORD.uri';
my $outFileWORD = 'URI3WORD.wod';
my $outFileWORDRE = 'URI3WORD.wre';
#######################################
# カウント処理
while (<>) {
chomp;
my $uri = $_;
##### URIをカウント
$URI{$uri}++;
##### 単語を取得
my $word = parse_word($uri);
##### 単語数をカウント
for(keys %{$word}){
$WORDC{$_} += $word->{$_};
$WORD{$_}++;
}
}
my @word1 = keys %WORD;
for(@word1){
my $word = $_;
/$word/ and $WORDRE{$word} += $WORD{$_} for(keys %WORD);
}
#######################################
# ファイル出力
print "== $outFileURI\n";
print $_, "\t", $URI{$_}, "\n" for(sort keys %URI);
print "== $outFileWORD\n";
print $_, "\t", $WORDC{$_}, "\n" for(sort keys %WORDC);
print "== $outFileWORDRE\n";
print $_, "\t", $WORDRE{$_}, "\n" for(sort keys %WORDRE);
exit;
#######################################
# URIを渡すと$N文字以上の単語=>単語数のハッシュリファレンスを返す関数
my %cache;
sub parse_word {
my $str = shift;
#既に処理した事のある文字列ならキャッシュを返す
return $cache{$str} if($cache{$str});
# 単語を探してカウントする
my %word;
while ($str =~ m|\b(\w{$N,})\b|go) { $word{$1}++ }
# キャッシュにいれる
$cache{$str} = \%word;
#単語がキーで単語数が値のハッシュリファレンスをかえす。
return $cache{$str};
}
1;
---------+---------+---------+---------+---------+---------+
SHIN HONDA <makoto @ cpan.jp> "http://www.cpan.jp/"
<makoto @ fes-total.com> "http://www.fes-total.com/"
FES Co., Ltd. Tel:+81-46-278-1153 Fax:+81-46-275-0966
Tokyo-pm メーリングリストの案内