鴨川にあこがれる日々

軽い技術っぽい記事かいてます

知人に相談されたことをいかにして解くか(AV女優編)

はじめに

この記事にはAV女優に関する言及がいくつかあります.
苦手な方はスクロールせずに戻っていただけると幸いです.


とある知り合い(以下Aさん)に深刻な面持ちでこのような相談を受けました.
有村千佳っていう好きなAV女優が5月で引退してすごい困るんだけど,似てる女優調べるのが億劫なんだよね.どうにかならないかなぁ???」


これに対する私がとった簡易的な解決策をまとめました.

使用するデータについて

ほとんどのAV女優の作品はDMM.R18にあります.(おそらく)
DMM.R18の動画ページには,女優名や監督名などの他にもジャンルというフィールドがあり,いくつかのタグが付与されています.

なので,女優名とジャンルのタグを今回は使用します.
直近1000件の動画ページをwgetでsleep 1秒あけつつ取得したものを
Rubyのnokogiriで女優名とタグを取り出します.

総集編のような複数人が参加している作品については,個人ごとにジャンルタグを割り当てました.
結果

  • ユニーク女優数 : 1077
  • ユニークタグ数 : 184

を得ました.

定式化

前述したデータはグラフにおける有向2部グラフとして考える事ができます.
グラフ理論 - Wikipedia

fromが女優でtoがタグです.

Aさんを助けるためには,有村千佳と似ている女優を得たいので,
fromのノードの中から有村千佳ノードともっとも類似度が高いノードを抽出できれば良いことになります.


ノード間の類似度を得るために,今回はSimrankを使用しました.
Simrankはあるノードと別のノードの隣接するノードが似ていれば,
そのノード同士は似ている,とする類似度です.

今回の問題に当てはめると,
似たようなジャンルのタグがついた作品に出演しているAV女優同士は似ている,
ことになります


Simrankは以下の論文の4.3 Bipartite Simrankを参考にしました.
http://www-cs-students.stanford.edu/~glenj/simrank.pdf

計算量が多いため,Simrankは高速化の計算方法がいくつか提案されていますが,今回はナイーブな実装を行いました.

パラメータは論文の通り,
{ \displaystyle
C_{1}=0.8,C_{2}=0.8,k=5
}

で計算を行いました.


コードはいろいろな関係で後日記載します.

Simrank自体は10年以上前の指標ですし,他にもPageRankのようなやり方もありますが,
直感的で実装がしやすかったので,Simrankを使いました.

結果

計算した結果とりあえず雪見紗弥さんが得られました.

後日Aさんに教えたいと思います.

また,女優だけでなく,タグでも類似度が計算できるので,

f:id:another16javac:20150405211800p:plain

と言った結果も得られます.

幾つか試してみて,タグはいい感じに取れるものとそうでないものがありました.

  • バイブ→ローター
  • ふたなり→デカチン・巨根
  • 女子校生→学生服
  • OL→秘書
  • ベスト・総集編→4時間以上作品
  • お姉さん→セクシー

以前に似たようなことしてなかった?

nzw.hatenablog.jp

単語間の類似度を出すにはword2vecがかなり便利なのですが,
DMM.R18のビデオの紹介文は隠語が多用されているため形態素解析が難しいこと,
文書数が少ないこと(今回は1000件)

からAさんを満足させる結果が得られないと思われたため,行いませんでした.
タグと女優名が予め用意されていることから前処理が少ないSimrankを選びました.



おわりに

高速な計算手法や別の手法で計算することを,今後の課題としたいと思います.