经常看到公众号推什么“学姐一年发五篇SCI,原来是靠它”之类的文章,点进去全是Python的安利,然而跟着广告进去也不一定能学会。正好时值学校要求写文献阅读报告,然而至少一万字的报告实在是让人望而却步,于是想到了自己使用Python去实现自动读取英文文献,并翻译生成综述(当然,只适用于凑字数的情况,如果需要写综述,还是建议自己总结归纳)。这里分享给大家,希望大家都能学废(不是)

如果不想了解技术细节,只想直接拿来用,可以直接跳过代码编写部分,直达最后代码使用部分。

本代码免费开源,如果你觉得好用,希望能够给我一个赞(能打赏更好),也欢迎去github发表意见建议。

代码实现效果如下:

实现效果

开发环境

Windows 10

Sublime Text 3

Python 3.7

Pdfminer

有道翻译API

事前准备

接口申请

本代码使用了有道翻译的API,因此,如需使用,需要去有道翻译接口官方申请APP Key和Secret key,直接按照其官方教程申请即可,后续需要在代码中配置。接口申请完全免费,初始会送100元的面值,用完需要续费,不过一般情况100元可以用很久了。

安装pdfminer

因为我使用的是python3,因此输入以下命令安装:

pip install pdfminer4k

需求分析

这里分析了本代码实现的关键点:

文献是已经下载下来的pdf文件

文献中,需要提取的部分主要为:

标题

作者

摘要

结论

因此,本代码的思路是读取本地文件夹内的pdf文件,然后读取并识别出其关键元素,调用有道翻译的API进行翻译,并进行有机组合,写入TXT文件中。

代码编写

读取pdf文件

依次读取文件夹内的文件,如果后缀为pdf,则写入文件元祖:

def getFileName(filepath):

file_list = []

for root,dirs,files in os.walk(filepath):

for filespath in files:

if 'pdf' in filespath.split('.')[1]:

file_list.append(os.path.join(root,filespath))

return file_list

读取文件内容并提取标题、作者、摘要和结论

def parse(DataIO, save_path, appKey, appSecret):

#用文件对象创建一个PDF文档分析器

parser = PDFParser(DataIO)

#创建一个PDF文档

doc = PDFDocument()

#分析器和文档相互连接

parser.set_document(doc)

doc.set_parser(parser)

#提供初始化密码,没有默认为空

doc.initialize()

#检查文档是否可以转成TXT,如果不可以就忽略

if not doc.is_extractable:

raise PDFTextExtractionNotAllowed

else:

#创建PDF资源管理器,来管理共享资源

rsrcmagr = PDFResourceManager()

#创建一个PDF设备对象

laparams = LAParams()

#将资源管理器和设备对象聚合

device = PDFPageAggregator(rsrcmagr, laparams=laparams)

#创建一个PDF解释器对象

interpreter = PDFPageInterpreter(rsrcmagr, device)

last_para = '' # 记录上一段文本

count = 0 # 对文本块进行计数,方便后续查找标题和作者

author = '' # 记录作者

ab_count = 0 # 记录已识别的摘要的数量,避免提取文中的abstract

fanyi = YouDaoFanyi(appKey, appSecret)

#循环遍历列表,每次处理一个page内容

#doc.get_pages()获取page列表

for page in doc.get_pages():

interpreter.process_page(page)

#接收该页面的LTPage对象

layout = device.get_result()

#这里的layout是一个LTPage对象 里面存放着page解析出来的各种对象

#一般包括LTTextBox,LTFigure,LTImage,LTTextBoxHorizontal等等一些对像

#想要获取文本就得获取对象的text属性

for x in layout:

try:

if(isinstance(x, LTTextBoxHorizontal)):

with open('%s' % (save_path), 'a', encoding='utf-8') as f:

result = x.get_text() # 每块的内容

# print(result)

# 提取标题

if count==0:

# 如果是researchgate的文章,直接翻页

if re.findall('^see discussions', result.lower())!=[]:

break

# 如果第一行是各种页眉等干扰信息,直接略过

if re.findall('(^[0-9])|(^(research )?article)|(unclassified)|(www.)|(accepted (from|manuscript))|(proceedings of)|(vol.)|(volume \d)|(https?://)|(^ieee)|(sciencedirect)|(\d{4}\)$)|(\d{1,4} – \d{1,4}$)|(cid:)',re.split('\s+$',result.lower())[0])!=[] or '':

count -= 1

else:

# 将结果写入TXT

f.write('\n'+result.replace('\n', '')+'\n')

# 提取作者

elif count==1:

# 只取第一作者

author = result.split('\n')[0].split(',')[0].split(' and ')[0]

author = generate_author(author)

print('author '+ author)

# 去掉pdf文件读取的各种换行符

result = result.replace('\n', '')

try:

# 转为小写,去掉空格,方便正则识别

last_para = last_para.lower().replace(' ', '')

# print(result)

# 匹配Abstract和摘要内容分开的情况

if re.findall('abstract$', last_para)!=[]:

# 去掉关键词

oringin_result = re.split('(K|k)(eyword|EYWORD)[sS]?',result)[0]

# 翻译并转换人称

trans_result = fanyi.translate(oringin_result).replace('我们', '他们')

# print(result)

# 组织语言写入TXT

write_cont = author + '等人提出:' + trans_result + '\n'

ab_count += 1

f.write(write_cont)

# 匹配Abstract和摘要内容位于同一行的情况

elif re.findall('^abstract', result.lower().replace(' ', ''))!=[] and re.findall('abstract$', result.lower().replace(' ', ''))==[]:

# 确保摘要只匹配一次,不匹配文中的Abstract字眼

if ab_count==0:

# 去掉Abstract字眼及其后续的符号

oringin_result = re.sub('(a|A)(bstract|BSTRACT)[- —.]?','', result)

# 去掉关键词

oringin_result = re.split('(K|k)(eyword|EYWORD)[sS]?',oringin_result)[0]

# 翻译并转换人称

trans_result = fanyi.translate(oringin_result).replace('我们', '他们')

# print(result)

# 组织语言写入TXT

write_cont = author + '等人提出:' + trans_result + '\n'

ab_count += 1

f.write(write_cont)

# 匹配结论

elif re.findall('(^(i|v|x|\d)*\.?conclusions?)|(conclusions?$)', last_para)!=[]:

# 避免因图表在标题下方导致的识别错误

if re.findall('^fig', result.lower()):

continue

# 翻译

trans_result = fanyi.translate(result)

# print(result)

# 转换人称

write_cont = trans_result.replace('我们', '他们') + '\n'

# 写入TXT

f.write(write_cont)

except Exception as e:

print(e)

last_para = result

count += 1

except Exception as e:

print('out'+str(e))

else:

continue

with open('%s' % (save_path), 'a', encoding='utf-8') as f:

f.write('\n')

按照引用的格式生成作者信息

def generate_author(author):

# 过滤掉作者名后面的各种符号,并生成引用的格式

# print(author)

author = re.sub('by |[\s\d\*∗\/@†\(\&\)]+$', '', author)

author_list = re.split('\s+',author)

author_str = author_list[len(author_list)-1]

for i in range(0,len(author_list)-1):

author_str = author_str + ' ' + author_list[i][0]

return author_str

翻译接口

其实直接抄有道官网文档就可以了,这里在其基础上做了更改:

class YouDaoFanyi:

def __init__(self, appKey, appSecret):

self.YOUDAO_URL = 'https://openapi.youdao.com/api/'

self.APP_KEY = appKey # 应用id

self.APP_SECRET = appSecret # 应用密钥

self.langFrom = 'en' # 翻译前文字语言,auto为自动检查

self.langTo = 'zh-CHS' # 翻译后文字语言,auto为自动检查

self.vocabId = "您的用户词表ID"

def encrypt(self,signStr):

hash_algorithm = hashlib.sha256()

hash_algorithm.update(signStr.encode('utf-8'))

return hash_algorithm.hexdigest()

def truncate(self,q):

if q is None:

return None

size = len(q)

return q if size <= 20 else q[0:10] + str(size) + q[size - 10:size]

def do_request(self,data):

headers = {'Content-Type': 'application/x-www-form-urlencoded'}

return requests.post(self.YOUDAO_URL, data=data, headers=headers)

def translate(self,q):

data = {}

data['from'] = self.langFrom

data['to'] = self.langTo

data['signType'] = 'v3'

curtime = str(int(time.time()))

data['curtime'] = curtime

salt = str(uuid.uuid1())

signStr = self.APP_KEY + self.truncate(q) + salt + curtime + self.APP_SECRET

sign = self.encrypt(signStr)

data['appKey'] = self.APP_KEY

data['q'] = q

data['salt'] = salt

data['sign'] = sign

data['vocabId'] = self.vocabId

response = self.do_request(data)

contentType = response.headers['Content-Type']

result = json.loads(response.content.decode('utf-8'))['translation'][0]

print(result)

return result

最后,书写主函数进行调用:

if __name__ == '__main__':

#解析本地PDF文本,保存到本地TXT

folder = '文件夹路径' # 需要读取pdf的文件夹的路径,注意为绝对路径,如:E:/论文/

write_txt_file = 'result.txt' # 保存结果的文件

appKey = '应用ID' # 应用id

appSecret = '应用秘钥' # 应用密钥

success_count = 0 # 统计成功的次数

fail_count = 0 #统计失败的次数

# 单次调用,供开发测试

# pdf_filename = folder+'文件名'

# with open(pdf_filename,'rb') as pdf_html:

# try:

# parse(pdf_html, folder + write_txt_file, appKey, appSecret)

# success_count+=1

# except Exception as e:

# print(pdf_filename)

# fail_count+=1

pdf_list = getFileName(folder)

# 依次读取元祖,获取pdf文件位置

for file_item in pdf_list:

with open(file_item,'rb') as pdf_html:

try:

print(file_item)

parse(pdf_html, folder + write_txt_file, appKey, appSecret)

success_count+=1

except Exception as e:

# 文件读取或翻译失败则将错误信息写入TXT

print('文档读取失败:' + str(e) +',路径为:' + file_item)

with open('%s' % (folder + write_txt_file), 'a', encoding='utf-8') as f:

f.write('\n'+'文档读取失败:' + str(e) +',路径为:' + file_item + '\n')

fail_count+=1

print('共读取pdf文件' + str(success_count+fail_count) + '个,其中成功读取并翻译' + str(success_count) + '个,失败' + str(fail_count) + '个')

至此,代码编写完毕

使用

代码可在Github上下载

配置代码

更改代码主函数的配置变量(其中的应用ID和应用秘钥需要事先申请,见上文事前准备一节):

if __name__ == '__main__':

#解析本地PDF文本,保存到本地TXT

folder = '文件夹路径' # 需要读取pdf的文件夹的路径,注意为绝对路径,如:E:/论文/

write_txt_file = 'result.txt' # 保存结果的文件

appKey = '应用ID' # 应用id

appSecret = '应用秘钥' # 应用密钥

运行代码

在代码所在的根目录下的命令行中输入以下命令即可:

python pdfprocessor.py

运行结果

仅花了38秒的时间,就提取并翻译完成了14个pdf文件,翻译生成的字数合计6812个字:

运行结果

试了一下45个文件,花了大概两分钟,生成了一万多字

最后看一下翻译结果对比:

翻译结果中英对比

python英文文献翻译_科研神器(1)——python实现自动读取英文文献翻译并生成综述...相关推荐

  1. 英文翻译_科研论文英文翻译时需注意的事项及一些对策

    科研论文的英文翻译是以把握全文精髓为目的,准确简单阐明观点,用精炼的语言介绍文章的论点.论据.过程.实验和结果,尽可能让读者通过阅读标题和摘要大致了解整篇文章所阐述的问题和表达的内容.蓝译编译认为,科 ...

  2. 爬虫推特数据分析的外文文献_科研人必备:一个工具搞定文献查阅、数据分析、模型搭建...

    发表论文,是每个科研人的必经之路!你想要毕业.拿奖金.评职称.争取资金.争取项目,必须发表论文.跟论文打交道的过程足以写成一本20万字的"爱恨情仇史"了. 从选题开始,到大量查阅文 ...

  3. python的界面文字翻译_教你用Python实现微信翻译机器人

    相信大家在日常学习或者是阅读英文文章的过程中,难免会出现几个不认识的单词,或者想快速翻译某段英文的意思. 今天,利用Python爬虫等知识,教大家打造一个微信下的翻译小助手.好吧,开始干活. 先来看看 ...

  4. python开发环境推荐_推荐一款Python开发环境管理神器

    在 Python 开发中,有些情况下,我们可能面临在一台机器上同时安装多版本Python的需求.比如: 有多个Python项目,每个项目依赖不同的Python版本. 有一个Python项目,它需要同时 ...

  5. scholarscope不显示影响因子_科研神器Scholarscope

    做科研.当医生都需要阅读大量文献,特别是外文文献,其中影响因子是一个文献质量的重要评判标准. 使用pubmed可检索到无数文献,但经常无法直接显示影响因子,即使专业的文献管理软件如endnote也无法 ...

  6. 孩子学python用的笔记本电脑_教孩子学Python 后的一点感受

    先说一下孩子的情况.男孩儿,10岁,在学校上过scratch 的课:喜欢音乐和表演,是学校英文戏剧社成员:数学和语文成绩中等:贪玩儿,不会安排自己的事情.概括来说,就是一只普通孩子(和我小时候一样 L ...

  7. 用python给女朋友惊喜_如和用python给女朋友做个专属她的软件

    如和用python给女朋友做个专属她的软件 在学习python的路上如果觉得枯燥就可以想我一样做一些有趣的事情就不会无聊了 python是一门及其有趣的语言. 人们都喜欢记住一些重要的日子,比如说跟女 ...

  8. python 英文字符频率统计 采用降序方式输出_Python读取英文文件并记录每个单词出现次数后降序输出示例...

    本文实例讲述了Python读取英文文件并记录每个单词出现次数后降序输出.分享给大家供大家参考,具体如下: 对文中出现的句号,逗号和感叹号做了相应的处理 sorted排序函数用法: 按照value值降序 ...

  9. python 视频转场_视频剪辑什么鬼?Python 带你高效创作短视频

    近两年,抖音.快手将短视频推到风口浪尖上,要生产出高质量的视频,离不开视频剪辑这一环节:在全民剪片浪潮中,大众使用最多的剪辑软件如:Pr.FCPX.剪印.Vue 等. 视频剪辑过程中,Python 一 ...

最新文章

  1. WPF入门教程-转载
  2. 【Notepad++】Notepad++ 插件 for js 各种插件全介绍
  3. hdu 3081(并查集+最大流)
  4. 因HTTP的Header长度过长导致下载文件名出现乱码的问题
  5. uniapp打包成html5包个ios壳,HBuilder之uni-app打包App方法
  6. 做一个管理者的学习之路--002
  7. 网络模型 OSI七层协议和TCP/IP四层协议
  8. 网络编程——UDP编程
  9. 方舟手游服务器设置文件翻译,方舟生存进化单机模式设置中英文对照翻译一览...
  10. 关机闹钟原理,Android和Iphone关机闹钟
  11. EasyDarwin开源流媒体服务器Golang版本:拉转推功能之拉流实现方法
  12. Python3.X使用Cython调用C/C++
  13. 设计模式(四)注册模式 解决:解决全局共享和交换对象
  14. 计算机键盘如何打字课件,教您如何熟悉键盘(打字指法)_计算机的基本知识_IT /计算机_信息...
  15. SAR成像系列:【11】干涉合成孔径雷达(干涉SAR,Interferometric SAR,InSAR)
  16. DeepMind攻克50年数学难题!AlphaZero史上最快矩阵乘法算法登Nature封面
  17. 三菱FX2N模拟量模块-模拟量输入模块
  18. 修改Datagrip 2021.2.4 系统文件插件等目录的位置
  19. 彻底搞懂java程序的初始化顺序
  20. java 模板转 PDF

热门文章

  1. Linux IPC实践(3) --具名FIFO
  2. hadoop--MapReduce概述
  3. 性能测试监控关键指标
  4. DataBinding注意事项Error parsing XML: duplicate attribute以及如何在listview中使用DataBinding...
  5. 【百度地图API】如何判断点击的是地图还是覆盖物?
  6. infobright安装部署及参数调整优化
  7. Spring Quartz的原理
  8. Redhat 6 git 服务器配置(gitweb)
  9. openstack中resize更改虚拟机内存、cpu大小后虚拟机状态显示VERIFY_RESIZE
  10. Vczh Library++ 语法分析器开发指南