通常我们基于神经网络解决机器翻译任务的流程如下:
配置环境---数据预处理---模型训练和验证---使用模型进行翻译--提交结果。
首先,配置环境
!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 spac
y
然后我们从该路径下: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
定义这个函数的目的是将原始的英文和中文句子数据进行预处理,包括将英文句子转换为小写、截取长度,以及确保英文和中文句子都有至少一个单词,以便于后续的模型训练和应用。
- 函数接受两个参数:
en_data
(一个英文句子列表) 和zh_data
(一个中文句子列表)。这两个列表应该是一一对应的,即每个英文句子都有一个对应的中文句子。 - 函数返回一个
List[Tuple[List[str], List[str]]]
类型的数据,也就是一个元组列表,每个元组包含两个列表: 第一个列表是经过预处理的英文单词列表;第二个列表是经过预处理的中文单词列表。 -
在函数内部,它遍历
en_data
和zh_data
两个列表,对每对英文和中文句子进行如下操作:
- 使用
en_tokenizer
函数将英文句子转换为小写,并截取前MAX_LENGTH
个单词,得到英文单词列表en_tokens
。 - 使用
zh_tokenizer
函数将中文句子转换为中文单词列表zh_tokens
,同样也截取前MAX_LENGTH
个单词。 - 检查
en_tokens
和zh_tokens
是否都不为空(即都有至少一个单词),如果是,则将这对英文和中文单词列表组成一个元组,并添加到processed_data
列表中。
4.最终,该函数返回 processed_data
列表,其中包含了经过预处理的英文和中文句子对。未完待续。。。