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

如何高效计算两个数据框列表的关键词列距离矩阵与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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:42:33