爬取goole翻译和百度翻译用于产生相似句子数据集

项目的目的

在做问答系统研究的时候,想通过deeplearning的方法获得句子语义,并计算两个问句的相似度,为此需要相似问题的数据集,但是一般相似问题数据集很难获取,特别是质量较高的数据集。为此,想到用目前最先进的翻译系统来实现构建数据。

另外,当前NLP比较成功应用就是机器翻译,之所以deeplearning能成功应用到翻译,得意于庞大的、高质量的翻译语料数据。

1.爬取goole翻译

说明

谷歌翻译直接通过request请求是获取不到结果的,需要tk值,tk值需要由问句+tkk值来生成。

  • 获取tkk:

requests获取主页面,只需re正则在主页面上获取tkk值(之前需要通过js脚本来实现,参考

  • 获取tk

通过js脚本实现:gettk.js

var b = function (a, b) {
	for (var d = 0; d < b.length - 2; d += 3) {
		var c = b.charAt(d + 2),
			c = "a" <= c ? c.charCodeAt(0) - 87 : Number(c),
			c = "+" == b.charAt(d + 1) ? a >>> c : a << c;
		a = "+" == b.charAt(d) ? a + c & 4294967295 : a ^ c
	}
	return a
}

var tk =  function (a,TKK) {
	//console.log(a,TKK);
	for (var e = TKK.split("."), h = Number(e[0]) || 0, g = [], d = 0, f = 0; f < a.length; f++) {
		var c = a.charCodeAt(f);
		128 > c ? g[d++] = c : (2048 > c ? g[d++] = c >> 6 | 192 : (55296 == (c & 64512) && f + 1 < a.length && 56320 == (a.charCodeAt(f + 1) & 64512) ? (c = 65536 + ((c & 1023) << 10) + (a.charCodeAt(++f) & 1023), g[d++] = c >> 18 | 240, g[d++] = c >> 12 & 63 | 128) : g[d++] = c >> 12 | 224, g[d++] = c >> 6 & 63 | 128), g[d++] = c & 63 | 128)
	}
	a = h;
	for (d = 0; d < g.length; d++) a += g[d], a = b(a, "+-a^+6");
	a = b(a, "+-3^+b+-f");
	a ^= Number(e[1]) || 0;
	0 > a && (a = (a & 2147483647) + 2147483648);
	a %= 1E6;
	return a.toString() + "." + (a ^ h)
}
  • 最终地址

将tk值和需要翻译的句子代人如下格式

中-英 :

https://translate.google.cn/translate_a/single?client=t&sl=zh-CN&tl=en&hl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&ie=UTF-8&oe=UTF-8&source=bh&ssel=0&tsel=0&kc=1&tk=xxxxxx&q=xxxxxxx

英-中:

https://translate.google.cn/translate_a/single?client=t&sl=en&tl=zh-CN&hl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&ie=UTF-8&oe=UTF-8&source=bh&ssel=0&tsel=0&kc=1&tk=xxxxxx&q=xxxxxxx

程序中简单增加了中英文判断。

  • requests获取结果

获取的结果在三维的列表中,list[0][0][0]即为所需的结果

程序 goole_trans.py

import requests
import urllib
import re
import json
import execjs

class Goole_translate():
    def __init__(self):
        self.url_base = 'https://translate.google.cn'
        self.headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36'}
        self.get_tkk()

    def get_tkk(self):
        page = requests.get(self.url_base, headers= self.headers )
        tkks = re.findall(r"TKK='(.+?)';", page.text)
        if tkks:
            self.tkk = tkks[0]
            return self.tkk
        else:
            raise ('no found tkk')

    def translate(self, query_string):
        last_url = self.get_last_url(query_string)
        response = requests.get(last_url, headers=self.headers)
        if response.status_code != 200:
            self.get_tkk()
            last_url = self.get_last_url(query_string)
            response = requests.get(last_url, headers=self.headers)

        content = response.content # bytes类型
        text = content.decode()  # str类型  , 两步可以用text=response.text替换
        dict_text = json.loads(text)  # 数据是json各式
        result = dict_text[0][0][0]
        return result

    def get_tk(self, query_string):
        tem = execjs.compile(open(r"gettk.js").read())
        tk = tem.call('tk', query_string, self.tkk)
        return tk

    def query_string(self, query_string):
        '''将字符串转换为utf8格式的字符串,本身已utf8格式定义的字符串可以不需要'''
        query_url_trans = urllib.parse.quote(query_string)  # 汉字url编码, 转为utf-8各式
        return query_url_trans

    def get_last_url(self, query_string):
        url_parm = 'sl=en&tl=zh-CN'
        for uchar in query_string:
            if uchar >= u'\u4e00' and uchar <= u'\u9fa5':
                url_parm = 'sl=zh-CN&tl=en'
                break

        url_param_part = self.url_base + "/translate_a/single?"
        url_param = url_param_part + "client=t&"+ url_parm+"&hl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&ie=UTF-8&oe=UTF-8&source=btn&ssel=3&tsel=3&kc=0&"
        url_get = url_param + "tk=" + str(self.get_tk(query_string)) + "&q=" + str(self.query_string(query_string))
        return url_get

if __name__=="__main__":
    query_string = 'how are you'
    gt = Goole_translate()
    en = gt.translate(query_string)
    print(en)

注意

频繁访问可能被封,没有测试过,可以设置延时或ip代理

参考

http://www.cnblogs.com/by-dream/p/6554340.html

https://blog.csdn.net/boyheroes/article/details/78681357

2.爬取百度翻译

  • 自动检测中英文

  • 获取百度翻译结果

程序 baidu_trans.py

# coding=utf-8
import requests
import json

class Baidu_translate():
    def __init__(self):
        self.headers = {"User-Agent":"Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Mobile Safari/537.36"}
        self.lang_detect_url = "https://fanyi.baidu.com/langdetect"
        self.trans_url = "https://fanyi.baidu.com/basetrans"

    def get_lang(self,query_string):
        '''自动检测语言'''
        data = {'query':query_string}
        response = requests.post(self.lang_detect_url, data=data, headers=self.headers)
        return json.loads(response.text)['lan']

    def translate(self,query_string):
        '''翻译'''
        lang = self.get_lang(query_string)
        data = {"query":query_string,"from":"zh","to":"en"} if lang== "zh" else {"query":query_string,"from":"en","to":"zh"}
        response = requests.post(self.trans_url, data=data, headers=self.headers)
        result = json.loads(response.text)["trans"][0]["dst"]
        return result


if __name__ == '__main__':
    query_string = 'how are you'
    bt = Baidu_translate()
    en = bt.translate(query_string)
    print(en)

参考

https://blog.csdn.net/blues_f/article/details/79319461

3.中文-英文-中文

通过中-英-中可以产生相似问答对语料。

  • q_zh:中文问句
  • g_en:谷歌对中文问句中-英翻译
  • b_zh:百度对谷歌结果进行英-中翻译

程序 zh_en_zh_translate.py

'''
通过翻译实现中文问句的相似问法,来产生相似问题对数据集。可用于语义相似模型训练。

goole翻译:中文-英文
baidu翻译:英文-中文

注意:本程序未设置ip代理,频繁访问谨防被封。(只做了简单的随机延迟措施)
'''
import time
import random
from goole_trans import Goole_translate
from baidu_trans import Baidu_translate

gt = Goole_translate()
bt = Baidu_translate()

r_file = 'data/zh.txt'
w_file = 'data/zh_en_zh.txt'
fw = open(w_file,'w',encoding='utf8')
with open(r_file,'r',encoding='utf8') as f:
    for line in f:
        r = random.random()*10
        time.sleep(r)
        ls = line.strip().split('\t')
        query_string = ls[0]
        g_en = gt.translate(query_string)
        b_zh = bt.translate(g_en)
        fw.write(query_string+'\t'+g_en+'\t'+b_zh+'\n')

        print('q_zh:',query_string)
        print('g_en:',g_en)
        print('b_zh:',b_zh)
        print('\n')
fw.close()

运行结果

q_zh: 下周有什么好产品?
g_en: What are the good products next week?
b_zh: 下周的好产品是什么?

------------

q_zh: 第一次使用,额度多少?
g_en: What is the amount of the first use?
b_zh: 第一次使用的数量是多少?

------------

q_zh: 我什么时候可以通过微粒贷借钱
g_en: When can I borrow money from micro-credit?
b_zh: 我什么时候可以从小额信贷中借钱?

------------

q_zh: 借款后多长时间给打电话
g_en: How long does it take to make a call after borrowing?
b_zh: 借钱后打电话需要多长时间?

------------

q_zh: 没看到微粒贷
g_en: Didn't see the micro-credit
b_zh: 没有看到小额信贷

------------

q_zh: 原来的手机号不用了,怎么换
g_en: The original mobile phone number is not used, how to change
b_zh: 原来的手机号码没有用,怎么改

注意

程序均未设置ip代理,频繁访问谨防被封。(只做了简单的随机延迟措施),后期若更新,见github: github地址

转载于:https://my.oschina.net/u/3851199/blog/2208539

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值