R语言中unnest_tokens的逆操作:如何还原原始数据框
还原tidy text格式为原始数据框(unnest_tokens逆操作)
嘿,我刚好处理过类似的需求!要把经过unnest_tokens()拆分并去除停用词后的tidy文本数据还原回原始格式,核心是保留每个原始文本的唯一标识(比如行ID、文档ID),再借助purrr的映射函数或者dplyr的分组聚合来实现。下面给你具体的操作步骤:
1. 先明确前提:保留分组标识
在执行unnest_tokens()的时候,一定要保留能对应回原始文本的唯一键(比如doc_id),这是还原的关键。举个例子,先看原始数据和tidy转换的过程:
library(tidytext) library(dplyr) library(purrr) library(stringr) # 原始数据框(带唯一标识doc_id) original_df <- tibble( doc_id = c(1, 2, 3), text = c("This is a sample text with stopwords.", "Another example sentence to test.", "All words here are stopwords so they'll get removed.") ) # 转换为tidy text并去除停用词 tidy_df <- original_df %>% unnest_tokens(word, text) %>% anti_join(stop_words)
2. 用分组+拼接实现还原
我们可以通过group_by()按唯一标识分组,再用str_c()把每个组的token拼接回完整文本。如果需要更灵活的处理,也可以用purrr::map_chr()来实现:
方法一:用dplyr分组聚合(最直观)
restored_df <- tidy_df %>% # 按原始文本的唯一标识分组 group_by(doc_id) %>% # 把每个组的word用空格拼接成完整文本 summarize(restored_text = str_c(word, collapse = " "), .groups = "drop") %>% # 左连接原始数据,确保所有原始行都被保留(哪怕token全被删掉) left_join(original_df, by = "doc_id") %>% # 调整列顺序,和原始格式对齐 select(doc_id, original_text = text, restored_text)
方法二:用purrr::map_chr()实现映射
如果你习惯用purrr的函数风格,也可以这样写:
# 先提取每个doc_id对应的token列表 token_list <- tidy_df %>% group_split(doc_id) %>% set_names(unique(tidy_df$doc_id)) %>% map(pull, word) # 拼接成文本并和原始数据合并 restored_df <- original_df %>% mutate(restored_text = map_chr(doc_id, ~str_c(token_list[[as.character(.)]], collapse = " "))) %>% # 处理那些token全被删除的情况(替换为NA) mutate(restored_text = ifelse(restored_text == "", NA, restored_text))
3. 额外说明
- 如果原始文本包含标点、大小写等格式,
unnest_tokens()默认会去除这些信息,还原后无法完全恢复原始格式,若需要可以手动补充(比如在拼接后的文本末尾加句号)。 - 一定要确保分组标识的唯一性,否则还原后会出现文本错乱的问题。
内容的提问来源于stack exchange,提问作者Puneet Sachdeva
相关产品推荐
相关产品推荐

