GraphAware
TM
Christophe Willemsen
graphaware.com
@graph_aware
Recommandations
avec Neo4j
Construction d’un moteur de reco...
GraphAware
TM
Rapide introduction
Pourquoi les graphes ?
Challenges Business et Techniques
GraphAware Recommendation Engin...
GraphAware
TM
Articles que vous pourriez lire
Livres que vous pourriez acheter
Personnes que vous pourriez connaitre
Perso...
GraphAware
TM
Approche contenu (caractéristiques)
Filtrage collaboratif (relations utilisateur <-> produit)
Recommandation
GraphAware
TM
Les caractéristiques tout comme les relations
peuvent être représentées naturellement dans un
graphe.
Bonnes...
GraphAware
TM
Exemple
IS_OF_GENRE
title:
“Love Actually”
Movie
name: “Bob”
User
name:
“Comedy”
Genre
RATED
rating: 5
name:...
GraphAware
TM
Facile à comprendre
Modélisation naturelle
Flexible (schema-free)
Temps de requête ultra-rapides
Graphes (Ne...
GraphAware
TM
Bien pour un PoC rapide
Bien pour des petits jeux de données
Bien pour des logiques relativement simples
Cyp...
GraphAware
TM
Cypher
MATCH
(u:User)-[:LIKED]->(m:Movie),
(m)<-[:LIKED]-(another:User),
(another)-[:LIKED]->(reco:Movie)
WH...
GraphAware
TM
Les spécificités d’un moteur de recommandation
pour le monde réel sont souvent beaucoup plus
complexes.
La ré...
GraphAware
TM
Imaginez que vous construisez la fonction
”personnes que vous pourriez connaître”
sur LinkedIn.
Exemple
GraphAware
TM
Après une session de brainstorming, votre équipe
définit de la façon suivante comment trouver des
personnes q...
GraphAware
TM
Contacts en commun
Amis Facebook en communs
Contacts email/mobile en commun
Tous les autres contacts email/m...
GraphAware
TM
Mais c’est seulement le début!
Retournons en arrière et améliorons tout cela.
GraphAware
TM
Plus de contacts en commun = meilleure chance?
Même ville / école / société = la taille compte?
Qu’en est-t-...
GraphAware
TM
Trouver des “choses” à recommander
Servir les recommandations les plus rélévantes
Mesurer la qualité des rec...
GraphAware
TM
Performance (real-time!)
Challenges Techniques
GraphAware
TM
Mauvaise Recommandation
GraphAware
TM
Mauvaise Recommandation
GraphAware
TM
Performance (real-time!)
Simplicité
Flexibilité
Challenges Techniques
GraphAware
TM
Alors on a sorti une architecture de base open-
source d’un moteur de recommandation qui vous
aidera à résou...
GraphAware
TM
plugin Neo4j (utilise GraphAware Framework)
vous devez utiliser un langage JVM
architecture dogmatique
ultra...
GraphAware
TM
Un moteur par “raison” de recommandation 

(core logic)
Le moteur effectuée une traversée dans le graphe
pou...
GraphAware
TM
Exemple
IS_OF_GENRE
title:
“Love Actually”
Movie
name: “Bob”
User
name:
“Comedy”
Genre
RATED
rating: 5
name:...
GraphAware
TM
Un moteur par “raison” de recommandation 

(core logic)
Le moteur effectuée une traversée dans le graphe
pou...
GraphAware
TM
Exemple
IS_OF_GENRE
title:
“Love Actually”
Movie
name: “Bob”
User
name:
“Comedy”
Genre
RATED
rating: 5
name:...
GraphAware
TM
Un moteur par “raison” de recommandation 

(core logic)
Le moteur effectuée une traversée dans le graphe pou...
GraphAware
TM
Example
IS_OF_GENRE
title:
“Love Actually”
Movie
name: “Bob”
User
name:
“Comedy”
Genre
RATED
rating: 5
name:...
GraphAware
TM
Input -> Engine -> Recommandations
Scores et Score Transformers
Blacklists
Filters
Post-processors
Context (...
GraphAware
TM
En 5 minutes, on va construire un moteur de
recommandation qui vous proposera des personnes
avec qui vous po...
GraphAware
TM
0) Modèle
GraphAware
TM
1) Découverte
GraphAware
TM
public class FriendsInCommon extends SomethingInCommon {



@Override

public String name() {

return "frien...
GraphAware
TM
2) Score
GraphAware
TM
public class FriendsInCommon extends SomethingInCommon {

@Override

protected ScoreTransformer scoreTransfo...
GraphAware
TM
3) Post-Process
GraphAware
TM
public class RewardSameLocation extends RewardSomethingShared {



@Override

protected RelationshipType typ...
GraphAware
TM
public class RewardSameLabels implements PostProcessor<Node, Node> {



@Override

public void postProcess(R...
GraphAware
TM
4) Filter
GraphAware
TM
...



@Override

protected List<BlacklistBuilder<Node, Node>> blacklistBuilders() {

return asList(

new Ex...
GraphAware
TM
5) Assemble
GraphAware
TM
public final class FriendsComputingEngine extends Neo4jTopLevelDelegatingEngine {



@Override

protected Li...
GraphAware
TM
?) Precompute
GraphAware
TM
public final class FriendsComputingEngine extends Neo4jTopLevelDelegatingEngine {



public FriendsComputing...
GraphAware
TM
public final class FriendsRecommendationEngine extends Neo4jTopLevelDelegatingEngine {



@Override

protect...
GraphAware
TM
6) Log
GraphAware
TM
public final class FriendsRecommendationEngine extends Neo4jTopLevelDelegatingEngine {



@Override

protect...
GraphAware
TM
7) Test
GraphAware
TM
List<Recommendation<Node>> reco =

recommendationEngine.recommend(getPersonByName(“Adam"), 2);



String exp...
GraphAware
TM
Trouver des “choses” à recommander
Servir les recommandations les plus rélévantes
Mesurer la qualité des rec...
GraphAware
TM
Performance (real-time!)
Simplicité
Flexibilité
Challenges Techniques
GraphAware
TM
A vous !
<dependencies>
...
<dependency>

<groupId>com.graphaware.neo4j</groupId>

<artifactId>recommendatio...
GraphAware
TM
Habilité intégrée pour pré-computer les
recommandations
Autres classes intégrées
Time-based ParticipationPol...
GraphAware
TM
Algorithmes intégrés
Intégration avec des compute engines
Machine learning
Futur
GraphAware
TM
Le Framework GraphAware rend facile la
conception, le test et le déploiement de
fonctionnalités pour Neo4j, ...
GraphAware
TM
GraphUnit

& RestTest
RelCount WarmUp Schema (wip)
Recommendation
Engine
GraphAware Framework
ChangeFeed UUI...
GraphAware
TM
Open Source (GPL)
Actif
Production Ready
Github: github.com/graphaware
Web: graphaware.com
Maven Central
Gra...
GraphAware
TM
Essayez
Donnez-nous du feedback
Contribuez
Concevez vos propres modules
Contactez-nous pour du support/consu...
Questions ?
Merci !
GraphAware
TM
Christophe Willemsen
Twitter: @ikwattro
Github: @ikwattro
Recommandations avec Neo4j et le GraphAware Recommendation Engine
Recommandations avec Neo4j et le GraphAware Recommendation Engine
Prochain SlideShare
Chargement dans…5
×

Recommandations avec Neo4j et le GraphAware Recommendation Engine

886 vues

Publié le

Dans cette présentation, vous découvrirez comment faire des moteurs de recommendations avec Neo4j et le moteur de recommendation de GraphAware.

Publié dans : Logiciels
0 commentaire
1 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
886
Sur SlideShare
0
Issues des intégrations
0
Intégrations
1
Actions
Partages
0
Téléchargements
29
Commentaires
0
J’aime
1
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Recommandations avec Neo4j et le GraphAware Recommendation Engine

  1. 1. GraphAware TM Christophe Willemsen graphaware.com @graph_aware Recommandations avec Neo4j Construction d’un moteur de recommandation haute-performance
  2. 2. GraphAware TM Rapide introduction Pourquoi les graphes ? Challenges Business et Techniques GraphAware Recommendation Engine A propos
  3. 3. GraphAware TM Articles que vous pourriez lire Livres que vous pourriez acheter Personnes que vous pourriez connaitre Personnes que vous pourriez rencontrer Personnes auxquelles vous pourriez présenter
 votre produit … Recommandation
  4. 4. GraphAware TM Approche contenu (caractéristiques) Filtrage collaboratif (relations utilisateur <-> produit) Recommandation
  5. 5. GraphAware TM Les caractéristiques tout comme les relations peuvent être représentées naturellement dans un graphe. Bonnes nouvelles
  6. 6. GraphAware TM Exemple IS_OF_GENRE title: “Love Actually” Movie name: “Bob” User name: “Comedy” Genre RATED rating: 5 name: “Alice” User name: “Romance” Genre title: “American Pie” Movie IS_OF_GENRE IS_OF_GENRE RATEDrating: 5 INTERESTED_IN rating: 5 RATED
  7. 7. GraphAware TM Facile à comprendre Modélisation naturelle Flexible (schema-free) Temps de requête ultra-rapides Graphes (Neo4j)
  8. 8. GraphAware TM Bien pour un PoC rapide Bien pour des petits jeux de données Bien pour des logiques relativement simples Cypher
  9. 9. GraphAware TM Cypher MATCH (u:User)-[:LIKED]->(m:Movie), (m)<-[:LIKED]-(another:User), (another)-[:LIKED]->(reco:Movie) WHERE NOT (u)-[:LIKED|DISLIKED]->(reco) RETURN reco;
  10. 10. GraphAware TM Les spécificités d’un moteur de recommandation pour le monde réel sont souvent beaucoup plus complexes. La réalité
  11. 11. GraphAware TM Imaginez que vous construisez la fonction ”personnes que vous pourriez connaître” sur LinkedIn. Exemple
  12. 12. GraphAware TM Après une session de brainstorming, votre équipe définit de la façon suivante comment trouver des personnes que vous pourriez connaître: Exemple
  13. 13. GraphAware TM Contacts en commun Amis Facebook en communs Contacts email/mobile en commun Tous les autres contacts email/mobile Travaillé pour la même société Etudié à la même école Partage le même intérêt Vit dans la même ville Personnes que vous pourriez connaître
  14. 14. GraphAware TM Mais c’est seulement le début! Retournons en arrière et améliorons tout cela.
  15. 15. GraphAware TM Plus de contacts en commun = meilleure chance? Même ville / école / société = la taille compte? Qu’en est-t-il des emails qui ne représentent pas une personne ? Et les personnes déjà connectées? Et celles en attente… Et celles rejetées… Et celles ignorées répétivement… Personnes que vous pourriez connaître
  16. 16. GraphAware TM Trouver des “choses” à recommander Servir les recommandations les plus rélévantes Mesurer la qualité des recommandations Time to market / coût du développement Challenges Business
  17. 17. GraphAware TM Performance (real-time!) Challenges Techniques
  18. 18. GraphAware TM Mauvaise Recommandation
  19. 19. GraphAware TM Mauvaise Recommandation
  20. 20. GraphAware TM Performance (real-time!) Simplicité Flexibilité Challenges Techniques
  21. 21. GraphAware TM Alors on a sorti une architecture de base open- source d’un moteur de recommandation qui vous aidera à résoudre tous ces challenges. On l’a fait
  22. 22. GraphAware TM plugin Neo4j (utilise GraphAware Framework) vous devez utiliser un langage JVM architecture dogmatique ultra rapide ultra flexible gère toute l’encapsulation Moteur de recommandation
  23. 23. GraphAware TM Un moteur par “raison” de recommandation 
 (core logic) Le moteur effectuée une traversée dans le graphe pour trouver des produits/personnes/.. Les moteurs sont assemblés ensemble dans un moteur de haut-niveau Décisions d’architecture
  24. 24. GraphAware TM Exemple IS_OF_GENRE title: “Love Actually” Movie name: “Bob” User name: “Comedy” Genre RATED rating: 5 name: “Alice” User name: “Romance” Genre title: “American Pie” Movie IS_OF_GENRE IS_OF_GENRE RATEDrating: 5 INTERESTED_IN rating: 5 RATED
  25. 25. GraphAware TM Un moteur par “raison” de recommandation 
 (core logic) Le moteur effectuée une traversée dans le graphe pour trouver des produits/personnes/.. Les moteurs sont assemblés ensemble dans un moteur de haut-niveau Les produits trouvés plusieurs fois sont plus rélévants La rélévance dépend de la vitesse à laquelle un produit a été trouvé Décisions d’architecture
  26. 26. GraphAware TM Exemple IS_OF_GENRE title: “Love Actually” Movie name: “Bob” User name: “Comedy” Genre RATED rating: 5 name: “Alice” User name: “Romance” Genre title: “American Pie” Movie IS_OF_GENRE IS_OF_GENRE RATEDrating: 5 INTERESTED_IN rating: 5 RATED
  27. 27. GraphAware TM Un moteur par “raison” de recommandation 
 (core logic) Le moteur effectuée une traversée dans le graphe pour trouver des produits/personnes/.. Les moteurs sont assemblés ensemble dans un moteur de haut-niveau Les produits trouvés plusieurs fois sont plus rélévants La rélévance dépend de la vitesse à laquelle un produit a été trouvé Produits qui ne doivent pas être recommandés Décisions d’architecture
  28. 28. GraphAware TM Example IS_OF_GENRE title: “Love Actually” Movie name: “Bob” User name: “Comedy” Genre RATED rating: 5 name: “Alice” User name: “Romance” Genre title: “American Pie” Movie IS_OF_GENRE IS_OF_GENRE RATEDrating: 5 INTERESTED_IN rating: 5 RATED
  29. 29. GraphAware TM Input -> Engine -> Recommandations Scores et Score Transformers Blacklists Filters Post-processors Context (combien, en combien de temps,…?) Loggers Architecture
  30. 30. GraphAware TM En 5 minutes, on va construire un moteur de recommandation qui vous proposera des personnes avec qui vous pourriez vous connecter. Let’s code
  31. 31. GraphAware TM 0) Modèle
  32. 32. GraphAware TM 1) Découverte
  33. 33. GraphAware TM public class FriendsInCommon extends SomethingInCommon {
 
 @Override
 public String name() {
 return "friendsInCommon";
 }
 
 @Override
 protected RelationshipType getType() {
 return FRIEND_OF;
 }
 
 @Override
 protected Direction getDirection() {
 return BOTH;
 }
 }
  34. 34. GraphAware TM 2) Score
  35. 35. GraphAware TM public class FriendsInCommon extends SomethingInCommon {
 @Override
 protected ScoreTransformer scoreTransformer() {
 return new ParetoScoreTransformer(100, 10);
 }
 
 @Override
 public String name() {
 return "friendsInCommon";
 }
 
 @Override
 protected RelationshipType getType() {
 return FRIEND_OF;
 }
 
 @Override
 protected Direction getDirection() {
 return BOTH;
 }
 }
  36. 36. GraphAware TM 3) Post-Process
  37. 37. GraphAware TM public class RewardSameLocation extends RewardSomethingShared {
 
 @Override
 protected RelationshipType type() {
 return LIVES_IN;
 }
 
 @Override
 protected Direction direction() {
 return OUTGOING;
 }
 
 @Override
 protected float scoreValue(Node reco, Node in, Node shared) {
 return 10;
 }
 
 @Override
 protected String scoreName() {
 return "sameLocation";
 }
 }
  38. 38. GraphAware TM public class RewardSameLabels implements PostProcessor<Node, Node> {
 
 @Override
 public void postProcess(Recommendations<Node> out, Node in) {
 Label[] inLabels = toArray(in.getLabels());
 
 for (Recommendation<Node> reco : out.get()) {
 if (Arrays.equals(inLabels, toArray(reco.getItem().getLabels()))) {
 reco.add("sameGender", 10);
 }
 }
 }
 }
  39. 39. GraphAware TM 4) Filter
  40. 40. GraphAware TM ...
 
 @Override
 protected List<BlacklistBuilder<Node, Node>> blacklistBuilders() {
 return asList(
 new ExistingRelationshipBlacklistBuilder(FRIEND_OF, BOTH)
 );
 }
 
 @Override
 protected List<Filter<Node, Node>> filters() {
 return asList(
 new ExcludeSelf()
 );
 }

  41. 41. GraphAware TM 5) Assemble
  42. 42. GraphAware TM public final class FriendsComputingEngine extends Neo4jTopLevelDelegatingEngine {
 
 @Override
 protected List<RecommendationEngine<Node, Node>> engines() {
 return Arrays.<RecommendationEngine<Node, Node>>asList(
 new FriendsInCommon(),
 new RandomPeople()
 );
 }
 
 @Override
 protected List<PostProcessor<Node, Node>> postProcessors() {
 return Arrays.asList(
 new RewardSameLabels(),
 new RewardSameLocation(),
 new PenalizeAgeDifference()
 );
 }
 
 @Override
 protected List<BlacklistBuilder<Node, Node>> blacklistBuilders() {
 return Arrays.asList(
 new ExistingRelationshipBlacklistBuilder(FRIEND_OF, BOTH)
 );
 }
 
 @Override
 protected List<Filter<Node, Node>> filters() {
 return Arrays.<Filter<Node, Node>>asList(
 new ExcludeSelf()
 );
 }
 }
  43. 43. GraphAware TM ?) Precompute
  44. 44. GraphAware TM public final class FriendsComputingEngine extends Neo4jTopLevelDelegatingEngine {
 
 public FriendsComputingEngine() {
 super(new FriendsContextFactory());
 }
 
 @Override
 protected List<RecommendationEngine<Node, Node>> engines() {
 return asList(
 new FriendsInCommon(),
 new RandomPeople()
 );
 }
 
 @Override
 protected List<PostProcessor<Node, Node>> postProcessors() {
 return asList(
 new RewardSameLabels(),
 new RewardSameLocation(),
 new PenalizeAgeDifference()
 );
 }
 
 @Override
 public ParticipationPolicy<Node, Node> participationPolicy(Context<Node, Node> context) {
 return ParticipationPolicy.IF_MORE_RESULTS_NEEDED;
 }
 }
  45. 45. GraphAware TM public final class FriendsRecommendationEngine extends Neo4jTopLevelDelegatingEngine {
 
 @Override
 protected List<RecommendationEngine<Node, Node>> engines() {
 return Arrays.<RecommendationEngine<Node, Node>>asList(
 new Neo4jPrecomputedEngine(),
 new FriendsComputingEngine()
 );
 }
 
 @Override
 protected List<BlacklistBuilder<Node, Node>> blacklistBuilders() {
 return Arrays.asList(
 new ExistingRelationshipBlacklistBuilder(FRIEND_OF, BOTH)
 );
 }
 
 @Override
 protected List<Filter<Node, Node>> filters() {
 return Arrays.<Filter<Node, Node>>asList(
 new ExcludeSelf()
 );
 }
 }

  46. 46. GraphAware TM 6) Log
  47. 47. GraphAware TM public final class FriendsRecommendationEngine extends Neo4jTopLevelDelegatingEngine {
 
 @Override
 protected List<RecommendationEngine<Node, Node>> engines() {
 return Arrays.<RecommendationEngine<Node, Node>>asList(
 new Neo4jPrecomputedEngine(),
 new FriendsComputingEngine()
 );
 }
 
 @Override
 protected List<BlacklistBuilder<Node, Node>> blacklistBuilders() {
 return Arrays.asList(
 new ExistingRelationshipBlacklistBuilder(FRIEND_OF, BOTH)
 );
 }
 
 @Override
 protected List<Filter<Node, Node>> filters() {
 return Arrays.<Filter<Node, Node>>asList(
 new ExcludeSelf()
 );
 }
 
 @Override
 protected List<Logger<Node, Node>> loggers() {
 return Arrays.asList(
 new Slf4jRecommendationLogger<Node, Node>(),
 new Slf4jStatisticsLogger<Node, Node>()
 );
 }
 }

  48. 48. GraphAware TM 7) Test
  49. 49. GraphAware TM List<Recommendation<Node>> reco =
 recommendationEngine.recommend(getPersonByName(“Adam"), 2);
 
 String expected = 
 "(Vince {total:19.338144," +
 "ageDifference:-5.527864," +
 "friendsInCommon:14.866008," +
 "sameGender:10.0})," +
 
 "(Luanne {total:11.553411," +
 "ageDifference:-3.312597," +
 "friendsInCommon:14.866008})";
 
 assertEquals(expected, toString(reco));
  50. 50. GraphAware TM Trouver des “choses” à recommander Servir les recommandations les plus rélévantes Mesurer la qualité des recommandations Time to market / coût du développement Challenges Business
  51. 51. GraphAware TM Performance (real-time!) Simplicité Flexibilité Challenges Techniques
  52. 52. GraphAware TM A vous ! <dependencies> ... <dependency>
 <groupId>com.graphaware.neo4j</groupId>
 <artifactId>recommendation-engine</artifactId> <version>2.2.0.30.6</version>
 </dependency> ... <dependencies>
  53. 53. GraphAware TM Habilité intégrée pour pré-computer les recommandations Autres classes intégrées Time-based ParticipationPolicy Raisons for Recommendation Contribuez ! https://github.com/graphaware/neo4j-reco Il y a encore plus !
  54. 54. GraphAware TM Algorithmes intégrés Intégration avec des compute engines Machine learning Futur
  55. 55. GraphAware TM Le Framework GraphAware rend facile la conception, le test et le déploiement de fonctionnalités pour Neo4j, aussi bien génériques que spécifiques à un domaine. GraphAware Framework
  56. 56. GraphAware TM GraphUnit
 & RestTest RelCount WarmUp Schema (wip) Recommendation Engine GraphAware Framework ChangeFeed UUID TimeTree Algorithms NodeRank
  57. 57. GraphAware TM Open Source (GPL) Actif Production Ready Github: github.com/graphaware Web: graphaware.com Maven Central GraphAware Framework
  58. 58. GraphAware TM Essayez Donnez-nous du feedback Contribuez Concevez vos propres modules Contactez-nous pour du support/consultance GraphAware Framework
  59. 59. Questions ?
  60. 60. Merci ! GraphAware TM Christophe Willemsen Twitter: @ikwattro Github: @ikwattro

×