唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

「Pixiv Tag Suggest」に学習機能を追加しました

Pixiv Tag Suggest

pixivでブックマーク時にタグ推薦を行うChrome拡張を作っています.
今までは文字列の包含関係や最長共通部分列などを使って判断していました.

学習機能の追加

しかしこの方法では「STEINS;GATE」→「シュタインズゲート」といったように表層的に似ていない場合には対応できません.
そこで過去のブックマーク履歴から学習する機能を導入しました.

具体的な手法としては統計的機械翻訳の手法を用いています.
参考にしたのはEMNLP 2011の論文の"A Simple Word Trigger Method for Social Tag Suggestion"です.
この論文ではリソースの説明文とタグのアラインメント(対応関係あるいは翻訳確率)をIBM Model 1を用いて学習しています.
説明文からタグへの翻訳確率と,逆方向の翻訳確率の調和平均を用いたり,tf-idfによる重み付けなどをやっています.

「Pixiv Tag Suggest」では,シンプルにIBM Model 1を用いて作品のタグから個々人がブックマークしているタグへの翻訳確率を推定し,その値を推薦に利用します.
IBM Model 1の実装は以下の記事を参考にさせていただき,JavaScriptに書き直しました.

また以下のスライドはIBM Model 1の説明として参考になります.

評価

自分のブックマークを適当に400件ほど集めて実験.

  1. 前処理として,アルファベットの大文字化と,どれにも対応しないことを表すタグ(NULL)をすべてのデータに追加.
  2. 2回以上登場した「作品のタグ」と「ブックマークタグ」のペアのみを用いてパラメータの推定.
  3. ある作品のすべての「作品のタグ」の「ブックマークタグ」への翻訳確率を足しあわせて,上位3件を推薦とみなす.10分割交差検定を用いて評価.ただし,どちらかのタグが空のデータ(NULLだけ)は評価の際は除外.
Recall Precision F-measure
0.58 0.37 0.45
面白い結果

18禁注意!
私が悪いんじゃなくて,イラストについてるタグが悪いんです><
以下を見るとある程度意味が捉えられてることがわかると思います(笑)

  • 「中出し」→「R-18」
  • 「触手」→「R-18」
  • 「すじ」→「R-18」
  • 「前から見えるお尻」→「R-18」
  • 「泣き顔」→「涙」
  • 「ドSホイホイ」→「涙」
  • 「狐耳」→「獣耳」
  • アルビノ」→「白髪」

ソースコード

一応クラス化してあるけど,前処理の部分は直書き.

本体部分は昔書いたのでかなり汚い.クラスとかCoffeeScriptとか覚えて書き直したい.

関連記事

sucrose.hatenablog.com