如何在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
相关产品推荐
相关产品推荐

