関連記事プラグイン「WordPress Related Posts」ってどうなの

WordPress

関連記事の表示はサイトの回遊率を上げるのに非常に有効な手段です。

WordPressでは関連記事を取得する機能はないため、プラグインを利用したり自分で実装する必要があります。

試しに「wordpress 関連記事 プラグイン」で調べてみるとそれらしい記事はたくさんヒットします。

上位サイトを覗いてみたところほとんどのサイトで「WordPress Related Posts」を紹介していました。

プラグインを開発している身としては、どうしてそんなに人気があるのか気になります。

実際にダウンロードして色々と調べてみました。

WordPress Related Posts の特徴

紹介されている内容として多くあったのは「デザインが複数」や「設定が簡単」などでした。

さっそくプラグインを有効化して確認してみましょう。

するとまだ何も設定していないにもかかわらず記事の最後に関連記事が表示されるようになりました。

あとは関連記事のタイトルが変えられればとりあえずは問題なさそうです。

プラグインの設定画面を確認してみます。

日本語化されていませんがこの時点で設定の数はたったの2つしかなく、さきほど変えたいと思ったタイトルの変更箇所がすぐにわかります。

さらに「Advanced settings」を開くと細かい設定が出てきます。

評判通り色々なデザインがあらかじめ用意されているようです。

選択肢をホバーすればどのようになるのかがすぐわかるので、いちいち保存して確認しに行く必要がありません。

タイトルを変更してデザインも好きなものを選んで保存すれば求めていたことが実現されることでしょう。

非常に有用なプラグイン

普通にブログを書いている人からすればきっとそう思うでしょう。

簡単に かつ 十分にきれいな関連記事が表示さえされれば、このプラグインが裏でどのような動作をしているかはさほど重要視していないようです。

では実際にこのプラグインが裏で行っている処理を見ていきましょう。

プラグインを有効化したとき

有効化と同時にこのプラグインは以下の情報をMixpanelというサービスに送信します。

  • サイトのホスト名(ユーザID)
  • サーバーのIP
  • サーバーのPHPのバージョン
  • このプラグインを有効化したという情報
  • 操作した時間

Mixpanelというサービスはアクセス解析などに使用されるものです。

あなたがこのプラグインを有効化したという情報は収集されています。

こういった情報が送信されることは事前に説明されていましたか?

プラグイン作成者は無料で作っているのだからそれくらいは問題ない?

PHPのバージョンを見て脆弱性を探すことができ、さらにホスト名もわかるので…

でも1発だけなら誤射かもしれない…?

設定画面に毎日アクセスしてみる

いいえ、誤射なんかではありません。

「WordPress Related Posts」の設定画面にアクセスすると、一日に一回さっきの情報と紐づいた情報が送られます。

あなたがこのプラグインを使用しているということは監視されています。

無効化時

想像通りだと思いますが、この時も無効化したという情報を送信してくれます。

あなたがこのプラグインを使わなくなったということが、あなたのサイトの情報とともに送られます。

何に使っているかはわかりませんが…

設定画面にアクセス時

「WordPress Related Posts」の設定画面を開くたびに「Zemanta」というサービスと連携するために

http://api-ea.sovrn.com/services/rest/0.0/

というAPIにアクセスします。

少し古い記事を見てみたところ、かつては携帯端末とPCとでクリック率等を表示するために使用していたサービスのようで、有効化するときにサービス利用規約的なのに同意するといった文言があったようです。

【ワードプレス・プラグイン】Related Posts by Zemantaの設定方法 | M-design
『Related Posts by Zemanta』の設定方法と使い方を解説しています。     『Related Posts by Zemanta』は関連記事を自動的に表示するプラグインです。 これ・・・

今は稼働していないようですが勝手にAPIにアクセスしている状態です。

どのような判断で関連記事を決めているか

tf-idfのようなもので算出しているようです。

tf-idfは関連記事を求めるのによく使われる手法なので、アプローチとしては正しいです。

ただ日本語記事の場合はこのプラグインの処理では意味のあるものにはなっていません。

tfの算出

tfとは単語の出現頻度、すなわち記事の中にある単語が割合で含まれているかの値です。

このプラグインではtfは「タグ」と「カテゴリ」と「タイトルと本文から抽出した単語」をそれぞれ重みづけしたもので導出しています。

重みはタグは10倍、カテゴリーは5倍、単語は2倍になっています。

ただし「タイトルと本文から抽出した単語」は以下のような処理で抽出されています。

  1. 「タイトルを空白で分割した集合」と「本文を空白で分割した集合」を合わせて先頭から200件取得(⇒英語の文章であれば単語の集合になるが日本語では…)
  2. それぞれの単語に対して、
    1. 小文字に変換
    2. 英単語に使われるような文字(アルファベットや数字)以外を削除(もはや日本語は含まれない)
    3. 英単語の正規化
    4. 使用頻度を集計
  3. それぞれの集計された単語に対して
    1. 辞書登録された単語かどうか判定(lib/unigrams.csv)
    2. 「辞書登録された恐らく様々な文章から集計した単語の使用頻度の逆数(idfに相当)と思われる値」と「記事内での疑似的な使用回数をルート2した値」を掛けた値を評価値として保存(tf-idfとは違うが似たような値)
  4. 評価値の高い順に並び替えて先頭の15この単語を「タイトルと本文から抽出した単語」として使用

いろいろ処理をしていますが日本語に関しては全く考慮されていません。

実際にQiitaで見つけた適当な記事で抽出された単語をvar_dumpしてみた結果です。

array (size=6)
  'idc' => float 0.038011695906433
  'ls' => float 0.025296442687747
  'div' => float 0.020052770448549
  10 => float 0.013195470211718
  'a' => float 0.009815123425433
  'id' => float 0.0072491278699008
array (size=22)
  'wip' => float 0.10532994923858
  'app' => float 0.10421374296051
  'lili' => float 0.093619341937829
  'lia' => float 0.069284064665127
  'ul' => float 0.050354609929078
  'api' => float 0.045795543612138
  'code' => float 0.04433888441912
  'rust' => float 0.043381535038932
  'div' => float 0.040105540897098
  'hook' => float 0.034950692551906
  'github' => float 0.032662192393736
  'cargo' => float 0.028380423814329
  'li' => float 0.023232382997962
  'ol' => float 0.020092041755528
  'releas' => float 0.018155341509202
  'ci' => float 0.017123287671233
  'a' => float 0.017000292455409
  'url' => float 0.0097022044566265
  'span' => float 0.0071037315987675
  'warn' => float 0.0069141235740344
  'merg' => float 0.0046314780803322
  'id' => float 0.0041852859270773
array (size=4)
  'aa' => float 0.042318634423898
  'div' => float 0.028358899931492
  'span' => float 0.016659727322207
  'id' => float 0.0059188881204819
array (size=19)
  'app' => float 0.18050349765452
  'googl' => float 0.095306368156461
  'alt' => float 0.081311562818174
  'h2' => float 0.073587385019711
  'gt' => float 0.055269922879177
  'ga' => float 0.054751778921616
  'aa' => float 0.042318634423898
  'a' => float 0.040468790611534
  8 => float 0.040403893255304
  'script' => float 0.030460274827131
  42 => float 0.022950819672131
  1 => float 0.022224657133987
  'div' => float 0.020052770448549
  5 => float 0.019731872160836
  58 => float 0.012737501326823
  45 => float 0.0076729776908174
  23 => float 0.0070726915520629
  'id' => float 0.0059188881204819
  56 => float 0.0051706308169597

これらからどれだけ記事が似ているか判断できるでしょうか?

idfの算出

idfとは逆文書頻度、すなわち全ての記事でどのくらいその単語が使用されているかの割合の逆数です(単語のレア度)。

先ほどの処理内容の3.2に相当します。

あなたが投稿した記事からではなく、このプラグインの提供している辞書から判定しています。

この辞書はもちろん英語にしか対応していないようなので意味はありません。

評価値の算出

タイトルや本文からは意味のない評価値しか得られないため、結局のところ「タグ」と「カテゴリ」のみで判定されているようなものです。

それであれば先に挙げたような無駄な処理は不要で、同じタグやカテゴリを持つ記事をランダムでとってきてもさほど違いはないと思います。

このプラグインのメリット

このプラグインは、無意味な処理で機械的に算出された関連記事よりも、記事画面から手動で好きな記事を関連記事として簡単に登録できる点にあると思います。

この機能は操作感もよく直観的で、非常に素晴らしいものです。

まとめ

WordPressの関連記事を検索してきたときに上位に出てくるサイトでよく称賛されているプラグインだとしても、裏ではいろいろな情報を勝手に取得している場合があります。

本来は個人を特定できないCookieでさえプロファイルで特定可能だとか色々言われて個人情報保護が謳われている今日において、同意も得ずにサイトのセキュリティに関わる重要情報を勝手に送信するのはどうかと思います。

デザインの重要性や導入・設定の容易さは見習うべきところがあり、今後のプラグイン開発に生かしていきたいです。

宣伝

関連記事に関するプラグインを開発中です。

Elasticsearchのような検索機能を提供するためのWordPressのプラグイン
WordPressはデフォルトでキーワード検索機能がありますが、精度はあまりよくありません。具体的には、例えば「php wordpress 管理サイト」のように検索した場合、これらすべての単語を含んでいる記事しか引っかかりません。「word

まだデザイン的なものは用意しておらず、PHPを理解している開発者向けになってしまっています。

tf-idfよりも一般的に良い結果が得られるといわれているアルゴリズム「Okapi BM25」を使用しています。

もちろん日本語に対応しており(むしろ日本語向けのみ)、分かち書き(文章から単語に分割すること)には

  • Yahoo!APIを利用したもの
  • バイグラム(2文字ずつ分割)
  • Igoと呼ばれる形態素解析器

の3通りを用意しています。

多くのフィルタを用意してあり、プログラムさえかければプラグインを拡張して分かち書きの方法も追加することが可能です。

WP Related Post JP は Elasticsearchのような全文検索やインデックス化による関連記事の提供を可能にするプラグインです。
詳細はこちらをご覧ください。

コメント