震惊!知名数据分析软件竟被某度翻译“亲切称呼”为“斯塔塔”
本文作者:王玉婷,中南财经政法大学金融学院
文字编辑:李婷婷
技术总编:余术玲
爬虫俱乐部云端课程
导读
各位小伙伴、大伙伴,大家好,今天是我爬虫俱乐部“张三丰”的主场。
话说在之前《在Sustainability上发文最多的原来是这些高校》的推文中,咱们写了几个大循环,实不相瞒,后劲很足。上次我们已经提取出了作者所属高校的英文名称,并命名为institute_en.dta
放在D盘下。首先,我们来看看该文件的数据集:
被选中的inname
变量即为各高校的英文名称。可以发现,红框内均为安徽财经大学,但因其写法不同,Stata无法将其归为一组,进一步导致分组汇总结果出错。因此我们需要将该变量翻译为唯一的、正确的中文名称。
注册百度翻译开发者账号
当然,人工翻译是不可能人工翻译的,为了提(jiu)高(shi)效(tou)率(lan),秉承能坐着绝不站着、能躺着绝不坐着的精神,我决定用百度翻译简单迅速地完成高校名称的翻译工作。那就让咱们先来看看百度翻译的界面:
震惊!知名数据分析软件竟被某度翻译“亲切称呼”为“斯塔塔”!
哦,对不起,走错了。我们应该打开百度翻译开放平台(https://api.fanyi.baidu.com/)。但这也反映出引用百度翻译的一个问题:通用模式下无法准确翻译特殊的缩写词和专业术语,这个问题暂且搁置,先来看看如何在Stata中利用百度翻译API。
首先,打开百度翻译开放平台,使用百度账号登录。
登录后,下拉页面至产品服务页,选择通用翻译API。
进入详情页后点击立即使用
,跳转到开发者注册页面,选择个人开发者完成认证。
随后要求填写真实姓名和身份证号,这里我们暂时不填,选择暂不认证
。此时可以使用标准版通用翻译,实名认证后可以使用高级版。
注册成功后,点击开通服务
,进而选择通用翻译API
,选择开通标准版。
随意填写应用名称后,前往控制台,找到开发者信息
里你的APPID和密钥。
Stata与百度翻译
百度通用翻译API的HTTP地址为:http://api.fanyi.baidu.com/api/trans/vip/translate
,有多个参数可供选择:
其中最重要的是前5个字段,q
是请求翻译的内容,为保证准确性,单次翻译文本长度最大限制为6000字节(汉字约为2000个字符),salt
为随机的一串数字,sign
为根据百度翻译API要求生成的签名
,签名的生成方式为:
Step1. 将请求参数中的appid, 翻译内容q(应为UTF-8编码), 随机数(salt), 以及平台分配的密钥(可在管理控制台查看) 按照 appid+q+salt+密钥 的顺序拼接得到字符串1。
Step2. 对字符串1做md5,得到32位小写的sign。注意:
待翻译文本(q)需为UTF-8编码
在生成签名拼接 appid+q+salt+密钥 字符串时,q不需要做URL encode,在生成签名之后,发送HTTP请求之前才需要对要发送的待翻译文本字段q做URL encode
值得注意的是,对q(即翻译内容)做urlencode时要特别小心,若q参数中含有&
、=
、+
等特殊符号时,url无法被正确识别,这也是笔者在上期翻译高校名称时将&
替换为and
的原因。
首先,我们设定q=Zhongnan University of Economics and Law
,salt=123456
。
其次,找到一个在线MD5加密网站生成签名(sign)并将加密结果抓取下来:(一定要换成你的APPID才能运行程序!!)
cap mkdir "D:\Sus\bdtrans"
cd "D:\Sus\bdtrans"
!curl "http://tool.chinaz.com/tools/md5.aspx" ///
-H "Content-type:application/x-www-form-urlencoded;charset=gb2312" ///
--data "q=你的APPIDZhongnan University of Economics and Law123456sbIDdZ9bJxh7o7b7Zkfa&md5type=1" ///
-o "temp.txt"
infix strL v 1-100000 using "temp.txt",clear
keep if strpos(v,`"id="MD5Result">"')
gen md5= ustrregexs(1) if ustrregexm(v,`"(?<=id="MD5Result">)(.*?)(?=</textarea>)"')
gen inname = "Zhongnan University of Economics and Law"
drop v
save md5_1,replace
运行结果如下:
需要注意的是,使用循环对较多的字符串加密时,可能导致对方服务器异常(别问,问就是用了三个),建议数据集分成几个parts,分别在多个MD5加密网站进行加密。
再次,将HTTP请求拼接完整,使用DOS命令curl
进行抓取(使用copy
会被服务器拒绝):(一定要换成你的APPID才能运行程序!!)
use md5_1,clear
local q = geturi(inname[1]) //对inname进行url编码
local sign = md5[1]
!curl "http://api.fanyi.baidu.com/api/trans/vip/translate" ///
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36" ///
--data "q=`q'&from=en&to=zh&appid=你的APPID&salt=123456&sign=`sign'" ///
-o "temp.txt"
infix strL v 1-100000 using "temp.txt",clear
**如果返回结果错误error,就不对q进行url编码**
if strpos(v,"54001") {
!curl "http://api.fanyi.baidu.com/api/trans/vip/translate" ///
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36" ///
--data `"q=Zhongnan University of Economics and Law&from=en&to=zh&appid=你的APPID&salt=123456&sign=`sign'"' ///
-o "temp.txt"
infix strL v 1-100000 using "temp.txt",clear
}
gen trans = ustrregexs(1) if ustrregexm(v,`""dst":"(.*?)""')
gen inname = "Zhongnan University of Economics and Law",before(trans)
drop v
replace trans = ustrunescape(trans)
save trans_1,replace
运行结果如下图所示:
利用循环我们就可以将所有的高校名称翻译完毕啦,通过合并所有的trans_*.dta
文件,我们可获得所有高校的中文名称~限于篇幅,我们不再展示循环程序,如有需要,可回复bdtrans
获取完整的代码。
最后,将翻译后的中文文件institute_zh.dta
与institute_en.dta
横向合并:
use "D:/Sus/top/institute_en.dta",clear
merge 1:1 inname using "D:/Sus/bdtrans/institute_zh.dta"
drop _merge
**清理、分组汇总**
replace trans = ustrregexs(1) if ustrregexm(trans,`"(.*?大学|.*?学院|.*?大學|.*?學院)"')
replace trans = ustrregexs(1) if ustrregexm(trans,`"(+?(.*?)$"')
bysort trans:egen total = sum(sum)
bysort trans:keep if _n == 1
drop sum
gsort -total
save institute_zh,replace
运行结果如下图所示:
话说回来,咱们前面是不是还留了个尾巴没有解决?那就是,百度通用翻译对专业术语翻译不准确的问题。
幸运地是,百度翻译近期更新后允许开发者创建自己的语料库,能够优化对专业术语的翻译。由于篇幅有限,伙伴们可以先自行探索一下语料库的使用,我们下期再聊~
喜临涛门,月满人圆
字符串函数总动员
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。