You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:20:39