attention-seq2seq:实现中英翻译

在我前一篇博客用attention-seq2seq模型实现了法语-英语的翻译:基于pytorch的attention-seq2seq实现机器翻译。中文与其他语言不同,不能简单使用空格分割单词建立语料库。在这篇文章将基于我前一篇博客的工程,稍微修改实现中译英,读者也可以自行修改,如增加数据集,实现中英互译等,工程已发布到我的github:https://github.com/JingBob/chn2eng-seq2seq
整体工程目录如下:
attention-seq2seq:实现中英翻译_第1张图片

废话不多说,下面讲讲代码实现。基本和之前博客的相同,这里只提一下分割中文方面改了一下。

一、数据集预处理

(1)数据集下载
先从此处下载中-英文本数据集:https://www.manythings.org/anki/,下载后发现数据集长这样:
attention-seq2seq:实现中英翻译_第2张图片
怎么多了那么多没用的东西?没事,稍稍处理下并保存:

# 下载的数据集包含一些其他信息,我们只保留前面的中文-英文对
lines = open('data/%s-%s.txt' % ("eng", "chn"), encoding='utf-8').read().strip().split('\n')
pairs = [[s for s in l.split('\t')] for l in lines]

with open("data/eng-chin.txt", "w", encoding='utf-8') as f:
    for i in pairs:
        f.write(i[0]+'\t'+i[1]+'\n')

(2)中文分割
采用结巴实现中文分割
先安装下结巴分词:

pip install jieba

在词统计的类中,要判断如果是中文,就不能用空格分词了,而要用结巴分词:

class Lang:
    def __init__(self, name):
        self.name = name
        self.word2index = {}
        self.word2count = {}
        self.index2word = {0: "SOS", 1: "EOS"}
        self.n_words = 2  # Count SOS and EOS

    def addSentence(self, sentence):
        # 如果是中文,不能用空格分词了,用结巴分词
        if self.name == "chin":
            words = jieba.cut(sentence)
        else:
            words = sentence.split(' ')
        for word in words:
            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

其他涉及到中文句子分词的地方都差不多,我已经全部改好,具体见我github的工程。

二、结果

(1)训练结果
训练了75000代,效果如下:
attention-seq2seq:实现中英翻译_第3张图片
效果不是太好,最后的损失还是比较大呀。
(2)翻译效果
打印了下翻译时的注意力权重:
attention-seq2seq:实现中英翻译_第4张图片
感觉训练得结果不太行,对于一些简单的句子可能还可以,但是稍微复杂的句子就炸了。。。
(3)优化
简单点的话就调调超参数,如learning-rate,dropout等。然后此代码是没有用mini-batch训练的,可以构造mini-batch进行训练,编码器可以试试用双头LSTM,毕竟GRU虽然训练快,但还是牺牲了点精度。

你可能感兴趣的:(NLP,nlp,gru,机器翻译,pytorch)