Система reco на основе контента в neo4j для большого набора данных

Я пытаюсь сделать сайт рекомендаций книг. Я просканировал некоторые книжные сайты, и у меня есть около 15 миллионов отдельных книг в базе данных, которая находится в neo4j.

Сейчас для некоторых жанров, таких как детективы и триллеры, существует как минимум около 1 миллиона книг. Я должен составить топ-20 рекомендаций. Мой текущий подход-

  1. получить книги
  2. запустить сравнение подобия (vec-косинус или Пирсон)
  3. сортировать и отображать

дороги и требуют времени, совсем не подходят для системы реального времени. Я думал сохранить отсортированный список по жанрам, связав neo4j с традиционной БД и получая лучшие из этой БД через neo4j. Но это также медленно (занимает несколько десятков секунд). Есть ли более простой и интуитивно понятный способ сделать это? Любые идеи помогут.


person goelakash    schedule 08.02.2015    source источник


Ответы (1)


Было бы хорошо знать, на каких других критериях вы хотели бы основывать свои рекомендации, например. как именно вы измеряете сходство между книгами. Я предполагаю, что это не чисто жанровая основа.

Один из подходов, который мы использовали с этими плотными узлами (такими как ваши жанры или города, в которых живут люди и т. д.), заключается в том, чтобы сначала найти рекомендации на основе некоторых других критериев, а затем повысить показатель релевантности рекомендации, если она связана с правильный плотный узел. Такой запрос намного производительнее.

Например, рекомендуя 20 человек, с которыми вы должны дружить, я нахожу 100 кандидатов по всем остальным критериям, а затем повышаю баллы кандидатов, живущих в том же месте, что и пользователь, которого мы рекомендуем. Это 100 обходов с одним переходом, что будет очень быстро.

Взгляните на запись этого недавнего вебинара, возможно, вы найдете в ней вдохновение.

Что касается показателей сходства, их, возможно, потребуется предварительно вычислить, связав похожие книги друг с другом SIMILAR_TO отношениями. Такой предварительный расчет может быть выполнен с использованием среды выполнения GraphAware Framework, который выполняет эти фоновые вычисления только в периоды покоя, не мешая, таким образом, вашей обычной обработке транзакций. Посмотрите на модуль NodeRank, который вычисляет PageRank в Neo4j в периоды затишья.

person Michal Bachman    schedule 08.02.2015