最近因為要做一個title壓縮的任務,所以調研了一些text summary的方法。
text summary 一般分為抽取式和生成式兩種。前者一般是從原始的文本中抽取出重要的word or sentence,然后按照一定的語法或者句法進行組合,從而對原始的文本進行壓縮。再文本摘要的早期,基本都是這個思路,代表性的方法是textrank。所謂生成式的方法,就是試圖讓機器理解原始的文本,從而自己歸納出原始文本的摘要,給出的結果(詞語或者句子)可能是原始文本中沒有出現過的,這也是其與抽取式的方法最大的不同之處。
隨着最近幾年深度學習的大行其道,生成式的方法的研究也逐漸多了起來。其實最主流的思路就是使用基於深度學習的seq2seq框架。說起seq2seq就不得不提著名的nmt(nerual machine translation,神經機器翻譯),其基本也是基於seq2seq框架的,一般分為encoder和decoder,最近幾年流行在基本的seq2seq框架上加上attention機制(注意力機制),一般可以顯著提高translation的質量。
廢話了這么多,本文是對於google nmt 官方github repo 實驗的一個踩坑記錄。基本不做理論方面的討論,主要討論記錄一些實驗結果。
1. google nmt 官方 github 地址:nmt
2. clone repo to local,這個按照教程做就可以了,不表。
3. first experiment
-
教程中給出的第一個實例是越南語到英語的翻譯(Vietnamese to English),
具體如何下載數據,訓練(train)以及在測試集上推斷(infer)的腳本github上面都說的很清楚了,不表。 -
注意第一個實驗只是作為一個demo,其訓練數據只有13w+,這個對於大規模的機器翻譯真的可以說是very small
了。 -
數據的准備一般有以下部分:
- source language & target language,格式是每行一句話,source & target兩個文件每行是一一對應的,
- 還有就是需要source & target 的vocabulary(詞匯表),其中包括了該種語言盡可能多的詞匯,每行一個word(還
包括特殊的開始,結束token,unknow token) - 數據集分為三個部分,訓練集,驗證集,測試集,特別地,.vi結尾的是越南語文件,.en結尾的是英語文件
-
作者進行了普通的nmt 以及加入了attention 機制的nmt兩組實驗
-
我使用了公司四核(4*24G) RAM 的 Tesla M40 顯卡 進行train & infer(使用 nvidia-smi 查看nvidia 顯卡信息)
-
實驗結果表明在訓練數據較少的情況下,使用attention 的nmt 的翻譯質量還是比不加attention的翻譯強不少的,這個結果是
通過將二者的翻譯結果分別於參考翻譯進行粗略得到的,當然使用定量的bleu指標也可以得到一樣的結論,加入attention的nmt bleu
score 要比普通的nmt 高不少。具體結果見下圖1,2:


直觀看上去,確實是attention nmt 的翻譯質量更勝一籌。
2. second experiment
-
教程中給出的第二個實驗是德語到英語的翻譯(WMT German-English)
-
這個部分的訓練數據就比較大了,400w+行,教程中提供了train 和 infer 兩個腳本,
在下載完數據之后,我又下載了幾個pretrained de-en(德語到英語) model,但是發現
infer總是會報錯如下:
FailedPreconditionError (see above for traceback):
Attempting to use uninitialized value dynamic_seq2seq/decoder/multi_rnn_cell/cell_1/basic_lstm_cell/kernel
[[Node: dynamic_seq2seq/decoder/multi_rnn_cell/cell_1/basic_lstm_cell/kernel/read = Identity[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:0"]
(dynamic_seq2seq/decoder/multi_rnn_cell/cell_1/basic_lstm_cell/kernel)]]
-
de-en infer fail 這個問題暫時沒有找到原因。
-
de-en train from stratch 沒有問題,但是因為訓練數據巨大,所以應該需要訓練很久(幾天吧)
3. 使用nmt 做 text summary
-
text summary 在nmt的框架下,可以看做是單語言的簡化(一般的翻譯是兩個語言之間),原文是source,
summary 是target -
需要准備的訓練數據有:
- text.ori:原始的文本,每行一個文本,越多越好,需要去除一些無關詞匯
- text.sum:原始文本對應的summary文本,每行一個summary
- vocab.txt:全部的word組成的文本,包括token_start,token_end,以及unknow_token等
-
train & infer 的腳本仿照 vi-en 或者de-en來寫就行,需要顯示指定source 以及target,可以這樣寫:
--src=ori --tgt=sum
其余的參數類似指定
- 這部分的實驗,TODO
4. OTHERS
- google nmt github repo 講的非常清楚,除了代碼部分,關於nmt,attention等基礎知識也講的很清楚,值得一看,
而且它也給出了一些有價值的參考資料,可以好好閱讀一下。