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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:21:10