WordPress Related Post for Japanese 1.01 (バグフィックスリリース)

昨日リリースの WordPress Related Post for Japanese のバグフィックス版をリリースします。 DB 構造がかわり、大変申し訳ないのですが辞書再生成となります。 すいません、すいません。。

JSeries に 1.01 としてリリースしております。 このプラグインのオプション削除(これでテーブル再生成および初期化されます)の簡単な手順ものせましたのでお手数ですが 1.00 試された方はご覧のうえアップデートください。

WordPress Plugins/JSeries » WordPress Related Post for Japanese

バージョン 1.01 は 1.00 からデータベースの構造が変わりました。 大変お手数ですが、(wp_)options テーブルから WpJRelated 行を削除してオプションの設定からお願いいたします。(辞書は一度クリアされます)

1.01 はいくつか重要なバグフィックスを含みますので、アップデートは必須とさせてください。

せっかくいい感じに辞書できたかたごめんなさい。。 うちもクリアしました。

昨日はたくさんのコメントありがとうございました。 非常に参考になりました。

以下変更点です。

  • 閲覧時の辞書作成コストの一部を、バックグラウンド側ではなく閲覧側に倒しました。 これにより閲覧時は1クエリふえますが、サーバ負荷は軽減されます。
  • 非公開投稿を関連検索対象としてしまっていたのを修正しました。 (thx yuriko さん) ただし非公開投稿の形態素分析は行います。 これは現在のところ仕様とさせてください。 (Yahoo に非公開投稿の内容が送られるのに抵抗があるかたは適宜ソースを修正してください)
  • MySQL 4 系で create table が動かない問題が修正されたハズです。 (thx yuriko さんをかもとさん)
  • テーブル定義で unique をきっていなかったので、辞書生成タイミングによってはキー重複がおきていたため unique を alter しました。 (tnx をかもとさん)
  • (wp_)morpheme テーブルの yahooid 項目を appid 項目に変更しました。 また関連検索時に appid 項目を アプリケーションID をもってひくように修正しました。(というか実装をわすれてました。。)
    Yahoo! 側のバージョンアップがあった場合のデータ切り替えや、他の形態素解析などがでてきた場合を想定して、既存データそのままに appid でなにかしら区分けしようというのが意図でした。(現在のところあまり意味を持っていません) (to yuriko さん)
  • 関連表示の HTML タグがおもいっきり間違っていたので修正しました(汗) (thx テルミナさんおでこさん)
  • add_options_page でマジックナンバーを使っているのを削除しました。 (thx yuriko さん)
  • get_class 時の小文字化のコメントが不適切だったのを修正しました。(thx yuriko さん)
  • 投稿タイトルの取得を get_the_title() に変更しました。(thx yuriko さん)
  • 不要な global 宣言を削除しました。(prefix の指定を wpdb のメンバに変更しました)
  • 少しだけコードのクリーンアップをしました。
  • テンプレートタグのようにつかえる、getRelated() メソッドを追加しました。 (tnx Masayan さんをかもとさん)

ソース差分は sourceforge の CVS から確認できます。

いやーいっぱい。。 すいません、こんなに使っていただけるのならいっかいアルファリリースすればよかたす。。 PHP 5 完全対応はちょっと遅らせます。 simpleXML の部分だけなのでちょっと迷い中です。

最後の getRelated は以下のようにすれば呼び出せるはずです。

<?php if(isset($wpjr)) echo $wpjr->getRelated(); ?>

is_single() 判定していないので、メッセージループの中にいれると好きな位置に関連が表示できます。 思うほどコストは高くないとは思いますが、関連エントリのタイトルなどを取りに行くため、多くの投稿を一度に表示するトップページのループなどでの利用は負荷の注意をして使ってください。

昨日、yuriko さんから興味深いコメントをいただいていますのでご紹介させてください。

形態素解析自体はもはや枯れた技術だと思うんですが、その結果を用いて記事同士の関連を見つけるのは、けっこう難しいことです。本プラグインでは、単語の出現頻度が似ているものを関連している記事としているようですが、それでどこまで適合率および再現率が出てくるかは、興味深いところです (「適合率」「再現率」という用語については Wikipedia の「情報検索」あたりを参照)。

関連記事を5本しかピックアップしないため再現性は重視されていないわけで、適合率を高めるのがポイントとなるでしょうか。

情報検索というのは、非常に面白い分野ですね。 ぼくはまったくもって素人なのであれですが、同じことをするにもいろいろなアルゴリズムがありそうです。

今回は、動的関連生成(その場で検索してしまう)をしたいという要件が最初にあったため、「高速でそれっぽく」というのがテーマでしたがはたして。 文章の内容によってもいろいろクレンジングやチューニングが必要になってきそうで興味はつきません。 🙂

では最後に開発風景などを。

一生懸命 SQL をかいて抽出を確認中の図。(← SQL が苦手である

jrelated21

CVS コミット前の差分確認中。

jrelated22

まだバグいる予感もしますので、何かありましたらご連絡ください。 🙂

WordPress Related Post for Japanese リリース

形態素解析を行い各投稿の関連記事を出力するプラグイン、WordPress Related Post for Japanese ができたのでおいてみます。 🙂 Yahoo! Japan の提供する形態素解析を用いて、その結果を元にランク付けを行い、シングルページの場合に投稿の最後に関連度トップ5 のタイトルとリンクを付与します。

このプラグインは実は 3年前からつくろうとおもっていたものです(笑)

hiromasa.zone :o) » WordPress Related Entries for J (仮称)

そのエントリに関連するエントリを抽出する、Related Entries for J (仮称) を作り始めてみました。

うーん、この手の日本語の処理は大変です。 漢字コード表とにらめっこで、なんとかデバッグ表示くらいまでは動くようになりました。

N-Gram のまねごとで辞書をつくって検索、、という予定だったのですが N-Gram 解析時にメモリ不足でとんだり、はたまた既存の投稿にたいする辞書作成のよい UI が思いつかなかったりで結局お蔵入りになったのでありました。

時はたち、Yahoo さんが形態素解析 API を提供してくれ、WordPress は wp-cron によるバックグラウンド動作をサポートしてくれ、そしてひろまさくんは PHP が少し分かるようになり(笑)、

[tegaki]期は熟した![/tegaki]

ってことでリリースとあいなりました。 🙂

WordPress Plugins/JSeries » WordPress Related Post for Japanese

Yahoo! Japan が提供する日本語形態素解析APIを利用して、WordPress の投稿をアナライズし、自動的に投稿の下部に「関連する記事」へのリンクを付与するプラグインです。

使い方ですが、プラグイン有効化してほっとけばそのうちいい感じに関連記事がでてくるようになります。 ほっとけば、、というのは過去記事に対しては閲覧をフックして、その投稿に辞書がまだなければ Yahoo! に問い合わせがいくようになっています。 なので、サイトアクセス数にもよりますが 2、3日くらい待ってもらえば次第にいい感じになっていくと思います。

bot の襲撃をうければ一気にできるでしょう。 まったりどうぞ。  🙂

jrelated10

jrelated12

形態素分析なんかはめったにできるもんじゃないので、Yahoo! からの貴重な RAW XML データもそのままテーブルに保持しています。 (wp_)morpheme というテーブルが新規にできているはずです。 最初はこのテーブルのできをみていると面白いかもしれません。

形態素解析。

形態素解析 – Wikipedia

対象言語の文法の知識(文法のルールの集まり)や辞書(品詞等の情報付きの単語リスト)を情報源として用い、自然言語で書かれた文を形態素Morpheme, おおまかにいえば、言語で意味を持つ最小単位)の列に分割し、それぞれの品詞を判別する作業を指す。

形態素解析は日本語を文章として解析してそれぞれの品詞を取得できます。 日本語って英語のようにスペースデリミタじゃないので単語の区切りを切り出すには意味の解析が必要です。

日本語の検索というのはこれが難しくって、形態素しないで普通に文字一致で検索をかけると「京都」の検索で「東京都」があたってしまったり、「パン」の検索で「ルパン」があたってしまったりするわけです。 🙂

今回は、このような不具合をさけるためまずは形態素で名詞を抽出し、それをハッシュして DB に登録。 そのハッシュに対して MySQL の like で検索しています。 またハッシュで格納する際に高頻度ででてくる単語を前に配置し、その位置情報も加味してランキングを決めています。(SQL 一発取りしたかったのもある)

まー紛れも多い実装で、やってみるまではドキドキでしたが、うちのサイトではなかなかの精度ででてきてくれるようで嬉しいです。

逆に、Yahoo! が知らない単語、たとえば「プラグイン」が「プラグ」と「イン」にわかれたり、「タチコマ」が「タチ」と「コマ」に分かれたりしていますが、双方はたいていはセットで出現するため大きな問題にはならなかったようです。

関連出さなくても、(wp_)morpheme テーブルを生成するだけでも後々いろいろ使えるかもしれません。(オプションでそういう設定もできます)

たとえば、WordPress のサイト検索をこのテーブル読むようにおきかえると、頻出順とかにもできますし、先ほどの部分一致の問題も回避できるかもです。 あと、robot 用のメタタグいれても面白いかもですね。 一応、隠しで使えそうな function をいれてあったりもします。(やろうとして力尽きたとも言う)

てなわけで、ぼくてきには機能を満たしているので 1.00 にしていますが、みなさんでいろいろ改造してみてください。 🙂

– まっじくなんばー多かったりソースコメントとかええかげんなのは、堪忍な。

Windows Live Writer プラグイン WlOdeko リリース(?)

Masayan さん開催のトラックバック企画「WP2.5に入れるプラグイン10選」の結果発表がありましたが、WP-AddQuictag 強い~ってことで、やはり管理画面から簡単になにかを挿入プラグインというのは人気があります。 🙂

てなわけで、まけないぞー(!?)ってことで、WordPress Live Writer 用の挿入系プラグインのひな形をかいてみました。

WlOdeko-1.02.zip

プラグインリクエスターは、おなじみおでげのおでこさん。 Flickr の HTML ソースを入力すると、いい感じに highslide が動くように HTML を変換して挿入します。

超特定用途ですが、きっとみなさんもそういった要件があるはず。 ソースなおせば、その手のものにはすぐなれると思いますので、必要になったら思い出してもらえれば 🙂

WLW のプラグインは .dll ファイルを作成してプラグインディレクトリに格納すれば動き始めます。

WlOdeko\WlOdeko\bin\Release\WlOdeko.dll

アーカイブでいうとこれっすね。 これを、

C:\Program Files\Windows Live\Writer\Plugins

にいれてあげればOKです。 WLW 起動すると、

wlwp30

てな感じで、右下に追加されます。 あんまりいっぱいいれると見えなくなるみたいなので要注意(笑)

であとは、こいつをくりっと押すと

wlwp31

こんなダイアログがでてくるので、

wlwp32

Flickr のコードいれて、OKするとこんな感じに挿入されます。 この挿入時に highslide が動くように HTML をごにょごにょしています。

wlwp33

WLW のプラグインも WP よろしくいろいろな形態があって、たとえばサイドバーから挿入後にいろいろ属性をいじれたりとかもできるのですが、このサンプルは一番簡単な挿入型です。 小物ですが、ぱっとつくれると結構便利なのではないかと思います。

上の .zip のアーカイブは、それっぽい感じにプロジェクト設定済みなので、Visual C# 2008 Express Edition をインストールしてもらって、WlOdeko.sln をダブルクリックしてもらって、[F6] 押してもらえれば、コンパイルして .dll つくって WLW へのプラグインインストールまでいくはずです。(WLW 本体はビルド前に落としておくのと、インストールパスは標準設定決めうちなのはご注意を)

Visual Studio 左のエクスプローラの WlOdegeForm をダブルクリックするとデザイナが開きます。で、でてきたフォームの OK をダブルクリックすると処理部分のコードがでてくるはずです。 ここをなおしちゃえばオリジナルのできあがり。

wlwp34

一応、バリデーションとかもいれているので、ダイアログだしてほにゃららする系としてそれっぽい流れにはなっているはずです。 適当に修正してください。 🙂

WlOdeko.cs がプラグインのエントリポイントになり、以下のようにプラグイン属性をいれています。 ここも適宜変更を。

[WriterPlugin(
    "25e0a22d-24fe-409c-b23e-d8fa4151ec9a",
    "WlOdeko",
    Description = "おでこを挿入します。",
    HasEditableOptions = false,
    Name = "WlOdeko",
    PublisherUrl = "https://another.maple4ever.net",
    ImagePath = "icon.png")]
[InsertableContentSource("おでこ")]
public class WlOdeko : ContentSource

だいたいのりで分かりますが、一番上の妙な文字列は GID というアプリを一意にする ID です。 まぁ配布しないなら適当でいいですが、一応、プロジェクトのプロパティのアセンブリ情報から作成できるです。 あとここのアセンブリ名は .dll の名称になります。

wlwp35

 wlwp36

アイコン変えたいときは、変更後のアイコンファイルのプロパティを表示して

wlwp38

ビルドアクションを「埋め込まれたリソース」にします。 これで、.dll の中にはいるです。

あとはー、F6 のビルドですが、WLW のプラグインディレクトリに .dll を入れる関係で Administrator 権限じゃないとだめっす。 Vista の人は起動時に Visual Studio の権限昇格しておきましょう。

wlwp39

くらいかな~。 ソースの中身は、PHP っぽくしてみたので普段 C# 使わない人でものりでわかると思います。 最初は HTML の解析に .NET の XMLパーサとかつかっていたのですが、DOM とか Exception 処理とかお手軽感がなくみえたのでやめました。 清く正しく正規表現で加工しています。(笑)

ちょっとがんばればクライアントサイドでフォントレンダリングする、WlTegaki とかもつくれそうです。 まー、静的レンダリングすると文字色背景色が固定になっちゃうのでテーマとかかえると悲しいことになりそうですが、技術的には面白そうですね。

ともかめさんの wp-tmkm-assist など WordPress 動的生成のショートコードの挿入をさらに assist する(id の選択を画面でアシストする)ような WLW プラグインとかもいけてそうです。 wp-tmkm-assist は Word のような参照挿入ができるのでかなり注目しています。 🙂

さいごに、らーめんを挿入。(←むりにおちをつける

 DVC00035