如何绘制起点为0的水平直方图 复现R文本挖掘主题建模β对比图
R实现《Text Mining with R》图3.6的绘制方法
我们直接基于tidy生态工具链复现效果,步骤如下:
1. 数据预处理
首先从已拟合的LDA主题模型中提取β值,整理为每个词条对应两个主题β值的宽表,并计算差值:
library(tidyverse) library(tidytext) # 替换lda_model为你自己拟合完成的LDA模型对象 beta_wide <- tidy(lda_model, matrix = "beta") %>% pivot_wider(names_from = topic, values_from = beta, names_prefix = "topic_") %>% # 计算主题2与主题1的β差值 mutate(beta_diff = topic_2 - topic_1)
2. 提取差值最大的子集
按差值正负分组,分别取绝对值最大的N个词条(示例取各10个,可自行调整):
top_diff_terms <- beta_wide %>% group_by(direction = beta_diff > 0) %>% slice_max(abs(beta_diff), n = 10) %>% ungroup() %>% # 按差值对词条排序,保证绘图顺序符合预期 mutate(term = forcats::fct_reorder(term, beta_diff))
3. 绘制双向水平条形图
ggplot(top_diff_terms, aes(x = beta_diff, y = term, fill = direction)) + geom_col(show.legend = FALSE) + # 自定义颜色,负向(更偏向主题1)为红色,正向(更偏向主题2)为蓝色 scale_fill_manual(values = c("#A50021", "#005792")) + labs(x = "β差值(主题2 - 主题1)", y = NULL) + # 添加0点参考虚线 geom_vline(xintercept = 0, linetype = "dashed", color = "gray60") + theme_minimal()
效果说明
绘制出的图表会以0为中轴,左侧条形长度代表词条更偏向主题1的程度,右侧代表更偏向主题2的程度,和原书图3.6的呈现逻辑完全一致。如果需要调整展示的词条数量,只要修改slice_max中的n参数即可。
内容的提问来源于stack exchange,提问作者Anders Jørgensen
相关产品推荐
相关产品推荐

