对于像' 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_symbols
在quanteda::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))
}