Hatena::ブログ(Diary)

TMBのおぼえがき

2011-03-17

きれいなおねいさんのあつめかた:Bijostagramのはなし。

Bijostagram(びじょすたぐらむ)というWebサービスを作ってみました。

http://bijostagram.com

Bijostagram - Cute Girls on Instagram

きれいなおねいさんは、好きですか?

Bijostagramとは?

Bijostagramは、きれいなおねいさんの画像がたくさん眺められるサービスです(個人的に作りました)。一番の大きな特徴は、Instagramから自動的にきれいなおねいさんの画像を集めてくる、というところです。Bijostagramでは、集めてきたおねいさん画像をランダムに表示しています。


Instagramは写真版Twitterで、しかも撮影した画像をオサレな感じで加工できてツイートできるというサービス。2月末に公式のAPIが公開されたので、いじってみました。→インスタグラムのAPIについてはこちら


Bijostagramは、画像抽出と画像配置のアルゴリズムPerlで実装して、id:amachangオサレなフロントエンドを手伝ってもらいました。あまちゃんありがとう。オサレなフロントエンドの話はまたおいおいするとして・・・。


Bijostagramの中身でやってること

Bijostagramの中身でやってることはそんなに難しくありません。やっていることは以下のこと。


    1. 1. InstagramAPIを使って画像とタグ、コメントを集めてくる
    2. 2. OpenCVを使って、顔画像判定を行う
    3. 3. 顔画像の領域や、タグ、コメントを素性として機械学習SVM)でモデルを作成
    4. 4. 作成したモデルをもとに、画像を美女判定

今回一番ネックになるかなぁ、と思ったのは、画像認識の所です。データマイニングに関してはある程度は知識はありますが、画像認識や画像処理については専門家ではないので、どこまでいけるかと思いましたが、OpenCVがすばらしく、あっさり実装できてしまいました。今まで手を出してなかった方は、ぜひいじってみるといいと思います。なおPerlOpenCVをいじるのに、以下の記事を参考にいたしました。

OpenCVを使って画像の物体認識をするPerlモジュール作った - spiritlooseのはてなダイアリー


トレーニングデータは集めてきた画像に対して自分でビジョかどうか仕分けしました。ツイッターで「作者と趣味が合わない!」とのコメントがありましたが、たぶんこの仕分けのせいです・・・。すみません。僕の趣味です。また、時々若干年齢層の低いビジョが引っかかっていますが、趣味ではなく自動的に判定した結果です。ロリコンではありません。多分。


画像判定の精度は95%くらいです。もちろん、ビジョの基準は人によって異なるので、出てくる人が全員ビジョだ!という人もいるでしょうし、ハードルの高い人はビジョ10%かもしれませんが・・・。

人気のビジョ

リリースしてからたくさんの方からアクセスをいただき感謝しています。ちょっと面白いのは、国別のアクセス。もちろん日本からのアクセスが一番多いですが、次に多いのが台湾。おそらくどこからか台湾クラスターにうまく広がっていったのでしょう。


Bijostagramでは、気になるビジョをクリックするとInstagramのサイトに飛ぶように作ってあります。内部的にはどのビジョがクリックされたかがわかるので、これを集計すると人気のビジョランキングを作ることができます。ちなみにサイトを開いて一番最初は、人気上位200位のビジョがランダムに表示されます。


では、一番アクセスの多い日本で人気ビジョと、二番目に多い台湾で人気ビジョをご紹介します。ランキング順に画像が大きくなっています。


日本での人気ビジョ

f:id:hirotmb:20110317005827p:image

台湾での人気ビジョ

f:id:hirotmb:20110317005828p:image


各国で好むビジョの傾向があるかもしれませんね!いろんな国からのアクセスが増えているので、何か面白いものができるかもしれません。


Instagram APIを使ったなかまたち

InstagramAPIが公開されて、このAPIを利用したサービスが沢山生まれてます。代表的なのはid:ruedapさんのNekostagramでしょう。他にもたくさんあるので、まとめ記事を参照してください。

Nekostagram - Cat Lovers Instagram Viewer

お探しのページは見つかりませんでした。 - はてなブログ

最後に

3月11日東北関東大地震が起きました。被災された方々には心よりお見舞い申し上げます。Instagram上でも、海外から非常に多くのフォトメッセージが流れています。こういったメッセージを少しでも多くの人の目に触れてもらえればと思い、Bijostagramをちょっと改良してサイトを作りました。画像は、Pray_for_Japanというタグがついているものを集めています。ぜひご覧になっていただけたらと思います。

Pray for Japan on Instagram

http://bijostagram.com/pray_for_japan.html

2010-12-19

SPYSEEのつながりマイニングのはなし。

オーマ×クックパッド勉強会に参加しました

f:id:hirotmb:20101221184853p:image:h300

ごはんが美味しかった。

まえおき

FuelPHP Frameworkのなかのひとです。

フロントエンドやインフラ系はシャッチョーやid:amachangがやっているので、それ以外のところやってます。主にアルゴリズム。つながりの抽出手法や同姓同名処理手法を開発しました。


時々、なかのひととしていろんな会合に出没してます。そのたびに、


「つながりどうやってできてんのー?」

「同姓同名どうなってんのー?」


など聞かれますが、詳細に答えたことはありませんでした。about SPYSEE的な話はIVSのLaunch Pad(動画)などで話したことはありますが、アルゴリズムの詳しいところまでは時間なくて話しておりません。


さて先日、オーマ×クックパッド合同勉強会 を開催しました。そこでお時間いただき、「SPYSEEのつながりマイニング手法」という題目で講演させていただきました。参加されなかった方や、参加した方のおさらい用に当日の発表のまとめを公開できる範囲で用意いたしましたので、ご興味ある方はぜひご覧になっていただければと思います。

SPYSEEは学術研究をベースにしたアルゴリズムに支えられている

SPYSEEの歴史については、id:amachangが詳細に書いてくれている・・・ハズです。僕が博士課程に在学中に研究していた、研究者間の人間関係(共著や同所属、学会参加など)をウェブから自動抽出する、というものがスパイシーのつながりの原型になっています。その後、いくつもの研究開発を重ねてアルゴリズムを精錬したものが今のスパイシーのコアエンジンとして稼動しています。

SPYSEEは(ほぼ)すべての情報を自動で抽出している

SPYSEEで人物のページでは、以下の情報を見ることができます。

    • 顔写真
    • プロフィール
    • 相関図(つながり)
    • タグ
    • 関連商品
    • みんなのうわさ(Twitter
    • キーワード
    • etc...

このうち、ユーザさんに入力してもらうタグ、メイン顔写真(クロールしてきた顔写真から最適なものを選ぶ)を除き、すべての情報を自動的に取得しています。それぞれその人物に最適な情報を抽出するためのアルゴリズムを開発し、人物名が追加されるたびに自動的に取得する仕組みになっています。SPYSEEが運用開始から2010年12月15日正午までに、自動で取得した情報の量をスライドにまとめました。

f:id:hirotmb:20101220005017p:image

つながり抽出のベースとなる考え方

ここからが本題です。ひととひとのつながり自動抽出の方法について説明します。SPYSEEでつながりを抽出するときにベースとなった考え方があります。それは・・・


「たくさんのウェブページで名前が一緒に出てくる人はつながりがあるはずだ」


というものです。二人の名前を検索エンジンに入れると、その二人のひとの名前が一緒に出現するページの数がわかります。

f:id:hirotmb:20101220005834p:image

ここで、市川海老蔵さんと小林麻央さんで検索すると、60万件を超えるウェブページがあることがわかります。一方で、市川海老蔵さんと僕の名前で検索すると、ほとんどヒットしません(当然、面識もなにもないので・・・)。このことから、「市川海老蔵さんと僕」のつながりよりも「市川海老蔵さんと小林麻央さん」のつながりの方が強い、ということが予想されます。これがベースとなる考え方です。この、二人の名前が一緒に出現するウェブページの数を共起ヒット件数と呼びます。

ただし、実はこの共起ヒット件数だけではひとのつながりをうまく抽出することができません。というのも、有名人同士の共起ヒット件数は、そうでない人との共起ヒット件数に比べて、大きい数字になる傾向があるからです。そこで、SPYSEEではウェブ検索のヒット件数をつかってつながりの強さを抽出する指標を開発しました。ただ、こちらはもちろん公表できないものですので、参考によく使われる指標を挙げておきます。

f:id:hirotmb:20101220010842p:image

スライドにもかいてありますが、SPYSEEではこれらの指標の組み合わせでつながりの強さを算出しています。

クローリングの問題

さて、氏名を組み合わせて共起ヒット件数などを取得すればつながりを抽出できることがわかりました。しかし実際にやろうとするとすぐに問題にぶちあたります。それは・・・


「クローリング回数が膨大な数になる」


というものです。先ほどSPYSEEが取得したデータ数を挙げましたが、登録人数は853,542人です。これで二人の氏名の組み合わせを作ると、


853,542 x (853,542 - 1) / 2 = 364,266,546,111


3600億回・・・。これは絶望的な数字です。どうしよう。


クローリングする候補を絞り込む

そこで、クローリングする候補を絞り込むことを考えます。最初のベースとなる考え方のところで出した例を思い出してください。市川海老蔵さんと小林麻央さんは共起ヒット件数が60万件以上でしたが、共起ヒット件数がこれだけたくさん取れる例は珍しいです。先ほど計算した3600億の組み合わせのうち多くの場合が、市川海老蔵さんと僕のように、ほとんど共起ヒット件数がないものでしょう。そこで、効率よくクローリングするため事前にクローリング候補を絞り込む手法を考えました。


f:id:hirotmb:20101220012509p:image

f:id:hirotmb:20101220012510p:image

これにより、一人当たり80万人以上クローリングしなければならなかったものが、100人程度に抑えることができます。実は、候補となる氏名が取得できるウェブページの集め方には工夫が必要だったり、集めてきたウェブページから氏名を抽出するところにも工夫が必要だったりします。


ページの中まで読む

以上でだいたいのつながりは抽出できますが、それでもまだ問題があります。同じページ、しかも同じ文に二人の名前が出てくるケースを例に挙げます。

例1

私、小林麻央市川海老蔵さんと結婚を前提にしてお付き合いをしております・・・


例2

押尾学報道市川海老蔵報道も両方とも賑やかだなぁ・・・。



例1では、市川海老蔵さんと小林麻央さんは婚約関係という非常に強いつながりがありますが、例2の押尾学さんと市川海老蔵さんのつながりはそれほど強くなさそうです。しかし、共起ヒット件数を取得する手法だけだと、このような細かい処理ができません。

そこで、ページの中を読みつながりの強弱を数値化する指標も開発しています。この指標は、

    • 氏名の出現頻度
    • 氏名の出現する位置の近さ
    • 文の係り受け
    • etc...

をミックスして計算しています。共起ヒット件数だけでは補えきれない細かい関係までケアできるようになっています。

まとめ

f:id:hirotmb:20101220013908p:image


最後に

今回ご紹介させていただいたものは、SPYSEE内部のアルゴリズムのごく一部です。検索機能についてはid:mroriiが説明してくれています。他にも同姓同名や機械学習ソーシャルサービスマイニングなど様々なアルゴリズムを開発していますので、機会があればこのブログで紹介させていただけたらなぁと思います。


ずいぶん長くなりましたが、読んでいただき誠にありがとうございました。f:id:hirotmb:20101221184651p:image