Выполнение анализа временных рядов квантовых токенов

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


person Community    schedule 18.11.2019    source источник


Ответы (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()

person JBGruber    schedule 19.11.2019