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
相关产品推荐
相关产品推荐

