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)
Затем вы будете непрерывно вычислять сходство между историями поиска в качестве фоновой работы. Общий алгоритм - косинусное подобие или функция правдоподобия
Затем вы можете найти потенциальные похожие поиски и возвращенные фильмы на основе сходства с текущей историей пользователя и другими историями пользователя.
Наконец, конечно, вы можете объединить всю логику рекомендации и вычислить окончательный результат.
И на основании вашего комментария:
Ключевое слово для поиска пользователей может быть любым, например, название фильма, имя актера, тег и т. Д. Так, например, если это имя тега, я хочу представить те фильмы, имеющие такой же тег.
Это скорее сопоставление с образцом и на самом деле не относится к теме рекомендаций.