基于R语言的文本时间序列分析:按日期识别趋势术语方法
嘿,你已经搞定了文本预处理的基础步骤,接下来咱们一步步实现按日期识别趋势术语的目标哈~
先回顾下你的初始数据和已执行的代码:
df = data.frame( person = c('jim','john','pam','jim'), date =c('2018-01-01','2018-02-01','2018-03-01','2018-04-01'), text = c('the lonely engineer','tax season is upon us, engineers, do your taxes!','i am so lonely','rage coding is the best') ) # 已执行的预处理代码 xCorp = corpus(df, text_field = 'text') x = tokens(xCorp) %>% tokens_remove( c( stopwords('english'), 'western digital', 'wd', 'nil'), padding = T )
按日期识别趋势术语的完整流程
1. 优化文本预处理(可选但推荐)
你已经移除了停用词,不过可以再补充几步让术语更统一,减少噪声:
x <- x %>% tokens_tolower() %>% # 统一转小写,避免"Engineer"和"engineer"被当成不同词 tokens_remove(pattern = "\\p{P}", valuetype = "regex") %>% # 移除所有标点 tokens_wordstem() # 词干化,比如把"engineers"还原成"engineer"
2. 构建按日期分组的词频矩阵
要按日期分析,得先把文本数据按日期聚合,生成带日期维度的文档-词项矩阵(DTM):
# 确保corpus的元数据包含日期(其实df的date列会自动导入,这里再确认下) docvars(xCorp, "date") <- df$date # 生成DTM并按日期分组聚合词频 dtm <- dfm(x) %>% dfm_group(groups = date) # 把同一天的所有文本合并,计算每个词的总出现次数
3. 识别趋势术语的核心方法
接下来就可以用几种方法找出随日期变化的趋势性术语了:
方法一:计算词频变化率(适合短时间序列)
直接计算每个术语在相邻日期的词频变化幅度,找出增长/下降显著的词:
# 把DTM转换成数据框,方便计算 dtm_df <- convert(dtm, to = "data.frame") rownames(dtm_df) <- dtm_df$date # 把日期设为行名 dtm_df$date <- NULL # 移除单独的date列 # 计算每个词的相邻日期变化率(后一天词频/前一天词频 - 1) freq_change <- t(apply(dtm_df, 2, function(col) { c(NA, diff(col)/col[-length(col)]) # 第一个日期没有前值,设为NA })) # 转成易读的数据框 freq_change_df <- as.data.frame(freq_change) colnames(freq_change_df) <- rownames(dtm_df)[-1] # 列名设为后续日期
之后你可以筛选出变化率超过阈值(比如增长2倍以上)的术语,这些就是潜在的趋势词。比如在你的数据里,lonely在2018-03-01相对于前一个月的变化率会很明显。
方法二:时间序列分解(适合较长时间序列)
如果你的日期序列更长,可以用时间序列分解来分离出术语的趋势成分:
library(stats) # 提取某个术语的时间序列,比如"lonely" lonely_ts <- ts( dtm_df$lonely, start = as.Date("2018-01-01"), frequency = 30 # 假设是月度数据,频率设为30 ) # 分解时间序列,得到趋势、季节、残差成分 lonely_decomp <- decompose(lonely_ts) plot(lonely_decomp) # 可视化分解结果
如果趋势成分呈现明显的上升/下降,说明这个术语是带有趋势性的。
方法三:动态主题模型(适合大量文本数据)
如果你的文本量较大,想从主题层面追踪趋势,可以用动态主题模型(STM)来分析主题随日期的变化,进而提取主题中的核心术语:
library(stm) # 转换为STM需要的数据格式 stm_data <- convert(dtm, to = "stm") # 构建动态主题模型,把日期作为时间协变量 dtm_stm <- stm( documents = stm_data$documents, vocab = stm_data$vocab, K = 2, # 根据你的数据调整主题数量 prevalence =~ s(as.numeric(as.Date(date))), # 用平滑函数捕捉时间趋势 data = docvars(dtm), verbose = FALSE ) # 查看主题随时间的变化趋势 plot(dtm_stm, type = "summary", xlab = "Date") # 提取每个主题的核心术语 labelTopics(dtm_stm)
4. 可视化趋势术语
最后把趋势术语的变化可视化,结果会更直观:
library(ggplot2) library(dplyr) library(tidyr) # 整理词频数据为长格式 trend_words <- dtm_df %>% rownames_to_column("date") %>% mutate(date = as.Date(date)) %>% select(date, lonely, engineer, tax) %>% # 选择你关注的术语 pivot_longer(cols = -date, names_to = "term", values_to = "frequency") # 绘制折线图 ggplot(trend_words, aes(x = date, y = frequency, color = term)) + geom_line(size = 1) + labs(title = "Term Frequency Trend Over Time", x = "Date", y = "Frequency") + theme_minimal()
内容的提问来源于stack exchange,提问作者Ted Mosby
相关产品推荐
相关产品推荐

