Recommandations avec Neo4j et le GraphAware Recommendation Engine

1 307 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
  • Soyez le premier à commenter

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

×