Вычислить `tf-idf` для фрейма данных документов - PullRequest
0 голосов
/ 25 марта 2020

Следующий код

library(dplyr)
library(janeaustenr)
library(tidytext)
book_words <- austen_books() %>%
  unnest_tokens(word, text) %>%
  count(book, word, sort = TRUE)

book_words <- book_words %>%
  bind_tf_idf(word, book, n)
book_words

взят из Термин «Частота и обратная частота документа» (tf-idf) Используя принципы данных Tidy , оценивает tf-idf в работах Джейн Остин. Во всяком случае, этот код, похоже, указывает c на книги Джейн Остин. Я хотел бы получить, вместо этого, tf-idf для следующего фрейма данных:

sentences<-c("The color blue neutralizes orange yellow reflections.", 
             "Zod stabbed me with blue Kryptonite.", 
             "Because blue is your favourite colour.",
             "Red is wrong, blue is right.",
             "You and I are going to yellowstone.",
             "Van Gogh looked for some yellow at sunset.",
             "You ruined my beautiful green dress.",
             "You do not agree.",
             "There's nothing wrong with green.")

 df=data.frame(text = sentences, 
               class = c("A","B","A","C","A","B","A","C","D"),
               weight = c(1,1,3,4,1,2,3,4,5))

1 Ответ

3 голосов
/ 25 марта 2020

Необходимо изменить две вещи:

  1. , поскольку вы не установили stringsAsFactors = FALSE при построении data.frame, вам необходимо сначала преобразовать text в символ.

  2. У вас нет столбца с именем book, что означает, что вы должны выбрать другой столбец как document. Поскольку вы поместили столбец с именем class в ваш пример, я предполагаю, что вы хотите вычислить tf-idf для этого столбца.

Вот код:

library(dplyr)
library(janeaustenr)
library(tidytext)
book_words <- df %>%
  mutate(text = as.character(text)) %>% 
  unnest_tokens(output = word, input = text) %>%
  count(class, word, sort = TRUE)

book_words <- book_words %>%
  bind_tf_idf(term = word, document = class, n)
book_words
#> # A tibble: 52 x 6
#>    class word          n     tf   idf tf_idf
#>    <fct> <chr>     <int>  <dbl> <dbl>  <dbl>
#>  1 A     blue          2 0.0769 0.288 0.0221
#>  2 A     you           2 0.0769 0.693 0.0533
#>  3 C     is            2 0.2    0.693 0.139 
#>  4 A     and           1 0.0385 1.39  0.0533
#>  5 A     are           1 0.0385 1.39  0.0533
#>  6 A     beautiful     1 0.0385 1.39  0.0533
#>  7 A     because       1 0.0385 1.39  0.0533
#>  8 A     color         1 0.0385 1.39  0.0533
#>  9 A     colour        1 0.0385 1.39  0.0533
#> 10 A     dress         1 0.0385 1.39  0.0533
#> # ... with 42 more rows

В документации есть полезные замечания для этой проверки ?count и ?bind_tf_idf.

...