Напротив 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 = " "))