如何使用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 name | Hello I am Joe. Joe is indeed my name |
注:所有重复内容仅出现在文本开头,数据中每个文本长度至少440字符,开头重复内容平均长度220字符。
实现思路
由于重复内容长度平均为220,文本总长度至少440,因此从文本中间位置开始的后半段必然包含完整的有效开头。我们可以:
- 取文本后半段作为参考
- 寻找开头子串与后半段子串的最长完全匹配长度
- 删除开头的匹配部分,去除可能的前导空格后得到结果
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
相关产品推荐
相关产品推荐

