当前位置: 首页 > article >正文

基于 Seq2Seq 的中英文翻译项目(pytorch)

项目简介

本项目旨在使用 PyTorch 构建一个基于 Seq2Seq(编码器-解码器架构)的中英文翻译模型。我们将使用双语句子对的数据进行训练,最终实现一个能够将英文句子翻译为中文的模型。项目的主要步骤包括:

  1. 数据预处理:从数据集中提取英文和中文句子,并进行初步清洗和保存。
  2. 数据加载与分词:将预处理后的数据加载进内存,进行分词处理,并构建词汇表。
  3. 模型构建:实现 Seq2Seq 模型的编码器和解码器部分。
  4. 模型训练与验证:使用训练集对模型进行训练,并使用验证集评估模型性能。
  5. 测试与推理:使用训练好的模型进行实际的翻译测试。

Step 1: 数据预处理

目的

从原始数据集中提取英文和中文句子,并将其转换为模型能够使用的格式。

流程

  1. 读取文件:从给定的文本文件中读取每一行数据。
  2. 提取句子:每一行数据包含英文和中文句子,我们将其分割并提取出这两部分。
  3. 保存处理后的数据:将处理后的句子保存为两个单独的文件,一个保存英文句子,另一个保存中文句子。

代码

import pandas as pd

# 加载数据文件并进行预处理
file_path = 'data/cmn.txt'  # 请确保数据文件位于该路径下

# 读取文件并处理每一行,提取英文和中文句子
data = []
with open(file_path, 'r', encoding='utf-8') as file:
    for line in file:
        # 每行数据使用制表符分割,提取英文和中文部分
        parts = line.strip().split('\t')
        if len(parts) >= 2:
            english_sentence = parts[0].strip()
            chinese_sentence = parts[1].strip()
            data.append([english_sentence, chinese_sentence])

# 创建 DataFrame 保存提取的句子
df = pd.DataFrame(data, columns=['English', 'Chinese'])

# 将处理后的英文和中文句子分别保存为两个文件
df['English'].to_csv('data/english_sentences.txt', index=False, header=False)
df['Chinese'].to_csv('data/chinese_sentences.txt', index=False, header=False)

# 显示前几行以验证处理是否正确
print(df.head())

输出示例

  English Chinese
0     Hi.      嗨。
1     Hi.     你好。
2    Run!    你跑吧!
3    Run!    你快跑!
4   Who?      是谁?

Step 2: 数据加载与分词

目的

将预处理后的数据加载进内存,对每个句子进行分词处理,并构建英文和中文的词汇表。

流程

  1. 定义分词器:英文使用基本的英文分词器,中文采用字符级分割。
  2. 构建词汇表:基于分词后的数据构建词汇表,并添加特殊标记,如 <unk><pad><bos><eos>
  3. 将句子转换为索引序列:将分词后的句子转换为词汇表中的索引序列,准备用于模型的输入。
  4. 创建数据集和数据加载器:将处理后的数据封装成可用于模型训练的数据集和数据加载器。

代码

import torch
from torchtext.data.utils import get_tokenizer
from torchtext.vocab import build_vocab_from_iterator

# 定义英文和中文的分词器
tokenizer_en = get_tokenizer('basic_english')

# 中文分词器:将每个汉字作为一个 token
def tokenizer_zh(text):
    return list(text)

# 构建词汇表函数
def build_vocab(sentences, tokenizer):
    def yield_tokens(sentences):
        for sentence in sentences:
            yield tokenizer(sentence)
    vocab = build_vocab_from_iterator(yield_tokens(sentences), specials=['<unk>', '<pad>', '<bos>', '<eos>'])
    vocab.set_default_index(vocab['<unk>'])
    return vocab

# 从文件中加载句子
with open('data/english_sentences.txt', 'r', encoding='utf-8') as f:
    english_sentences = [line.strip() for line in f]

with open('data/chinese_sentences.txt', 'r', encoding='utf-8') as f:
    chinese_sentences = [line.strip() for line in f]

# 构建词汇表
en_vocab = build_vocab(english_sentences, tokenizer_en)
zh_vocab = build_vocab(chinese_sentences, tokenizer_zh)

print(f'英文词汇表大小:{
     len(en_vocab)}')
print(f'中文词汇表大小:{
     len(zh_vocab)}')

# 将句子转换为索引序列,并添加 <bos> 和 <eos>
def process_sentence(sentence, tokenizer, vocab):
    tokens = tokenizer(sentence)
    tokens = ['<bos>'] + tokens + ['<eos>']
    indices = [vocab[token] for token in tokens]
    return indices

# 处理所有句子
en_sequences = [process_sentence(sentence, tokenizer_en, en_vocab) for sentence in english_sentences]
zh_sequences = [process_sentence(sentence, tokenizer_zh, zh_vocab) for sentence in chinese_sentences]

# 示例:查看处理后的索引序列
print("示例英文句子索引序列:", en_sequences[0])
print("示例中文句子索引序列:", zh_sequences[0])

创建数据集和数据加载器

from torch.utils.data import Dataset, DataLoader
from torch.nn.utils.rnn import pad_sequence

class TranslationDataset(Dataset):
    def __init__(self, src_sequences, trg_sequences):
        self.src_sequences = src_sequences
        self.trg_sequences = trg_sequences

    def __len__(self):
        return len(self.src_sequences)

    def __getitem__(self, idx):
        return torch.tensor(self.src_sequences[idx]), torch.tensor(self.trg_sequences[idx])

def collate_fn(batch):
    src_batch, trg_batch = [], []
    for src_sample, trg_sample in batch:
        src_batch.append(src_sample)
        trg_batch.append(trg_sample)
    src_batch = pad_sequence(src_batch, padding_value=en_vocab['<pad>'])
    trg_batch = pad_sequence(trg_batch, padding_value=zh_vocab['<pad>'])
    return src_batch, trg_batch

# 创建数据集
dataset = TranslationDataset(en_sequences, zh_sequences)

# 划分训练集和验证集
from sklearn.model_selection import train_test_split
train_data, val_data = train_test_split(dataset, test_size=0.1)

# 创建数据加载器
batch_size = 32
train_dataloader = DataLoader(train_data, batch_size=batch_size, shuffle=True, collate_fn=collate_fn)
val_dataloader = DataLoader(val_data, batch_size=batch_size, shuffle=False, collate_fn=collate_fn)

Step 3: Seq2Seq 模型构建

目的

构建一个基于 Seq2Seq 结构的模型,用于序列到序列的翻译任务。Seq2Seq 模型主要包括两个部分:

  1. 编码器(Encoder):负责接收输入的英文句子,将其编码为上下文向量。
  2. 解码器(Decoder):根据编码器的输出上下文向量,逐字生成中文翻译。

编码器

import torch.nn as nn

class Encoder(nn.Module):
    def __init__(self, input_dim, emb_dim, hid_dim, n_layers, dropout):
        """
        初始化编码器
        :param input_dim: 输入词汇表的大小(英文词汇表大小)
        :param emb_dim: 词嵌入维度
        :param hid_dim: 隐藏层维度
        :param n_layers: LSTM 层数
        :param dropout: Dropout 概率
        """
        

http://www.kler.cn/news/328617.html

相关文章:

  • 番外篇 | 复现AC-YOLOv5,进行自动化织物缺陷检测
  • Mybatis 9种动态 sql 标签使用
  • 基于深度学习的任务序列中的快速适应
  • 基于微信小程序的宿舍报修系统的设计与实现(lw+演示+源码+运行)
  • 正交阵的概念、性质与应用
  • 激光切割机适用材质有哪些
  • 证件照换底色免费
  • Nginx基础详解4(location模块、nginx跨域问题的解决、nginx防盗链的设计原理及应用、nginx模块化解剖)
  • Vue.js 组件开发
  • 【数据库】 MongoDB 查看当前用户的角色和权限
  • C++八股进阶
  • 【API安全】crAPI靶场全解
  • (void*) 是啥意思
  • 【Vue】为什么 Vue 不使用 React 的分片更新?
  • 重置linux后vscode无法再次使用ssh连接
  • C# HttpClient请求URL重定向后丢失Authorization认证头
  • 基于RustDesk自建远程桌面服务
  • 0基础学前端 day9--css布局
  • UI设计师面试整理-团队合作与沟通能力
  • 深度学习·wandb
  • 自然语言处理问答系统技术
  • html5 + css3(下)
  • STL容器适配器
  • OpenCV 形态学相关函数详解及用法示例
  • 字符串逆序
  • 滚雪球学MySQL[3.3讲]:MySQL复杂查询详解:CASE语句、自连接与视图管理
  • OpenCV视频I/O(11)视频采集类VideoCapture之设置视频捕获设备的属性函数 set()的使用
  • Go语言入门:掌握基础语法与核心概念
  • 决策树的损失函数公式详细说明和例子说明
  • JS+HTML基础