KAIHATSUGIKEN GROUP
************************************************************************************
25 例題
**************
単語の出現頻度
単語の出現頻度を調べてみましょう。
単語は単純に/w+ と言うパターンにします。
while(<>)で各行ごとにループして、その中で各単語ごとにループします。
全体は・・・
use English;
while(<>){
while(/\w+/g){
$word=$match;
各単語の処理
}
}
各単語の処理ですが、%Count と言う連想配列に出現回数を入れることにします。
単語がキーで値が回数です。
if(exists($Count{$word})){
$Count{$word}++;
}else{
$Count{$word}=1;
}
と言う感じになります。
すでに出現していたら一回増やして初めてだったら1にするというわけです。
ところで存在しないキーで読み出すと、undef(未定義)と言う値が帰ってきます。
undefは数としては0として扱われます。
と言うことは$Count{$word}++;でちゃんと1になるはずです。
結局if 文は無くても大丈夫と言うことになります。
プリント文を書き加えると
use English;
while(<>){
while(/\w+/g){
$word=$match;
$Count{$word}++;
}
}
foreach $key(sort(keys(%Count))){
print"$key\t$Count{$key}\n"
}
そして ソートします。
use English;
while(<>){
while(/\w+/g){
$word=$match;
$Count{$word}++;
}
}
foreach $key(sort{$Count{$b}<=>$Count{$a}}keys(%Count)){
print"$key\t$Count{$key}/n"
}
これで 出現頻度の高い順番にソートされます。
***********************************************
集合として
*********
連想配列はキーの集合として考えると良いです。
"a","b","c" と言う要素があります。
その連想配列は
%Set=("a"=>1,"b"=>1"c"=>1);
となります。
この集合に要素 "d"を追加するには
$Set{"d"}=1; を書き加えるだけで良いです。
要素"a"を削除するのは
delete($Set{"a"});
です。
ある要素 $x がその集合に含まれるかどうか調べるのは existsです。
if(exists($Set{$x})){
}
全ての要素の値を足すときは
%Set1=("a"=>1,"b"=>1,"c"=>1);
%Set2=("b"=>1,"c"=>1,"d"=>1);
%Union=(%Set1,%Set2);
これで それぞれの 値はUnionに代入されて和集合が出来ます。
積集合の法は片方の集合の要素(キー)に関してループを回してその要素がもう一方の集合にも
含まれていたら積集合に追加していきます。
%Intersection=();
foreach $key(keys(%Set1)){
if(exists($Set2{$key})){
$Intersection{$key}=1;
}
}
*************************************************