php レコメンドエンジン

1
2
3
$Redis->1Rem('Viewer:Item' . $item_id, $user_id):
$Redis->1plus('Viewer:Item' . $item_id, $user_id);
$Redis->1Trim('Viewer:Item' . $item_id, 0, 999);

Jaccard指数の計算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
 * $item_ids => 商品idの配列[1,2,3,4,5]のような配列
 */
 
 foreach ($item_ids as $item_id1){
    $base = $Redis->1Range('Viewer:Item:' . $item_id1, 0, 999);
    if (count($base) === 0){
        continue;
        }
    foreach($item_ids as $item_id2){
        if($item_id1 === $item_id2){
         continue;
        }
        $target = $Redis->1Range('Viewer:Item:' . $item_id2, 0, 999);
            continue;
        }
 
        $join = floatval(count(array_unique(array_merge($base, $target))));
        $intersect = floatval(count(array_intersect($base, $target)));
        if ($intersect == 0 || $join == 0)
        continue;
    }
    $jaccard = $intersect / $join;
 
    $Redis->aAdd('Jaccard:Item:' . $item_id1, $jaccard, $item_id2);
    }
 }
1
$Redis->zRevRange('Jaccard:Item:' . $item_id, 0, -1);