Home » March 2005 » AllKeywords Plugin

AllKeywords Plugin

AllKeywords PluginはTagwire Pluginに開発が引き継がれました。下記のエントリーをご参照ください。

エントリーのキーワードをイワユル「タグ」として利用するためのさまざまな機能を提供するプラグイン。

all-keywords.zip

0.10 (2005.03.19):
  • 公開開始。
0.11 (2005.03.20):
  • case_sensitiveオプションの追加。
0.12 (2005.03.26):
  • コードクリーニング。
  • MT-XSearchとの連携をサポート。MT-XSearchとの連携方法に関しては別エントリーで述べる予定。

Ogawa::Memoranda: 四畳半フォークソノミーの実現に向けてのアイディアを実現すべく、Movable Typeのエントリーのキーワード部分を使ったさまざまな便利機能を提供する。

具体的にはこのプラグインはカテゴリーの場合と同様に、利用されているキーワードやキーワードの個数をリストアップする機能、指定したキーワードにマッチするエントリーをリストアップする機能、類似度が高い(現在のエントリーとマッチするキーワードの数が多い)エントリーをリストアップする機能などを柔軟に実現する。

ひとまず生半可なドキュメントができたので公開してみた。長いよ。

MTAllKeywordsコンテナタグ

ブログ内のすべてのキーワードをリストアップするコンテナタグ。

オプション:

sort_by="keyword|count"
リストアップする順序をキーワードのアルファベット順か出現頻度順かを選択する。デフォルトではkeyword。
sort_order="ascend|descend"
リストアップする順序を昇順か降順かを選択する。デフォルトでは昇順(ascend)。
lastn="N"
リストをN個まで表示する。デフォルトではすべて表示する(N=0)。
delimiter="区切り文字"
キーワードを切り出す際に使用するデリミタを指定する。「delimiter=","」とするとカンマで区切られた語を一個のキーワードとする。デフォルトでは空白文字(スペース、タブ)をデリミタとする。
case_sensitive="0|1"
キーワードの大文字・小文字を区別するかどうかを指定する。デフォルトでは区別する(case_sensitive=1)。

このコンテナタグの中で利用可能なタグ:

<$MTAllKeyword$>
一個のキーワードを表示する。
<$MTAllKeywordCount$>
一個のキーワードの出現回数を表示する。
<$MTAllKeywordsTotal$>
すべてのキーワードの数を表示する。MTAllKeywordsコンテナの直後でも利用可能。
<$MTAllKeywordsTotalSum$>
すべてのキーワードの数の総和を表示する。MTAllKeywordsコンテナの直後でも利用可能。

また、このコンテナの外部で利用可能なタグも利用できる。

使用例:

出現頻度の高い10個のキーワードをリストアップしてそれぞれをTechnorati Tagにリンクする。

<ul>
<MTAllKeywords sort_by="count" sort_order="descend" lastn="10">
<li><a href="http://www.technorati.com/tag/<$MTAllKeyword$>"
  rel="TAG" title="TAG:<$MTAllKeyword$>">
  <$MTAllKeyword$></a> (<$MTAllKeywordCount$>)</li>
</MTAllKeywords>
</ul>
<ul>
<li>Total Keywords: <$MTAllKeywordsTotal$></li>
<li>Total Keywords(Sum): <$MTAllKeywordsTotalSum$></li>
</ul>

また、Ogawa::Memoranda TagsはMTAllKeywordsを使った例のひとつである。

MTEntryAllKeywordsコンテナタグ

エントリーコンテキスト(MTEntriesの内部、または個別アーカイブ)でMTAllKeywordなどを利用可能にするコンテナタグ。

オプション:

delimiter="区切り文字"
キーワードを切り出す際に使用するデリミタを指定する。「delimiter=","」とするとカンマで区切られた語を一個のキーワードとする。デフォルトでは空白文字(スペース、タブ)をデリミタとする。
case_sensitive="0|1"
キーワードの大文字・小文字を区別するかどうかを指定する。デフォルトでは区別する(case_sensitive=1)。

このコンテナタグの中で利用可能なタグ:

MTAllKeywordsと同様なので省略。

使用例:

各エントリーのキーワードをリストアップしてそれぞれをTechnorati Tagにリンクする。

<MTEntries lastn="10">
<h2><$MTEntryTitle$></h2>
 
<ul>
<MTAllKeywords sort_by="count" sort_order="descend" lastn="10">
<li><a href="http://www.technorati.com/tag/<$MTAllKeyword$>"
  rel="TAG" title="TAG:<$MTAllKeyword$>">
  <$MTAllKeyword$></a></li>
</MTAllKeywords>
</ul>
 
<$MTEntryBody$>
</MTEntries>

MTAllKeywordCountも利用できるが残念ながら(当然)1と表示されるだけである。

MTEntriesWithKeywordsコンテナタグ

指定したキーワードを含むエントリーをリストアップするコンテナタグ。

オプション:

keywords="keyword-list"
リストアップする対象となるキーワードを一個以上指定する。
delimiter="区切り文字"
keywordsオプションで指定したキーワードリストからキーワードを切り出す際に使用するデリミタを指定する。「delimiter=","」とするとカンマで区切られた語を一個のキーワードとする。デフォルトでは空白文字(スペース、タブ)をデリミタとする。
case_sensitive="0|1"
キーワードの大文字・小文字を区別するかどうかを指定する。デフォルトでは区別しない(case_sensitive=0)。
sort_by="title|status|created_on|modified_on|author_id|excerpt"
エントリーをリストアップする順序を選択する。デフォルトではエントリーの作成時刻の順(created_on)に従う。
sort_order="ascend|descend"
リストアップする順序を昇順か降順かを選択する。デフォルトでは降順(descend)。
lastn="N"
リストをN個まで表示する。デフォルトではすべて表示する(N=0)。

このコンテナタグの中で利用可能なタグ:

MTEntriesと同様に「MTEntry*」というタグが一通り利用できる。また、MTEntriesの外部で利用可なタグも同様に利用できる。

使用例:

"movable"と"type"というキーワードを含むエントリーをすべてリストアップし、タイトルや本文を表示する。

<MTEntriesWithKeywords keywords="movable type">
<h2><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></h2>
 
<$MTEntryBody$>
<$MTEntryExtended$>
 
</MTEntriesWithKeywords>

平たく言うと通常のMTEntriesコンテナと同様に使用できる。

MTMostRelatedEntriesコンテナタグ

エントリーコンテキスト(MTEntriesの内部、または個別アーカイブ)で関連するキーワードを持つ他のエントリーをリストアップするコンテナタグ。関連度が高い(関連するキーワードの個数が多い)エントリーから順にリストアップする。

オプション:

delimiter="区切り文字"
キーワードを切り出す際に使用するデリミタを指定する。「delimiter=","」とするとカンマで区切られた語を一個のキーワードとする。デフォルトでは空白文字(スペース、タブ)をデリミタとする。
case_sensitive="0|1"
キーワードの大文字・小文字を区別するかどうかを指定する。デフォルトでは区別しない(case_sensitive=0)。
lastn="N"
リストをN個まで表示する。デフォルトではすべて表示する(N=0)。

このコンテナタグの中で利用可能なタグ:

MTEntriesと同様に「MTEntry*」というタグが一通り利用できる。また、MTEntriesの外部で利用可なタグも同様に利用できる。

使用例:

MTEntriesで最近の10件をリストアップし、そのそれぞれのエントリーについて関連するエントリーをリストアップする。

<MTEntries lastn="10">
<h2><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></h2>
<$MTEntryBody$>
 
<ul>
<MTMostRelatedEntries>
<li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
</MTMostRelatedEntries>
</ul>
 
</MTEntries>

使用上の注意

Movable Type、およびAllKeywords Pluginはキーワード用のインデックスを持たない。したがって、MTAllKeywords, MTEntriesWithKeywords, MTMostRelatedEntriesは、使い方によっては強烈に重い!!ということを自覚して使うこと。エントリー数が増えると生半可なレンタルサーバーでBerkeleyDBなど使っている場合には500 Internal Server Errorを食らうことになるので要注意である。これを改善するアイディアはいくつか思い付いているので今後改善していく予定である。

更新履歴

2005-03-20更新:

case_sensitiveオプションを追加した。MTAllKeywordsとMTEntryAllKeywordsでは区別し、MTEntriesWithKeywordsとMTMostRelatedEntriesでは区別しない、のがデフォルトと設定としてあるので要注意。どうしてこのような設定になっているかというと、前者はキーワードをリストアップし、後者はエントリーをリストアップするという性質の違いがあるためである。

キーワードをリストアップする場合には、大文字・小文字を区別しないとすると例えば「ipOD」と「iPod」を同一のものとみなす。したがってリストアップ時にどのような表現を採るべきか(ipOD? iPod? Ipod? IPOD? ipod?)を自動的に判定せざるを得ない。これは必ずしも望ましくない。

一方エントリーをリストアップする場合には、なるべく多くのエントリーとマッチすることが望ましい。大文字・小文字を区別することにすると、たまたま特定のエントリーのキーワードに「ipod」と登録した場合、他の「iPod」関係のエントリーとの関連性が発見できなくなる。

SEE ALSO

英語版はまだ書いていない。

LICENSE

This code is released under the Artistic License. The terms of the Artistic License are described at http://www.perl.com/language/misc/Artistic.html.

AUTHOR & COPYRIGHT

Copyright 2005, Hirotaka Ogawa (hirotaka.ogawa at gmail.com)

このエントリーのトラックバックURL: http://as-is.net/mt/mt-tb.cgi/255

Links referred to this entry

Comments (11)

  1. プラグイン利用させていただきました。MTMostRelatedEntriesなど、前からこんなのあったらいいなと思ってた通りの機能でしたので即使ってみました。
    (前回のエントリを読んだ時から、ひっそりとkeywordにタグをあてる作業を進めてたりして...)

    ファイル名の決定にkeyword使ってるような場合どうすれば良いのか気になりましたが、delimiterのおかげで命名の仕方によってはわりと移行しやすいんじゃないかと思いました。

  2. やってみていないので分かりませんけど、いろいろやりようがありそうですね。

    キーワードに「key1 key2 key3」と設定しておき、<$MTEntryKeywords dirify="1"$>とすると、「key1_key2_key3」という文字列にしてくれると思います。それをファイル名として使うということもできます。

    逆に、キーワードに「this_file_name」のようにファイル名をまんま設定しておき、このプラグインを使ってバラバラのキーワードにすることも多分できます。

    それにしてもキーワードの大文字・小文字、区切り文字の処理には悩みます。例えば、プラグインでは、なるべく多くのキーワードを同一項にまとめるために大文字と小文字の区別をしません。そのため「iPod」も「ipod」も同一視できるのですが、逆にMTAllKeywordsなどでリストアップするときに「最初の文字だけ大文字、残りは小文字」に変換するとかせざるを得ません。なので「iPod」も「IPOD」も「Ipod」になってしまって気持ちが悪いという問題はあります。大文字小文字を区別するということにすればすべて解決しますが、ヒューマンエラーが露わになりやすいかなあ、とも。

    とりあえず作って皆様のご意見を伺おうという方針です。

  3. http://nano.moo.jp/archives/tags.php
    (o)様のtagsリストに触発されて(?)作ってみました。

    http://nano.moo.jp/tag/Movabletype
    SBMのサイドメニュー風のも、小手先ですが;。

  4. やっぱりフォントサイズの制御が難しいなあと思いました。

    タグの分布は得られるので、仮に分布が正規分布に従っているものとして、Javascriptを使って分散・標準偏差を計算し、それに基づいてフォントサイズを決定するとかすれば、妥当なサイズが設定できそうな気がしています。

    そうしないとしても、cutoffの値をユーザーが選べるようにして、cutoff個以下のタグはdisplay: hiddenして見えなくするとか、ユーザーインタフェース面で遊べることがいろいろありそうですね。

    やり過ぎ?

  5. http://nano.moo.jp/archives/tags.php
    えーと、とりあえずこんな風にしてみました。zero_padで数字3ケタのクラスを与えて、あまりに小さくなっちゃう文字だけ助ける感じです。ローテクですがIEの表示はいい感じなのでこれで妥協するつもりです(笑)

  6. HINAGATA:<$MTEntryKeywords$>をうまく使おう!
    http://hinagata.biz/log/2004/08/05/1656.html

    のようなクラス指定のためだけにに使うキーワードを除外するような
    ことはできませんでしょうか。

    例)key1,key2,key3

    とした場合key2 key3のみリストアップしたいのですが。

  7. 個別にカスタマイズすればできないこともないです。が、最初のキーワードだけ特別扱いするというのはややスマートさに欠けるというか一般性に乏しいので対応はしないと思います。
    上之郷谷くんのエントリーはもちろん読んでいますが、カテゴリーを使わない前提なら「キーワードはキーワードとして使い、クラス指定はカテゴリーを使う」ということもできます。

  8. お返事ありがとうございます。
    先頭のキーワードというより特定のキーワードをエントリーさせないという意味も含めたかったのですが言葉足らずでした。

    >カテゴリーを使わない前提なら「キーワードはキーワードとして使い、クラス指定はカテゴリーを使う」ということもできます。

    そっかー、その為のAllKeywords Pluginですもんね。

  9. こんばんは。Truth Is No Words管理人のCARNIVALと申します。
    突然で大変恐縮ですが、OgawaさんがOgawa::Memoranda Tagsで使用されている
    JavaScriptのコードを教えて頂くことはできませんでしょうか。
    フォントサイズを制御しているコードです。

    私のところでも現在、カテゴリーからタグに乗り換える作業をしていまして、
    出現頻度に応じてフォントサイズが変化する仕組みに大変惹かれております。
    企業秘密であれば無理は言いません。
    もし教えて頂ければ嬉しいです。

  10. 特に秘密は何もなくて http://as-is.net/blog/tags.html にベタ書きしてある通りなのです。コードの流用・改変はご自由にどうぞ。下のURLにテンプレートのコア部分を抜き出しておいたので参考にしてください。

    http://as-is.net/blog/archives/misc/tags-archive.tmpl

    フォントサイズを定めるアルゴリズムは固まっていませんで、私自身ときどき修正しています。

  11. コードを教えて下さいましてありがとうございます!
    無事動作いたしましたのでご報告いたします。
    あとは過去ログにタグを付ける作業を進めるのみです。
    今後ともよろしくお願いいたします!

Post a comment

Remember me?