【问题标题】:Extract words from text using dplyr and stringr使用 dplyr 和 stringr 从文本中提取单词
【发布时间】:2019-11-15 19:35:50
【问题描述】:

我正在尝试找到一种从数据集中的文本列中提取单词的有效方法。我使用的方法是

library(dplyr)
library(stringr)

Text = c("A little bird told me about the dog", "A pig in a poke", "As busy as a bee")
data = as.data.frame(Text)
keywords <- paste0(c("bird", "dog", "pig","wolf","cat", "bee", "turtle"), collapse = "|")
data %>% mutate(Word = str_extract(Text, keywords))

这只是一个示例,但我有超过 2000 个可能的单词要从每一行中提取。我不知道另一种使用方法,但是我将拥有一个大的正则表达式这一事实会使事情变慢或正则表达式的大小无关紧要?我认为它不会在每一行中出现多个这些单词,但是如果每行中出现多个单词,有一种方法可以自动制作多列?

【问题讨论】:

  • 你需要v1 &lt;- c("bird", "dog", "pig","wolf","cat", "bee", "turtle") ;map(v1, ~ str_detect(data$Text, .x)) %&gt;% set_names(v1) %&gt;% as_tibble %&gt;% bind_cols(data, .)
  • 很大程度上取决于您是要匹配整个单词还是只匹配字符序列。

标签: r regex string dplyr


【解决方案1】:

我们可以使用str_extract_all 来返回list,将list 元素转换为命名列表或tibble 并使用unnest_wider

library(purrr)
library(stringr)
library(tidyr)
library(dplyr)
data %>% 
  mutate(Words = str_extract_all(Text, keywords),
        Words = map(Words, ~ as.list(unique(.x)) %>% 
                              set_names(str_c('col', seq_along(.))))) %>%
  unnest_wider(Words)
# A tibble: 3 x 3
#  Text                                col1  col2 
#  <fct>                               <chr> <chr>
#1 A little bird told me about the dog bird  dog  
#2 A pig in a poke                     pig   <NA> 
#3 As busy as a bee                    bee   <NA> 

【讨论】:

  • 这正是我想要的。我只是对 R 新手有一些疑问。在 unique() 中,您传递了一个参数 .x 并且没有 x 变量,所以这意味着要在每一行中查找唯一值?当您使用 set_names() 时,它会在您使用 unnest_wider 拆分列表之前根据唯一词的数量创建新列? seq 中的点 (.) 是什么意思?
  • @Roland ~ .x 是用于匿名函数的 function(x) x 的较短版本。在tidyverse中,传递的默认值为..x。您也可以使用map(Words, function(x) as.list(unique(x)) %&gt;% 将其更改为常规函数
【解决方案2】:

尝试将intersectkeywords 作为数组

data <- data.frame(Text = Text, Word = sapply(Text, function(v) intersect(unlist(strsplit(v,split = " ")),keywords),USE.NAMES = F))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多