如何在R中按数据框变量分组进行文本词频统计?
按分组实现文本高频词统计(R语言)
问题背景
我在R中有一个数据框,需要对其中的Message列做基础文本分析,此前已能完成单组的词频统计,但现在需要按Pad.Name分组执行分析,输出每个分组的高频词(如前10个)及对应计数。
样本数据
dat <- structure(list(Pad.Name = c("MISSOURI W", "MISSOURI W", "MISSOURI W", "LEE", "LEE", "LEE"), Message = c("pump maint", "PUMP MAINT", "Pump Maintenance", "waiting on wireline", "seating the ball", "Waiting on wireline")), row.names = 11:16, class = "data.frame")
尝试过的方法
我尝试使用quanteda包的corpus_group和corpus函数,设置docid_field = dat$Pad.Name和text_field = dat$Message,但未成功得到分组统计结果。
期望输出
每个Pad.Name对应的高频词及计数,示例如下:
output <- data.frame(Pad.Name = c("MISSOURI W", "MISSOURI W", "LEE", "LEE"), Word = c("pump", "maint", "waiting", "wireline"), Count = c(3,2,2,2))
解决方案
方法1:使用quanteda包
正确流程是先创建包含分组变量的语料库,分组后生成词频矩阵,最终整理为目标格式:
library(quanteda) library(tidyr) library(dplyr) # 创建语料库,保留Pad.Name作为文档变量 corp <- corpus(dat, text_field = "Message", docvars = dat["Pad.Name"]) # 按Pad.Name分组语料库 corp_grouped <- corpus_group(corp, groups = Pad.Name) # 分词并预处理(小写、移除停用词) toks <- tokens(corp_grouped, remove_punct = TRUE) %>% tokens_tolower() %>% tokens_remove(stopwords("english")) # 移除英文停用词(如on/the等) # 生成文档-词频矩阵并转换为数据框 dfm <- dfm(toks) result <- convert(dfm, to = "data.frame") %>% pivot_longer(cols = -document, names_to = "Word", values_to = "Count") %>% rename(Pad.Name = document) %>% filter(Count > 0) %>% group_by(Pad.Name) %>% arrange(desc(Count), .by_group = TRUE) %>% slice_head(n = 10) %>% # 提取前10个高频词 ungroup() print(result)
方法2:使用tidytext包(tidyverse风格)
如果习惯tidyverse工作流,tidytext的实现更简洁直观:
library(tidytext) library(dplyr) library(tidyr) dat %>% # 将文本拆分为单个词 unnest_tokens(input = Message, output = Word) %>% # 移除英文停用词 anti_join(stop_words, by = "Word") %>% # 按分组和词统计频次 group_by(Pad.Name, Word) %>% summarise(Count = n(), .groups = "drop") %>% # 按分组排序并提取前10个高频词 group_by(Pad.Name) %>% arrange(desc(Count), .by_group = TRUE) %>% slice_head(n = 10)
说明
之前的错误在于corpus函数参数使用不当:docid_field是指定数据框中作为文档ID的列名,而非直接传入向量。正确做法是将分组变量作为文档变量(docvars)传入语料库,再用corpus_group完成分组。
内容的提问来源于stack exchange,提问作者new2data
相关产品推荐
相关产品推荐

