从数据框中删除停用词

时间:2017-11-16 17:54:12

标签: r tidyr tidyverse tidytext

我的数据已经在数据框中,每行一个令牌。我想过滤掉包含停用词的行。

数据框如下所示:

docID <- c(1,2,2)
token <- c('the', 'cat', 'sat')
count <- c(10,20,30)
df <- data.frame(docID, token, count)

我已尝试过以下内容,但收到错误:

library(tidyverse)
library(tidytext)
library(topicmodels)
library(stringr)
data('stop_words')
clean_df <- df %>%
  anti_join(stop_words, by=df$token)

错误:

Error: `by` can't contain join column `the`, `cat`, `sat` which is missing from LHS

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

设置anti_join()时,需要在左侧和右侧说出列名称。在tidytext中的stop_words数据对象中,该列称为word,在您的数据框中,该列称为token

library(tidyverse)
library(tidytext)

docID <- c(1, 2, 2, 2, 3)
token <- c("the", "cat", "sat", "on-the-mat", "with3hats")
count <- c(10, 20, 30, 10, 20)
df <- data_frame(docID, token, count)


clean_df <- df %>%
  anti_join(stop_words, by= c("token" = "word"))

clean_df
#> # A tibble: 4 x 3
#>   docID token      count
#>   <dbl> <chr>      <dbl>
#> 1  2.00 cat         20.0
#> 2  2.00 sat         30.0
#> 3  2.00 on-the-mat  10.0
#> 4  3.00 with3hats   20.0

请注意,“the”现已消失,因为它位于stop_words数据集中。

在评论中,您询问了有关删除包含标点符号或数字的令牌的问题。我会使用filter()(如果您愿意,也可以使用filter()删除停用词。)

clean_df <- df %>%
  filter(!str_detect(token, "[:punct:]|[:digit:]"))

clean_df
#> # A tibble: 3 x 3
#>   docID token count
#>   <dbl> <chr> <dbl>
#> 1  1.00 the    10.0
#> 2  2.00 cat    20.0
#> 3  2.00 sat    30.0

如果要同时执行这两项操作,请使用管道使用两行来构建对象。