【问题标题】:Filter all rows with word next to a specified word in R过滤R中指定单词旁边的单词的所有行
【发布时间】:2020-05-29 04:28:54
【问题描述】:

我有一列包含字符串内容

temp <- c(NA, NA, "grocery pantry all offers", NA, "grocery offers today low price", 
"grocery offers today low price", "tide soap", "tide soap bar", 
"tide detergent powders 2kg", NA, "tide", "tide detergent powders 2kg", 
"liquid detergent tide brand")

我的目的是用 Tide 旁边的单词创建一个二元组。为此,我需要过滤掉潮汐旁边的单词。无论是左侧还是右侧。对于上述输出中的 ex 将是

tide soap
tide soap
tide detergent
tide detergent
detergent tide
tide brand

有什么帮助吗?

【问题讨论】:

    标签: r tidyverse tidyr tidytext


    【解决方案1】:

    这是你想要的吗?

    library(stringr)
    
    str_extract(temp, "(tide [:alnum:]*)|([:alnum:]* tide)")
    

    它基本上说提取的字符串要么是"tide",后跟一个空格,然后是任意长度(*)或(|)的字母和数字的组合([:alnum:])其他方式 ([:alnum:]* tide)。

    顺便说一句:如果您愿意,之后您可以使用

    删除 NAs
    x <- str_extract(temp, "(tide [:alnum:]*)|([:alnum:]* tide)")
    x[!is.na(x)]
    

    【讨论】:

    • 谢谢您能否编辑它,使其包含最后一个单词中的两个单词它目前只提供潮汐洗涤剂,它也可以提供潮牌吗?另外,是否可以使用pairwise_count?我试图使用 pairwise_count 来做到这一点,但不幸的是,我发现没有一个组是不可能的
    【解决方案2】:

    如果您使用 quanteda 包,这很简单。您指定要定位的单词并决定目标左侧/右侧的单词数。

    library(quanteda)
    
    kwic(x = temp, pattern = "tide", window = 1) %>% 
    as.data.frame
    
      docname from to       pre keyword      post pattern
    1   text7    1  1              tide      soap    tide
    2   text8    1  1              tide      soap    tide
    3   text9    1  1              tide detergent    tide
    4  text11    1  1              tide              tide
    5  text12    1  1              tide detergent    tide
    6  text13    3  3 detergent    tide     brand    tide
    

    【讨论】:

    • @akrun 不用担心。我认为在 SO 上有类似的案例,你会遇到kwic()。如果您挖掘文本,Quanteda 非常有用。
    【解决方案3】:

    这是另一种选择,仅使用 tidyverse 抓取“潮”之前和/或之后的任何内容。

    stringr::str_match_all(temp, "(\\w+)?\\s?tide\\s?(\\w+)?") %>%
       purrr::reduce(rbind) %>%
       as.data.frame %>%
       dplyr::filter_all(dplyr::any_vars(!is.na(.)))
    
                        V1        V2        V3
    1            tide soap      <NA>      soap
    2            tide soap      <NA>      soap
    3       tide detergent      <NA> detergent
    4                 tide      <NA>      <NA>
    5       tide detergent      <NA> detergent
    6 detergent tide brand detergent     brand
    

    【讨论】:

      【解决方案4】:

      您可以使用tidytext 包将文本拆分为二元组并过滤tide

      library(tidytext)
      library(dplyr)
      library(tibble)
      
      temp %>% 
        enframe(name = "id") %>%
        filter(str_detect(value, "tide")) %>%
        unnest_tokens(bigrams, value, token = "ngrams", n = 2) %>%
        filter(str_detect(bigrams, "tide"))
      
      # A tibble: 6 x 2
           id bigrams       
        <int> <chr>         
      1     5 tide soap     
      2     6 tide soap     
      3     7 tide detergent
      4    10 tide detergent
      5    11 detergent tide
      6    11 tide brand  
      

      【讨论】:

        【解决方案5】:

        这是一个基本的 R 解决方案

        r <- unlist(Filter(length,
                           t(do.call(cbind,
                                     lapply(c("\\w+\\stide","tide\\s\\w+"), 
                                            function(p) regmatches(temp,gregexpr(p,temp)))))))
        

        这样

        > r
        [1] "tide soap"      "tide soap"      "tide detergent" "tide detergent" "detergent tide" "tide brand"  
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-06
          • 1970-01-01
          • 2016-08-29
          • 2015-09-25
          相关资源
          最近更新 更多