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

g2ieeal7  于 2023-09-27  发布在  其他
关注(0)|答案(3)|浏览(88)

对于像'ABCDEFG'这样的字符串,是否可以拆分成不同长度的重叠段的不同列表?例如,使用两个字母:'AB'、'BC'、'CD'、'DE'、'EF'、'FG'。三个字母:'ABC',' BCD ',' CDE ',' DEF ','EFG'等等。这些段应该是一个移动的一个字母,而不是简单的分裂。
非常感谢

1hdlvixo

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"
i7uq4tfw

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使用不同的值)。

使用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

1l5u6lss

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()是矢量化的:

ngrams = function (x, len) {
  start = seq_len(nchar(x) - len + 1L)
  substring(x, start, start + len - 1L)
}

但是,由于substring()使用参数长度的循环扩展,因此当输入不是预期的输入时,它有点容易出错。

相关问题