对 quanteda 代币进行时间序列分析
Performing time series analysis of quanteda tokens
我正在 运行 解决问题,找出一种方法将时间信息与 quanteda 中的每个单独标记配对。我想对包含 25 个不同标记的列表进行 运行 时间序列分析。我知道我只能找到每个相应令牌的索引,但我想知道是否有任何方法可以将日期信息直接附加到每个单独的令牌。
据我了解您的问题,您希望将日期信息保留在文本旁边以进行时间序列分析。这里有一些提示:
创建语料库
首先我们创建一个语料库。由于您没有提供示例数据,我将只使用一些用 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()
我正在 运行 解决问题,找出一种方法将时间信息与 quanteda 中的每个单独标记配对。我想对包含 25 个不同标记的列表进行 运行 时间序列分析。我知道我只能找到每个相应令牌的索引,但我想知道是否有任何方法可以将日期信息直接附加到每个单独的令牌。
据我了解您的问题,您希望将日期信息保留在文本旁边以进行时间序列分析。这里有一些提示:
创建语料库
首先我们创建一个语料库。由于您没有提供示例数据,我将只使用一些用 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()