求邯郸网站制作,建设大厦网站,wordpress 转 帝国,建设网站一般要多少钱#Datawhale #NLP
1.背景介绍#xff1a; 机器翻译#xff08;Machine Translation#xff0c;简称MT#xff09;是自然语言处理领域的一个重要分支#xff0c;其目标是将一种语言的文本自动转换为另一种语言的文本。机器翻译的发展可以追溯到20世纪50年代#xff0c;经历…#Datawhale #NLP
1.背景介绍 机器翻译Machine Translation简称MT是自然语言处理领域的一个重要分支其目标是将一种语言的文本自动转换为另一种语言的文本。机器翻译的发展可以追溯到20世纪50年代经历了从基于规则的方法、统计方法到深度学习方法的演变过程。 当前机器翻译正朝着更加智能化和个性化方向发展。一方面结合上下文理解、情感分析等技术提高翻译的准确性和自然度另一方面通过用户反馈和个性化学习提供更加符合用户需求的翻译服务。同时跨语言信息检索、多模态翻译等新兴领域也正在成为研究热点。 总的来说机器翻译的发展历程是从规则驱动到数据驱动再到智能驱动的过程反映了自然语言处理技术的进步和应用需求的变化。 2.数据集简介 基于术语词典干预的机器翻译挑战赛选择以英文为源语言中文为目标语言的机器翻译。本次大赛除英文到中文的双语数据还提供英中对照的术语词典。参赛队伍需要基于提供的训练数据样本从多语言机器翻译模型的构建与训练并基于测试集以及术语词典提供最终的翻译结果
赛题数据划分 训练集双语数据 - 中英14万余双语句对 开发集英中1000双语句对 测试集英中1000双语句对 术语词典英中2226条 训练集training set用于运行你的学习算法。 开发集development set用于调整参数选择特征以及对学习算法作出其它决定。有时也称为留出交叉验证集hold-out cross validation set。 测试集test set用于评估算法的性能但不会据此改变学习算法或参数。
下面是每日任务打卡以及学习笔记
task1:了解机器翻译 理解赛题
跑通baseline并上传数据
baseline主要分为三个板块模型训练模型推理验证集模型推理测试集
模型训练
值得注意的是这里其实用的jupternotebook写的代码就是一块一块的一块定义一个函数并且写上notebook笔记注释在最后一块写上if name主函数调用运行即可运行的时候切记要将所有的代码块从头到尾一个个运行一遍才能运行主函数否则前面的代码编译器未编译主函数里面调用的函数识别不出来。
这里我是图方便全部合在一起了到时候直接运行就好和jupyter那个要从头到尾跑一遍代码块一样的道理这就是python的特质没有什么引入接口函数必须要从头到尾来一遍才能读进去。maybe
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader
from torchtext.data.utils import get_tokenizer
from collections import Counter
import random
from torch.utils.data import Subset, DataLoader
import time# 定义数据集类
# 修改TranslationDataset类以处理术语
class TranslationDataset(Dataset):def __init__(self, filename, terminology):self.data []with open(filename, r, encodingutf-8) as f:for line in f:en, zh line.strip().split(\t)self.data.append((en, zh))self.terminology terminology# 创建词汇表注意这里需要确保术语词典中的词也被包含在词汇表中self.en_tokenizer get_tokenizer(basic_english)self.zh_tokenizer list # 使用字符级分词en_vocab Counter(self.terminology.keys()) # 确保术语在词汇表中zh_vocab Counter()for en, zh in self.data:en_vocab.update(self.en_tokenizer(en))zh_vocab.update(self.zh_tokenizer(zh))# 添加术语到词汇表self.en_vocab [pad, sos, eos] list(self.terminology.keys()) [word for word, _ in en_vocab.most_common(10000)]self.zh_vocab [pad, sos, eos] [word for word, _ in zh_vocab.most_common(10000)]self.en_word2idx {word: idx for idx, word in enumerate(self.en_vocab)}self.zh_word2idx {word: idx for idx, word in enumerate(self.zh_vocab)}def __len__(self):return len(self.data)def __getitem__(self, idx):en, zh self.data[idx]en_tensor torch.tensor([self.en_word2idx.get(word, self.en_word2idx[sos]) for word in self.en_tokenizer(en)] [self.en_word2idx[eos]])zh_tensor torch.tensor([self.zh_word2idx.get(word, self.zh_word2idx[sos]) for word in self.zh_tokenizer(zh)] [self.zh_word2idx[eos]])return en_tensor, zh_tensordef collate_fn(batch):en_batch, zh_batch [], []for en_item, zh_item in batch:en_batch.append(en_item)zh_batch.append(zh_item)# 对英文和中文序列分别进行填充en_batch nn.utils.rnn.pad_sequence(en_batch, padding_value0, batch_firstTrue)zh_batch nn.utils.rnn.pad_sequence(zh_batch, padding_value0, batch_firstTrue)return en_batch, zh_batchclass Encoder(nn.Module):def __init__(self, input_dim, emb_dim, hid_dim, n_layers, dropout):super().__init__()self.embedding nn.Embedding(input_dim, emb_dim)self.rnn nn.GRU(emb_dim, hid_dim, n_layers, dropoutdropout, batch_firstTrue)self.dropout nn.Dropout(dropout)def forward(self, src):# src shape: [batch_size, src_len]embedded self.dropout(self.embedding(src))# embedded shape: [batch_size, src_len, emb_dim]outputs, hidden self.rnn(embedded)# outputs shape: [batch_size, src_len, hid_dim]# hidden shape: [n_layers, batch_size, hid_dim]return outputs, hiddenclass Decoder(nn.Module):def __init__(self, output_dim, emb_dim, hid_dim, n_layers, dropout):super().__init__()self.output_dim output_dimself.embedding nn.Embedding(output_dim, emb_dim)self.rnn nn.GRU(emb_dim, hid_dim, n_layers, dropoutdropout, batch_firstTrue)self.fc_out nn.Linear(hid_dim, output_dim)self.dropout nn.Dropout(dropout)def forward(self, input, hidden):# input shape: [batch_size, 1]# hidden shape: [n_layers, batch_size, hid_dim]embedded self.dropout(self.embedding(input))# embedded shape: [batch_size, 1, emb_dim]output, hidden self.rnn(embedded, hidden)# output shape: [batch_size, 1, hid_dim]# hidden shape: [n_layers, batch_size, hid_dim]prediction self.fc_out(output.squeeze(1))# prediction shape: [batch_size, output_dim]return prediction, hiddenclass Seq2Seq(nn.Module):def __init__(self, encoder, decoder, device):super().__init__()self.encoder encoderself.decoder decoderself.device devicedef forward(self, src, trg, teacher_forcing_ratio0.5):# src shape: [batch_size, src_len]# trg shape: [batch_size, trg_len]batch_size src.shape[0]trg_len trg.shape[1]trg_vocab_size self.decoder.output_dimoutputs torch.zeros(batch_size, trg_len, trg_vocab_size).to(self.device)_, hidden self.encoder(src)input trg[:, 0].unsqueeze(1) # Start tokenfor t in range(1, trg_len):output, hidden self.decoder(input, hidden)outputs[:, t, :] outputteacher_force random.random() teacher_forcing_ratiotop1 output.argmax(1)input trg[:, t].unsqueeze(1) if teacher_force else top1.unsqueeze(1)return outputs# 新增术语词典加载部分
def load_terminology_dictionary(dict_file):terminology {}with open(dict_file, r, encodingutf-8) as f:for line in f:en_term, ch_term line.strip().split(\t)terminology[en_term] ch_termreturn terminologydef train(model, iterator, optimizer, criterion, clip):model.train()epoch_loss 0for i, (src, trg) in enumerate(iterator):src, trg src.to(device), trg.to(device)optimizer.zero_grad()output model(src, trg)output_dim output.shape[-1]output output[:, 1:].contiguous().view(-1, output_dim)trg trg[:, 1:].contiguous().view(-1)loss criterion(output, trg)loss.backward()torch.nn.utils.clip_grad_norm_(model.parameters(), clip)optimizer.step()epoch_loss loss.item()return epoch_loss / len(iterator)# 主函数
if __name__ __main__:start_time time.time() # 开始计时device torch.device(cuda if torch.cuda.is_available() else cpu)#terminology load_terminology_dictionary(../dataset/en-zh.dic)terminology load_terminology_dictionary(E:/2024年项目资料/2024Datawhale AI夏令营---基于术语词典干预的机器翻译挑战赛/dataset/en-zh.dic)# 加载数据dataset TranslationDataset(E:/2024年项目资料/2024Datawhale AI夏令营---基于术语词典干预的机器翻译挑战赛/dataset/train.txt,terminology terminology)# 选择数据集的前N个样本进行训练N 1000 #int(len(dataset) * 1) # 或者你可以设置为数据集大小的一定比例如 int(len(dataset) * 0.1)subset_indices list(range(N))subset_dataset Subset(dataset, subset_indices)train_loader DataLoader(subset_dataset, batch_size32, shuffleTrue, collate_fncollate_fn)# 定义模型参数INPUT_DIM len(dataset.en_vocab)OUTPUT_DIM len(dataset.zh_vocab)ENC_EMB_DIM 256DEC_EMB_DIM 256HID_DIM 512N_LAYERS 2ENC_DROPOUT 0.5DEC_DROPOUT 0.5# 初始化模型enc Encoder(INPUT_DIM, ENC_EMB_DIM, HID_DIM, N_LAYERS, ENC_DROPOUT)dec Decoder(OUTPUT_DIM, DEC_EMB_DIM, HID_DIM, N_LAYERS, DEC_DROPOUT)model Seq2Seq(enc, dec, device).to(device)# 定义优化器和损失函数optimizer optim.Adam(model.parameters())criterion nn.CrossEntropyLoss(ignore_indexdataset.zh_word2idx[pad])# 训练模型N_EPOCHS 10CLIP 1for epoch in range(N_EPOCHS):train_loss train(model, train_loader, optimizer, criterion, CLIP)print(fEpoch: {epoch1:02} | Train Loss: {train_loss:.3f})# 在训练循环结束后保存模型torch.save(model.state_dict(), E:/2024年项目资料/2024Datawhale AI夏令营---基于术语词典干预的机器翻译挑战赛/model/translation_model_GRU.pth)end_time time.time() # 结束计时# 计算并打印运行时间elapsed_time_minute (end_time - start_time)/60print(fTotal running time: {elapsed_time_minute:.2f} minutes)
直接运行主函数
结果如下这里我是按默认的参数只跑了10个epoch,训练了1000对中英翻译对效果其实是会很差的。 模型推理验证集
这里是用验证集先对模型进行一次评测大家都懂验证集是用来干嘛的就是拿来给模型调参的这里只是一个演示跑通了后面会发挥其作用用于调参。
import torch
from sacrebleu.metrics import BLEU
from typing import List# 假设我们已经定义了TranslationDataset, Encoder, Decoder, Seq2Seq类def load_sentences(file_path: str) - list[str]:with open(file_path, r, encodingutf-8) as f:return [line.strip() for line in f]# 更新translate_sentence函数以考虑术语词典
def translate_sentence(sentence: str, model: Seq2Seq, dataset: TranslationDataset, terminology, device: torch.device, max_length: int 50):model.eval()tokens dataset.en_tokenizer(sentence)tensor torch.LongTensor([dataset.en_word2idx.get(token, dataset.en_word2idx[sos]) for token in tokens]).unsqueeze(0).to(device) # [1, seq_len]with torch.no_grad():_, hidden model.encoder(tensor)translated_tokens []input_token torch.LongTensor([[dataset.zh_word2idx[sos]]]).to(device) # [1, 1]for _ in range(max_length):output, hidden model.decoder(input_token, hidden)top_token output.argmax(1)translated_token dataset.zh_vocab[top_token.item()]if translated_token eos:break# 如果翻译的词在术语词典中则使用术语词典中的词if translated_token in terminology.values():for en_term, ch_term in terminology.items():if translated_token ch_term:translated_token en_termbreaktranslated_tokens.append(translated_token)input_token top_token.unsqueeze(1) # [1, 1]return .join(translated_tokens)def evaluate_bleu(model: Seq2Seq, dataset: TranslationDataset, src_file: str, ref_file: str, terminology,device: torch.device):model.eval()src_sentences load_sentences(src_file)ref_sentences load_sentences(ref_file)translated_sentences []for src in src_sentences:translated translate_sentence(src, model, dataset, terminology, device)translated_sentences.append(translated)bleu BLEU()score bleu.corpus_score(translated_sentences, [ref_sentences])return score# 主函数
if __name__ __main__:device torch.device(cuda if torch.cuda.is_available() else cpu)# 加载术语词典terminology load_terminology_dictionary(E:/2024年项目资料/2024Datawhale AI夏令营---基于术语词典干预的机器翻译挑战赛/dataset/en-zh.dic)# 创建数据集实例时传递术语词典dataset TranslationDataset(E:/2024年项目资料/2024Datawhale AI夏令营---基于术语词典干预的机器翻译挑战赛/dataset/train.txt, terminology)# 定义模型参数INPUT_DIM len(dataset.en_vocab)OUTPUT_DIM len(dataset.zh_vocab)ENC_EMB_DIM 256DEC_EMB_DIM 256HID_DIM 512N_LAYERS 2ENC_DROPOUT 0.5DEC_DROPOUT 0.5# 初始化模型enc Encoder(INPUT_DIM, ENC_EMB_DIM, HID_DIM, N_LAYERS, ENC_DROPOUT)dec Decoder(OUTPUT_DIM, DEC_EMB_DIM, HID_DIM, N_LAYERS, DEC_DROPOUT)model Seq2Seq(enc, dec, device).to(device)# 加载训练好的模型model.load_state_dict(torch.load(E:/2024年项目资料/2024Datawhale AI夏令营---基于术语词典干预的机器翻译挑战赛/model/translation_model_GRU.pth))# 评估BLEU分数bleu_score evaluate_bleu(model, dataset, E:/2024年项目资料/2024Datawhale AI夏令营---基于术语词典干预的机器翻译挑战赛/dataset/dev_en.txt, E:/2024年项目资料/2024Datawhale AI夏令营---基于术语词典干预的机器翻译挑战赛/dataset/dev_zh.txt, terminology terminology,device device)print(fBLEU-4 score: {bleu_score.score:.2f})
这里验证集用的评分 指标是自动评价指标 BLEU-4 具体工具使用 sacrebleu开源版本。
什么是 BLEU-4 下面简单的做一个介绍 BLEU全称为Bilingual Evaluation Understudy双语评估替换是一种对生成语句进行评估的指标。BLEU 评分是由Kishore Papineni等人2002年的论文《BLEU: a Method for Automatic Evaluation of Machine Translation》中提出的。 在机器翻译领域BLEUBilingual Evaluation Understudy是一种常用的自动评价指标用于衡量计算机生成的翻译与一组参考译文之间的相似度。这个指标特别关注 n-grams连续的n个词的精确匹配可以被认为是对翻译准确性和流利度的一种统计估计。计算BLEU分数时首先会统计生成文本中n-grams的频率然后将这些频率与参考文本中的n-grams进行比较。如果生成的翻译中包含的n-grams与参考译文中出现的相同则认为是匹配的。最终的BLEU分数是一个介于0到1之间的数值其中1表示与参考译文完美匹配而0则表示完全没有匹配。 BLEU-4 特别指的是在计算时考虑四元组即连续四个词的匹配情况。
BLEU 评估指标的特点 优点计算速度快、计算成本低、容易理解、与具体语言无关、和人类给的评估高度相关。 缺点不考虑语言表达语法上的准确性测评精度会受常用词的干扰短译句的测评精度有时会较高没有考虑同义词或相似表达的情况可能会导致合理翻译被否定。 除翻译之外BLEU评分结合深度学习方法可应用于其他的语言生成问题例如语言生成、图片标题生成、文本摘要、语音识别。
运行主函数结果如下
嘿嘿直接是0哈哈哈效果确实很差 模型推理测试集
下面就是正式的将我们的模型训练后再经过验证集的调参之后用于正式的测试啦
def inference(model: Seq2Seq, dataset: TranslationDataset, src_file: str, save_dir:str, terminology, device: torch.device):model.eval()src_sentences load_sentences(src_file)translated_sentences []for src in src_sentences:translated translate_sentence(src, model, dataset, terminology, device)#print(translated)translated_sentences.append(translated)#print(translated_sentences)# 将列表元素连接成一个字符串每个元素后换行text \n.join(translated_sentences)# 打开一个文件如果不存在则创建w表示写模式with open(save_dir, w, encodingutf-8) as f:# 将字符串写入文件f.write(text)#return translated_sentences# 主函数
if __name__ __main__:device torch.device(cuda if torch.cuda.is_available() else cpu)# 加载术语词典terminology load_terminology_dictionary(E:/2024年项目资料/2024Datawhale AI夏令营---基于术语词典干预的机器翻译挑战赛/dataset/en-zh.dic)# 加载数据集和模型dataset TranslationDataset(E:/2024年项目资料/2024Datawhale AI夏令营---基于术语词典干预的机器翻译挑战赛/dataset/train.txt,terminology terminology)# 定义模型参数INPUT_DIM len(dataset.en_vocab)OUTPUT_DIM len(dataset.zh_vocab)ENC_EMB_DIM 256DEC_EMB_DIM 256HID_DIM 512N_LAYERS 2ENC_DROPOUT 0.5DEC_DROPOUT 0.5# 初始化模型enc Encoder(INPUT_DIM, ENC_EMB_DIM, HID_DIM, N_LAYERS, ENC_DROPOUT)dec Decoder(OUTPUT_DIM, DEC_EMB_DIM, HID_DIM, N_LAYERS, DEC_DROPOUT)model Seq2Seq(enc, dec, device).to(device)# 加载训练好的模型model.load_state_dict(torch.load(E:/2024年项目资料/2024Datawhale AI夏令营---基于术语词典干预的机器翻译挑战赛/model/translation_model_GRU.pth))save_dir E:/2024年项目资料/2024Datawhale AI夏令营---基于术语词典干预的机器翻译挑战赛/dataset/submit.txtinference(model, dataset, src_fileE:/2024年项目资料/2024Datawhale AI夏令营---基于术语词典干预的机器翻译挑战赛/dataset/test_en.txt, save_dir save_dir, terminology terminology, device device)print(f翻译完成文件已保存到{save_dir})test-data已经准备好了这里就是将模型用于测试集进行推理吧不能叫评测结果如下
额 这结果确实是意料之中的差啊哈哈哈哈没事没事这相当于让你看10遍一个1000对中英翻译就能学会英语翻译另外1000个句子一样哈哈哈impossible 并将推理结果提交至这里打分就好
2024 iFLYTEK A.I.开发者大赛-讯飞开放平台 (xfyun.cn)
这样task1的baseline就跑通啦后面就是更加细致的了解代码和赛题进行各方面的优化架构和代码疯狂上分
task2:从baseline代码详解入门深度学习