Neo4j - Рекомендация пользователя на основе истории поиска

У меня есть следующие ярлыки:-

  • Тег
  • Жанр
  • Актер
  • директор
  • Кино
  • пользователь
  • UsersSerachHistory

У моего пользователя приложения есть панель поиска, где они могут вводить и искать что угодно. Я сохраняю содержимое, в котором пользователи искали, в течение ограниченного периода времени для будущих рекомендаций. Каким будет запрос Рекомендации на основе истории поиска пользователей? Нужно ли мне создавать отношения истории поиска? Пройдя некоторое руководство для рекомендаций, я немного смог написать следующий запрос -

MATCH (m:Movie)<-[:LIKE]-(p:Person {personId : 1})
OPTIONAL MATCH (t:Tag)
WITH collect(distinct t.tagName) as c1

OPTIONAL MATCH (g:Genre) 
WITH collect(distinct g.name) + c1 as c2

OPTIONAL MATCH (l:Language) 
WITH collect(distinct l.languageName) + c2 as c3
RETURN c3

Это не полный запрос, а грубая идея, и я не уверен, что это правильно? Кто-нибудь может помочь мне достичь этого? Большое спасибо!!

1 ответ

Что ж, с вашей текущей моделью, я предполагаю, что вы можете сделать такие рекомендации, как

Найдите людей, которым нравятся те же фильмы, что и вам, какие другие фильмы им нравятся, которые вы еще не смотрели

MATCH (p:Person {personId: 1})-[:LIKE]->(movie)<-[:LIKE]-(other)
WITH distinct other, p
MATCH (other)-[:LIKE]->(reco)
WHERE NOT (p)-[:LIKE]->(reco)
RETURN reco, count(*) as score
ORDER BY score DESC

Вы можете применять тот же тип запросов для поиска фильмов с одинаковыми жанрами и т. Д. И затем комбинировать результаты.

Есть хороший пост в блоге с большим количеством примеров запросов рекомендаций для Cypher: http://www.markhneedham.com/blog/2015/03/27/neo4j-generating-real-time-recommendations-with-cypher/

Для рекомендаций, основанных на поиске, простое решение состоит в том, чтобы разбить строку поиска на элементы, например:

WITH split("action movie with arnold in 1997", " ") AS elements
MATCH (m:Movie)<-[r]-(object)
WHERE object.value IN elements
RETURN m, count(*) as score

Это предполагает, что все узлы, представляющие свойство фильма, будут иметь общий value собственность, так :Tag(value), :Year(value), :Title(value)

Это своего рода основа, в общих рекомендательных системах, основанных на истории поиска, вы бы моделировали историю как временную шкалу:

(user)-[:LAST_SEARCH]->(s)-[:PREV_SEARCH]->(s)..
(s)-[:HAS_KEYWORD]->(keyword)

введите описание изображения здесь

Затем вы будете непрерывно вычислять сходство между историями поиска в качестве фоновой работы. Общий алгоритм - косинусное подобие или функция правдоподобия

Затем вы можете найти потенциальные похожие поиски и возвращенные фильмы на основе сходства с текущей историей пользователя и другими историями пользователя.

Наконец, конечно, вы можете объединить всю логику рекомендации и вычислить окончательный результат.

И на основании вашего комментария:

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

Это скорее сопоставление с образцом и на самом деле не относится к теме рекомендаций.

Другие вопросы по тегам