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

如何在R中计算成对文档的余弦语义相似度

R语言计算Word文档剧情文本余弦语义相似度教程

1. 所需依赖包

先安装所需的工具包,对应功能分别为Word文档读取、文本预处理、相似度计算:

install.packages(c("officer", "tm", "text2vec"))
# 中文文本额外安装分词包
install.packages("jiebaR")

2. 基础实现流程(基于TF-IDF,适合短剧情文本)

2.1 读取Word文档内容

library(officer)
library(tm)
library(text2vec)

# 自定义读取Word文本函数
read_word_text <- function(file_path) {
  doc <- read_docx(file_path)
  text_content <- paste(docx_summary(doc)$text, collapse = " ")
  return(text_content)
}

# 替换为你自己的文件路径
original_text <- read_word_text("原作剧情描述.docx")
sequel_text <- read_word_text("续集剧情描述.docx")

2.2 文本预处理

英文文本预处理:

# 构建语料库
text_corp <- VCorpus(VectorSource(c(original_text, sequel_text)))

# 标准化清洗
text_corp_clean <- tm_map(text_corp, content_transformer(tolower))
text_corp_clean <- tm_map(text_corp_clean, removePunctuation)
text_corp_clean <- tm_map(text_corp_clean, removeNumbers)
text_corp_clean <- tm_map(text_corp_clean, removeWords, stopwords("english"))
text_corp_clean <- tm_map(text_corp_clean, stripWhitespace)

中文文本预处理:

需要先完成分词再构建语料库:

library(jiebaR)
wk <- worker()

# 分词处理
original_seg <- paste(segment(original_text, wk), collapse = " ")
sequel_seg <- paste(segment(sequel_text, wk), collapse = " ")

# 后续构建语料库、清洗逻辑和英文一致,停用词替换为中文停用词即可
text_corp <- VCorpus(VectorSource(c(original_seg, sequel_seg)))
text_corp_clean <- tm_map(text_corp, removePunctuation)
text_corp_clean <- tm_map(text_corp_clean, removeNumbers)
text_corp_clean <- tm_map(text_corp_clean, removeWords, stopwords("zh", source = "jieba"))
text_corp_clean <- tm_map(text_corp_clean, stripWhitespace)

2.3 计算余弦相似度

# 生成TF-IDF权重的文档词矩阵
dtm_tfidf <- DocumentTermMatrix(text_corp_clean, control = list(weighting = weightTfIdf))
dtm_mat <- as.matrix(dtm_tfidf)

# 自定义余弦相似度计算函数
cal_cos_sim <- function(vec1, vec2) {
  sum(vec1 * vec2) / (sqrt(sum(vec1^2)) * sqrt(sum(vec2^2)))
}

# 得到最终相似度得分,取值范围0-1,越接近1相似度越高
similarity_score <- cal_cos_sim(dtm_mat[1, ], dtm_mat[2, ])

3. 语义优化方案(基于预训练词向量,适合长文本/语义匹配要求高的场景)

如果需要更精准的语义匹配,可以用预训练词向量生成句嵌入后再计算相似度:

install.packages("word2vec")
library(word2vec)

# 加载提前下载好的对应语言预训练word2vec模型
# w2v_model <- read.word2vec("你的预训练模型路径.bin")

# 生成全文句向量
orig_vec <- doc2vec(w2v_model, original_text, type = "embedding")
seq_vec <- doc2vec(w2v_model, sequel_text, type = "embedding")

# 计算相似度
similarity_score <- cal_cos_sim(orig_vec, seq_vec)

批量计算提示

如果需要批量计算多组原作和续集的相似度,可将所有文件路径存入列表批量读取,一次性生成全量文档的相似度矩阵,批量提取对应配对的得分即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:36:02