论文小助手-pdf自动翻译1.0

下学期就要开始写毕业论文了,参考文献里没有几篇外文逼格怎么上的去,但是外文看起来很头疼,总是看着后面的忘着前面的。以前我都是用一些可以划词翻译的软件来看,但还是感觉不够方便。恰好正在学python,于是一直想能不能用python实现自动翻译。直接从网上搜果然已经有人这样做了,但是因为时间有点久远基本上都不能直接拿来用,只能自己试着写一个了。

外文文献一般都是pdf的,pdf格式是一个很烦人的格式,怎么处理都不方便。想要用python实现外文文献自动翻译首先要把文字提取出来。

想从pdf中提取文字又分成两种情况,一种是扫描版pdf文档,这种文档中的文字只能被识别成图片,想要提取出来要借助一些什么ocr光学扫描库,比较麻烦,并且总会有错的,这种一般是年代比较久远的文献,遇到这种情况只能放弃了;另一种是其他文字处理软件转制的pdf文档,这种直接复制粘贴就能把文字提取出来,处理起来比较方便,唯一的问题是直接提取的话会有很多换行符,如果直接复制粘贴出来扔到翻译软件里会受换行符干扰导致断句错误。所以,把文字提取出来后要把换行符替换掉。

python有很多处理pdf的库,之前用过一个专门从pdf中提取表格的叫tabula,此外还有pdfplumber和pdfminer3k。其中pdfminer3k只能提取文字并且用起来比较麻烦,pdfplumber即可以提取文字也可以提取表格,用起来也很简单,但是提取出来的不论是文字还是表格看起来都乱七八糟的,二次处理很麻烦。pdfminer3k虽然用着麻烦但是可以分析pdf的布局,将文字分块提取出来,还能提取图片,于是选择用pdfminer3k提取文字。

虽然看着很长,但基本上都是照葫芦画瓢,用起来还是很简单的。

文字提取出来后又发现一个问题,pdfminer会把表格分解成一小块一小块的,这会导致提取出来的文本里面有大量乱七八糟的数字,由于它没法识别表格,所以只能想办法把这些碎片过滤掉,只保留大部分正文,只要大部分正文翻译好了还要啥自行车。所以设置了一个delete参数,经测试delete=140,也就是大约两行文本时,能删除绝大部分乱七八糟的东西,并保留绝大部分正文,不同的pdf文档排版不同,根据具体情况可以自行调整。

提取出来的效果还是很好的,还能根据段落进行分块,唯一美中不足的是遇到横跨两页的段落时同一句话会被拆成两段,如下所示:

反正问题不大,要啥自行车。实在有强迫症的话我把原文保存到了一个txt里,可以手动调整,然后用代码里翻译部分自己翻译。自动识别的话由于表格的存在也不能很好的识别,因为下一页接着的不一定是下半句,有可能是一个表。

字都提取出来了,接下来就是翻译了。翻译部分参考的这篇文章的代码:https://zhuanlan.zhihu.com/p/34659267。感觉调用api比较方便一点,所以就照着这篇文章的方法注册了api直接把他的代码复制过来就能用。

至于为什么这样写,我也没仔细研究,好像百度api接口的手册上要求这样写的,没什么需要改动的空间。

最后再加一个保存到txt的步骤就行了。

为了美观我还查了一下怎么添加进度条,在python上两三行代码就能实现,最终运行状态如下:

翻译完直接放到word里就能看了。

看起来还不错,有中英对照着,就算翻译的不好也能立刻对比原文。

但是最后我又发现一个问题,百度提供的接口一个月只能翻译两百万个字符,一开始我以外两百万挺多的,后来看了一下昨天测试个十几次竟然已经用掉了100多万个字符,原来字符是按字母算的我一开始当成是按单词算了。这样算下来一个月顶多翻译个二十来篇,如果超出免费范围则要交钱,49块才100万个字符。于是只能想想还有没有其他翻译方法。

api都要收费,只能试试小爬虫了,但是这些翻译网站都有很强的反爬虫机制。先试了一下谷歌翻译:

什么都没输的话地址栏是https://translate.google.cn/。

随便输了点东西后地址栏变成了很长的一堆,text后边不是直接跟着输入的内容而是加了一大堆%20

“https://translate.google.cn/#view=home&op=translate&sl=en&tl=zhCN&text=I%20will%20beat%20your%20ass%20into%20ground”

从网上查如何爬谷歌翻译给出的方法都很复杂还要装别的库,遂放弃。

听说有道翻译的反爬比较简单,于是试试有道:

有道和谷歌不同,有道输入后网址没有变化,于是从审查元素的Network里找到底是怎么翻译的:

终于在这里面找到了,于是用requests构建相应的post请求,但无论怎么弄返回的都是:

{'errorCode': 50}

直接百度搜索这个提示

看来是有道翻译专属的错误提示,点开后发现原来有道翻译为了反爬虫给出的request url是错的,网站上给的是:

只要把 translate后面的_o去掉就行了,试了一下,果真如此。

并且返回的内容还自动拆成单个句子,比百度的更好看一些。

把有道翻译的方法也加进去就大功告成了。

全部代码如下需要的同学可以自取一下。

总结:两年前我就申请了公众号,但是长时间没发东西被冻结了两次,这次又重拾公众号打算记录一下自己学习历程和心得,没事会发一些自己学习python的小成果,编程还是挺有意思的,毕竟每天都在面向对象。

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20190202G0LEJ700?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券