Я сталкиваюсь с проблемами, пытаясь найти способ связать информацию о времени с каждым отдельным токеном в quanteda. Я хочу провести анализ временного ряда для списка из 25 различных токенов. Я знаю, что могу просто найти индекс каждого соответствующего токена, но мне было интересно, есть ли способ прикрепить информацию о дате непосредственно к каждому отдельному токену.
Выполнение анализа временных рядов квантовых токенов
Ответы (1)
Насколько я понимаю ваш вопрос, вы хотите сохранить информацию о дате рядом с текстом для анализа временных рядов. Вот несколько советов:
создание корпуса
Сначала создаем корпус. Поскольку вы не предоставили данные для примера, я просто использую случайный текст, созданный с помощью пакета stringi
:
library(quanteda)
set.seed(1)
text <- stringi::stri_rand_lipsum(nparagraphs = 30)
length(text)
#> [1] 30
Я создаю вектор случайных дат, чтобы соответствовать этому:
date <- sample(seq(as.Date("1999/01/01"), as.Date("1999/02/01"), by = "day"), 30)
Теперь мы можем создать объект корпуса. Если вы проверите справку функции корпуса (?corpus
), вы увидите, что существуют разные методы для разных объектов ввода. Для символьных объектов мы можем предоставить дополнительные переменные уровня документа как data.frame
:
corp <- corpus(x = text,
docnames = NULL,
docvars = data.frame(date = date))
corp
#> Corpus consisting of 30 documents and 1 docvar.
создание и подмножество dfm
Большая часть анализа в quanteda выполняется с помощью document-feature matrix
объектов. Здесь мы преобразуем наш корпус в dfm
, а затем сохраняем только те функции, которые хотим проанализировать. В данном случае я просто выбрал самые распространенные слова в случайном тексте:
dfm <- dfm(corp)
dfm_sub <- dfm_keep(dfm,
pattern = c("sed", "in"),
valuetype = "fixed",
case_insensitive = TRUE)
У dfm
есть много преимуществ, но использование его с другими инструментами обычно означает, что нам нужно сначала преобразовать его в какой-то другой объект. Похоже, что это теряет информацию о дате, но мы можем просто повторно подключить ее после преобразования матрицы в data.frame
:
df <- convert(dfm_sub, "data.frame")
df$date <- dfm@docvars$date
head(df)
#> document in sed date
#> 1 text1 4 4 1999-01-31
#> 2 text2 6 8 1999-01-04
#> 3 text3 1 3 1999-01-30
#> 4 text4 1 6 1999-02-01
#> 5 text5 3 5 1999-01-17
#> 6 text6 2 5 1999-01-28
временная последовательность
Вы не очень четко указали, какой анализ вы хотите провести. Когда я говорю о временных рядах, я обычно представляю себе первый шаг в виде линейного графика. Вот что я здесь делаю:
library(tidyr)
library(dplyr)
library(ggplot2)
df %>%
pivot_longer("in":sed, names_to = "word") %>%
ggplot(aes(x = date, y = value, color = word)) +
geom_line()