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

如何使用stringi移除字符向量开头的重复片段?

解决方案:移除character向量开头的重复前缀

问题背景

我有一个character类型的向量,每个元素开头存在重复内容——重复部分是后续有效文本的前缀(可能缺失少量字符),需要去除开头的重复部分,保留完整的有效文本。具体示例如下:

输入文本期望输出
Hello. Hello. How are you?Hello. How are you?
Hello I am Joe. Hello I am Joe. How are you?Hello I am Joe. How are you?
Hello I a Hello I am Joe. How are you?Hello I am Joe. How are you?
Hello I am Jo Hello I am Joe. How are you?Hello I am Joe. How are you?
Hello I am J Hello I am Joe. Joe is indeed my nameHello I am Joe. Joe is indeed my name

注:所有重复内容仅出现在文本开头,数据中每个文本长度至少440字符,开头重复内容平均长度220字符。

实现思路

由于重复内容长度平均为220,文本总长度至少440,因此从文本中间位置开始的后半段必然包含完整的有效开头。我们可以:

  1. 取文本后半段作为参考
  2. 寻找开头子串与后半段子串的最长完全匹配长度
  3. 删除开头的匹配部分,去除可能的前导空格后得到结果

R代码实现

remove_prefix_duplicate <- function(s) {
  n <- nchar(s)
  if (n < 2) return(s)
  
  # 从中间位置截取后半段文本,确保包含完整有效开头
  start_pos <- floor(n / 2)
  suffix_sub <- substr(s, start_pos, n)
  
  max_k <- 0
  # 遍历最长可能的匹配长度,从大到小寻找第一个完全匹配的长度
  max_possible_k <- min(nchar(suffix_sub), start_pos - 1)
  for (k in seq(max_possible_k, 1, by = -1)) {
    prefix_candidate <- substr(s, 1, k)
    suffix_prefix <- substr(suffix_sub, 1, k)
    if (prefix_candidate == suffix_prefix) {
      max_k <- k
      break
    }
  }
  
  # 移除开头重复部分并清理前导空格
  result <- if (max_k > 0) substr(s, max_k + 1, n) else s
  trimws(result)
}

# 测试示例向量
text_vec <- c(
  "Hello. Hello. How are you?",
  "Hello I am Joe. Hello I am Joe. How are you?",
  "Hello I a Hello I am Joe. How are you?",
  "Hello I am Jo Hello I am Joe. How are you?",
  "Hello I am J Hello I am Joe. Joe is indeed my name"
)

# 处理整个向量
cleaned_vec <- sapply(text_vec, remove_prefix_duplicate)

# 输出结果
print(cleaned_vec)

输出结果

[1] "Hello. How are you?"                  "Hello I am Joe. How are you?"        
[3] "Hello I am Joe. How are you?"         "Hello I am Joe. How are you?"        
[5] "Hello I am Joe. Joe is indeed my name"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:15:37