はてなキーワードよろしく記事文中のタグを自動リンクする

Posted by
ぴろり
Posted at
2005/11/05 19:22
Trackbacks
関連記事 (2)
Comments
コメント (16)
Post Comment
コメントできます
Category
プラグイン カテゴリ
  から、 はてなダイアリーキーワードを貼るは幾つか存在するようですが、 折角に訪問頂いたビジターを外部コンテンツに安易に誘導することは少なからず勿体無い気がします。 当サイトでは plugin を使って独自にタグデータベースを蓄積していますので、 これを上手に使って似たようなことができないでしょうか?
 そこで、ビジターに一つでも多くの記事を参照してもらう機会を増やせるよう、 のキーワードよろしく記事文中に現れた文字列に自動的にタグを張れるようにしてみました。
この記事をはてなブックマークに追加する この記事のはてなブックマーク数 | この記事をlivedoorクリップに追加する この記事のlivedoorクリップ数 | この記事をYahooブックマークに追加する この記事のYahoo!ブックマーク数 | この記事をdel.icio.usに追加する

Regexp::TrieEUC の導入

 Regexp::TrieEUC は文字列のリストから TRIE の生成を行い、 それを の正規表現式として変換するためのモジュールです。オリジナルは、 404 Blog Not FoundDan Kogaiさんが、 TRIE-Optimized Regexp で公開されている mk_trie_regexp.pl です。 これを使用することで、大量のキーワード文字列を効率的にパターンマッチ可能な正規表現式を得ることができます。
 今回は、これを語(euc-jp)で動作するように少し手を入れています。 以下のコードを( のインストールパス)/extlib/Regexp/TrieEUC.pmとして保存します (アーカイブがダウンロードできます)

plugin の改造

 少し長いですがガンバってください(?)  Ogawa::Memorandaで公開されている 小川宏高さん作の Tagwire pluginに以下のコードを追加します (修正済みアーカイブがダウンロードできます)

 MTTagsAsKeyword の処理については、再びDan Kogaiさん公開の Click'n Hatenizeを 大変参考にさせて頂きましたm(_ _)m ありがとうございます。

Jcode.pm のアップグレード new

  のパッケージに添付されている Jcode.pm (3.2ja2 のものはバージョン 0.88)では、 UTF8 などの環境で文字化けが発生する例が報告されています。 Tagwire plugin w/ TrieEUC 0.11 でこの問題は解決されていますが、 これと併せて Jcode.pm のバージョンを 1.99 以上にアップグレードする必要があります。
  1. 新しいバージョンの Jcode.pm パッケージを取得します
  2. の(インストールディレクトリ)/etlib に含まれる Jcode.pm と Jcode ディレクトリに、取得したアーカイブに含まれる同名のファイル/ディレクトリで上書きします

参考Shift_JIS に含まれない文字をエスケープ (Jcode.pm編)

追加されるタグ

 今回、 plugin に以下のタグを追加しました。
MTTagsAsRegexp
  plugin に登録されている全てのタグから、 後述するオプションで指定された条件に合致するタグを表す正規表現式を生成するためのタグです。 生成された正規表現式は MTTagsAsKeyword で使用することができます。
cutoff_score
 指定されたスコア未満のタグを正規表現式に含みません。 タグの使用頻度に基づいてフィルタをしたい場合に使用します。 0 から 100 までの整数値を指定します。 指定が無い場合のデフォルト値は 0 で、スコアが 0 点以上のタグ、即ち全てのタグが対象になります。
cutoff_length
 指定された文字列長さ未満のタグを正規表現式に含みません。 0 以上の整数値を指定します。 指定が無い場合のデフォルト値は 0 で、0 文字以上のタグ、即ち全てのタグが対象になります。
case_sensitive
 タグの大文字/小文字の区別を 0 か 1 で指定します。 指定が無い場合のデフォルト値は 1 で、大文字と小文字を区別します。
MTTagsAsKeyword
 文字列中にタグが出現した場合、それをパターンで置き換えるためのコンテナタグです。
repeat_count
 タグを発見した場合、そのタグの repeat_count 回数目の登場までをキーワードとします。 指定がない場合のデフォルト値は 0 で、登場する全ての場合がキーワードになります。
keyword_pattern
 発見したタグを指定されたパターンで置き換えます。 置換パターン中の エンティティはエスケープしておいてください。 パターン中で以下の文字列を使用することができます。
%k
該当するタグそのものに置換されます。
%e
該当するタグを URL エンコードしたものに置換されます。
keyword_pattern="<a href="/tag/%e">%k</a>"
regexp_file
 指定されたファイルの内容をタグのための正規表現式として使用します。 その動作は <$MTInclude file="..."$> に準じます。
regexp_template
 指定されたインデックスによって生成されたファイルの内容をタグのための正規表現式として使用します。 その動作は <$MTLink template="..."$> に準じます。
regexp_module
 指定されたモジュールの構築結果を、タグのための正規表現式として使用します。 その動作は <$MTInclude module="..."$> に準じます。 構築のたびに正規表現式の生成が行われるため、タグ数が増えた場合にパフォーマンス上の問題となる可能性があります。

regexp_file、regexp_template、regexp_module が何れも指定されていない場合、 内部的にデフォルトパラメータを用いて MTTagsAsRegexp を呼び出します。 そのため、構築のたびに正規表現式の生成が行われるため、 タグ数が増えた場合にパフォーマンス上の問題となる可能性があります。

ignore_tags
 デフォルトで a,blockquote,pre,textarea,script 内部に含まれるテキストにはタグを生成しません。 他に追加していしたい タグがある場合、それらのタグをコンマで区切って指定することができます。
ignore_tags="span,address"
apply_tags
 ignore_tags とは逆に、その内部でタグを生成させたい タグをコンマで区切って指定することができます。
apply_tags="a,textarea"

これらの指定はデフォルトのignore_tags < ignore_Tags < apply_tags の順に優先されます。

正規表現式の生成とタグの修正

 タグを抽出するための正規表現式を生成し、この正規表現式を使って文章中のタグにを与えます。 これには MTTagsAsRegexpMTTagsAsKeyword を使用します。

case 1. 正規表現式が外部ファイルの場合

 別途ファイルとして用意された正規表現式の、そのファイル名を指定する方法です。 この場合は MTTagsAsRegexp を使用しません。 MTTagsAsKeyword の regexp_file オプションでファイル名を指定します。

case 2. インデックスを使用する場合

 MTTagsAsRegexp をインデックス内で使用し、を構築することで正規表現式をファイルに書き出します。 書き出されたファイルは MTTagsAsKeyword から regexp_template オプションで、 その名を指定することで使用することができます。

Tags Regexp Template インデックス

case 3. モジュールを使用する場合

 MTTagsAsRegexp をモジュール内で使用し、再構築毎に正規表現式を生成します。 正規表現式は MTTagsAsKeyword の regexp_module オプションで指定します。 MTTagsAsKeyword が出現するたびに、内部的に MTTagsAsRegexp が呼ばれるため、 パフォーマンス上の問題となる場合があります。

Tags Regexp Module モジュール

既知の不具合

  • 単語境界を判別しません。そのため "IE" タグは "BOOGIE-WOOGIE(ヴギウギ)" に反応します

/ MD5バージョン日付サイズ(Bytes)動作環境備考
Tagwire plugin w/ TrieEUC
0.11 new '06/02/07 文字化け対策
要Jcode 1.99以上
3.151-ja で動作確認

plugin; Copyright 2005, Hirotaka Ogawa (hirotaka.ogawa at gmail.com)
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

mk_trie_regexp.pl is the original of TrieEUC. Copyright 2005, dankogai

雑記

 とりあえず動くところまでは何とかなったものの、もしかすると効率の悪いことをやっているかも知れず。 何かありましたら遠慮なくツッ込んで頂けると有り難いです。
 今回、自分で作った部分は大した事をしていなくて、 コードの骨格や重要な部分はネット上の様々な先輩方の功績から拝借させて頂いたものです。 有用なリソースを精力的に公開されている方々に改めて感謝をいたしますm(_ _)m
 しかし、登録されているタグが高々 150 個程度では、それほど面白いことになりませんでした。 そういう意味ではハテナの有する20万を超えるキーワードは非常に貴重なコンテンツなんだと思い知らされました。

この記事を読んだ人はこんな記事も読んでいます ?

その他の関連する記事


関連記事/トラックバック (全 2 件中、最新 5 件まで表示しています)

雑記帳@やすひさ のスクリーンショット
タイトル
エントリー内のタグを自動でリンクするように修正
Trackbacked at
2006/01/27 23:37
from
雑記帳@やすひさ
評価
Web Scouter
概要
Open MagicVox.net - はてなキーワードよろしく記事文中のタグを...

Open MagicVox のスクリーンショット
タイトル
Tagwire Pluginで記事内容からタグ候補を自動的に抽出する
Trackbacked at
2005/11/15 18:11
from
Open MagicVox
評価
Web Scouter
概要
 新しく記事を書いていて、以前に使ったタグと同じものを紐付けたいと思った時、 過...

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

寄せられたコメント (全 16 件中、最新 5 件まで表示しています)

Posted by
footbrain
at
2007/04/28 18:47
ID
vRLqL1rs

Tagwire pluginが0.26にアップしたので、Tagwire plugin の改造をやり直しているのですがどうも上手くいきません。
Tagwireのコードが変わってしまっているせいだろうとは思うのですが、当然素人が手を出せるものでは無さそうです。
どこをどうしたらいいのでしょうか?
とりとめのない質問で申し訳ありませんが、(今更という気もしますが)対応をお願いします。

Posted by
footbrain
at
2006/11/24 12:28
ID
0ITXtwYA

13:やすひささんと同様に、

keyword_pattern="<a href="/tag/%e">%k</a>"
の%kが文字化けを起こして正しく表示されません。

その後、この問題は解決されたのでしょうか?
解決方法があれば、教えてください。お願いします。

Posted by
ぴろり
at
2006/03/06 10:38
ID
83Szf2uk

内部で文字コードの変換をしている部分があるのですが、
ここでの処理に失敗しているのでしょうか??
# (MTの文字コード)→EUC-JP→(MTの文字コード)という感じ

この部分、ちょっと(かなり?)いい加減なところがあるので少し見直してみますね…

Posted by
やすひさ
at
2006/03/05 02:16
ID
dX1azhSg

こんにちは。ご無沙汰しております。
試しにPerl5.8.7のサーバ(前と同じくxrea.comですが、サーバ違い)に設置してみると、「〜」の文字化けはなくなりました。
ただ、キーワードパターンの「%k」に限って、2バイト文字のタグだと化ける用になってしまいました。

※「%k」でも1バイト文字のタグと、「%e」では問題ありませんでした。
また、Perl4.6.1のサーバではこの現象が起きていませんでした。

どうぞ、よろしくお願いします。

Posted by
やすひさ
at
2006/02/26 09:52
ID
k.7DQQQI

パッチを当てることはできました。
あとはコンパイルできれば何とかなりそうなのですが、環境になくコンパイルできません。
次元の低い話で申し訳ありません…。

ちなみに、Perl 4.8.1 にアップしようとサーバを変えてみようとか思いましたが、エントリーがうまく移行できなかったのであきらめました。

コメントを投稿する

 (必須/公開)
 (必須/非公開)
 

コメントスパム防止のため投稿前に ランダムな数字 ? を入力してから投稿してください。 お手数ですがご協力のほど宜しくお願いいたします。(必須)