ngrams 顺序不正确
ngrams not in correct order
我有兴趣找到字符串 x= "A T G C C G C G T"
的 ngrams
。我使用 ngram
R
包来获取 ngrams
。我使用以下几行来完成我的工作。
library(ngram)
ng <- ngram(x,n=2)
ngrams_out = get.ngrams(ng)
ngrams_final <- gsub(" ", "",ngrams_out , fixed = TRUE)
# "CG" "TG" "AT" "GC" "CC" "GT" ## ngrams
它给出了所述字符串的所有 ngrams
而没有重复,但令我惊讶的是 ngrams
的顺序不正确。该顺序对于跟踪 ngram
的位置非常重要。 ngrams
的正确顺序是 "AT","TG","GC","CC","CG","GC","CG","GT"
重复,从那里我可以清楚地找出给定字符串中特定 ngram
的位置。
不知道 ngram
但你应该像这样生成输出,
x= "A T G C C G C G T"
strsplit(gsub("(\S)(?=\s(\S))|\s+\S$", "\1\2", x, perl=T), " ")[[1]]
# [1] "AT" "TG" "GC" "CC" "CG" "GC" "CG" "GT"
我们可以scan
字符串'x'得到单个字符,然后paste
把相邻的元素放在一起
v1 <- scan(text=x, what='')
paste0(v1[-length(v1)], v1[-1])
#[1] "AT" "TG" "GC" "CC" "CG" "GC" "CG" "GT"
对于更新后的问题,
x1 <- gsub('\s+', '', x)
n <- 3
pat <- paste0('.{', n,'}')
library(stringi)
v1 <- c(stri_list2matrix(lapply(seq_len(n), function(i)
stri_extract_all_regex(substring(x1,i), pat)[[1]]),byrow=TRUE))
v1[!is.na(v1)]
#[1] "ATG" "TGC" "GCC" "CCG" "CGC" "GCG" "CGT"
改为
n <- 4
v1[!is.na(v1)]
#[1] "ATGC" "TGCC" "GCCG" "CCGC" "CGCG" "GCGT"
文本分析包 quanteda 有一个很棒的 ngram 生成器:
require(quanteda)
unlist(tokenize("A T G C C G C G T", ngrams = 2, concatenator = ""))
## [1] "AT" "TG" "GC" "CC" "CG" "GC" "CG" "GT"
在这里,我已经将从 tokenize()
返回的 tokenizedText class 对象(一种列表)转换为您想要的简单向量。
我有兴趣找到字符串 x= "A T G C C G C G T"
的 ngrams
。我使用 ngram
R
包来获取 ngrams
。我使用以下几行来完成我的工作。
library(ngram)
ng <- ngram(x,n=2)
ngrams_out = get.ngrams(ng)
ngrams_final <- gsub(" ", "",ngrams_out , fixed = TRUE)
# "CG" "TG" "AT" "GC" "CC" "GT" ## ngrams
它给出了所述字符串的所有 ngrams
而没有重复,但令我惊讶的是 ngrams
的顺序不正确。该顺序对于跟踪 ngram
的位置非常重要。 ngrams
的正确顺序是 "AT","TG","GC","CC","CG","GC","CG","GT"
重复,从那里我可以清楚地找出给定字符串中特定 ngram
的位置。
不知道 ngram
但你应该像这样生成输出,
x= "A T G C C G C G T"
strsplit(gsub("(\S)(?=\s(\S))|\s+\S$", "\1\2", x, perl=T), " ")[[1]]
# [1] "AT" "TG" "GC" "CC" "CG" "GC" "CG" "GT"
我们可以scan
字符串'x'得到单个字符,然后paste
把相邻的元素放在一起
v1 <- scan(text=x, what='')
paste0(v1[-length(v1)], v1[-1])
#[1] "AT" "TG" "GC" "CC" "CG" "GC" "CG" "GT"
对于更新后的问题,
x1 <- gsub('\s+', '', x)
n <- 3
pat <- paste0('.{', n,'}')
library(stringi)
v1 <- c(stri_list2matrix(lapply(seq_len(n), function(i)
stri_extract_all_regex(substring(x1,i), pat)[[1]]),byrow=TRUE))
v1[!is.na(v1)]
#[1] "ATG" "TGC" "GCC" "CCG" "CGC" "GCG" "CGT"
改为
n <- 4
v1[!is.na(v1)]
#[1] "ATGC" "TGCC" "GCCG" "CCGC" "CGCG" "GCGT"
文本分析包 quanteda 有一个很棒的 ngram 生成器:
require(quanteda)
unlist(tokenize("A T G C C G C G T", ngrams = 2, concatenator = ""))
## [1] "AT" "TG" "GC" "CC" "CG" "GC" "CG" "GT"
在这里,我已经将从 tokenize()
返回的 tokenizedText class 对象(一种列表)转换为您想要的简单向量。