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 1.01 (バグフィックスリリース)」への11件のフィードバック

  1. 自然言語処理については、一応専門分野なのでそれなりに知っています。ただ、検索関連はあまり詳しくありませんが……。

    単語出現順にリストを作って、そのリストが似ているものを関連ありとするのは、簡単ですが比較的効果が高い方法だと思います。

    名詞の出現リストですが、ここからストップワード (その言語で一般的によく出る単語) や全ポストでよく出る単語を除去するとかすれば、「その投稿だけに顕著な単語」が絞り出せて精度 (適合率) が上がると思います。
    日本語の名詞だと「わたし」「私」「ぼく」とかの人称代名詞、「三」とかの数値がストップワードとして適切でしょう (Yahoo の場合「匹」という数助詞は「接尾辞」に分類されていました)。
    全ポストでよく出る言葉を除去するのも比較的効果的なんですが、逆効果もありそうです。「WordPress」という語がよく出るウェブログでこれを無視してしまうと「WordPress 2.6 リリース」という記事と「WordPress 2.6 のバグ」という記事が関連なしになってしまうかもしれません。

    このへんは、(wp_)morpheme テーブルの中身を見たり、関連投稿の結果を見たりして調整していく必要があるでしょうか。いろんなウェブログでインストールしてもらってテストすると楽しいでしょう。
    ウチはまだ入れていませんが、精度向上のために時間を見て試してみる予定です (というか、Yahoo! 不要の N-gram バージョンを作るかも 😉 😉

  2. ピンバック: kuniharumaki blog

  3. yuriko さん

    なるほど、ストップワードというのですね。たしかに、開発中も試験データで「ぼく」などが上位にでてきていて気になっていました。 オプション画面にストップワード設定があると良い感じがしますね。 うーん、参考になります。

    一応、容量を犠牲にして RAW XML も保持していますので少し研究してみることにします。 これはおもしろいですね!

    N-Gram 楽しみです。実はつくるのを一度断念していまして。。 hiromasa.zone.ne.jp が 8M リミットのメモリだったのもあるのですが、アルゴリズム的にも分からないことがたくさんあったので、とても勉強になりそうです。 🙂

  4. >N-Gram 楽しみです。実はつくるのを一度断念していまして。

    関連投稿を出すのはあまり興味がないので、なかなか着手しないかもしれません。

    実は来年のエイプリルフールプラグインは形態素解析系を検討していて、Yahoo! API をそろそろ勉強する予定でした。しかし、「ジョークプラグインのために Yahoo! に登録してもらう」のはなかなか敷居が高いと思っていたところです。
    本プラグインが普及すれば、RAW XML を横取りするだけで「ジョークプラグイン」が実現できるので、楽になりそうです 😉

  5. そーなんですよね。 このデータはいろいろ使えそうなので、とれるだけとってみました。 実は使うのは出現頻度情報データだけでよかったのですが、形態素解析の生も別途とってきていたりします。(笑)

    いずれにせよこの手の解析は興味がありますので、なにか面白いものができることを期待しています。 🙂

  6. MySQL4系でもバッチリ動作しました。
    ただいま辞書構築中。

    この形態素解析後のデータは良いですね。
    これを利用すれば、圧縮新聞の WordPress プラグイン版とか、すぐできそうな気がします。

  7. おお、よかったす!
    ゲーム系の投稿でちゃんとゲーム関連がでていて、思わず Wikipedia のようにあちこちさまよってしまいました 🙂

    圧縮WordPress いいっすね。 うちの抜粋 RSS、これにしますか(笑)

  8. これを利用すれば、圧縮新聞の WordPress プラグイン版とか、すぐできそうな気がします。

    自動要約はなかなか難しいですよ。形態素解析だけでやるとすれば、冗長な単語 (「えーと」とか) を除去するぐらいでしょうか。接続詞から文同士の関係を見て、より重要な文を残すなどの処理になると、あらゆる接続詞についてルールを書かないといけないのでちょっと作業が多くなります。
    ただし、XHTML ドキュメントだと、ul とか dl とかの箇条書き系や blockquote など引用系は重要度が低いと判断するなどのヒューリスティックは使えるかもしれません。

    新聞の場合、冒頭にある文章を抜き出して冗長な語句を抜けばいいので実は楽なんです。ブログのような雑文だと、どこに論旨があるか不明なので、要約がやりにくい題材ですね。

  9. ピンバック: Wing World» ブログアーカイブ » iWPhone WordPress Plugin and Theme Version 0.1.2

  10. ひろまささん、どもです。

    エントリ中にショートコードが埋め込まれてると上手くないです。
    頻出単語の中にショートコード名やプロパティ名が入ってしまって、関連が無い記事もピックアップされてしまいます。
    WordPress 2.6 からは、メディアライブラリに登録された画像をエントリに挿入すると、デフォルトで caption と言うショートコードが挿入されるので、かなり致命的では?

    辞書作成時、Yahoo の 日本語形態素解析API に渡す前に strip_tags() しているのであれば、ショートコードタグも剥ぎ取ってはいかがでしょうか?
    # とりあえず preg_replace(‘/\[[^\]]*\]/’, ”, $content) で行けるはず。

  11. ピンバック: 独断と偏見の何でもレビュー

コメントを残す