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

如何在R语言中计算DataFrame相邻行文本的余弦相似度?

计算DataFrame相邻行文本的余弦相似度(textTinyR包)

问题背景

现有名为text的DataFrame,包含year和text两列,需计算每一行文本与上一行文本的余弦相似度。使用textTinyR::cosine_distance直接结合dplyr::mutate时触发报错,因为该函数仅接受单个字符串对,而非整个字符向量。

原始报错代码

result <- text %>%
  mutate(cosine_similarity = cosine_distance(text, dplyr::lag(text)))

错误信息

Error in mutate():
ℹ In argument: cosine_similarity = cosine_distance(text, dplyr::lag(text)).
Caused by error:
! Expecting a single string value: [type=character; extent=8].

解决方案

以下两种方法均可实现逐对计算相邻行的余弦相似度:

方法1:使用rowwise()逐行处理

通过rowwise()让mutate逐行执行逻辑,确保每次传入cosine_distance的是单个字符串对:

library(dplyr)
library(textTinyR)

result <- text %>%
  rowwise() %>%
  mutate(
    cosine_similarity = ifelse(
      is.na(lag(text)), 
      NA,  # 第一行无前置行,返回NA
      cosine_distance(text, lag(text))
    )
  ) %>%
  ungroup()  # 取消行分组,避免影响后续操作

方法2:使用purrr::map2()批量处理成对元素

将当前行文本与滞后一行文本作为两个向量,通过map2_dbl逐个传入函数计算:

library(dplyr)
library(purrr)
library(textTinyR)

result <- text %>%
  mutate(
    prev_text = lag(text),
    cosine_similarity = map2_dbl(
      text, prev_text,
      ~ifelse(is.na(.y), NA, cosine_distance(.x, .y))
    )
  ) %>%
  select(-prev_text)  # 可选:删除临时生成的prev_text列

验证说明

比如前两行文本完全一致,计算出的余弦距离应为0(对应余弦相似度1),可以通过查看result$cosine_similarity第一行(NA)、第二行(0)验证逻辑正确性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 15:08:17