如何在字符向量中找到常用短语。例如,我有下面的字符向量,我想确定Foo Bar 1
对于2& 3和Foo Bar 2
对于4& 5,我不知道我正在寻找Foo Bar 1
和Foo Bar 2
。
示例输入
a <- c("index", "bla Foo Bar 1", "blah Foo Bar 1",
"blaa Foo Bar 2", "blahh Foo Bar 2")
并且所需的输出类似于
output <- list(`Foo Bar 1` = c(2, 3), `Foo Bar 2` = c(4, 5))
输出格式可能有所不同,但我正在寻找原始矢量中的常用短语和相应位置。
我希望匹配最长的常用短语(顺序问题),因此在这种情况下,单独使用Foo Bar
进行匹配是不可取的。也可以返回开始和结束空格(我可以稍后剥离)。在这个例子中,我也不想匹配Foo Bar 1a
,所以我们应该假设单词用空格分隔。
我的问题类似于前面提到的this one,虽然在我的情况下我有一个向量,想要匹配完整的单词而不是字符。
答案 0 :(得分:1)
这是可行的。首先,输入样本
#sample input
a <- c("index", "bla Foo Bar 1", "blah Foo Bar 1",
"blaa Foo Bar 2", "blahh Foo Bar 2")
然后是一个将字符串分解为短语的函数
allcomp <- function(x) {
unname(do.call(c, lapply(1:length(x),
function(z) lapply(1:(length(x)-z+1),
function(i) x[i:(i+z-1)]))))
}
getPhrases <- function(a) {
parts <- Map(allcomp, strsplit(a, " "))
vals <- sapply(parts, sapply, paste0, collapse=" ")
len <- sapply(parts, sapply, length)
do.call(rbind, Map(cbind.data.frame, i=seq_along(a), v=vals, l=len))
}
现在我们可以制表
pp<-getPhrases(a)
tbl<-Map(function(x) list(ids=unique(x$i), len=max(x$l),
cnt=length(unique(x$i))), split(pp, pp$v))
maxlen<-max(sapply(tbl, `[[`, "len") * as.numeric(sapply(tbl, `[[`, "cnt")>1))
maxcnt<-max(sapply(tbl[sapply(tbl, `[[`, "len")==maxlen], `[[`, "cnt"))
Map(function(x) x$ids, tbl[sapply(tbl, `[[`, "len")==maxlen &
sapply(tbl, `[[`, "cnt")==maxcnt])
返回
$`Foo Bar 1`
[1] 2 3
$`Foo Bar 2`
[1] 4 5