懒惰的骚操作
贫穷限制了我们的想象,但是懒惰能激发灵感,进行各种骚操作😏
因此,开了一个专题,对平时的骚操作进行总结。
只用作学习,不作为商用。
只用作学习,不作为商用。
只用作学习,不作为商用。
摘要批量翻译
众所周知,对于我这种英语渣渣来说,看英文论文不带一个翻译器,是一件很痛苦的事情😭
为了省时省力的得到论文的摘要翻译,帮我更加省力的删论文,用python写了摘要的翻译程序
论文的标题和摘要的话,直接上 web of science,使用关键词搜索就能得到(我想看帖的很多人都是研究僧,用校园网一般可以上),这里就不多做赘述了
至于论文下载的格式,建议采用csv格式(主要是我写的代码是基于csv写的),如果采用其他格式的话,烦请自己修改。
1、调用百度翻译API翻译(正经的)
这里调用百度API来对论文的摘要进行翻译,直接申请一个账户就可以调用百度翻译的API。由于百度翻译存在字数限制,所以我把一段话拆成几段,分别翻译。
import time
import requests
import random
from hashlib import md5
import pandas as pd
# 利用百度API翻译的代码
def translate_baidu(query, from_lang, to_lang):
'''调用百度的API,需要自己设置,每月5万字符,每次翻译还有字数限制,压根不够用'''
# print(query)
# Set your own appid/appkey.
appid = 'id'
appkey = 'key'
# For list of language codes, please refer to `https://api.fanyi.baidu.com/doc/21`
endpoint = 'http://api.fanyi.baidu.com'
path = '/api/trans/vip/translate'
url = endpoint + path
# Generate salt and sign
def make_md5(s, encoding='utf-8'):
return md5(s.encode(encoding)).hexdigest()
salt = random.randint(32768, 65536)
sign = make_md5(appid + str(query) + str(salt) + appkey)
# Build request
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
payload = {'appid': appid, 'q': query, 'from': from_lang, 'to': to_lang, 'salt': salt, 'sign': sign}
# Send request
r = requests.post(url, params=payload, headers=headers)
result = r.json()
print(result)
if "error_code" in result:
return 'non'
else:
return result['trans_result'][0]["dst"]
def content_split_translate_baidu(query, from_lang, to_lang):
'''百度配套的拆分句子的'''
query = query.replace('. ', '.\n')
# 段落拆分成句子
query = query.split('\n')
content = []
step = 4
sentence = []
# print(query)
# 句子合成段落
for i in range(0, len(list(query)), step):
# 当在step步数的句子中
if len(list(query)) - i - step >= 0:
if step == 5:
sentence = query[i] + query[i + 1] + query[i + 2] + query[i + 3] + query[i + 4]
elif step == 4:
sentence = query[i] + query[i + 1] + query[i + 2] + query[i + 3]
else:
print('step有问题!')
break
# print(sentence)
sentence = translate_baidu(sentence, from_lang=from_lang, to_lang=to_lang)
content.append(sentence)
# 当不在step步数的句子中
else:
t = len(list(query)) - i
for s in range(0, t):
sentence += query[ i + s]
sentence = translate_baidu(sentence, from_lang=from_lang, to_lang=to_lang)
content.append(sentence)
sentence *= 0
# 延迟时间
time.sleep(1)
return content
def translation_save_Abstract_bidu(data, translationpath, from_lang = 'en', to_lang = 'zh'):
with open(translationpath, 'w', encoding='utf-8') as f:
for line in data.values:
# 提取内容
title = str(line[9])
Abstract = str(line[34])
print(title)
# 翻译
Abstract = content_split_translate_baidu(Abstract, from_lang, to_lang)
# 写入
f.write('标题:' + str(title) + "\n")
f.write('DOI:' + str(line[28]) + "\n")
f.write('期刊:' + str(line[17]) + "\n")
f.write('摘要:' + str(Abstract) + "\n" + "\n" + "\n")
print('翻译完成!!!')
# num = num + 1
f.close()
if __name__ == '__main__':
datapath = 'paper.csv'
translationpath = 'output/Abstract_translation.txt'
data = pd.read_csv(datapath)
# 保存标题题目,期刊来源,doi和百度翻译后的摘要
translation_save_Abstract_bidu(data, translationpath, from_lang='en', to_lang='zh')
2、调用CopyTranslator翻译(骚操作)
但是,百度API每月翻译的字节数有限制,当批量翻译论文时,字数压根不够用,所以我就想,何不直接利用能够剪贴板识别翻译的软件CopyTranslator,直接翻译得到摘要。
其他的软件也可以,但主要是可以进行剪贴板识别功能,且直接快速翻译的。
下面上代码
import pandas as pd
import win32clipboard
import win32con
# 利用剪切板和copytranslation的剪切板监视功能进行翻译
def translate_copy(content, time):
set_text(content, time)
return get_text()
def get_text():
win32clipboard.OpenClipboard()
text = win32clipboard.GetClipboardData(win32con.CF_UNICODETEXT)
win32clipboard.CloseClipboard()
return text
def set_text(string, time):
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardData(win32con.CF_UNICODETEXT, string)
win32clipboard.CloseClipboard()
time.sleep(time)
def read_save_Abstract(data, Abstractpath, time):
'''
line
9:标题
28:doi
17:期刊来源
34:摘要
'''
with open(Abstractpath, 'w', encoding='utf-8') as f:
for line in data.values:
# 翻译摘要
Abstract = translate_copy(str(line[34]), time)
# 写入txt文件
f.write('标题:' + str(line[9]) + "\n")
f.write('DOI:' + str(line[28]) + "\n")
f.write('期刊:' + str(line[17]) + "\n")
f.write('摘要:' + str(Abstract) + "\n" + "\n" + "\n" + "\n" + "\n")
f.close()
def clean_txt(content, salt, sign):
print("to continue")
if __name__ == '__main__':
# data是数据,Abstractpath是输出的路径,time是留给翻译软件的反应时间
datapath = 'paper.csv'
Abstractpath = 'Abstract_translation.txt'
time = 2
data = pd.read_csv(datapath)
# 保存标题题目,期刊来源,doi和中文摘要
read_save_Abstract(data, Abstractpath, time)
注意
代码运行的时候,记得把CopyTranslator的剪贴板识别打开
结束语
进行骚操作只是因为学生的贫穷和省吃俭用的无奈,如果有能力和经济实力的话,还请使用百度翻译API