- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍖 原作者:K同学啊
前期准备
1. 创建语言类
定义两个常量SOS_token和EOS_token,分别表示序列的开始与结束,然后创建语言类方便对语料库进行操作。
- word2index 将单词映射到索引
- word2count 记录单词出现的次数
- index2word 将索引映射到单词
- n_words 单词数量,初始值为2,因为序列的开始和结束单词已经被添加
- addSentence方法: 用于向语言类对象添加句子,它会调用addWord方法将句子中的每个单词添加到语言类的对象中。
- addWord方法: 将单词添加到word2index,word2count,index2word字典中,然后对n_words进行更新。如果单词已经存在于word2index中,则会将word2count对应的计数器+1
SOS_token = 0
EOS_token = 1
class Lang:
def __init__(self, name):
self.name = name
self.word2index = {
}
self.word2count = {
}
self.index2word = {
0: 'SOS', 1: 'EOS'}
self.n_words = 2
def addSentence(self, sentence):
for word in sentence.split(' '):
self.addWord(word)
def addWord(self, word):
if word not in self.word2index:
self.word2index[word] = self.n_words
self.word2count[word] = 1
self.index2word[self.n_words] = word
self.n_words += 1
else:
self.word2count[word] += 1
2. 编写文本处理函数
import re
import unicodedata
# 使用unicodedata模块,通过Normalize方法将字符串s转换为unicode规范化形式NFD
# 使用条件过滤语句过滤掉了uncodedata.category(c) 为'Mn'的字符
# 剩下的字符通过join组成了一个新的字符串
def unicodeToAscii(s):
return ''.join(c for c in unicodedata.normalize('NFD', s) if unicodedata.category(c) != 'Mn')
# 将字符串转小写,并去除首尾空格,随后字符串输入unicodeToAscii函数
# 通过正则表达式替换,将句子中的标点符号前添加一个空格
# 将非字母替换为空格
# 最后返回处理后的字符串s
def normalizeString(s):
s = unicodeToAscii(s.lower().strip())
s = re.sub(r"([.!?])", r" \1", s)
s = re.sub(r"[^a-zA-Z.!?]+", r" ", s)
return s
3. 文件读取函数
def readLangs(lang1, lang2, reverse=False):
print('Reading lines...')
# 以行为单位读取文件
lines = open('data/%s-%s.txt' %(lang1, lang2), encoding='utf-8').read().strip().split('\n')
# 每行放入一个列表中
# 一个列表中有两个元素,lang1语言文本和lang2语言文本
pairs = [[normalizeString(s) for s in l.split('\t')] for l in lines]
# 创建lang实例
if reverse:
pairs = [list(reversed(p)) for p in pairs]
input_lang = Lang(long2)
output_lang = Lang(lang1