利用杰卡德系数计算文本相似度

1. 杰卡德相似系数

两个集合A和B交集元素的个数在A、B并集中所占的比例,称为这两个集合的杰卡德系数,用符号 J(A,B) 表示。

Jaccard相似指数用来度量两个集合之间的相似性。

2. 杰卡德距离

与杰卡德相似系数相反的概念是杰卡德距离(Jaccard Distance),可以用如下公式来表示:

杰卡德距离用两个两个集合中不同元素占所有元素的比例来衡量两个集合的区分度。

Jaccard距离用来度量两个集合之间的差异性。

3. 使用场景

对字 / 词的顺序不敏感的文本,比如 “北京首都” 和“首都北京”,可以很好地兼容。

长文本,比如一篇论文,甚至一本书。如果两篇论文相似度较高,说明交集比较大,很多用词是重复的,存在抄袭嫌疑。

4. 不适用场景

重复字符较多的文本,比如 “空气很很很很很很很很很很好” 和“空气很好好好好好好好好好好”,这两个文本有很多字不一样,直观感受相似度不会太高,但计算出来的相似度却是 100%(交集 = 并集)。

对文字顺序很敏感的场景,比如 “一八三六年” 和“一六八三年”,杰卡德相似度是 100%,意思却完全不同。

5. 示例

代码语言:javascript
复制
  /**
   * 计算杰卡德系数.
   */
  def test(): Double = {
    val a = "天气很好".toCharArray.toList
    val b = "天气很棒".toCharArray.toList
val aSize = a.size.toDouble
val bSize = b.size.toDouble
val unionSize = a.union(b).distinct.size.toDouble
val score = (aSize + bSize - unionSize) / unionSize
println(s"${aSize} ${bSize} ${unionSize} ${score}")
score

}

上面是用scala写的代码,打印出来的结果:

代码语言:javascript
复制
4.0 4.0 5.0 0.6

score = (4 + 4 - 5) / 5 = 0.6

杰卡德系数越大,说明两个文本越相似,杰卡德距离则相反。