使用Google翻译API与translateR批量翻译报错求助:无法打开连接
首先得说,你的代码里有个明显的小问题——循环里根本没用到i变量!每次都在重复翻译整个alltexts向量,这不仅完全没必要,还可能因为短时间内重复发送大量请求触发Google API的速率限制,这大概率是你报错的核心原因之一。
先给你修正循环的写法,这是解决问题的基础:
# 先初始化一个和原向量长度一致的空向量,用来存储翻译结果 translations <- character(length(alltexts)) # 循环遍历每个文本元素 for(i in 1:length(alltexts)){ # 每次只翻译当前的单个文本 translations[i] <- translate(content.vec = alltexts[i], google.api.key = my.api.key, source.lang = 'fr', target.lang = 'en') # 关键:添加1秒延迟,避免请求太频繁被API限制 Sys.sleep(1) } # 查看最终翻译结果 translations
接下来分析你遇到的Error in file(con, "r") : cannot open the connection报错,除了刚才的循环错误,还有这些可能原因和对应解决办法:
单次请求文本过长:Google翻译API有单次请求的字符上限(大概5000字符左右),如果你的某些文本特别长,就会导致请求失败。你可以先检查每个文本的长度:
# 查看每个文本的字符数 nchar(alltexts)要是发现有超长文本,可以把它按句子拆分(比如用
strsplit()按句号拆分),翻译后再合并起来。API速率限制触发:即使修正了循环,短时间内连续发送43个请求也可能触发Google的速率限制。除了上面加的
Sys.sleep(1),你也可以根据API的限制调整延迟时间(比如2秒),或者用批量请求的方式(不过要确保总字符数不超限)。网络或密钥问题:虽然你说小样正常,但还是要确认下你的API密钥权限正常,网络能稳定访问Google API(没有防火墙或代理拦截)。
添加错误捕获,避免循环中断:如果个别文本翻译失败,整个循环会停掉,用
tryCatch可以让循环继续,同时标记失败的文本:translations <- character(length(alltexts)) for(i in 1:length(alltexts)){ tryCatch({ translations[i] <- translate(content.vec = alltexts[i], google.api.key = my.api.key, source.lang = 'fr', target.lang = 'en') Sys.sleep(1) }, error = function(e){ # 打印错误信息,方便排查问题 message(paste("翻译第", i, "条文本时出错:", e$message)) # 用NA标记翻译失败的条目 translations[i] <- NA }) }
最后提醒下,其实translateR本身支持直接传入向量(translate(content.vec = alltexts, ...)),如果你的所有文本总字符数没超限,直接批量请求反而更高效,没必要写循环。但如果总字符数超了,再用循环逐个处理就好。
内容的提问来源于stack exchange,提问作者Sera

