File size: 1,942 Bytes
6b1bc4b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
"""Demo with synthetic posts: a brand-new user vs the same user after 30 engaged posts. Run from the folder above: python -m hybrid_engine.example"""
import numpy as np
from hybrid_engine import HybridRecommender

rng = np.random.default_rng(1)
def vec():
    v = rng.normal(size=1024); return (v / np.linalg.norm(v)).tolist()
now = 1_800_000_000_000.0
posts = [dict(post_id=f"post-{i}", community=c, post_type="text", score=s, comments=s // 5, age_hours=a, title=f"Post {i}", body="...", tags=t, embedding=vec(), author=f"author-{i % 4}", impressions=imp)
         for i, (c, s, a, t, imp) in enumerate([("r/MachineLearning", 300, 3, {"machine-learning": 0.9}, 0), ("r/robotics", 40, 2, {"robotics": 0.95}, 1),
                                                ("r/IOT", 15, 30, {"iot": 0.9}, 4), ("r/learnprogramming", 900, 200, {"data-structures-and-algorithms": 0.8}, 50),
                                                ("r/computervision", 120, 10, {"computer-vision": 0.9, "deep-learning": 0.7}, 2), ("r/memes", 5000, 600, {}, 300)])]
engine = HybridRecommender()
new_user = {"interests": ["machine-learning", "computer-vision", "robotics"], "history": []}
history = [dict(post_id=f"h{k}", ts_ms=now - 3_600_000 + k * 60_000, visible_ms=5000, focal_ms=5000 if k % 2 else 300, hover_ms=400, clicked=bool(k % 3 == 0), engaged=bool(k % 2),
                community="r/computervision", author="author-1", embedding=vec()) for k in range(60)]
for name, user in (("brand-new user", new_user), ("same user after 30 engaged posts", {**new_user, "history": history})):
    print(f"\n{name}:")
    for d in engine.recommend(user, posts, now, k=6):
        print(f"  {d['post_id']:8s} score {d['score']:.3f} | v2b {d['v2b']:.3f} | warm {('%.3f' % d['warm_probability']) if d['warm_probability'] is not None else '  -  '} "
              f"| warm weight {d['warm_weight']:.2f} | freshness x{d['freshness_multiplier']:.2f} | push +{d['push']:.3f}")