如何高效计算两个数据框列表的关键词列距离矩阵与Jaccard指数?
高效计算文本列距离矩阵与Jaccard指数实现方案
一、生成跨列表文本列的距离矩阵
实现思路
先提取两个列表中所有数据框的keyword列,合并为两个独立向量,再利用stringdist包的向量化函数批量计算距离,避免循环提升效率。
代码示例
library(stringdist) library(dplyr) library(purrr) # 提取list_v1所有数据框的keyword列,合并为单一向量 v1_keywords <- list_v1 %>% map_dfr(~select(., keyword)) %>% pull(keyword) # 提取list_v2所有数据框的keyword列,合并为单一向量 v2_keywords <- list_v2 %>% map_dfr(~select(., keyword)) %>% pull(keyword) # 生成Levenshtein距离矩阵(维度:length(v1_keywords) × length(v2_keywords)) dist_matrix <- stringdistmatrix(v1_keywords, v2_keywords, method = "lv") # 可选:转换为带标签的tibble格式 dist_tibble <- dist_matrix %>% as.data.frame() %>% setNames(v2_keywords) %>% mutate(v1_keyword = v1_keywords) %>% relocate(v1_keyword) %>% as_tibble()
效率优化
stringdistmatrix是底层优化的向量化实现,比手动循环计算效率高一个量级- 若文本均为ASCII编码,可添加
useBytes = TRUE参数进一步提速
二、计算跨列表文本列的Jaccard指数
整体集合的Jaccard指数
针对两个列表所有keyword的整体集合计算:
# 转换为去重集合 v1_set <- unique(v1_keywords) %>% as.set() v2_set <- unique(v2_keywords) %>% as.set() # 计算Jaccard指数:交集大小 / 并集大小 jaccard_index <- length(intersect(v1_set, v2_set)) / length(union(v1_set, v2_set))
两两文本对的Jaccard相似度矩阵
若需要计算每个v1_keywords元素与每个v2_keywords元素的字符级Jaccard相似度:
# 定义单文本对的Jaccard计算函数 text_jaccard <- function(x, y) { x_chars <- strsplit(x, "")[[1]] %>% as.set() y_chars <- strsplit(y, "")[[1]] %>% as.set() length(intersect(x_chars, y_chars)) / length(union(x_chars, y_chars)) } # 生成两两相似度矩阵 jaccard_matrix <- outer(v1_keywords, v2_keywords, Vectorize(text_jaccard)) # 转换为带标签的tibble格式 jaccard_tibble <- jaccard_matrix %>% as.data.frame() %>% setNames(v2_keywords) %>% mutate(v1_keyword = v1_keywords) %>% relocate(v1_keyword) %>% as_tibble()
内容的提问来源于stack exchange,提问作者larry77
相关产品推荐
相关产品推荐

