2.3.4 評者をランキングする
今日は2.3.4節を実装してみました。指定したユーザに最もマッチするユーザを求めるtopMathcesサブルーチンを作りました。topMatchesは、データセットとユーザ名に加えて、結果の数と類似性スコアを求める関数(のリファレンス)を受け取り、スコアの高い順に並んだ配列(ハッシュの配列)を返すようにしています。
出来たもの
topMatchesは以下のようになりました。
# personに最もマッチするトップn人を返す sub topMatches { my ($prefs, $person, $n, $similarity) = @_; # person以外のユーザとのスコア算出 my %scores = (); foreach my $user (keys %{ $prefs }) { if ($user ne $person) { $scores{$user} = &$similarity($prefs, $person, $user); } } # スコアが高い順にソートする my @sortedscores = (); foreach my $user (sort {$scores{$b} <=> $scores{$a}} keys %scores) { my $h = { $user => $scores{$user} }; push(@sortedscores, $h); } # トップn人を返す my @result = (); for (my $i=0; $i<$n; $i++) { push(@result, $sortedscores[$i]); } return @result; }
標準入力からユーザと結果の数を与えると、マッチするユーザとそのスコアを得ることが出来ます。
Enter person1 ==> Toby Enter num of match persons ==> 3 Match Persons: Lisa Rose : 0.99124070716193 Mick LaSalle : 0.924473451641905 Claudia Puig : 0.893405147441564
今回は、類似性スコアを求める関数を指定して、ランキングになったユーザ名とスコアのペアを出力するということで、ハッシュの配列やサブルーチンのリファレンスを使ってみました。
コード置き場
これまでの部分も含んだソースコードをgistに置いております。
gist: 489178 - GitHub