SlideShare a Scribd company logo
「これを買っている人はこれも買っています」
実装してみた
デジタルサーカス(株)長谷川智希
side
長谷川智希
とも き
@tomzoh

とむぞう
趣味 Webサイト開発, iOSアプリ開発
レンタルカートレース, ビール, 電子工作 (mbed), …
TOMZOH
デジタルサーカス(株)

副団長CTO
Facebook CakePHP iOS
デジタルサーカス(株)
・ Webサイト開発
・ スマホアプリ開発
・ 自社サービス
( )
(iOS, Android)
(http://appbuilder.jp)
Twitter: @tomzoh
Twitter: @tomzoh
今日のテーマ:
「これを買っている人はこれも買っています」
実装してみた
side
Toby Segaran 著
當山 仁健、鴨澤 眞夫 訳
出版社: オライリージャパン
2008年07月 発行
392ページ
ISBN978-4-87311-364-7
http://www.amazon.co.jp/dp/4873113644
2章
推薦を行う
「この映画に高い評価をした人は、こんな
映画にも高い評価をしています。」のアルゴ
リズム。
・自分に似ている人は誰か
・この映画に似ている映画は何か
# 映画の評者といくつかの映画に対する彼らの評点のディクショナリ

critics={
'Lisa Rose': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.5, 'Just My Luck': 3.0, 'Superman Returns': 3.5,
'You, Me and Dupree': 2.5, 'The Night Listener': 3.0},
'Gene Seymour': {'Lady in the Water': 3.0, 'Snakes on a Plane': 3.5, 'Just My Luck': 1.5, 'Superman Returns':
5.0, 'The Night Listener': 3.0, 'You, Me and Dupree': 3.5},
'Michael Phillips': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.0, 'Superman Returns': 3.5, 'The Night
Listener': 4.0},
'Claudia Puig': {'Snakes on a Plane': 3.5, 'Just My Luck': 3.0, 'The Night Listener': 4.5, 'Superman Returns': 4.0,
'You, Me and Dupree': 2.5},
'Mick LaSalle': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0, 'Just My Luck': 2.0, 'Superman Returns': 3.0,
'The Night Listener': 3.0, 'You, Me and Dupree': 2.0},
'Jack Matthews': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0, 'The Night Listener': 3.0, 'Superman
Returns': 5.0, 'You, Me and Dupree': 3.5},
'Toby': {'Snakes on a Plane':4.5,'You, Me and Dupree':1.0,'Superman Returns’:4.0}
}
「これを買っている人はこれも買っています」実装してみた PHP side
「これを買っている人はこれも買っています」実装してみた PHP side
「これを買っている人はこれも買っています」実装してみた PHP side
やりたいこと
・ 「このリポジトリにスターした⼈はこんなリポジ
トリにもスターしています」
・ ⾒ると嬉しいであろうリポジトリをお勧めして
くれるシステム!
推薦: 2つの⽅法
(1)⾃分に似たユーザを探して、そのユーザが
スターしているリポジトリを推薦する。
(2)⾃分がスターしているリポジトリについて、
似たリポジトリを探して推薦する。
「似ている」
どうやって「似ている」と判断するか。
「似ている」
どうやって「似ている」と判断するか。
「似ている」 = 「近い」
ユークリッド距離
63
2
3
ユークリッド距離
sqrt((6-3)^2 + (2-3)^2) = 3.16…
63
2
3 3.16…
ユークリッド距離
John Steve Tim Philip
The Shawshank Redemption 1 1 2 2
The Man in the Iron Mask 2 1 4 1
ID4 2 3
The Devil Wears Prada 3 5 4
ユークリッド距離
John Steve Tim Philip
The Shawshank Redemption 1 1 2 2
The Man in the Iron Mask 2 1 4 1
ID4 2 3
The Devil Wears Prada 3 5 4
JohnとSteveの距離:
ユークリッド距離
John Steve Tim Philip
The Shawshank Redemption 1 1 2 2
The Man in the Iron Mask 2 1 4 1
ID4 2 3
The Devil Wears Prada 3 5 4
JohnとSteveの距離:
sqrt((1-1)^2 + (2-1)^2 + (2-0)^2 + (3-5)^2))
ユークリッド距離
John Steve Tim Philip
The Shawshank Redemption 1 1 2 2
The Man in the Iron Mask 2 1 4 1
ID4 2 3
The Devil Wears Prada 3 5 4
JohnとSteveの距離:
sqrt((1-1)^2 + (2-1)^2 + (2-0)^2 + (3-5)^2))
( - )^2 +
( - )^2 +
( - )^2 +
( - )^2
John Steve Tim Philip
John - 3 4.2 2
Steve * - 5.9 3.3
Tim * * - 5.8
Philip * * * -
John Steve Tim Philip
John - 3 4.2 2
Steve * - 5.9 3.3
Tim * * - 5.8
Philip * * * -
John Steve Tim Philip
John - 3 4.2 2
Steve * - 5.9 3.3
Tim * * - 5.8
Philip * * * -
TimにはJohnが⾒た映画を推薦すれば良さそう
John Steve Tim Philip
The Shawshank Redemption 1 1 2 2
The Man in the Iron Mask 2 1 4 1
ID4 2 3
The Devil Wears Prada 3 5 4
John Steve Tim Philip
The Shawshank Redemption 1 1 2 2
The Man in the Iron Mask 2 1 4 1
ID4 2 3
The Devil Wears Prada 3 5 4
John Steve Tim Philip
The Shawshank Redemption 1 1 2 2
The Man in the Iron Mask 2 1 4 1
ID4 2 3
The Devil Wears Prada 3 5 4
「これを買っている人はこれも買っています」実装してみた PHP side
良い映画ですよね😇
観てない?
http://www.amazon.co.jp/dp/B0083RQI0S
BUY NOW
話を戻して…
推薦: 2つの⽅法
(1)⾃分に似たユーザを探して、そのユーザが
スターしているリポジトリを推薦する。
(2)⾃分がスターしているリポジトリについて、
似たリポジトリを探して推薦する。
「これを買っている人はこれも買っています」実装してみた PHP side
「これを買っている人はこれも買っています」実装してみた PHP side
⭐ Repo
88,811 twbs/bootstrap
45,137 vhf/free-programming-books
44,106 angular/angular.js
43,279 mbostock/d3
37,667 nodejs/node-v0.x-archive
36,648 jquery/jquery
31,681 h5bp/html5-boilerplate
31,461 FreeCodeCamp/FreeCodeCamp
31,080 facebook/react
29,881 robbyrussell/oh-my-zsh
29,651 meteor/meteor
29,413 github/gitignore
28,336 rails/rails
27,248 torvalds/linux
27,111 Homebrew/homebrew
User
mvied
dcwatson
christophwille
rpoisel
victoriafrench
runcom
brynary
marceloemanoel
ysrb
Caged
anotherjesse
kevwil
rsanheim
BrianTheCoder
lancecarlson
kvnsmth
josh
⭐ Repo
88,811 twbs/bootstrap
45,137 vhf/free-programming-books
44,106 angular/angular.js
43,279 mbostock/d3
37,667 nodejs/node-v0.x-archive
36,648 jquery/jquery
31,681 h5bp/html5-boilerplate
31,461 FreeCodeCamp/FreeCodeCamp
31,080 facebook/react
29,881 robbyrussell/oh-my-zsh
29,651 meteor/meteor
29,413 github/gitignore
28,336 rails/rails
27,248 torvalds/linux
27,111 Homebrew/homebrew
GitHubのデータ数
リポジトリ 約1千400万
リポジトリ 約1千400万 ユーザ 約1千600万
mvied dcwatson rpoisel ysrb
twbs/bootstrap
vhf/free-programming-books
angular/angular.js
:
⭐
⭐
⭐ ⭐
⭐ ⭐⭐
⭐
mvied dcwatson rpoisel ysrb
twbs/bootstrap
vhf/free-programming-books
angular/angular.js
:
ユーザ 約1千600万
⭐
⭐
⭐ ⭐
⭐ ⭐⭐
⭐
mvied dcwatson rpoisel ysrb
twbs/bootstrap
vhf/free-programming-books
angular/angular.js
:
ユーザ 約1千600万リポジトリ約1千400万
⭐
⭐
⭐ ⭐
⭐ ⭐⭐
⭐
リポジトリとリポジトリの距離を計算
(14,000,000 x 14,000,000 - 14,000,000) / 2 = 100兆回の組合せ計算
計算1回あたり
16,000,000回の2乗計算
mvied dcwatson rpoisel ysrb
twbs/bootstrap
vhf/free-programming-books
angular/angular.js
:
ユーザ 約1千600万リポジトリ約1千400万
⭐
⭐
⭐ ⭐
⭐ ⭐⭐
⭐
リポジトリとリポジトリの距離を計算
(14,000,000 x 14,000,000 - 14,000,000) / 2 = 100兆回の組合せ計算
計算1回あたり
16,000,000回の2乗計算
mvied dcwatson rpoisel ysrb
twbs/bootstrap
vhf/free-programming-books
angular/angular.js
:
ユーザ 約1千600万リポジトリ約1千400万
⭐
⭐
⭐ ⭐
⭐ ⭐
😱つらい
⭐
⭐
じゃあどうしたか
リポジトリ ⭐ スターを付けたユーザの一覧
twbs/bootstrap 88,811 mvied dcwatson ysrb …
vhf/free-programming-books 45,137 mvied dcwatson rpoisel …
angular/angular.js 44,106 dcwatson ysrb …
:
リポジトリ ⭐ スターを付けたユーザの一覧
twbs/bootstrap 88,811 mvied dcwatson ysrb …
vhf/free-programming-books 45,137 mvied dcwatson rpoisel …
angular/angular.js 44,106 dcwatson ysrb …
:
リポジトリ350件☆6,700以上ぐらい
リポジトリ ⭐ スターを付けたユーザの一覧
twbs/bootstrap 88,811 mvied dcwatson ysrb …
vhf/free-programming-books 45,137 mvied dcwatson rpoisel …
angular/angular.js 44,106 dcwatson ysrb …
:
リポジトリ350件☆6,700以上ぐらい
ユーザ 最⼤88,811
リポジトリ ⭐ スターを付けたユーザの一覧
twbs/bootstrap 88,811 mvied dcwatson ysrb …
vhf/free-programming-books 45,137 mvied dcwatson rpoisel …
・ スターを付けている: 1 付けていない: 0
・ リポジトリ間のユークリッド距離を計算
twbs/bootstrap
vhf/free-
programming-books
angular/angular.js …
twbs/bootstrap - 0.01904850 0.00492629
vhf/free-
programming-books * - 0.00492461
angular/angular.js * * -
:
ユークリッド距離
GitHub recommender
http://ghrec.hasegawa-tomoki.com
・ GitHubのユーザ名を⼊⼒すると

おすすめリポジトリを表⽰
・ APIで⭐を付けているリポジトリ取得 →
そのリポジトリに似ているリポジトリを推薦
「これを買っている人はこれも買っています」実装してみた PHP side
アーキテクチャ
GitHubのユーザ名
GitHub recommender
http://ghrec.hasegawa-tomoki.com
GitHub recommender
http://ghrec.hasegawa-tomoki.com
・ 取得: ⭐数上位6,800リポジトリ
GitHub recommender
http://ghrec.hasegawa-tomoki.com
・ 取得: ⭐数上位6,800リポジトリ
・ 計算: ⭐数上位350リポジトリ
GitHub recommender
http://ghrec.hasegawa-tomoki.com
・ 取得: ⭐数上位6,800リポジトリ
・ 計算: ⭐数上位350リポジトリ
・ 計算量ナメてて間に合わなかった
GitHub recommender
http://ghrec.hasegawa-tomoki.com
・ 取得: ⭐数上位6,800リポジトリ
・ これが O(n^2) というやつか…
・ 計算: ⭐数上位350リポジトリ
・ 計算量ナメてて間に合わなかった
わかったこと
・ APIでデータを取るのにすごく時間がかかる。
・ リポジトリ間の距離を計算するのにすごく時間がかかる。
・ このクラスの計算量になると最初からまじめにプログラム
をチューニングしないといつまでたっても終わらない。
・ memcachedの圧縮は素晴らしい。
・ 超簡単な割にそれなりにそれっぽい結果が出るので楽
しい。
おまけ
どの程度「それらしい」か
「これを買っている人はこれも買っています」実装してみた PHP side
「これを買っている人はこれも買っています」実装してみた PHP side
「これを買っている人はこれも買っています」実装してみた PHP side
切り出したい!
GitHub API
・ 時間あたりの利⽤可能数が制限されている。
・ レイテンシは1秒ぐらい。
・ 全てのレコードが取得できる訳では無い。
・ ページ数を指定して取得することになるけど「これ以上は取れないよ」とレ
スポンスが帰ってくる。
・ 「リポジトリをスター数の降順で」は結構⾯倒。
・ 検索条件にリポジトリ作成⽇時、スター数を⼊れて複数回コール。
⭐を取得するAPI
https://api.github.com/repos/twbs/bootstrap/stargazers
⭐を取得するAPI
https://api.github.com/repos/twbs/bootstrap/stargazers
⭐を取得するAPI
https://api.github.com/repos/twbs/bootstrap/stargazers
こういうのを作って
計算状況がわかる様にすると
精神衛⽣上良い。
2次会やります!
この近くのシャレオツな(?)
お店で終電前まで
ありがとうございました
@tomzoh
デジタルサーカス(株)
Drupal & スマホエンジニア
絶賛 募集中!

More Related Content

PDF
「これを買っている人はこれも買っています」実装してみた
PDF
re:Invent 2015 参加報告
PDF
モテたい...Watsonでモテる秘訣を...ディスカバリーしてみた:女性限定! クラウド勉強会 ~Watson&Node-REDでアプリ開発~
PDF
botになる技術 (How to be a bot)
PDF
PHPカンファレンス福岡に 行ってきた
PDF
SwiftCoreとFoundationを読んでみた
PDF
Stargazer Meetup #1
PDF
PHPerのためのSwift入門
「これを買っている人はこれも買っています」実装してみた
re:Invent 2015 参加報告
モテたい...Watsonでモテる秘訣を...ディスカバリーしてみた:女性限定! クラウド勉強会 ~Watson&Node-REDでアプリ開発~
botになる技術 (How to be a bot)
PHPカンファレンス福岡に 行ってきた
SwiftCoreとFoundationを読んでみた
Stargazer Meetup #1
PHPerのためのSwift入門

Similar to 「これを買っている人はこれも買っています」実装してみた PHP side (13)

PDF
集合知プログラミング第2章推薦を行う
ODP
Programming Collective Intelligence 100111
PDF
「一番いいおすすめを頼む」 ~5分でわかるレコメンドエンジンの基礎~ (Gunma.web #3 2010/12/11)
PDF
協調フィルタリング with Mahout
PDF
JOI夏季セミ2014、集合知プログラミング_2、5
PDF
ユーザーサイド情報検索システム
PDF
JOI春季ステップアップセミナー 2021 講義スライド
PDF
レコメンデーション(協調フィルタリング)の基礎
PDF
MP Joinを使った類似データ抽出
PDF
CODE THANKS FESTIVAL 2014 A日程 解説
PDF
情報推薦システム入門:講義スライド
PPT
diff template library
KEY
20120127 nhn
集合知プログラミング第2章推薦を行う
Programming Collective Intelligence 100111
「一番いいおすすめを頼む」 ~5分でわかるレコメンドエンジンの基礎~ (Gunma.web #3 2010/12/11)
協調フィルタリング with Mahout
JOI夏季セミ2014、集合知プログラミング_2、5
ユーザーサイド情報検索システム
JOI春季ステップアップセミナー 2021 講義スライド
レコメンデーション(協調フィルタリング)の基礎
MP Joinを使った類似データ抽出
CODE THANKS FESTIVAL 2014 A日程 解説
情報推薦システム入門:講義スライド
diff template library
20120127 nhn
Ad

More from Tomoki Hasegawa (20)

PDF
Reading php terminal-gameboy-emulator
PDF
Drupal8 〜 モダンなアーキテクチャのPHPベース OSS CMS
PDF
とある受託ベンダの開発環境
PDF
iOS Developers Conference Japan 2016
PDF
エンジニアのお祭り
PDF
勉強会のこちら側とあちら側
PDF
tvOSでWebSocketを使う
PDF
tvOSネイティブアプリを作る
PDF
Drupal 8 - モダンなアーキテクチャのPHPベースOSS CMS
PDF
TestFlightみたいなのを自作する
PDF
PHPでスマホアプリにプッシュ通知する
PDF
PUSH通知証明書作成ツールを作った
PDF
CakePHP3ウォークスルー
PDF
はじめてのiOSアプリ開発 Swift対応版
PDF
AppStore申請を一式まるっと自動化する
PDF
オプショナル型。〜なんとなく付ける ! ? 撲滅〜 改訂版
PDF
Swiftのプロパティオブザーバを使い倒す
PDF
3 auto layout tips
PDF
Drupal on vagrant-aws
PDF
オプショナル型。 〜 なんとなく付ける ! ? 撲滅
Reading php terminal-gameboy-emulator
Drupal8 〜 モダンなアーキテクチャのPHPベース OSS CMS
とある受託ベンダの開発環境
iOS Developers Conference Japan 2016
エンジニアのお祭り
勉強会のこちら側とあちら側
tvOSでWebSocketを使う
tvOSネイティブアプリを作る
Drupal 8 - モダンなアーキテクチャのPHPベースOSS CMS
TestFlightみたいなのを自作する
PHPでスマホアプリにプッシュ通知する
PUSH通知証明書作成ツールを作った
CakePHP3ウォークスルー
はじめてのiOSアプリ開発 Swift対応版
AppStore申請を一式まるっと自動化する
オプショナル型。〜なんとなく付ける ! ? 撲滅〜 改訂版
Swiftのプロパティオブザーバを使い倒す
3 auto layout tips
Drupal on vagrant-aws
オプショナル型。 〜 なんとなく付ける ! ? 撲滅
Ad

「これを買っている人はこれも買っています」実装してみた PHP side