apoc.text.sorensenDiceSimilarity 的意外结果?

问题描述

关于使用 Sorensen-Dice 的字符串相似度有点困惑。 显然,它对传递参数的顺序有所不同。

WITH
apoc.text.sorensenDiceSimilarity("+46xxxxx2260","+46xxxxx2226") as score1,apoc.text.sorensenDiceSimilarity("+46xxxxx2226","+46xxxxx2260") as score2
RETURN
score1,score2

其中一个分数(即相似性系数)是 1.0,另一个是 0.909090...

对我来说没有意义,但也许我不知道算法有什么问题? 任何见解表示赞赏。

附言《Neo4j 内核》、《3.5.9》、《社区》

解决方法

这绝对是一个错误和一个很好的捕获!

作为替代,您可以执行以下查询,该查询使用 apoc 函数作为 toSet 和交集和文本函数,拆分。使用 ROUND(10^4/10^4) 使用 4 位小数位的查询中存在 hack。如果您喜欢我的回答,请投票并接受。谢谢。

WITH apoc.coll.toSet(split("+46xxxxx2260","")) as set1,apoc.coll.toSet(split("+46xxxxx2226","")) as set2
WITH set1,set2,apoc.coll.intersection(set1,set2) as common 
RETURN ROUND(2*size(common)*10^4/(size(set1)+size(set2)))/10^4 as sorensenDiceSimilarity

Result:
0.9091