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

