You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R中pairwise_similarity未输出全量两两比对结果问题咨询

结论

你的判断完全准确:

  • 之前认为pairwise_similarity()会输出所有条目两两比对结果的认知存在偏差
  • 该函数默认会直接过滤掉无共同特征、相似度为0的配对,不会在结果中返回这些行
计算逻辑说明

widyr::pairwise_similarity()底层是通过稀疏矩阵的交叉乘积实现相似度计算的,只会对**至少共享1个特征(本场景中即共同词)**的条目对计算相似度值:

  • 两个条目如果没有任何共同特征,默认使用的余弦相似度结果为0,这类配对在计算时就会被筛掉,不会进入最终返回的数据集
  • 第一个测试场景中,条目3和1、2没有任何共同词汇,因此所有涉及3的配对都被过滤,最终仅返回条目1和2的双向相似度结果
  • 第二个测试场景中,条目1和3无共同词汇,因此1和3的配对被过滤,仅返回有共同词的1-2、2-3双向配对,和你实际运行的结果完全一致
获取全量配对结果的方法

如果需要拿到包含0相似度配对的完整两两比对结果,可以先生成所有非自身配对的组合表,再和函数返回的相似度结果做连接,把缺失的相似度值填充为0即可,参考实现代码:

library(tidyverse)
library(widyr)
library(tidytext)

# 测试数据
d <- data.frame(column_id=1:3, description= c("red and yellow", "yellow and blue", "blue and black"))

# 分词、去停用词、计算tf-idf
d_un_nest  <- d %>%
  unnest_tokens(output = "word", input = "description", token = "words") %>%
  anti_join(stop_words) %>%
  count(column_id, word, sort = TRUE) %>%
  bind_tf_idf(word, column_id, n)

# 计算相似度
d_similarity <- pairwise_similarity(d_un_nest, column_id, word, tf_idf)

# 生成所有排除自身的两两配对
all_pairs <- expand_grid(
  item1 = unique(d_un_nest$column_id),
  item2 = unique(d_un_nest$column_id)
) %>%
  filter(item1 != item2)

# 补全结果,缺失的相似度填充为0
full_similarity <- all_pairs %>%
  left_join(d_similarity, by = c("item1", "item2")) %>%
  replace_na(list(similarity = 0))

运行上述代码后,就能得到包含1-3、3-1两组0相似度结果的完整比对表。


内容的提问来源于stack exchange,提问作者fe108

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 20:31:11