如何用quanteda筛选SOTU语料库中布什卡特演讲并解决docnames重复错误
解决docnames重复错误并完成词云生成
错误原因
你遇到的docnames must be unique错误,是因为用paste(president, year, sep = ": ")生成的文档名存在重复——比如部分总统同一年有多份演讲记录,导致同一个文档名对应多个文本,而quanteda要求语料库的每个文档名必须唯一。
修正代码并完成需求
以下是完整可运行的代码,包含错误修复、目标演讲筛选和词云生成:
library("quanteda") library("dplyr") library("sotu") library("quanteda.textplots") # 用于生成词云 # 1. 合并元数据与文本,生成唯一文档名 sotu_combined <- sotu_meta %>% bind_cols(text = sotu_text) %>% # 用make.unique自动处理重复的president+year组合,确保docnames唯一 mutate(docnames = make.unique(paste(president, year, sep = ": "))) # 2. 筛选布什(Bush)和卡特(Carter)的演讲 target_sotu <- sotu_combined %>% filter(grepl("Bush|Carter", president, ignore.case = TRUE)) # 3. 构建语料库并预处理生成DFM target_dfm <- target_sotu %>% corpus(docid_field = "docnames", text_field = "text") %>% dfm(tolower = TRUE) %>% # 统一转小写 dfm_remove(stopwords("english")) %>% # 移除停用词 dfm_trim(min_termfreq = 5) # 移除低频词,让词云更聚焦核心词汇 # 4. 生成词云 textplot_wordcloud(target_dfm, max_words = 150, color = RColorBrewer::brewer.pal(8, "Dark2"))
关键说明
- 唯一文档名:
make.unique()会自动给重复的文档名添加后缀(比如重复的Bush: 1989会变成Bush: 1989.1),彻底解决重复问题。 - 精准筛选:用
grepl("Bush|Carter", president)匹配包含布什或卡特的记录,ignore.case = TRUE避免大小写匹配失误。 - 预处理优化:增加转小写、过滤低频词的步骤,减少无效词汇干扰,让词云更具参考价值。
- 词云定制:可通过调整
max_words控制显示的词汇数量,用颜色调色板提升词云可读性。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

