先週末に行われたMTDDCに参加してライトニングトークで大トリ? をつとめさせていただきました。前日まで何を話すか決めてなかったんですが、今回はまぁ大阪開催じゃないし? ネタ抜きにして純粋にハックネタを話させていただきました。さすがに数百人前にしてつまらないネタじゃ悪いし(しかも時間一時間近く押していて、あそこで滑ると会場のコンテキスト? に影響するっていう危機感もありましたし。
すでにお気づきの方もいらっしゃる通り、今回のネタは今年一発目に上げた下記のエントリーの改良版です。
タグのプライベートモードを使うっていうのを直前に思いついてしまったのが今回の肝でした(しかし何でググると3.3のドキュメントが出てくんの?)。
方針は以下の通りです。
- 一回目の保存時には入力されたタグがあればそれにプラスしてタグが自動追加される
- ユーザー辞書に登録されている単語は無条件にタグとして登録される
- タイトルに1度以上、もしくはタイトル+テキストに2回以上出現した単語で「名詞,一般」もしくは「名詞,固有名詞,組織」にマッチするもの、且つ一定以上のバイト長の単語(サンプルでは[7]以上)をプライベート・タグとして登録する
前提としてMeCab、MeCab.pmをインストールする必要があります。ここで紹介するパスは私のMac上でのパスです。MacPortを使ってインストールしているので、一般的な環境とは異なるであろうことご了承ください。
タグとして登録したい単語を下記のようにCSVを作成した保存します。ここでのポイントは「Movable Type Developers & Designers Conference」を「MTDDC」として登録する等のようにマッチした文字列をタグとしてどのように登録したいかを定義付けることです。この辞書では「アルファサード有限会社」と「アルファサード」は同じ「アルファサード」として登録されるようになります。
Movable Type Developers & Designers Conference,-1,-1,1,名詞,一般,*,*,*,*,MTDDC,MTDDC,MTDDC,Tags
プラグイン,-1,-1,1,名詞,一般,*,*,*,*,プラグイン,プラグイン,プラグイン,Tags
Movable Type,-1,-1,1,名詞,一般,*,*,*,*,Movable Type,Movable Type,Movable Type,Tags
アクセシビリティ,-1,-1,1,名詞,一般,*,*,*,*,アクセシビリティ,アクセシビリティ,アクセシビリティ,Tags
アルファサード有限会社,-1,-1,1,名詞,一般,*,*,*,*,アルファサード,アルファサード,アルファサード,Tags
アルファサード,-1,-1,1,名詞,一般,*,*,*,*,アルファサード,アルファサード,アルファサード,Tags
セミナー,-1,-1,1,名詞,一般,*,*,*,*,セミナー・イベント,セミナー・イベント,セミナー・イベント,Tags
イベント,-1,-1,1,名詞,一般,*,*,*,*,セミナー・イベント,セミナー・イベント,セミナー・イベント,Tags
リリース,-1,-1,1,名詞,一般,*,*,*,*,リリース情報,リリース情報,リリース情報,Tags
cd /opt/user
sudo /opt/local/libexec/mecab/mecab-dict-index -d /opt/local/lib/mecab/dic/ipadic-utf8 -u user.dic -f utf8 -t utf8 dict.csv
user.dicが生成されるので、mecabrcにこのファイルをユーザー辞書として使うように登録します。
vi /opt/local/etc/mecabrc
下記の行を追加
userdic = /opt/user/user.dic
プラグイン(当日使ったものです)をMTにインストールします。
これで、ユーザー辞書に登録してあるものは無条件に、形態素解析で自動追加したものは「プライベートタグ(@からはじまる隠しタグ)」として登録されるようになります。
あとはogawaさんの TagSupplementalsプラグインにお任せです。
<mt:EntryIfTagged>
<div class="entry-body">
<h2>関連する話題</h2>
<ul>
<MTRelatedEntries lastn="3">
<li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
</MTRelatedEntries>
</ul>
</div>
</mt:EntryIfTagged>
ちゃんと大阪でのMTDDCの記事が一番目に出てますよね?(当日失敗したのは...自動でタグ付けされるのを見せたいがために文章色々直前で追加しちゃったんですよね...クソ!)
この方法で出来ないのは、エントリーに対するタグの重み付けなんですね。例えば上記エントリーには「MTDDC」というタグが最も重みが付けられるべきで、そうなれば確実に当日も失敗? しなかったわけです。ところが現状の方法では単語の出現回数なんかでの重み付けがなされないのです。
これについてはMT::ObjectTagオブジェクトを拡張してタグの重み付けを付けるという方法なんかが考えられますが(出現回数なんかでスコアを付ける)、興味のある方はトライしてみても面白いんじゃないでしょうか。
翌日のHack-A-Thonにも参加しましたが、こっちのほうはまたいずれ。
今日「ブログのサイドバーを見直す(ランキング/表示順/高速化)」って記事を製品サイトのブログに書いていて面倒だったので書いたのであげておきます(スタティック専用)。←しかしなんちゅう日本語だ。
特定のタグ(class指定可能)で囲まれた部分を実体参照に変換して出力するモディファイアescapecodeを提供します。
<$mt:EntryBody escapecode="code,mtml"$>
上記のようにテンプレートに記述すると、下記の部分をエスケープして出力します。
<pre><code class"mtml">
<$mt:EntryBody escapecode="code,mtml"$>
</code></pre>
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
随分ご無沙汰してしまったのですが、本年も引き続きよろしくお願いします。
さて今年の最初は実用性があるかどうかはまったく別にして(且つ環境を選ぶものですけど)、サンプル的な感じで一つ。
きっかけは(ちょっと時間が経ってしまいましたが)、以下のエントリーから。
本文内の文章を言語解析してくれて、関連するエントリーを勝手に出してほしい
- MeCab/MeCab.pmをインストール
- MTのタグをMeCabの辞書に書き出して登録
- プラグインによってエントリーの保存時に形態素解析してタグを抽出して自動的にセットする
というものです。タグを辞書に登録するのだから素直にDB見に行ってやればいいってのとそういうのもどっかで公開されてるんですが、あくまでもサンプルとして作りました。「名詞,一般」で2文字以上であれば自動登録とかの方法でやってもいいと思いますが、タグっぽくならないはならないので(関連エントリーのためだけに使うのであればそれでもいいと思いますが大量のタグが保存されて重くなるという懸念もあります)、このあたりは工夫の余地があるでしょう。
辞書へのタグの追加は MeCab: 単語の追加方法 を参照いただくとして(テスト用途であればユーザー辞書として登録するのがいいかと思います)、インデックス・テンプレートに下記のように記述して辞書登録のCSVを作るための kanji2kana モディファイアも作りました。
<MTTags><MTTagName>,-1,-1,1,名詞,一般,*,*,*,*,<MTTagName>,<MTTagName kanji2kana="1">,<MTTagName>,Tags
</MTTags>
このインデックステンプレート(を再構築して生成されるcsv)を辞書に登録してエントリーを保存すると自動的にタグ付けされます。表記のゆれについては別途辞書に登録してやって吸収することが出来るでしょう。これに加えてogawaさんの TagSupplementalsプラグイン で関連するエントリーを出すようにすれば「本文内の文章を言語解析してくれて、関連するエントリーを勝手に出してほしい」ってのに近い環境が構築されないでしょうか?
※備忘録的にローカルMacの辞書登録コマンドをメモ
sudo /opt/local/libexec/mecab/mecab-dict-index -d /opt/local/lib/mecab/dic/ipadic-utf8 -u user.dic -f utf8 -t utf8 dict.csv
ということで(謎)今年も頑張って色々ネタとか提供していければと思いますのでよろしくお願いします。
CMSContextプラグインをMT5対応として今日の勉強会向けに修正(ついでに会場でさらに修正)しました。entry/page/category/folder/blogあたりのコンテクストセットするついでにログインしてCMS操作しているユーザーのコンテクストもセットするようにしました。あとあんまりテスト出来てないですけど MTIfUserCan permission="rebuild" とかで再構築権限があるかどうかとか、権限の分岐できるようにしました(他にも2回呼び出された時にロードしなおさないようにしたとか細かい修正ちょこっと)。
CMSContext/tmpl以下にエントリー編集画面でタグ入力を支援するインターフェイスを提供するテンプレートのサンプル例が入ってます。
ついでにLove再構築のひな形となった今日の勉強会用のダッシュボードウィジェットも上げておきます。
あと、僕には珍しくちゃんと配布資料用意していったから、それも上げときますね。
本日MT5勉強会で管理画面カスタマイズテーブル担当させていただきました。エントリー編集画面のカスタマイズ例で説明してからダッシュボードウィジェット作る課題ってのをやったのですが、僕の作ったのをとりあえず上げておきます(みんなまだ飲んでるだろけどなw)
今日はありがとうございました。みんな俺のことも忘れないでなw

最近のコメント