N9 - seq2seq翻译实战使用Pytorch实现

前期准备

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值