60 机器翻译与数据集_by《李沐:动手学深度学习v2》pytorch版

系列文章目录



介绍机器翻译

语言模型是自然语言处理的关键, 而机器翻译是语言模型最成功的基准测试。 因为机器翻译正是将输入序列转换成输出序列的序列转换模型(sequence transduction)的核心问题。 序列转换模型在各类现代人工智能应用中发挥着至关重要的作用, 为此,本节将介绍机器翻译问题及其后文需要使用的数据集。
机器翻译(machine translation)指的是将序列从一种语言自动翻译成另一种语言。 事实上,这个研究领域可以追溯到数字计算机发明后不久的20世纪40年代, 特别是在第二次世界大战中使用计算机破解语言编码。 几十年来,在使用神经网络进行端到端学习的兴起之前, 统计学方法在这一领域一直占据主导地位。因为统计机器翻译(statistical machine translation)涉及了 翻译模型和语言模型等组成部分的统计分析, 因此基于神经网络的方法通常被称为 神经机器翻译(neural machine translation), 用于将两种翻译模型区分开来。
本书的关注点是神经网络机器翻译方法,强调的是端到端的学习。下面,我们看一下如何将预处理后的数据加载到小批量中用于之后的训练。

import os
import torch
from d2l import torch as d2l

下载和预处理数据集

首先,下载一个由Tatoeba项目的双语句子对
组成的“英-法”数据集,数据集中的每一行都是制表符分隔的文本序列对,序列对由英文文本序列和翻译后的法语文本序列组成。
请注意,每个文本序列可以是一个句子,也可以是包含多个句子的一个段落。
在这个将英语翻译成法语的机器翻译问题中,英语是源语言(source language),法语是目标语言(target language)。

# 注册数据集到数据中心,指定数据集名称和下载链接及其校验和
d2l.DATA_HUB['fra-eng'] = (d2l.DATA_URL + 'fra-eng.zip',
                           '94646ad1522d915e7b0f9296181140edcf86a4f5')

# 定义一个函数,用于加载“英语-法语”数据集
def read_data_nmt():
    """载入“英语-法语”数据集"""
    # 下载并解压数据集,返回数据目录
    data_dir = d2l.download_extract('fra-eng')
    
    # 打开解压后的文本文件,读取其内容
    with open(os.path.join(data_dir, 'fra.txt'), 'r', encoding='utf-8') as f:
        return f.read()  # 返回文件的全部内容

# 调用函数,获取原始文本数据
raw_text = read_data_nmt()

# 打印原始文本的前50个字符
print(raw_text[:50])

Go.	Va !
Hi.	Salut !
Run!	Cours !
Run!	Courez !
Wh

下载数据集后,原始文本数据需要经过[几个预处理步骤]。
例如,我们用空格代替不间断空格(non-breaking space),使用小写字母替换大写字母,并在单词和标点符号之间插入空格。

def preprocess_nmt(text):
    """预处理“英语-法语”数据集"""
    
    # 定义一个辅助函数,用于判断是否在单词和标点之间插入空格
    def no_space(char, prev_char):
        return char in set(',.!?') and prev_char != ' '

    # 将文本中的不间断空格和某些特殊空格替换为普通空格
    # 将文本转换为小写字母
    text = text.replace('\u202f', ' ').replace('\xa0', ' ').lower()
    
    # 在单词和标点符号之间插入空格
    out = [' ' + char if i > 0 and no_space(char, text[i - 1]) else char
           for i, char in enumerate(text)]
    
    # 将处理后的字符列表连接成一个字符串并返回
    return ''.join(out)

# 调用预处理函数,处理原始文本数据
text = preprocess_nmt(raw_text)

# 打印处理后的文本前80个字符
print(text[:80])
go .	va !
hi .	salut !
run !	cours !
run !	courez !
who ?	qui ?
wow !	ça alors !

词元化

与字符级词元化不同,在机器翻译中,我们更喜欢单词级词元化(最先进的模型可能使用更高级的词元化技术)。下面的tokenize_nmt函数对前num_examples个文本序列对进行词元,其中每个词元要么是一个词,要么是一个标点符号。
此函数返回两个词元列表:sourcetargetsource[i]是源语言(这里是英语)第 i i i个文本序列的词元列表,target[i]是目标语言(这里是法语)第 i i i个文本序列的词元列表。

# 定义一个函数,用于将“英语-法语”数据集进行词元化
def tokenize_nmt(text, num_examples=None):
    """词元化“英语-法语”数据集"""
    
    # 初始化源语言(英语)和目标语言(法语)的列表
    source, target = [], []
    
    # 遍历文本中的每一行
    for i, line in enumerate(text.split('\n')):
        # 如果指定了样本数量,且已处理的行数超过该数量,则停止处理
        if num_examples and i > num_examples:
            break
        
        # 将当前行按制表符分割,得到源语言和目标语言的部分
        parts = line.split('\t')
        
        # 如果当前行包含源语言和目标语言(即分割后有两个部分)
        if len(parts) == 2:
            # 将源语言部分按空格分割并添加到源语言列表中
            source.append(parts[0].split(' '))
            # 将目标语言部分按空格分割并添加到目标语言列表中
            target.append(parts[1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值