R中使用googleLanguageR批量检测文本列语言报错如何解决
R环境googleLanguageR批量检测文本列语种报错解决
问题复现
单条文本调用gl_translate_detect检测语种可正常返回结果,代码如下:
library(googleLanguageR) gl_auth("credential.json") # 检测df第45行text列文本 gl_translate_detect(df[[45, 'text']])
相关参数说明:
df:存储待处理语料的数据框text:数据框中存储待检测文本的列名credential.json:谷歌云平台提供的API身份认证文件
直接传入整列向量做批量检测时:
gl_translate_detect(df[['text']])
触发报错:
Error in nchar(string) : invalid multibyte string, element 13
目标是完成整列混合英、德语文本的批量语种检测,实现两类语言分离。
报错根因
- 文本列第13条存在不符合UTF-8规范的非法多字节字符,R内置
nchar()函数做字符串长度校验时无法解析该字符,直接抛出错误中断执行 - 直接传入整列向量时,函数未做单条容错,任意一条文本异常都会导致全量任务终止,同时谷歌API单次请求存在字符总量限制,长文本向量直接传入容易触发请求上限
可运行解决方案
1. 文本编码清洗
先统一文本编码,移除非法字符,从根源解决多字节字符报错:
# 所有文本统一转UTF-8编码,无法识别的非法字符直接替换为空 df$text <- iconv(df$text, from = "UTF-8", to = "UTF-8", sub = "")
2. 带容错的批量检测
用容错封装逐行调用接口,单条文本检测失败不会中断整体任务,同时避免触发API请求上限:
library(purrr) # 封装安全检测函数,单条报错时返回空结果而非中断 safe_gl_detect <- safely(gl_translate_detect, otherwise = data.frame( language = NA_character_, confidence = NA_real_, text = NA_character_ )) # 逐行执行检测,需要控速的话可以在函数内加Sys.sleep(0.1)做延时 batch_result <- map(df$text, ~safe_gl_detect(.x)$result) # 将检测结果合并后与原数据框绑定 df <- cbind(df, do.call(rbind, batch_result))
3. 按语种拆分文本
检测完成后直接按返回的language字段筛选即可分离两类文本:
# 提取英语语料 english_corpus <- df[df$language == "en", ] # 提取德语语料 german_corpus <- df[df$language == "de", ]
内容的提问来源于stack exchange,提问作者Ranji Raj
相关产品推荐
相关产品推荐

