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

如何生成含双词术语的词云?求助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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:27:50