以更快的方式查找大数据框中的单词/短语

时间:2017-11-08 07:02:15

标签: r

我有一个数据框,其中包含10137行(数据框命名短语)和文本,另一个数据框包含62000个术语(数据框命名的单词),我想在第一个数据框中使用它来查找文本第一个数据帧第二个数字的字是指0或1,如果它不存在或分别存在。

这段代码实现了这个过程:

# Create some fake data
words <- c("stock", "revenue", "continuous improvement")
phrases <- c("blah blah stock and revenue", "yada yada revenue yada", 
             "continuous improvement is an unrealistic goal", 
             "phrase with no match")

# Apply the 'grepl' function along the list of words, and convert the result to numeric
df <- data.frame(lapply(words, function(word) {as.numeric(grepl(word, phrases))}))
# Name the columns the words that were searched
names(df) <- words

然而,如果我在第一行使用我的初始数据时出现的问题是它需要很长时间。我试图找到一种有效的方法,以使流程更快。我虽然参与其中以使其成为例子(基于我的数据帧的数量)

 df_500 <- data.frame(lapply(words, function(word) {as.numeric(grepl(word, phrases[1:500]))}))
 df_1000 <- data.frame(lapply(words, function(word) {as.numeric(grepl(word, phrases[501:1000]))}))
 df_500 <- data.frame(lapply(words, function(word) {as.numeric(grepl(word, phrases[1:500]))}))
 df_1500 <- data.frame(lapply(words, function(word) {as.numeric(grepl(word, phrases[1001:1500]))}))

#并将数据帧列为10137,就像第一个数据帧的行一样,然后将结果合并到数据帧中。

如何并行实现这一点,因为现在它会一个接一个地执行命令,时间会相同?这是正确的解决方案吗?

1 个答案:

答案 0 :(得分:4)

您可以使用tm包并创建文档字词矩阵,并使用RWeka中的标记符。

library(tm)
library(RWeka)

首先,创建bigram tokeniser:

bigram_tokeniser <- function(x) NGramTokenizer(x, Weka_control(min = 1, max = 2))

然后从phrases

创建语料库
corpus <- VCorpus(VectorSource(phrases)) 

在这种情况下,只会考虑向量words中的字词,您可以通过更改control来更改它:

dtm <- DocumentTermMatrix(corpus, 
                          control = list(tokenize = bigram_tokeniser,
                                         dictionary = words))

然后,您可以将文档术语矩阵转换为矩阵并获得所需的输出:

as.matrix(dtm)

    Terms
Docs continuous improvement revenue stock
   1                      0       1     1
   2                      0       1     0
   3                      1       0     0
   4                      0       0     0