查看原文
其他

震惊!知名数据分析软件竟被某度翻译“亲切称呼”为“斯塔塔”

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:王玉婷,中南财经政法大学金融学院

文字编辑:李婷婷 

技术总编:余术玲

爬虫俱乐部云端课程

  爬虫俱乐部于2020年暑期在线上举办的Stata与Python编程技术训练营和Stata数据分析法律与制度专题训练营在不久前已经圆满结束啦~应广大学员需求,我们的课程现已在腾讯课堂全面上线,且继续提供答疑服务。现在关注公众号并在朋友圈转发推文《来腾讯课堂学Stata和Python啦》或《8月Stata数据分析法律与制度专场来啦!》,即可获得600元课程优惠券,集赞50个再领200元课程优惠券!(截图发至本公众号后台领取)原价2400元的课程,现在只要1600元!     

导读

  各位小伙伴、大伙伴,大家好,今天是我爬虫俱乐部“张三丰”的主场。

  话说在之前在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。注意:

  1. 待翻译文本(q)需为UTF-8编码  

  2. 在生成签名拼接 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",clearkeep if strpos(v,`"id="MD5Result">"')gen md5= ustrregexs(1) if ustrregexm(v,`"(?<=id="MD5Result">)(.*?)(?=</textarea>)"')gen inname = "Zhongnan University of Economics and Law"drop vsave md5_1,replace

  运行结果如下:

  需要注意的是,使用循环对较多的字符串加密时,可能导致对方服务器异常(别问,问就是用了三个),建议数据集分成几个parts,分别在多个MD5加密网站进行加密。 
  再次,将HTTP请求拼接完整,使用DOS命令curl进行抓取(使用copy会被服务器拒绝):(一定要换成你的APPID才能运行程序!!)

use md5_1,clearlocal 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 vreplace trans = ustrunescape(trans)save trans_1,replace

  运行结果如下图所示:

  利用循环我们就可以将所有的高校名称翻译完毕啦,通过合并所有的trans_*.dta文件,我们可获得所有高校的中文名称~限于篇幅,我们不再展示循环程序,如有需要,可回复bdtrans获取完整的代码。
  最后,将翻译后的中文文件institute_zh.dtainstitute_en.dta横向合并:

use "D:/Sus/top/institute_en.dta",clearmerge 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 == 1drop sumgsort -totalsave institute_zh,replace

  运行结果如下图所示:

  话说回来,咱们前面是不是还留了个尾巴没有解决?那就是,百度通用翻译对专业术语翻译不准确的问题。

  幸运地是,百度翻译近期更新后允许开发者创建自己的语料库,能够优化对专业术语的翻译。由于篇幅有限,伙伴们可以先自行探索一下语料库的使用,我们下期再聊~





对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐

喜临涛门,月满人圆

Python3.8新秀海象符成功出道
“合”我在一起—merge
在Sustainability上发文最多的原来是这些高校

Python中的这些运算符你真的会用吗?

字符串函数总动员

用词云图看2020社科基金课题~
建议收藏!Python精选推文干货合集
xpose和sxpose,谁是卧底?
让你的数据一目了然--label命令介绍
Python推文合集基础篇(下)|算法简介
【小白指南】Python中有哪些数据类型?(附推文合集)
轻松获取通行数据——cntraveltime命令介绍
让Stata完美牵手中国地图之cnmapsearch
自然语言分析——利用NLTK进行文本预处理
寻找B站的最爱--8月B站全站榜爬虫
cnaddress命令——实现经纬度转换为中文地址
定位神器——cngcode
Python入门—Spyder的简单使用
关于我们


微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

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

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