懒惰的骚操作(摘要批量翻译)

懒惰的骚操作

贫穷限制了我们的想象,但是懒惰能激发灵感,进行各种骚操作😏
因此,开了一个专题,对平时的骚操作进行总结。

只用作学习,不作为商用。
只用作学习,不作为商用。
只用作学习,不作为商用。

摘要批量翻译

众所周知,对于我这种英语渣渣来说,看英文论文不带一个翻译器,是一件很痛苦的事情😭

为了省时省力的得到论文的摘要翻译,帮我更加省力的删论文,用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ch216003

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值