如何生成含双词术语的词云?求助R语言实现方案
解决多词术语词云生成问题
你的核心需求是将单词语频与多词术语(如"fiscal rules")的频次合并后生成词云。之前的尝试失败主要是因为词干提取(stemming)破坏了多词术语的完整性,且没有正确统计多词组合的出现次数。以下是可行的解决步骤:
步骤1:安装并加载必要工具包
install.packages(c("pdftools", "tidytext", "dplyr", "wordcloud", "RColorBrewer", "readxl")) library(pdftools) library(tidytext) library(dplyr) library(wordcloud) library(RColorBrewer) library(readxl)
步骤2:批量读取PDF文本
替代原Corpus方法,用更灵活的方式提取PDF内容:
# 读取元数据中的PDF路径 Excel_Metadata <- read_excel("Y:/Excel.xlsx", range = "A1:D203") pdf_paths <- Excel_Metadata$files # 循环提取每个PDF的完整文本 pdf_texts <- lapply(pdf_paths, function(path) { text <- pdf_text(path) paste(text, collapse = " ") %>% gsub("\\n|\\r", " ", .) # 合并页面并清理换行符 }) # 转换为数据框便于后续处理 text_df <- data.frame(document_id = seq_along(pdf_texts), text = unlist(pdf_texts))
步骤3:统计单词语频与多词术语频次
3.1 统计单词语频(移除词干提取)
single_word_freq <- text_df %>% unnest_tokens(word, text) %>% filter(!word %in% stopwords("english"), # 去停用词 !grepl("[0-9]", word)) %>% # 去数字 count(word, sort = TRUE)
3.2 统计双词/多词术语频次
以双词(bigram)为例,如需三词可将n=2改为n=3:
bigram_freq <- text_df %>% unnest_tokens(bigram, text, token = "ngrams", n = 2) %>% separate(bigram, c("word1", "word2"), sep = " ") %>% # 过滤包含停用词或数字的无效组合 filter(!word1 %in% stopwords("english"), !word2 %in% stopwords("english"), !grepl("[0-9]", word1), !grepl("[0-9]", word2)) %>% unite(bigram, word1, word2, sep = " ") %>% count(bigram, sort = TRUE) %>% rename(word = bigram, n = n) # 统一列名便于合并
3.3 合并频次数据
combined_freq <- bind_rows(single_word_freq, bigram_freq) %>% arrange(desc(n)) %>% filter(n >= 10) # 过滤低频次噪声,可根据需求调整阈值
可选:自定义术语强制匹配
如果有明确需要优先统计的特定术语(如"stability and growth pact"),可以直接匹配统计:
custom_terms <- c("stability and growth pact", "fiscal rules") custom_freq <- lapply(custom_terms, function(term) { count <- sum(grepl(term, text_df$text, ignore.case = TRUE)) data.frame(word = term, n = count) }) %>% bind_rows() # 合并到总频次并去重求和 combined_freq <- bind_rows(combined_freq, custom_freq) %>% group_by(word) %>% summarise(n = sum(n)) %>% arrange(desc(n))
步骤4:生成包含多词术语的词云
set.seed(6984) pdf("folder/cloud_with_ngrams.pdf") wordcloud(words = combined_freq$word, freq = combined_freq$n, min.freq = 10, max.words = 150, random.order = FALSE, rot.per = 0.35, colors = brewer.pal(8, "Paired"), family = "serif") dev.off()
关键注意事项
- 必须移除词干提取:原代码中的
stemming = TRUE会拆解多词术语(如"rules"转为"rule"),导致无法识别完整术语。 - 按需调整n-gram参数:根据需求选择双词、三词甚至更长的术语组合。
- 去重逻辑可选:如果不想同时显示多词术语和其组成单字,可以在合并后手动移除重复的单字条目。
内容的提问来源于stack exchange,提问作者marcosmm
相关产品推荐
相关产品推荐

