R语言:如何将Term Document Matrix转换为Corpus?
根因定位
- 你此前生成TDM时调用
inspect()报错,核心问题是传入Corpus(VectorSource())的输入不符合接口要求:VectorSource需要接收的是「每个元素对应一篇完整文档的字符串向量」,而你传入的是rbind合并后的逐词拆分数据框——这类数据框是经过分词、去停用词后的逐行词目,既不是可识别的完整文本,也没有标识每行条目属于哪篇文档,最终生成的Corpus只是无意义的字符串拼接,自然无法生成有效的TDM、也无法正常查看结构。 - 你对tidytext教程的操作逻辑存在认知偏差:教程中讲解的双向转换场景是「整洁逐词数据 <-> 文档词频矩阵(TDM/DTM)」,不存在从聚合完成的TDM反向生成带原始文本的Corpus的可行路径——TDM本身存储的是词与文档的共现计数,已经丢失了原始文本的语序、语境信息,从原理上就无法还原出可用于后续分析的Corpus。你尝试用
quanteda::dfm()转换TDM的操作,本质是不同框架间的矩阵格式转换,和Corpus生成完全无关。
匹配tidytext流程的可复现操作步骤
给已有逐词整洁数据补充文档归属标识
你已经完成了三篇戏剧文本的分词、去停用词预处理,只需要给每个独立词表补上对应的文档名,避免合并后无法区分条目来源:# 为每篇文档的词表添加文档标识 article_words_1 <- article_words_1 %>% mutate(doc = "hamlet") article_words_2 <- article_words_2 %>% mutate(doc = "macbeth") article_words_3 <- article_words_3 %>% mutate(doc = "othello") # 合并为统一格式的整洁逐词表 all_tidy_words <- bind_rows(article_words_1, article_words_2, article_words_3)从整洁词表直接生成符合tm包规范的TDM
不需要绕路先生成Corpus再计算TDM,直接调用tidytext内置的转换函数即可:# 按文档-词对聚合计数,直接转换为标准TM格式的TDM tdm <- all_tidy_words %>% count(doc, word) %>% cast_tdm(term = word, document = doc, value = n) # 此时调用inspect()可正常查看TDM结构,不会触发报错 inspect(tdm)若需要Corpus对象,直接从原始文本生成即可
如果你确实需要tm包格式的Corpus做后续分析,不需要从TDM反向推导,直接用PDF提取的完整原始文本生成即可:# 提取三篇文档的完整原文 raw_docs <- c( hamlet = pdf_text("https://shakespeare.folger.edu/downloads/pdf/hamlet_PDF_FolgerShakespeare.pdf"), macbeth = pdf_text("https://shakespeare.folger.edu/downloads/pdf/macbeth_PDF_FolgerShakespeare.pdf"), othello = pdf_text("https://shakespeare.folger.edu/downloads/pdf/othello_PDF_FolgerShakespeare.pdf") ) # 生成标准tm包Corpus对象 my_corpus <- Corpus(VectorSource(raw_docs))
常见误区提示
- 不要尝试从TDM/DTM转换回Corpus:这类稀疏矩阵仅存储词的出现频次,完全丢失原文的句子结构、语序信息,强行转换得到的Corpus没有实际分析价值。
- 不需要在tm、tidytext、quanteda的不同框架间做无意义的多次格式转换:如果分析基于tidytext的整洁文本框架,直接保留逐词整洁表即可;如果需要用到tm包的统计函数,通过
cast_tdm()/cast_dtm()做一次性转换就足够,不需要额外引入跨包的转换逻辑。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

