Удалить стоп-слова из фрейма данных

Мои данные уже находятся во фрейме данных с одним токеном на строку. Я хотел бы отфильтровать строки, содержащие стоп-слова.

Фрейм данных выглядит так:

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

Как я могу решить эту проблему?


person Adam_G    schedule 16.11.2017    source источник
comment
Или by = c(token = "word") . (Извините: комментарий удален, а затем размещен повторно)   -  person Aurèle    schedule 16.11.2017
comment
Вы случайно не знаете о похожей функции для удаления строк со знаками препинания или числами?   -  person Adam_G    schedule 16.11.2017
comment
Может что-то вроде dplyr::filter(df, !grepl("[[:punct:]\\d]", token, perl = TRUE))   -  person Aurèle    schedule 16.11.2017
comment
Это прекрасно работает. Еще раз спасибо   -  person Adam_G    schedule 16.11.2017


Ответы (1)


Когда вы настраиваете anti_join(), вам нужно указать имена столбцов слева и справа. В объекте данных stop_words в tidytext столбец называется 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

Если вы хотите сделать и то, и другое, создайте свой объект с обеими линиями, используя трубы.

person Julia Silge    schedule 17.11.2017