Datawhale AI 夏令营 :基于 Seq2Seq 的 Baseline 笔记以及代码详解

通常我们基于神经网络解决机器翻译任务的流程如下:

配置环境---数据预处理---模型训练和验证---使用模型进行翻译--提交结果。

 首先,配置环境

!pip install torchtext 
!pip install jieba
!pip install sacrebleu
  • torchtext :是一个用于自然语言处理(NLP)任务的库,它提供了丰富的功能,包括数据预处理、词汇构建、序列化和批处理等,特别适合于文本分类、情感分析、机器翻译等任务

  • jieba是一个中文分词库,用于将中文文本切分成有意义的词语

  • sacrebleu:用于评估机器翻译质量的工具,主要通过计算BLEU(Bilingual Evaluation Understudy)得分来衡量生成文本与参考译文之间的相似度。

这里需要安装 spacy ,它用于英文的 tokenizer(分词,就是将句子、段落、文章这种长文本,分解为以字词为单位的数据结构,方便后续的处理分析工作。

  • spacy:是一个强大的自然语言处理库,支持70+语言的分词与训练。

第一次先使用魔塔来安装

打开魔塔的GPU环境,在终端中查看spacy的版本。

pip show spacy

然后我们从该路径下:https://github.com/explosion/spacy-models/releases 安装对应版本的 en_core_web_trf 语言包

可以看到我的 en_core_web_trf 3.7.3 版本的要求 spaCy >=3.7.2,<3.8.0,刚好满足我的 3.7.5的 spacy!

接下来下载第一个包,下载完成后,放入dataset中。(dataset是官方给出的数据集,下载下来直接拖入MT中,然后进行解压。解压代码:unzip dataset.zip)

由于这个包过大,所以我先尝试用的是版本低一点的。

接下来安装英文语言包

!p install -U pip setuptools wheel -i https://pypi.tuna.tsinghua.edu.cn/simple
!pip install -U 'spacy[cuda12x]' -i https://pypi.tuna.tsinghua.edu.cn/simple

!pip install ../dataset/en_core_web_sm-3.7.1-py3-none-any.whl

(原代码是:!pip install ../dataset/en_core_web_trf-3.7.3-py3-none-any.whl)

然后,进行数据预处理

# 定义tokenizer
en_tokenizer = get_tokenizer('spacy', language='en_core_web_trf')
zh_tokenizer = lambda x: list(jieba.cut(x))  # 使用jieba分词
  • en_tokenizer 使用的是 spaCy 库的 en_core_web_trf 模型,预训练的英文字典和分词模型。
  • zh_tokenizer 使用的是jieba库,基于HMM的中文分词工具。它将输入文本作为参数,并返回一个包含每个词语的列表。
# 读取数据函数
def read_data(file_path: str) -> List[str]:
    with open(file_path, 'r', encoding='utf-8') as f:
        return [line.strip() for line in f]

 用于读取指定文件中的数据,并将每一行的数据去掉首尾空白字符后返回为一个字符串列表。

  • -> List[str] 表示函数的返回类型是一个字符串列表 List[str]
  • with open(file_path, 'r', encoding='utf-8') as f:     使用 with 语句打开文件,这种方式可以确保文件使用完毕后自动关闭。

return [line.strip() for line in f]

  • 这是一个列表推导式,用于生成一个新的列表。
  • for line in f 表示对文件对象 f 中的每一行进行迭代。
  • line.strip() 去掉每一行的首尾空白字符(包括空格、制表符、换行符等)。
  • 最终将处理后的每一行组成一个列表,并作为函数的返回值。
# 数据预处理函数
def preprocess_data(en_data: List[str], zh_data: List[str]) -> List[Tuple[List[str], List[str]]]:
    processed_data = []
    for en, zh in zip(en_data, zh_data):
        en_tokens = en_tokenizer(en.lower())[:MAX_LENGTH]
        zh_tokens = zh_tokenizer(zh)[:MAX_LENGTH]
        if en_tokens and zh_tokens:  # 确保两个序列都不为空
            processed_data.append((en_tokens, zh_tokens))
    return processed_data

定义这个函数的目的是将原始的英文和中文句子数据进行预处理,包括将英文句子转换为小写截取长度,以及确保英文和中文句子都有至少一个单词,以便于后续的模型训练和应用。

  1. 函数接受两个参数:en_data (一个英文句子列表) 和 zh_data (一个中文句子列表)。这两个列表应该是一一对应的,即每个英文句子都有一个对应的中文句子。
  2. 函数返回一个 List[Tuple[List[str], List[str]]] 类型的数据,也就是一个元组列表,每个元组包含两个列表:   第一个列表是经过预处理的英文单词列表;第二个列表是经过预处理的中文单词列表。
  3. 在函数内部,它遍历 en_datazh_data 两个列表,对每对英文和中文句子进行如下操作:

  • 使用 en_tokenizer 函数将英文句子转换为小写,并截取前 MAX_LENGTH 个单词,得到英文单词列表 en_tokens
  • 使用 zh_tokenizer 函数将中文句子转换为中文单词列表 zh_tokens,同样也截取前 MAX_LENGTH 个单词。
  • 检查 en_tokens 和 zh_tokens 是否都不为空(即都有至少一个单词),如果是,则将这对英文和中文单词列表组成一个元组,并添加到 processed_data 列表中。

4.最终,该函数返回 processed_data 列表,其中包含了经过预处理的英文和中文句子对。未完待续。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值