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

如何逐词计算多词字符串相似度并优化现有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))

问题解决说明

  1. 无警告:移除了原有pivot、unnest等容易因为词数量不对等产生填充警告的步骤,运行无额外提示
  2. 逻辑简化:直接按行处理,无需做表结构转换,代码逻辑清晰易懂,代码量减少近50%
  3. 数值型距离:默认返回的distance列是数值向量列表,不需要再做字符拆分转换,可直接用于后续统计计算

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 09:15:02