Neo4j как ядро рекомендательной системы

Бурное развитие электронной коммерции годами способствовало развитию рекомендательных систем (РС), поскольку это очень эффективный и дешевый способ увеличения количества продаж. С этим ростом также возросли требования к РС. Все больше и больше компаний сталкиваются с большими объемами данных, требует от них разработки масштабируемых решений. Также в эру социальных сетей важную роль играют связи между пользователями. Подходы к созданию РС использовавшиеся ранее уже не могут справляться с этим. Возможным решением этих проблем является использование графовой СУБД Neo4j в качестве ядра рекомендательной системы. Целью этой статьи является исследование пригодности Neo4j к созданию рекомендательных систем и разработка прототипа рекомендательной системы.

Архитектура рекомендательной системы

В основе каждой рекомендательной системы лежит профиль и элементов для рекомендации для сохранения этих данных необходима база данных, в данном случае используем Ne04j. Также необходим метод доступа для получения сгенерированных рекомендаций, например RESTful API. В профиле пользователя сохраняются данные о его действия, такие как отзывы, и его персональная информация. То есть это рекомендательная система основанная на действиях пользователей. Среди преимуществ такой архитектуры стоит отметить независимость от внутренней структуры рекомендованных данных, недостатком является проблема холодного старта, на начальных этапах работы системы.

Архитектура рекомендационный системы

Реализация рекомендательной системы художественных книг

В ходе написания статьи было решено реализовать рекомендательную систему художественных книг. Система будет разработана на языке JavaScript на платформе Node.js. Для генерации тестовых данных используем коллекции данных доступны в Интернете, для генерации оценок пользователей был разработан алгоритм который случайным образом генерирует оценки от одного до пяти, нравится / не нравится. Прежде всего необходимо импортировать данные. Ниже приведен фрагмент в котором реализованы импорт данных в Neo4j.

Создание узла в Neo4j


for(var i=0;i<users.length;++i)
{
db.insertNode(users[i],['User'],function(err, node){
if(err) throw err;
});
}
for(var i=0;i<books.length;++i)
{
db.insertNode(books[i],['Book'],function(err, node){
if(err) throw err;
});
}

Процесс рекомендации состоит из пяти шагов:

  1.  Найти всех пользователей который оценил хотя бы одну книгу, назовем этих пользователей соседями
  2.  Для каждого соседа найти книги которые он оценил, и оценил пользователь для которого делается рекомендация.
  3. Для множества книг оценивших оба пользователя оценили вычислить евклидову расстояние между двумя пользователями.
  4. Разделить нормализованную евклидову расстояние на 4.
  5. Создать связь между соседями и пользователем для которого делается рекомендаци

Но это по сути реализация колаборативних фильтрации но в несколько более элегантный способ. Neo4j позволяет делать боль сложные рекомендации, например рекомендации основаны на друзьях пользователя, запрос приведен ниже.

Рекомендация по использованию друзей пользователя

MATCH (user:User)-[:IS_FRIEND_OF]->(friend), (friend)-[:LIKES]->(book:Book),
WHERE user.name = 'John Snow' 
RETURN book.title, count(*) AS occurrence ORDER BY occurrence 
DESC LIMIT 5

Сравнение с реализацией в процедурном стиле

Основными показателями для сравнения является время необходимое для выполнения алгоритма, оперативная память, точность, полнота. Кроме реализации с использованием Neo4j было реализована рекомендаций на языке JavaScript. Было реализованы алгоритмы колаборативних фильтрации и NMF(). Тестирование проводилось на одинаковых данных.

100 пользователей 1000 пользователей 5000

пользователей

Коллаборативная фильтрация 4,1 сек. 17,2 сек. 61.2 сек.
NMF 4,7 сек. 33,5 сек. 120.6 сек.
Neo4j 5.3 сек. 30.1 сек. 55.2 сек.

Заключение

В статье было рассмотрено создание рекомендательной системы с помощью Neo4j, а также рассмотрены пригодность Neo4j современным требованиям. Кроме того было проведено сравнение с традиционными подходами к разработке рекомендательных систем. В ходе тестирования было выявлено что рекомендации с помощью Neo4j являются самыми быстрыми при увеличении количества пользователей.