タグの関連度をスコア表示 〜 Tagwire Plugin の改造

Posted by
ぴろり
Posted at
2005/09/28 01:29
Trackbacks
関連記事 (0)
Post Comment
コメントできます
Category
プラグイン カテゴリ

 "タグ導入〜それでも捨てられないカテゴリ"では、ogawa さん作の Tagwire Plugin に改造を施し、従来のカテゴリとタグによる分類を橋渡しするための方法を紹介しました。カテゴリアーカイブにおいて、そのカテゴリのエントリ内で頻出するタグを列挙すると、それはカテゴリの特徴を代表するタグと見なすことができます。しかし列挙されたタグが、そのカテゴリとどの程度の関連性があるのか一見して判りません。
 このエントリでは、抽出されたタグの関連度を、具体的なスコアとして数値表示するための方法を紹介しています。

このエントリーをはてなブックマークに追加  

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 点満点とする整数値で返します。関連性を求める基準は以下のとおりです。

<MTTagsInEntries> 内で使用した場合
 現在のコンテクストのエントリ中で、そのタグがどれだけ頻繁に使用されているかを示します。 コンテクストのエントリ全てで、そのタグが使用されている場合のスコアは 100 になります (カテゴリアーカイブでの例。右サイドバーの"関連するタグ")
スコア = タグの使用回数 ÷ コンテクスト中のエントリ数 × 100
 例えば、カテゴリ内に 20 件のエントリがあり、そのうち 15 件のエントリで使用されているタグのスコアは 75 点です。
<MTRelatedTags> 内で使用した場合
 元となるタグが使用されているエントリ中で、関連するタグが同様に使用されている割合を示します (タグアーカイブでの例)
スコア = タグの使用回数 ÷ 親タグを持つエントリ数 × 100
 "MovableType"をタグに持つ 20 件のエントリのうち、"plugin"をタグに持つエントリが 3 件あった場合、 "plugin"タグのスコアは 15 点です。 仮に、"MovableType"タグと"plugin"タグが常にペアで使用されている場合のスコアは 100 点になります。
<MTTags> 内で使用した場合
 <MTTagCount> と同じです。
アーカイブテンプレートの例
 カテゴリアーカイブテンプレートでの記述例は以下の通りです。 カテゴリ内のエントリで頻出するタグを列挙し、 カテゴリ中の記事との関連度を100点満点で表示します。
<h4>このカテゴリの代表タグ</h4>
<ul>
<MTTagsInEntries sort_by="count" sort_order="descend" lastn="5">
	<li><$MTTag$> (<$MTTagScore$>pts)</li>
</MTTagsInEntries>
</ul>
このエントリーをはてなブックマークに追加  



関連記事/トラックバック

関連記事/トラックバックはまだありません

この記事にトラックバックを送るには?

コメントを投稿する

 
 (必須, 匿名可, 公開, トリップが使えます)
 (必須, 匿名可, 非公開, Gravatar に対応しています)
 (必須)
スパム コメント防止のため「投稿確認」欄に ランダムな数字 CAPTCHAについて を入力してから送信してください。お手数ですがご協力のほど宜しくお願いいたします。