У меня есть еще один вопрос, связанный со сходством с Джакардом:
Поскольку предыдущий метод, который я пробовал (вызывая алгоритм сходства с jaccard), дал мне странные результаты (я спрошу продолжение этого вопроса в другой теме)):
Я попробовал другой метод для вычисления подобия jaccard моего тестового представления данных (следующим образом):
CSV, использованный для создания всех узлов заголовков:
title_id,title
T1,Article Title 1
T2,Article Title 2
CSV, который я хочу использовать для создания отношений:
title_id,keyword_id,keyword
T1,K1,aaa
T1,K2,bbb
T1,K3,ccc
T1,K4,ddd
T2,K1,aaa
T2,K5,eee
T2,K6,fff
T2,K4,ddd
Я смог рассчитать сходство jaccard, используя следующий код:
MATCH(t:Title)-[:HAS_KEYWORDS]->(k:Keyword)<-[:HAS_KEYWORDS]-(other:Title)
WITH t, other,
count(k) AS intersection,
collect(k) AS i
MATCH (t)-[:HAS_KEYWORDS]->(tk:Keyword)
WITH t, other, intersection, i,
collect(tk) AS s1
MATCH (other)-[:HAS_KEYWORDS]->(ok:Keyword)
WITH t, other, intersection, i, s1,
collect(ok) AS s2
WITH t, other, intersection, s1, s2
WITH t, other, intersection, s1, s2,
s1+filter(x IN s2 WHERE NOT x IN s1) AS union
RETURN t.title, other.title, s1,s2,
((1.0*intersection)/SIZE(union)) AS jaccard
ORDER BY jaccard DESC LIMIT 100
Однако я также хотел бы установитьточка отсечения для рекомендаций, которые я бы сделал на основе этого сходства.
Я попытался добавить ограничение CASE WHEN (следующим образом):
...
RETURN t, other, s1,s2,
CASE WHEN ((1.0*intersection)/size(union)) > 0.1
THEN s2.jaccard
ELSE null
END AS jaccard
...
После некоторых попыток я понял, что мне нужно добавить... узел (?) перед битом THEN ... jaccard ELSE ..., но когда я это делаю, во время выполнения кода столбец jaccard заполняется нулем.
Поскольку я не слишком уверен, как назвать эту мою проблему, если бы кто-нибудь смог указать мне на некоторые базовые документы, чтобы прочитать и понять, в чем я ошибся, я был бы очень признателенмного.