我想构建一个n-gram的“字母文档矩阵”,它基本上使用最多n个字母的字母序列代替典型的单词。这是我想要实现的简化示例:
> letterDocumentMatrix(c('ea','ab','ca'), c('sea','abs','cab'))
[,sea] [,abs] [,cab]
[ea,] TRUE FALSE FALSE
[ab,] FALSE TRUE TRUE
[ca,] FALSE FALSE TRUE
这种操作有名称吗?是否有任何预建函数可以处理此问题?
最后,我尝试使用grepl进行外部测试,但无济于事:
> outer(c('ea','ab','ca'), c('sea','abs','cab'), grepl)
[,1] [,2] [,3]
[1,] TRUE FALSE FALSE
[2,] TRUE FALSE FALSE
[3,] TRUE FALSE FALSE
Warning message:
In FUN(X, Y, ...) :
argument 'pattern' has length > 1 and only the first element will be used
似乎external将第一个参数的整个传递给grepl,而不是一次传递一个条目,导致grepl只搜索第一个术语,在这种情况下为“ a”。
grepl()
不能根据其pattern
参数矢量化,这就是为什么您没有从获得正确结果的原因outer()
。这是使用的可能解决方案vapply()
。
vec <- c("sea", "abs", "cab") ## vector to search
pat <- c("ea", "ab", "ca") ## patterns we are searching for
"rownames<-"(vapply(pat, grepl, NA[seq_along(pat)], vec, fixed = TRUE), vec)
# ea ab ca
# sea TRUE FALSE FALSE
# abs FALSE TRUE FALSE
# cab FALSE TRUE TRUE
显然,这会导致您想要的内容转置。要获得所需的矩阵,我们可以使用lapply()
,rbind()
结果,然后设置名称。
xx <- do.call(rbind, lapply(pat, grepl, x = vec, fixed = TRUE))
dimnames(xx) <- list(pat, vec)
# sea abs cab
# ea TRUE FALSE FALSE
# ab FALSE TRUE TRUE
# ca FALSE FALSE TRUE
我想说的使用t()
对vapply()
结果进行转它,但它可以在大型矩阵缓慢。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句