Напротив unnest_tokens

Скорее всего, это глупый вопрос, но я погуглил и погуглил и не могу найти решение. Я думаю, это потому, что я не знаю, как правильно сформулировать свой вопрос для поиска.

У меня есть фрейм данных, который я преобразовал в текстовый формат в R, чтобы избавиться от стоп-слов. Теперь я хотел бы "развязать" этот фрейм данных до его первоначального формата.

Что является противоположной / обратной командой unnest_tokens?

Изменить: вот как выглядят данные, с которыми я работаю. Я пытаюсь повторить анализы из книги Tidy Text Силге и Робинсона, но использую итальянские оперные либретто.

character = c("FIGARO", "SUSANNA", "CONTE", "CHERUBINO") 
line = c("Cinque... dieci.... venti... trenta... trentasei...quarantatre", "Ora sì ch'io son contenta; sembra fatto inver per me. Guarda un po', mio caro Figaro, guarda adesso il mio cappello.", "Susanna, mi sembri agitata e confusa.", "Il Conte ieri perché trovommi sol con Barbarina, il congedo mi diede; e se la Contessina, la mia bella comare, grazia non m'intercede, io vado via, io non ti vedo più, Susanna mia!") 
sample_df = data.frame(character, line)
sample_df

character line
FIGARO    Cinque... dieci.... venti... trenta... trentasei...quarantatre
SUSANNA   Ora sì ch'io son contenta; sembra fatto inver per me. Guarda un po', mio caro Figaro, guarda adesso il mio cappello.
CONTE     Susanna, mi sembri agitata e confusa.
CHERUBINO Il Conte ieri perché trovommi sol con Barbarina, il congedo mi diede; e se la Contessina, la mia bella comare, grazia non m'intercede, io vado via, io non ti vedo più, Susanna mia!

Я превращаю его в аккуратный текст, чтобы избавиться от стоп-слов:

tribble <- sample_df %>%
           unnest_tokens(word, line)
# Get rid of stop words
# I had to make my own list of stop words for 18th century Italian opera
itstopwords <- data_frame(text=mystopwords)
names(itstopwords)[names(itstopwords)=="text"] <- "word"
tribble2 <- tribble %>%
            anti_join(itstopwords)

Теперь у меня есть что-то вроде этого:

text    word
FIGARO  cinque
FIGARO  dieci
FIGARO  venti
FIGARO  trenta
...

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

2 ответа

Решение

Не глупый вопрос! Ответ немного зависит от того, что именно вы пытаетесь сделать, но вот мой типичный подход, если бы я хотел вернуть свой текст к его первоначальной форме после некоторой обработки в приведенной форме, используя map функции от мур.

Сначала давайте перейдем от необработанного текста к приведенному в порядок формату.

library(tidyverse)
library(tidytext)


tidy_austen <- janeaustenr::austen_books() %>%
  group_by(book) %>%
  mutate(linenumber = row_number()) %>%
  ungroup() %>%
  unnest_tokens(word, text)

tidy_austen
#> # A tibble: 725,055 x 3
#>                   book linenumber        word
#>                 <fctr>      <int>       <chr>
#>  1 Sense & Sensibility          1       sense
#>  2 Sense & Sensibility          1         and
#>  3 Sense & Sensibility          1 sensibility
#>  4 Sense & Sensibility          3          by
#>  5 Sense & Sensibility          3        jane
#>  6 Sense & Sensibility          3      austen
#>  7 Sense & Sensibility          5        1811
#>  8 Sense & Sensibility         10     chapter
#>  9 Sense & Sensibility         10           1
#> 10 Sense & Sensibility         13         the
#> # ... with 725,045 more rows

Текст сейчас аккуратный! Но мы можем развернуть его обратно к чему-то вроде его первоначальной формы. Я обычно подхожу к этому, используя nest от тидыр, а потом еще map функции от мур.

nested_austen <- tidy_austen %>%
  nest(word) %>%
  mutate(text = map(data, unlist), 
         text = map_chr(text, paste, collapse = " ")) 

nested_austen
#> # A tibble: 62,272 x 4
#>                   book linenumber              data
#>                 <fctr>      <int>            <list>
#>  1 Sense & Sensibility          1  <tibble [3 x 1]>
#>  2 Sense & Sensibility          3  <tibble [3 x 1]>
#>  3 Sense & Sensibility          5  <tibble [1 x 1]>
#>  4 Sense & Sensibility         10  <tibble [2 x 1]>
#>  5 Sense & Sensibility         13 <tibble [12 x 1]>
#>  6 Sense & Sensibility         14 <tibble [13 x 1]>
#>  7 Sense & Sensibility         15 <tibble [11 x 1]>
#>  8 Sense & Sensibility         16 <tibble [12 x 1]>
#>  9 Sense & Sensibility         17 <tibble [11 x 1]>
#> 10 Sense & Sensibility         18 <tibble [15 x 1]>
#> # ... with 62,262 more rows, and 1 more variables: text <chr>

Как выглядит текст в конце, в данном конкретном случае?

nested_austen %>%
  select(text)
#> # A tibble: 62,272 x 1
#>                                                                   text
#>                                                                  <chr>
#>  1                                               sense and sensibility
#>  2                                                      by jane austen
#>  3                                                                1811
#>  4                                                           chapter 1
#>  5 the family of dashwood had long been settled in sussex their estate
#>  6  was large and their residence was at norland park in the centre of
#>  7      their property where for many generations they had lived in so
#>  8 respectable a manner as to engage the general good opinion of their
#>  9 surrounding acquaintance the late owner of this estate was a single
#> 10  man who lived to a very advanced age and who for many years of his
#> # ... with 62,262 more rows
library(tidyverse)
tidy_austen %>% 
     group_by(book,linenumber) %>% 
     summarise(text = str_c(word, collapse = " "))
Другие вопросы по тегам