TagSupplementals Plugin 0.04公開
Movable Type 3.3以降でサポートされた「タグ」に便利機能を追加・拡張するTagSupplementals Plugin(TagSupplementals Plugin公開 - Ogawa::Memoranda)をちょびっとアップデートしました。
変更点は、MTRelatedEntriesにweightオプション(現状は"constant"と"idf"のいずれかを選べる)を追加して、エントリー間の「関連度」の計算方法を選択できるようにしたというただ一点です。
下のようにweightオプションが指定できます。
<MTEntries lastn="10">
<h2><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></h2>
<$MTEntryBody$>
<ul>
<MTRelatedEntries weight="idf" lastn="10">
<li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
</MTRelatedEntries>
</ul>
</MTEntries>
デフォルトではconstantになっているので、結果が気に入らないなーという場合にはidfを指定してみるとよいでしょう。ただし、処理速度はidfの方が遅くなります。一応計算に必要な情報をキャッシュしたりしているので無闇に遅いことはありませんが。
MTRelatedEntriesの「関連度」についてまとまった説明をしてこなかった(つまりはユーザにとってブラックボックス化していた)ことが気になっていたので、このエントリーの残りの部分ではその説明をしておきます。
まず、Dをエントリー集合とします。ある元d∈Dに対して、そのタグ集合をT(d)と書くことにします。このとき、あるd0∈Dに対する、各エントリーのスコア関数は典型的には、
SCORE(d0, d) = ∑t∈T(d0) tf(t, d) weight(t)
のように定式化できます。
ここで、tf(t, d)はタグtがdのタグ集合T(d)に含まれていれば1、そうでなければ0を返す関数とします。一般のドキュメント空間ではT(d)は複数個のtを含むことができますが、タグ集合においてはあるタグが含まれるか含まれないかの二つの状態しかないので、このような単純なステップ関数として定義するのが妥当です。
次にtに関する重み付け関数weightには、安直にはconstantとidfが定義できるでしょう。constant(t)はtの値に関わらず定数を返す定数関数
constant(t) = 1 … (1)
であり、idf(t)はtの出現回数freq(t)の逆数関数で、例えば、
idf(t) = 1 / (freq(t) - 1) … (2)
のように定義できます。idf(t)の定義にはいくらでもバリエーションが作れて、
idf(t) = log(N(D) / freq(t)) + 1
と定義する流儀もあります(このとき、N(D)はエントリー集合の大きさを表します)。
constantの場合、tの重み付けを考慮しませんから、スコア関数は単にd0と共通に使われているタグの個数を返します。これに対してidfでは、使用頻度の低いものほど重要なタグと看做して重み付けをしてスコア付けをします。タグを基にした検索でどちらがより望ましい結果を示すのかは私には判断できませんが、一般の文書検索では後者のような重み付け手法をを発展させた方法を採っています。
weightにどのようなものを使うかはさておき、こうして対象エントリーd0に対するスコアSCORE(d0, d)をすべて計算することができます。そしてそのスコアの大きいものから順にリストしてやれば、d0により類似したエントリーを抽出することができます。
MTRelatedEntriesはざっとこのようなロジックで動作しています。もし望ましい結果が得られないのであれば、weightを変更することでより良い結果が得られる可能性があります。
(あー面倒くさかった。あとでMathMLで書き直すかも。)
他にもこんな機能があったらなという希望があったらコメント・トラックバックでお知らせください。簡単に実現できる機能から順に気まぐれに更新していきます。
TagSupplementals Plugin.ja JP - Ogawa Code
TagSupplementals Plugin - Ogawa Code (English)
このエントリーのトラックバックURL: http://as-is.net/mt/mt-tb.cgi/429
Comments (0)