对于像'ABCDEFG'这样的字符串,是否可以拆分成不同长度的重叠段的不同列表?例如,使用两个字母:'AB'、'BC'、'CD'、'DE'、'EF'、'FG'。三个字母:'ABC',' BCD ',' CDE ',' DEF ','EFG'等等。这些段应该是一个移动的一个字母,而不是简单的分裂。非常感谢
1hdlvixo1#
我不是很好,我不知道如果这是你搜索,但我认为它可能会做的伎俩与包字符串。
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"
i7uq4tfw2#
是的,这些被称为n-gram,在这种情况下,字符n-gram。n 等于要提取的字符数。您可以使用现有的函数来非常有效地提取它们:
stringdist
stringdist::qgrams("ABCDEFG", q = 2) # AB BC CD DE EF FG # V1 1 1 1 1 1 1
这将返回每个字符bigram/n-gram的计数表(q使用不同的值)。
q
quanteda
library(quanteda) "ABCDEFG" %>% tokens("character") %>% unlist() %>% char_ngrams(2, concatenator = "") # [1] "AB" "BC" "CD" "DE" "EF" "FG"
这将返回bigrams/n-gram的列表(更改n的值)。如果需要一些预处理,可以选择激活quanteda::tokens()中的选项remove_punct(删除所有标点符号)或remove_symbols。
n
quanteda::tokens()
remove_punct
remove_symbols
1l5u6lss3#
很不幸,没有固定的方法。也就是说,手动执行此操作相当简单。给出:
x = 'ABCDEFG' len = 3L
start = seq_len(nchar(x) - len + 1L) result = vapply(start, \(s) substr(x, s, s + len - 1L), character(1L))
或者, Package 在一个函数中(如上所述,这些重叠的子字符串称为“ngrams”):
ngrams = function (x, len) { start = seq_len(nchar(x) - len + 1L) vapply(start, \(s) substr(x, s, s + len - 1L), character(1L)) }
或者,你可以使用substring()代替substr() + vapply(),因为substring()是矢量化的:
substring()
substr()
vapply()
ngrams = function (x, len) { start = seq_len(nchar(x) - len + 1L) substring(x, start, start + len - 1L) }
但是,由于substring()使用参数长度的循环扩展,因此当输入不是预期的输入时,它有点容易出错。
3条答案
按热度按时间1hdlvixo1#
我不是很好,我不知道如果这是你搜索,但我认为它可能会做的伎俩与包字符串。
其结果是:
i7uq4tfw2#
是的,这些被称为n-gram,在这种情况下,字符n-gram。n 等于要提取的字符数。
您可以使用现有的函数来非常有效地提取它们:
带**
stringdist
**:这将返回每个字符bigram/n-gram的计数表(
q
使用不同的值)。使用
quanteda
:这将返回bigrams/n-gram的列表(更改
n
的值)。如果需要一些预处理,可以选择激活quanteda::tokens()
中的选项remove_punct
(删除所有标点符号)或remove_symbols
。1l5u6lss3#
很不幸,没有固定的方法。也就是说,手动执行此操作相当简单。
给出:
或者, Package 在一个函数中(如上所述,这些重叠的子字符串称为“ngrams”):
或者,你可以使用
substring()
代替substr()
+vapply()
,因为substring()
是矢量化的:但是,由于
substring()
使用参数长度的循环扩展,因此当输入不是预期的输入时,它有点容易出错。