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

R如何提取数据列Top20常见uni/bi/tri/ngram词频并绘图

问题根因
  • 直接调用txt_freq(covid$Title)得到全1频次的原因:txt_freq会对传入向量的每个独立元素做频次计数,未分词、未拆分的场景下每条完整标题是一个独立元素,自然所有条目计数为1。
  • 运行分组ngram代码触发object 'topic_modelling' not found报错的原因:参考代码中group_by传入的topic_modelling是示例环境中自定义的分组列,当前covid数据框无同名字段,直接复用代码会触发对象不存在的错误。
可复现实现方案

依赖加载与文本预处理

先加载所需依赖,对标题文本做分词、词性标注,过滤无意义的停用词、标点、功能词,避免统计结果出现无效高频词:

# 首次运行先安装依赖:install.packages(c("udpipe", "dplyr", "ggplot2"))
library(udpipe)
library(dplyr)
library(ggplot2)

# 加载英文分词模型,首次运行会自动下载模型文件
ud_model <- udpipe_load_model(udpipe_download_model(language = "english")$file_model)

# 对所有标题做标注,用自带的Refid作为文档唯一标识
annotation <- udpipe_annotate(ud_model, x = covid$Title, doc_id = covid$Refid)
anno_df <- as.data.frame(annotation) %>%
  # 过滤标点、数词、连词、介词、代词、助词、助动词等无分析价值的词性
  filter(!upos %in% c("PUNCT", "SYM", "NUM", "CCONJ", "SCONJ", "ADP", "DET", "PRON", "PART", "AUX")) %>%
  # 词元统一转小写,避免同词因大小写拆分频次
  mutate(lemma = tolower(lemma))

N元语法频次统计

直接调用udpipe内置的ngram生成函数,按文档id分组统计,不需要额外创建自定义分组列,从根源避免对象不存在的报错:

# 1. 一元词(unigram)Top20
unigram_top20 <- txt_freq(anno_df$lemma) %>%
  arrange(desc(freq)) %>%
  slice_head(n = 20)

# 2. 二元词(bigram)Top20
bigram_res <- keywords_ngram(
  x = anno_df,
  term = "lemma",
  group = "doc_id", # 按单篇文献分组,不会跨标题拼接无意义词组
  n_min = 2,
  n_max = 2
)
bigram_top20 <- bigram_res %>% arrange(desc(freq)) %>% slice_head(n = 20)

# 3. 三元词(trigram)Top20
trigram_res <- keywords_ngram(
  x = anno_df,
  term = "lemma",
  group = "doc_id",
  n_min = 3,
  n_max = 3
)
trigram_top20 <- trigram_res %>% arrange(desc(freq)) %>% slice_head(n = 20)

# 4. 通用N元语法统计:修改n_max参数即可自定义最长ngram长度,以下示例统计1-4元gram的Top20
ngram_all_res <- keywords_ngram(
  x = anno_df,
  term = "lemma",
  group = "doc_id",
  n_min = 1,
  n_max = 4
)
ngram_top20 <- ngram_all_res %>% arrange(desc(freq)) %>% slice_head(n = 20)

高频词可视化

以横向柱状图为例,替换对应数据集即可实现不同N元语法结果的可视化:

# 一元词Top20可视化
ggplot(unigram_top20, aes(x = reorder(key, freq), y = freq)) +
  geom_col(fill = "#2171b5") +
  coord_flip() +
  labs(x = "一元词", y = "出现频次", title = "COVID相关文献标题高频一元词Top20") +
  theme_minimal()

# 二元词Top20可视化
ggplot(bigram_top20, aes(x = reorder(keyword, freq), y = freq)) +
  geom_col(fill = "#238b45") +
  coord_flip() +
  labs(x = "二元词", y = "出现频次", title = "COVID相关文献标题高频二元词Top20") +
  theme_minimal()

提示:三元词、通用N元语法的可视化逻辑完全一致,仅需替换传入的数据集、修改对应坐标轴和标题文本即可。

内容的提问来源于stack exchange,提问作者Catalyst

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:55:05