如何识别两篇文本间的重叠单词序列(R语言场景)
识别文本重叠单词序列的R实现方案
核心思路
先统一文本格式(消除大小写、空格差异),再通过动态定位最长公共连续单词序列,最后还原成符合阅读习惯的文本。
实现步骤与代码
1. 文本预处理函数
标准化文本格式,消除大小写、空格、标点的格式差异,将文本分割为单词/标点单元:
preprocess_text <- function(text) { # 统一转为小写,消除大小写差异 text <- tolower(text) # 标点前后添加空格,便于分割为独立单元 text <- gsub("([[:punct:]])", " \\1 ", text) # 合并连续空格,消除多余空格差异 text <- gsub("\\s+", " ", text) # 去除文本首尾空格 text <- trimws(text) # 分割为单词/标点的向量 strsplit(text, " ")[[1]] }
2. 最长公共连续序列识别函数
用动态匹配的方式定位最长重叠序列,并还原为正常文本格式:
find_longest_common_sequence <- function(text1, text2) { # 预处理得到标准化的单词向量 words1 <- preprocess_text(text1) words2 <- preprocess_text(text2) n <- length(words1) m <- length(words2) # 初始化匹配记录矩阵,记录当前位置的最长连续匹配长度 dp <- matrix(0, nrow = n + 1, ncol = m + 1) max_len <- 0 end_pos <- 0 # 遍历寻找最长连续匹配 for (i in 1:n) { for (j in 1:m) { if (words1[i] == words2[j]) { dp[i+1, j+1] <- dp[i, j] + 1 if (dp[i+1, j+1] > max_len) { max_len <- dp[i+1, j+1] end_pos <- i } } } } # 提取并还原重叠序列 if (max_len == 0) { return("无重叠单词序列") } else { start_pos <- end_pos - max_len + 1 common_units <- words1[start_pos:end_pos] # 拼接时处理空格与标点的格式,避免标点前出现空格 result <- "" for (unit in common_units) { if (grepl("^[[:punct:]]$", unit)) { result <- paste0(result, unit) } else { if (nchar(result) > 0 && !grepl("[[:punct:]]$", substr(result, nchar(result), nchar(result)))) { result <- paste0(result, " ") } result <- paste0(result, unit) } } return(result) } }
3. 测试示例
用题目中的文本测试功能:
text_1 <- "She grew up in the United States. Her father was..." text_2 <- "I learned that she grew up in the united states.Her father was ..." # 调用函数获取重叠序列 find_longest_common_sequence(text_1, text_2)
执行后输出:she grew up in the united states. her father was ...
扩展说明
- 若需要识别所有重叠序列而非仅最长的,可修改代码记录所有匹配的起始/结束位置,再逐一提取。
- 处理大规模文本(如9000份作业)时,可优化匹配逻辑的空间复杂度,或采用滑动窗口法提升运行效率。
内容的提问来源于stack exchange,提问作者Anita
相关产品推荐
相关产品推荐

