「これを買っている人はこれも買っています」実装してみた php side
Post on 11-Apr-2017
614 Views
Preview:
TRANSCRIPT
「これを買っている人はこれも買っています」 実装してみた
デジタルサーカス(株)長谷川智希
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}}
やりたいこと
・ 「このリポジトリにスターした⼈はこんなリポジトリにもスターしています」
・ ⾒ると嬉しいであろうリポジトリをお勧めしてくれるシステム!
推薦: 2つの⽅法
(1)⾃分に似たユーザを探して、そのユーザがスターしているリポジトリを推薦する。
(2)⾃分がスターしているリポジトリについて、似たリポジトリを探して推薦する。
「似ている」
どうやって「似ている」と判断するか。
「似ている」
どうやって「似ている」と判断するか。
「似ている」 = 「近い」
ユークリッド距離
63
23
ユークリッド距離
sqrt((6-3)^2 + (2-3)^2) = 3.16…63
23 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
良い映画ですよね😇
観てない?
話を戻して…
推薦: 2つの⽅法
(1)⾃分に似たユーザを探して、そのユーザがスターしているリポジトリを推薦する。
(2)⾃分がスターしているリポジトリについて、似たリポジトリを探して推薦する。
⭐ Repo88,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
⭐ Repo88,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 …
:
リポジ
トリ35
0件 ☆
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 …
:
リポジ
トリ35
0件 ☆
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 recommenderhttp://ghrec.hasegawa-tomoki.com
・ GitHubのユーザ名を⼊⼒するとおすすめリポジトリを表⽰
・ APIで⭐を付けているリポジトリ取得 → そのリポジトリに似ているリポジトリを推薦
アーキテクチャ
GitHubのユーザ名
GitHub recommenderhttp://ghrec.hasegawa-tomoki.com
・ 取得: ⭐数上位6,800リポジトリ
GitHub recommenderhttp://ghrec.hasegawa-tomoki.com
・ 取得: ⭐数上位6,800リポジトリ
・ 計算: ⭐数上位350リポジトリ
GitHub recommenderhttp://ghrec.hasegawa-tomoki.com
・ 取得: ⭐数上位6,800リポジトリ
・ 計算: ⭐数上位350リポジトリ
・ 計算量ナメてて間に合わなかった
GitHub recommenderhttp://ghrec.hasegawa-tomoki.com
・ 取得: ⭐数上位6,800リポジトリ
・ これが O(n^2) というやつか…
・ 計算: ⭐数上位350リポジトリ
・ 計算量ナメてて間に合わなかった
わかったこと・ APIでデータを取るのにすごく時間がかかる。 ・ リポジトリ間の距離を計算するのにすごく時間がかかる。 ・ このクラスの計算量になると最初からまじめにプログラム
をチューニングしないといつまでたっても終わらない。 ・ memcachedの圧縮は素晴らしい。 ・ 超簡単な割にそれなりにそれっぽい結果が出るので楽
しい。
おまけ
どの程度「それらしい」か
切り出したい!
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 & スマホエンジニア
絶賛 募集中!
top related