如何在R中创建字符串的重叠段列表?



对于像' ABCDEFG '这样的字符串,是否有可能分割成不同长度的重叠段的不同列表?例如,使用2字母:"AB"、"公元前","CD","德","英孚"、"成品"。三个字母:' ABC ', ' BCD ', ' CDE ', ' DEF ', ' EFG '等等......这些片段应该只移位一个字母,而不是简单的分割。

非常感谢。

我不是很好,我不知道这是否是你搜索的,但我认为它可能会与包字符串的技巧。

string <- "ABCDEF"
library(stringr)
combinated_letters <- function(string, n) {
length_ <- str_length(string)
str_sub(string, seq(1, length_ + 1 - n), seq(n, length_))
}
combinated_letters(string, 1)
combinated_letters(string, 2)
combinated_letters(string, 3)
combinated_letters(string, 4)
combinated_letters(string, 5)
combinated_letters(string, 6)

结果:

> combinated_letters(string, 1)
[1] "A" "B" "C" "D" "E" "F"
> combinated_letters(string, 2)
[1] "AB" "BC" "CD" "DE" "EF"
> combinated_letters(string, 3)
[1] "ABC" "BCD" "CDE" "DEF"
> combinated_letters(string, 4)
[1] "ABCD" "BCDE" "CDEF"
> combinated_letters(string, 5)
[1] "ABCDE" "BCDEF"
> combinated_letters(string, 6)
[1] "ABCDEF"

是的,这些被称为n-grams在这种情况下,是字符n-gram。n等于要提取的字符数。

您可以使用现有的函数来非常有效地提取它们:

Withstringdist:

stringdist::qgrams("ABCDEFG", q = 2)
#    AB BC CD DE EF FG
# V1  1  1  1  1  1  1

这将返回每个字符双字母/n-gram的计数表(对于q使用不同的值)。

Withquanteda:

library(quanteda)
"ABCDEFG" %>% 
tokens("character") %>% 
unlist() %>% 
char_ngrams(2, concatenator = "")
# [1] "AB" "BC" "CD" "DE" "EF" "FG"

这将返回双元/n-grams的列表(改变n的值)。你可以选择激活选项remove_punct(删除所有标点符号)或remove_symbolsquanteda::tokens()如果你需要一些预处理。

不幸的是,没有内置的方法。也就是说,手动执行此操作相当简单。

给定:

x = 'ABCDEFG'
len = 3L
start = seq_len(nchar(x) - len + 1L)
result = vapply(start, function (s) substr(x, s, s + len - 1L), character(1L))

或者,用函数封装:

overlapping_substrings = function (x, len) {
start = seq_len(nchar(x) - len + 1L)
vapply(start, function (s) substr(x, s, s + len - 1L), character(1L))
}

最新更新