使用tidytext处理CSV文本时行号关联异常的技术咨询
解决tidytext分词时原文本行号错误的问题
我来帮你排查这个问题!你遇到的核心问题是读取CSV后的数据结构和手动输入的向量结构不一致,导致行号生成逻辑出错了。
问题原因分析
当你手动创建text <- c("furloughs", ...)时,text是一个字符向量,所以tibble(text = text)会生成一个每行对应一个文本条目的正常tibble,row_number()能正确对应每个原文本的行号。
但当你用read.csv("TextSample.csv", ...)读取数据后,text是一个data.frame(而不是字符向量)。如果你直接把这个data.frame传入tibble(text = text),会导致text_df的text列变成一个嵌套的列表/数据框,而不是每个元素是单独的文本字符串。这时候:
- 如果在
unnest_tokens前加row_number(),这个行号是基于嵌套后的tibble行(可能和原文本行号不匹配,甚至出现重复分配的情况); - 如果把
row_number()移到unnest_tokens之后,得到的自然是分词后的新行号,而非原文本的行号。
解决方案
你需要先从读取的CSV中提取出要处理的文本列,确保它是字符向量,再构建tibble。假设你的CSV里存储文本的列名叫text(你可以根据实际列名修改),调整代码如下:
正确的代码示例
library(dplyr) library(tidytext) library(SnowballC) # 读取CSV并提取文本列 text_data <- read.csv("TextSample.csv", stringsAsFactors = FALSE) # 确保我们处理的是单独的文本列,而非整个data.frame text_df <- tibble(text = text_data$text) # 这里的text_data$text替换成你实际的列名 # 后续处理和之前一致,行号会正确对应原文本行 tidy_text <- text_df %>% mutate(row_name = row_number()) %>% # 这里的行号是原文本的行号 unnest_tokens(word, text) %>% mutate(word = wordStem(word))
更简洁的写法(直接在原data.frame上处理)
如果你想保留CSV里的其他列,也可以直接在读取后的data.frame上操作,不用重新构建tibble:
tidy_text <- text_data %>% mutate(row_name = row_number()) %>% # 行号对应原CSV的每一行 unnest_tokens(word, text) %>% # 这里的text是你CSV中的文本列名 mutate(word = wordStem(word))
这样处理后,row_name就会正确对应原CSV中每个文本所在的行号啦!
内容的提问来源于stack exchange,提问作者Susan Ray
相关产品推荐
相关产品推荐

