查找字符向量中的常用短语

时间:2014-08-20 19:40:27

标签: r

如何在字符向量中找到常用短语。例如,我有下面的字符向量,我想确定Foo Bar 1对于2& 3和Foo Bar 2对于4& 5,我不知道我正在寻找Foo Bar 1Foo 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,虽然在我的情况下我有一个向量,想要匹配完整的单词而不是字符。

1 个答案:

答案 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