15Seq2Seq實(shí)戰(zhàn)語言翻譯(2)

1.加載數(shù)據(jù)

# English source data
with open("data/small_vocab_en", "r", encoding="utf-8") as f:
    source_text = f.read()

# French target data
with open("data/small_vocab_fr", "r", encoding="utf-8") as f:
    target_text = f.read()

2.查看數(shù)據(jù)

# 統(tǒng)計(jì)英文語料數(shù)據(jù)
sentences = source_text.split('\n')
word_counts = [len(sentence.split()) for sentence in sentences]
# 統(tǒng)計(jì)法語語料數(shù)據(jù)
sentences = target_text.split('\n')
word_counts = [len(sentence.split()) for sentence in sentences]

3.數(shù)據(jù)預(yù)處理

3.1 構(gòu)造字典

# 構(gòu)造英文詞典
source_vocab = list(set(source_text.lower().split()))
# 構(gòu)造法語詞典
target_vocab = list(set(target_text.lower().split()))

3.2 增加特殊字符

# 增加特殊編碼
SOURCE_CODES = ['<PAD>', '<UNK>']
TARGET_CODES = ['<PAD>', '<EOS>', '<UNK>', '<GO>']

3.3 word和id之間的映射表

# 構(gòu)造英文語料的映射表
source_vocab_to_int = {word: idx for idx, word in enumerate(SOURCE_CODES + source_vocab)}
source_int_to_vocab = {idx: word for idx, word in enumerate(SOURCE_CODES + source_vocab)}

# 構(gòu)造法語語料的映射表
target_vocab_to_int = {word: idx for idx, word in enumerate(TARGET_CODES + target_vocab)}
target_int_to_vocab = {idx: word for idx, word in enumerate(TARGET_CODES + target_vocab)}

3.4 text 轉(zhuǎn)換成 int

 # 用<PAD>填充整個(gè)序列
    text_to_idx = []
    # unk index
    unk_idx = map_dict.get("<UNK>")
    pad_idx = map_dict.get("<PAD>")
    eos_idx = map_dict.get("<EOS>")
    
    # 如果是輸入源文本
    if not is_target:
        for word in sentence.lower().split():
            text_to_idx.append(map_dict.get(word, unk_idx))
    
    # 否則,對于輸出目標(biāo)文本需要做<EOS>的填充最后
    else:
        for word in sentence.lower().split():
            text_to_idx.append(map_dict.get(word, unk_idx))
        text_to_idx.append(eos_idx)
    
    # 如果超長需要截?cái)?    if len(text_to_idx) > max_length:
        return text_to_idx[:max_length]
    # 如果不夠則增加<PAD>
    else:
        text_to_idx = text_to_idx + [pad_idx] * (max_length - len(text_to_idx))
        return text_to_idx
# 對源句子進(jìn)行轉(zhuǎn)換 Tx = 20
source_text_to_int = []
for sentence in tqdm.tqdm(source_text.split("\n")):
    source_text_to_int.append(text_to_int(sentence, source_vocab_to_int, 20, 
                                          is_target=False))

# 對目標(biāo)句子進(jìn)行轉(zhuǎn)換  Ty = 25
target_text_to_int = []
for sentence in tqdm.tqdm(target_text.split("\n")):
    target_text_to_int.append(text_to_int(sentence, target_vocab_to_int, 25, 
                                          is_target=True))

X = np.array(source_text_to_int)
Y = np.array(target_text_to_int)

# 對X和Y做One Hot Encoding
Xoh = np.array(list(map(lambda x: to_categorical(x, num_classes=len(source_vocab_to_int)), X)))
Yoh = np.array(list(map(lambda x: to_categorical(x, num_classes=len(target_vocab_to_int)), Y)))

4. 構(gòu)建模型

和上一篇介紹的一樣,encoder將輸入信息embedding轉(zhuǎn)換成稠密向量娃善,再輸入給LSTM學(xué)習(xí)成一個(gè)固定長度向量S吟税,S輸入到Decoder端生成新的序列泼各。所以模型模塊主要分為四部分:

  • 模型輸入: model_inputs
  • Encoder端: encoder_layer
  • Decoder端:輸入端decoder_layer_inputs/ 訓(xùn)練deocder_layer_train / 預(yù)測 decoder_layer_inference
  • Seq2seq模型
    具體代碼可以套用上一篇

5.模型預(yù)測與調(diào)參

epochs = 10
batch_size =128
rnn_size = 128
rnn_num_layers = 1
encoder_embedding_size = 100
decoder_embedding_size = 100
learning_rate = 0.001
#每50輪打印一次結(jié)果
display_step = 50

設(shè)置了10輪迭代谱俭,1層LSTM笙纤,encoder與decoder的嵌入詞向量維度均為100維查描,并指定每訓(xùn)練50輪打印一次結(jié)果.由于語料庫比較少突委,僅有13W條,對于語言翻譯模型這種嚴(yán)重依賴數(shù)據(jù)的模型確實(shí)有點(diǎn)少冬三。而且因?yàn)閿?shù)據(jù)集有限匀油,并沒有劃分訓(xùn)練集和測試集。


image.png

最終的LOSS在0.01左右勾笆。

如果用BiLSTM可以得到更多上下文的信息敌蚜,另外如果還加入attention,在翻譯每個(gè)單詞時(shí)會(huì)使用不同的S,這樣decoder時(shí)候匠襟,準(zhǔn)確率更高钝侠。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市酸舍,隨后出現(xiàn)的幾起案子帅韧,更是在濱河造成了極大的恐慌,老刑警劉巖啃勉,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忽舟,死亡現(xiàn)場離奇詭異,居然都是意外死亡淮阐,警方通過查閱死者的電腦和手機(jī)叮阅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泣特,“玉大人浩姥,你說我怎么就攤上這事∽茨” “怎么了勒叠?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵兜挨,是天一觀的道長。 經(jīng)常有香客問我眯分,道長拌汇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任弊决,我火速辦了婚禮噪舀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘飘诗。我一直安慰自己与倡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布疚察。 她就那樣靜靜地躺著蒸走,像睡著了一般。 火紅的嫁衣襯著肌膚如雪貌嫡。 梳的紋絲不亂的頭發(fā)上比驻,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機(jī)與錄音岛抄,去河邊找鬼别惦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛夫椭,可吹牛的內(nèi)容都是我干的掸掸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼蹭秋,長吁一口氣:“原來是場噩夢啊……” “哼扰付!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起仁讨,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤羽莺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后洞豁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盐固,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年丈挟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了刁卜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,110評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡曙咽,死狀恐怖蛔趴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情例朱,我是刑警寧澤夺脾,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布之拨,位于F島的核電站茉继,受9級(jí)特大地震影響咧叭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜烁竭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一菲茬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧派撕,春花似錦婉弹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至际跪,卻和暖如春商佛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背姆打。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工良姆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人幔戏。 一個(gè)月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓玛追,卻偏偏與公主長得像,于是被迫代替她去往敵國和親闲延。 傳聞我的和親對象是個(gè)殘疾皇子痊剖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評論 2 355