1. 程式人生 > >Neo4j 做推薦 (9)—— 協同過濾(人群的智慧)

Neo4j 做推薦 (9)—— 協同過濾(人群的智慧)

簡單的協同過濾

MATCH (u:User {name: "Cynthia Freeman"})-[:RATED]->(:Movie)<-[:RATED]-(o:User)
MATCH (o)-[:RATED]->(rec:Movie)
WHERE NOT EXISTS( (u)-[:RATED]->(rec) )
RETURN rec.title, rec.year, rec.plot
LIMIT 25

 

上面的簡單的過濾方法其實存在很多問題,例如不基於流行度來進行規範或不考慮評級。

 

只考慮使用者喜歡的型別

許多推薦系統融合了協同過濾和基於內容的方法,對於特定使用者,哪些型別的評分高於平均水平?用它來評分類似的電影:

MATCH (u:User {name: "Andrew Freeman"})-[r:RATED]->(m:Movie)
WITH u, avg(r.rating) AS mean

MATCH (u)-[r:RATED]->(m:Movie)-[:IN_GENRE]->(g:Genre)
WHERE r.rating > mean

WITH u, g, COUNT(*) AS score

MATCH (g)<-[:IN_GENRE]-(rec:Movie)
WHERE NOT EXISTS((u)-[:RATED]->(rec))

RETURN rec.title AS recommendation, rec.year AS year, COLLECT(DISTINCT g.name) AS genres, SUM(score) AS sscore
ORDER BY sscore DESC LIMIT 10

分析:

1. 使用者u評過的電影的平均分

2. 找出使用者u評過的高於平均分的電影的分類,並對分類計數

3. 找出這些分類的相關的電影,並且這些電影是使用者u沒有評過分的

4. 找出電影分類中影片數最多的前10部電影