查看原文
其他

教你如何优雅的用R语言调用有道翻译

2017-03-04 小魔方 数据小魔方

最近刚发现了个有趣的包,一个R语言发烧友开发了R语言与有道在线翻译的接口,可能这位大神也是一个受够了每天打开网页狂敲键盘查词的罪,索性自己动手,从此丰衣足食。


感觉这种性格,跟我超级像哈哈,可是我目前还没有那种说干就干底气,达不到开发包的水平,以后要是学会了,一定要多贡献一些偷懒神器!


以下是代码思路,这里我提供两种方法,一种是集合包内翻译函数和for循环,算是笨方法。另一种是对该包封装的函数源码进行了稍许调整,使得输出更加和谐一些。


library("RYoudaoTranslate")


鉴于在线调用有道翻译服务需要自己现在有道词典的开放平台免费注册开发者服务并获取有限量调用服务的API账号密码,每日限调用6000次。注册地址如下:


http://fanyi.youdao.com/openapi?path=data-mode


以下是该包官方文档提供的免费账号密码,试了一下还能用,感觉大神还是很够意思的,提供了好用的产品不说,还自己分享了免费账号。


apikey = "498375134"

keyfrom = "JustForTestYouDao"


随机生成了五个单词:


word<-c("weather","father","apple","like","hate")


方法一:

url<-paste("http://fanyi.youdao.com/openapi.do?keyfrom=JustForTestYouDao&key=498375134&type=data&doctype=json&version=1.1&q=",word,sep="")

url<-youdaoUrl(word=word,api="498375134",keyfrom="JustForTestYouDao")

以上两句等价。

Res<-c()

for( i in word){

     Res[i] = youdaoLookUp(i,api="282671603",keyfrom="fy1991--421fy")

    }

以上使用for循环,结合包内的查询函数,可获取查询结果向量。



其实我是觉得这样的不加筛选的输出不够友好,看了下源码里面的封装函数,稍微做了些改动,以下是方法二。


方法二:


youdaoUrl = function(word){

paste("http://fanyi.youdao.com/openapi.do?keyfrom=fy1991--421fy&key=282671603&type=data&doctype=json&version=1.1&q=",word,sep="")

}

youdaoTranslate<-function(word){

  url = getURL(youdaoUrl(word))

  obj = fromJSON(url) 

  result=paste0(obj$web[[1]]$value,collapse=";")

  return(result)

}


以上构造了两个函数,一个提供单词的URL地址匹配,一个提供查询结果。


sapply(word,youdaoTranslate,simplify=TRUE)


这里结果摒弃for循环,使用内置的apply组函数sapply,懂行的都知道为什么!



以上经过我的进一步筛选,结果更加简洁,实用。


如果是遇到大批量的翻译需求,这种方式还是很能提高效率的,不过我还没有测试中文单词的翻译效果,有兴趣的大家可以自己玩。


你以为到这里就结束了吗? NO!


后面还有好戏呢!


其实微软的excel更新至13版以后,也提供了调用有道在线翻译的服务。而且使用比较简单。以下是函数语句,不要被冗长的各种参数吓到了,你需要改的只是其中的单元格引用。(本例中位于中间位置的A2,记得用的时候是相对引用,否则填充后只能翻译首个单元格内容)。


本小编已经测试过了翻译结果,中英文互译效果相当棒,但是限制是:

单词翻译效果好,句子不行,水平还不如小编我,即便是那种带空格的短句、地名、人名也够呛。


=FILTERXML(WEBSERVICE("http://fanyi.youdao.com/translate?&i="&A2&"&doctype=xml&version"),"//translation") 



带函数的测试文件待我推送后,会传到QQ群共享中,下载后直接复制该单元格引用就OK了。


欢迎关注魔方学院QQ群


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存