如何逐词计算多词字符串相似度并优化现有R实现代码
优化方案
核心思路
避免来回做长宽表转换,直接逐行拆分词向量后计算所有两两组合的距离,从根源解决原有问题。
依赖包
library(dplyr) library(stringdist) library(purrr)
优化后代码
# 测试数据 df <- data.frame( col1 = c("ab", "ab bc", "yyyy", "yyyy pw hhhh", "wstjz") ) res <- df %>% mutate( id = row_number(), # 生成对比列:下一行的字符串 col2 = lead(col1), # 拆分当前行、对比行的字符串为词向量 col1_words = strsplit(col1, "\\s"), col2_words = strsplit(col2, "\\s"), # 逐行计算所有词两两的距离,返回数值型列表 distance = map2(col1_words, col2_words, function(x, y) { if (all(is.na(y))) return(NA_real_) # outer计算两个词向量的所有两两组合距离,拉平为向量 as.vector(outer(x, y, stringdist)) }), # 可选:生成展示用的逗号分隔字符型距离 distance_str = map_chr(distance, ~ if (all(is.na(.x))) NA_character_ else paste(.x, collapse = ", ")) ) %>% # 按需选择输出列 select(id, col1, col2, distance, distance_str)
输出效果
运行后res的distance_str列和你原有输出的distance列完全一致,同时新增的distance列为数值列表,你可以直接提取数值做后续计算,比如计算每行的平均距离:
res %>% mutate(avg_dist = map_dbl(distance, mean, na.rm = TRUE))
问题解决说明
- 无警告:移除了原有pivot、unnest等容易因为词数量不对等产生填充警告的步骤,运行无额外提示
- 逻辑简化:直接按行处理,无需做表结构转换,代码逻辑清晰易懂,代码量减少近50%
- 数值型距离:默认返回的
distance列是数值向量列表,不需要再做字符拆分转换,可直接用于后续统计计算
内容的提问来源于stack exchange,提问作者Chris Ruehlemann
相关产品推荐
相关产品推荐

