使用tidytext拆分词时触发check_input错误,求原因及解决方法
排查与解决
unnest_tokens报错:Input must be a character vector... 咱们一步步来拆解这个问题,虽然你已经把文本转成了字符型,但报错说明unnest_tokens还是没拿到符合要求的输入,下面是具体的排查和解决思路:
1. 先定位问题源头:检查初始文本的有效性
先单独跑这行代码,看看const.df$text[122]的真实情况:
str(const.df$text[122])
- 如果输出里有
NA,那哪怕转成字符型也没用,得先处理缺失值; - 如果是空字符串,后续
strsplit会得到空内容,也会导致后续步骤出问题; - 还要确认它是单个字符值,而不是长度大于1的向量——有时候数据框的列可能是列表列,直接取索引会拿到列表元素,这时候
as.character可能没法正确转换。
2. 检查拆分后的文本结构
接下来看strsplit和unlist后的结果:
sk_split <- strsplit(as.character(const.df$text[122]), "\n") str(sk_split) sk_unlist <- unlist(sk_split) str(sk_unlist) is.character(sk_unlist)
strsplit返回的是列表,每个元素应该是拆分后的字符向量;unlist后必须得到纯字符向量,is.character(sk_unlist)要返回TRUE;- 如果原文本里的换行符是特殊格式(比如
\r\n),strsplit("\n")可能拆分失败,导致sk_unlist是一个超长的单个字符串,这时候可以换成strsplit("\r?\n")兼容不同换行格式。
3. 确认生成的data.frame没问题
转成data.frame后,检查text列的类型和内容:
sk_df <- data.frame(line = 1:length(sk_unlist), text = sk_unlist, stringAsFactors = FALSE) str(sk_df) table(is.na(sk_df$text)) table(sk_df$text == "")
- 确保
text列是chr(字符)类型,不是因子或其他类型; - 过滤掉
NA值和空字符串,这些会让unnest_tokens无法处理:sk_df <- sk_df %>% filter(!is.na(text), text != "")
4. 分步运行代码,精准定位报错行
把你的代码拆成一步步执行,就能知道哪一步出了问题:
# 加载包 library(dplyr) library(tidytext) # 提取并转换文本 sk_char <- as.character(const.df$text[122]) # 拆分文本 sk_unlist <- unlist(strsplit(sk_char, "\r?\n")) # 构建数据框并清理 sk_df <- data.frame(line = 1:length(sk_unlist), text = sk_unlist, stringAsFactors = FALSE) %>% filter(!is.na(text), text != "") # 分词(这一步如果报错,就是文本内容的问题) sk_tokens <- sk_df %>% unnest_tokens(word, text) # 统计并去除停用词 sk_final <- sk_tokens %>% count(word, sort = TRUE) %>% anti_join(stop_words)
这样分步跑,哪一步报错就聚焦哪一步的问题,比如如果分词步骤报错,就说明sk_df$text里还有不符合要求的内容。
内容的提问来源于stack exchange,提问作者sni5ef
相关产品推荐
相关产品推荐

