"タグ導入〜それでも捨てられないカテゴリ"では、ogawa さん作の Tagwire Plugin に改造を施し、従来のカテゴリとタグによる分類を橋渡しするための方法を紹介しました。カテゴリアーカイブにおいて、そのカテゴリのエントリ内で頻出するタグを列挙すると、それはカテゴリの特徴を代表するタグと見なすことができます。しかし列挙されたタグが、そのカテゴリとどの程度の関連性があるのか一見して判りません。
このエントリでは、抽出されたタグの関連度を、具体的なスコアとして数値表示するための方法を紹介しています。
以下のソースを参考に、tagwire.pl を変更します。この改造は、Tagwire Plugin に既にMTTagsInEntries が導入されていることが前提になりますので、先にそちらの改造を行っておいてください。
;# MT::Template::Context->add_container_tag (... が続くあたりに追加します
;# piroli++, '05/09/27
MT::Template::Context->add_tag('TagScore' => &tag_score);
sub tag_score {
$_[0]->stash('Tagwire::tag_score') || 0;
}
;# sub tags_in_entries {...} 付近
:
:
my @res;
my $builder = $ctx->stash('builder');
my $tokens = $ctx->stash('tokens');
my $i = 0;
foreach (@list) {
last if $lastn && $i >= $lastn;
local $ctx->{__stash}{'Tagwire::tag'} = $_;
local $ctx->{__stash}{'Tagwire::tag_count'} = $tags{$_};
local $ctx->{__stash}{'Tagwire::tag_date'} = $ts{$_};
;# piroli, '05/09/27, コンテクスト中のエントリにおけるタグの使用率
local $ctx->{__stash}{'Tagwire::tag_score'} = int (0.5 + $tags{$_} * 100 / (scalar @$entries));
defined (my $out = $builder->build($ctx, $tokens))
or return $ctx->error($ctx->errstr);
push @res, $out;
$i++;
}
my $glue = $args->{glue} || '';
join $glue, @res;
}
;# sub related_tags {...} 付近
:
:
my @res;
my $builder = $ctx->stash('builder');
my $tokens = $ctx->stash('tokens');
my $i = 0;
foreach (@list) {
last if $lastn && $i >= $lastn;
local $ctx->{__stash}{'Tagwire::tag'} = $_;
local $ctx->{__stash}{'Tagwire::tag_count'} = $tags{$_};
local $ctx->{__stash}{'Tagwire::tag_date'} = $ts{$_};
;# piroli, '05/09/27, 親タグを持つエントリ中での使用率
local $ctx->{__stash}{'Tagwire::tag_score'} =
int (0.5 + $tags{$_} * 100 / (scalar @{$tindex{$tag}->{eids}}));
defined(my $out = $builder->build($ctx, $tokens))
or return $ctx->error($ctx->errstr);
push @res, $out;
$i++;
}
my $glue = $args->{glue} || '';
join $glue, @res;
}
オリジナルコードの著作権はogawaさん
(Ogawa::Memoranda)にあります。
また上記の改造コードの扱いについては Tagwire Plugin のそれに準じます。
http://www.perl.com/language/misc/Artistic.html
新しく追加されたテンプレートタグ <MTTagScore> は、現在のタグの関連性を示すスコアを 100 点満点とする整数値で返します。関連性を求める基準は以下のとおりです。
スコア = タグの使用回数 ÷ コンテクスト中のエントリ数 × 100例えば、カテゴリ内に 20 件のエントリがあり、そのうち 15 件のエントリで使用されているタグのスコアは 75 点です。
スコア = タグの使用回数 ÷ 親タグを持つエントリ数 × 100"MovableType"をタグに持つ 20 件のエントリのうち、"plugin"をタグに持つエントリが 3 件あった場合、 "plugin"タグのスコアは 15 点です。 仮に、"MovableType"タグと"plugin"タグが常にペアで使用されている場合のスコアは 100 点になります。
<MTTagCount> と同じです。
<h4>このカテゴリの代表タグ</h4> <ul> <MTTagsInEntries sort_by="count" sort_order="descend" lastn="5"> <li><$MTTag$> (<$MTTagScore$>pts)</li> </MTTagsInEntries> </ul>