gpt4 book ai didi

r - 使用 R 有效地计算列中单词列表的出现次数

转载 作者:行者123 更新时间:2023-12-04 10:09:50 26 4
gpt4 key购买 nike

如果我有一个单词列表,我如何有效地计算这些单词在数据集中出现的次数?

一个例子:

set.seed(123) 
df_data <- data.frame(
data_strings = sample(c("tom smith", "smith jim", "sam sam", "ted", "xxx"), 10, replace = TRUE)
)

df_names <- data.frame(
names = c("tom", "jim", "sam", "ted", "yyy")
)

即:

> df_data
data_strings
1 sam sam
2 sam sam
3 smith jim
4 smith jim
5 sam sam
6 xxx
7 ted
8 tom smith
9 smith jim
10 sam sam

> df_names
names
1 tom
2 jim
3 sam
4 ted
5 yyy

我可以使用 stringr 包中的 str_count 来做到这一点:

library(stringr)
library(tictoc)
tic()
df_data$counts <- as.vector(sapply(
paste(df_names[,"names"], collapse='|'),
str_count,
string=df_data$data_strings
))
toc()

这会产生预期的结果:

> df_data
data_strings counts
1 sam sam 2
2 sam sam 2
3 smith jim 1
4 smith jim 1
5 sam sam 2
6 xxx 0
7 ted 1
8 tom smith 1
9 smith jim 1
10 sam sam 2

但是,由于我的真实数据有几百万行,而且我的单词列表也是几百万。事实证明,这是获得结果的一种非常低效的方式。 我怎样才能加快它的速度?我试图通过 parallel 包使用更多的核心,但它同时完成(尽管我告诉它它只使用一个核心使用多个)。我在 Windows 上,所以我无法测试 mclapply()parallel 似乎工作正常,因为我可以让它在其他示例中使用更多内核。

library(stringr)
library(parallel)
library(tictoc)

cl <- makeCluster(4, type = "PSOCK")
tic()
df_data$counts <- as.vector(parSapply(
cl = cl,
paste(df_names[,"names"], collapse='|'),
FUN=str_count,
string=df_data$data_strings
))
toc()
stopCluster(cl)

我还可以尝试哪些其他方法?有 data.tables 的东西吗? apply 里面的 paste 可以不一样吗?

最佳答案

我不确定它在真实大小的数据集上是否更快,但你可以使用 quanteda,它内置了多核支持,在这种情况下应该非常高效:

library(dplyr)
library(quanteda)
quanteda_options("threads" = 4) # choose how many threads are used

df_data$counts <- df_data %>%
pull(data_strings) %>%
dfm() %>% # construct document-feature-matrix
dfm_keep(pattern = df_names$names) %>% # keep features that are names
convert(to = "data.frame") %>% # convert to data.frame
select(-document) %>% # remove non-numeric columns
rowSums() # only keep sums

df_data
#> data_strings counts
#> 1 sam sam 2
#> 2 sam sam 2
#> 3 smith jim 1
#> 4 smith jim 1
#> 5 sam sam 2
#> 6 xxx 0
#> 7 ted 1
#> 8 tom smith 1
#> 9 smith jim 1
#> 10 sam sam 2

reprex package 创建于 2020-01-13 (v0.3.0)

请注意,我在构建 data.frames 时设置了选项 stringsAsFactors = FALSE。否则你会遇到因素问题。

我可以想象,如果您的集合中有很多名字,这会更快。但是在我的基准测试中,stringr::str_countstringi::stri_count_regex 使用您提供的少量名称会更快。

关于r - 使用 R 有效地计算列中单词列表的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59717653/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com