4.9.机器翻译与数据集

机器翻译与数据集

import os
import torch
from d2l import torch as d2l

# @save
d2l.DATA_HUB['fra-eng'] = (d2l.DATA_URL + 'fra-eng.zip',
                           '94646ad1522d915e7b0f9296181140edcf86a4f5')


# @save
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()
print(raw_text[:75])


# @save
def preprocess_nmt(text):
    """预处理“英语-法语”数据集"""

    def no_space(char, prev_char):
        return char in set(',.!?') and prev_char != ' '

    # 如果当前字符是标点符号并且前一个字符不是空格,那么返回 True,表示需要在标点符号前插入空格。

    # 使用空格替换不间断空格
    # 使用小写字母替换大写字母
    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)
print(text[:80])

'''词元化'''


# 单词级词元化
# @save
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
        # 英语和法语是用\t分隔的,那使用split('\t')就能得到两个部分
        parts = line.split('\t')
        if len(parts) == 2:
            source.append(parts[0].split(' '))  # 英文
            target.append(parts[1].split(' '))  # 法语
    return source, target


source, target = tokenize_nmt(text)
print(source[:6], target[:6])


# 绘制每个文本序列所包含的标记数量的直方图
# @save
def show_list_len_pair_hist(legend, xlabel, ylabel, xlist, ylist):
    """绘制列表长度对的直方图"""
    d2l.set_figsize()
    _, _, patches = d2l.plt.hist(
        [[len(l) for l in xlist], [len(l) for l in ylist]])
    d2l.plt.xlabel(xlabel)
    d2l.plt.ylabel(ylabel)
    for patch in patches[1].patches:
        patch.set_hatch('/')
    d2l.plt.legend(legend)
    d2l.plt.show()


show_list_len_pair_hist(['source', 'target'], '# tokens per sequence',
                        'count', source, target)

'''词表
列填充到相同长度的填充词元(“<pad>”), 以及序列的开始词元(“<bos>”)和结束词元(“<eos>”)。
一个词的次数小于等于2,就不要
'''

src_vocab = d2l.Vocab(source, min_freq=2,
                      reserved_tokens=['<pad>', '<bos>', '<eos>'])
len(src_vocab)


'''加载数据集'''
'''通过截断(truncation)和填充(poadding)方式实现一次只处理一个小批量的文本序列'''
#@save
def truncate_pad(line, num_steps, padding_token):
    """截断或填充文本序列,取前num_steps个词元"""
    if len(line) > num_steps:
        return line[:num_steps]  # 截断
    # 不足num_steps的则使用<pad>填充
    return line + [padding_token] * (num_steps - len(line))  # 填充

print(truncate_pad(src_vocab[source[0]], 10, src_vocab['<pad>']))


'''将文本序列转换成小批量数据集用于训练,将特定的<eos>词元添加到所有序列的末尾,表示序列的结束'''
#@save
def build_array_nmt(lines, vocab, num_steps):
    """将机器翻译的文本序列转换成小批量"""
    lines = [vocab[l] for l in lines]
    lines = [l + [vocab['<eos>']] for l in lines]
    array = torch.tensor([truncate_pad(
        l, num_steps, vocab['<pad>']) for l in lines])
    valid_len = (array != vocab['<pad>']).type(torch.int32).sum(1) #去掉填充的实际长度
    return array, valid_len



'''训练模型'''

#@save
def load_data_nmt(batch_size, num_steps, num_examples=600):
    """返回翻译数据集的迭代器和词表"""
    text = preprocess_nmt(read_data_nmt())
    source, target = tokenize_nmt(text, num_examples)
    src_vocab = d2l.Vocab(source, min_freq=2,
                          reserved_tokens=['<pad>', '<bos>', '<eos>'])
    tgt_vocab = d2l.Vocab(target, min_freq=2,
                          reserved_tokens=['<pad>', '<bos>', '<eos>'])
    src_array, src_valid_len = build_array_nmt(source, src_vocab, num_steps)
    tgt_array, tgt_valid_len = build_array_nmt(target, tgt_vocab, num_steps)
    data_arrays = (src_array, src_valid_len, tgt_array, tgt_valid_len)
    data_iter = d2l.load_array(data_arrays, batch_size)
    return data_iter, src_vocab, tgt_vocab

train_iter, src_vocab, tgt_vocab = load_data_nmt(batch_size=2, num_steps=8)
for X, X_valid_len, Y, Y_valid_len in train_iter:
    print('X:', X.type(torch.int32))
    print('X的有效长度:', X_valid_len)
    print('Y:', Y.type(torch.int32))
    print('Y的有效长度:', Y_valid_len)
    break

FastReport Studio 4.9.314 是一款功能强大的报告生成工具。它可以帮助用户快速创建各种报告,包括表格报告、图表报告和交叉表报告等。它支持多种数据源,包括数据库、XML、JSON等,并提供了丰富的数据处理功能,如排序、过滤和计算等。 FastReport Studio 4.9.314 具有直观的用户界面,使用户可以轻松地创建和编辑报告模板。使用该工具,用户可以自定义报告的布局、样式和格式,以便满足特定的需求。它还提供了丰富的模板库,用户可以选择适合自己需求的模板,节省大量的时间和精力。 除了报告生成功能,FastReport Studio 4.9.314 还提供了强大的数据可视化功能。它支持各种图表类型,包括柱状图、饼图和折线图等,并可以根据需要进行个性化定制。用户可以通过图表直观地展示数据,并更好地理解数据之间的关系和趋势。 此外,FastReport Studio 4.9.314 还提供了丰富的导出功能。用户可以将报告导出为多种格式,包括PDF、Excel、Word和HTML等,以便在不同平台、设备和应用程序中进行共享和使用。 综上所述,FastReport Studio 4.9.314 是一款功能丰富、易于使用的报告生成工具。它可以帮助用户快速创建各种报告,并提供了丰富的数据处理和可视化功能,以满足用户的不同需求。无论是企业中的数据分析师,还是开发人员,都可以利用该工具轻松地生成和处理报告。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值