[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 メーリングリストの案内