apoc.text.sorensenDiceSimilarity 出现意外结果?
Unexpected result with 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...
对我来说没有意义,但也许我不知道算法有什么问题?
任何见解表示赞赏。
P.S。 “Neo4j 内核”、“3.5.9”、“社区”
这绝对是一个错误,也是一个很好的收获!
作为替代方案,您可以执行以下查询,该查询使用 apoc 函数作为 toSet 和交集以及文本函数,split。使用 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
对于使用 Sorensen-Dice 的字符串相似性有点困惑。 显然,它对传递的顺序参数有所不同。
WITH
apoc.text.sorensenDiceSimilarity("+46xxxxx2260", "+46xxxxx2226") as score1,
apoc.text.sorensenDiceSimilarity("+46xxxxx2226", "+46xxxxx2260") as score2
RETURN
score1, score2
其中一个分数(即相似系数)为 1.0,另一个为 0.909090...
对我来说没有意义,但也许我不知道算法有什么问题? 任何见解表示赞赏。
P.S。 “Neo4j 内核”、“3.5.9”、“社区”
这绝对是一个错误,也是一个很好的收获!
作为替代方案,您可以执行以下查询,该查询使用 apoc 函数作为 toSet 和交集以及文本函数,split。使用 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