Text Summarization文本摘要與注意力機制

引言:

本文的路線:從文本摘要的需求引出Seq2Seq->Encoder->Decoder,由於長文本,所以又引出了Attention機制。

什麼是NLP中的文本摘要

自動文本摘要是在保持關鍵信息內容和整體含義的同時,生成簡潔流暢的摘要的任務。文本摘要目前大致可以分為抽取式與生成式兩種類型:

1. Extractive Summarization:根據詞語重要性、句子重要性排序,抽取出重要度高的句子,從而形成摘要。主要是對文本的選擇,算法過程相對更容易,但是對於複雜的文本時,很難僅僅通過選擇文本來形成摘要,如小說。

2. Abstractive Summarization:過程更為複雜,但生成能力更強,可認為有一定的概括能力。

Extractive Summarization

由圖可以看出,這種方法提取的內容語句來自於原文。

Abstractive Summarization

由圖可以看出,這種方法提取的內容語句可能不存在於原文。

Seq2Seq模型

Seq2Seq模型可以處理一切連續型信息,包括情感分類,機器翻譯,命名實體識別等。

機器翻譯任務中,輸入是連續文本序列,輸出也是連續文本序列。

2. 命名實體識別中,輸入是連續文本序列,輸出是連續的標籤信息。

所以,我們可以利用Seq2Seq模型,通過輸入一段長文本,輸出短的摘要,實現文本摘要功能。下圖是典型的Seq2Seq模型架構:

通常我們可以選擇RNNs網絡的變體GRU或者LSTM,這是因為它們能夠通過克服梯度消失的問題來捕獲長期依賴性。

Encoder編碼器

LSTM中的Encoder讀取整個輸入序列,其中每個時間step上,都會有一個字輸入編碼器。然後,他在每個時間step上處理信息,並捕獲輸入序列中存在的上下文信息。

上一個時間step的隱藏層h1與記憶單元層c1將會用來初始化Decoder。

Decoder解碼器

Decoder是LSTM結構的另一部分。它逐字讀取整個目標序列,並以一個時間步長預測相同的序列偏移量。解碼器可以在給定前一個單詞的情況下預測序列中的下一個單詞。解碼器的初始輸入是編碼器最後一步的結果。

在將整個目標序列放入解碼器前,還需將[start] 與 [end]這兩個特殊的tokens加入序列中,告知模型的開始與結束。模型通過輸入的[start]開始預測第一個詞,而[end]則表示整個句子的結束。

Deocder的工作流程

假設輸入序列為[x1,x2,x3,x4],將其編碼成內部固定長度的向量。下圖顯示了每一個time step下Decoder是如何工作的。

推理部分

下圖是整個Encoder-Decode的結構。通過上面的理解,我覺得這個圖非常清晰。

Encoder整個輸入序列,並且用Encoder最後一個狀態結果來初始化Decoder。將[start]作為輸入傳遞給解碼器Decoder。使用通過Encoder初始化過的Decoder運行一個time stpe。輸出將是下一個單詞的概率,將選擇概率最大的單詞。這個預測的單詞將會在下一時間Step中作為輸入。並且通過當前狀態更新內部參數。重複步驟3-5,直到生成[end]或達到目標序列的最大長度。

Encoder-Decoder結構的侷限性

Encoder將整個輸入序列轉為固定的長度,但是當序列很長的時候,Encoder將會很難記住整個序列的內容,無法將所有必要信息準確的編碼到固定長度。但是,我們需要關注序列中所有的內容麼,不需要。

注意力機制

為了解決長句子的問題,注意力機制出現在人們的視野。注意力機制為對結果重要的部分添加高的權重,以保留主要信息。舉個例子:

需要編碼的序列[x1,x2,x3,x4,x5,x6,x7]
Source sequence: “Which sport do you like the most?需要解碼的序列[y1,y2,y3]
Target sequence: I love cricket.

我們可以判斷,y1[I]與x4[you]有關,而y2[love]則與x5[like]有關。所以,相比記住序列中的所有單詞,不如增加對目標序列重要部分的權重,忽視低權重的部分。

Global Attention and Local Attention

編碼器的隱藏層中,所有部分都參與attention計算上下文。

編碼器的隱藏層中,僅有部分參與attention計算上下文。

本文最終採用全局注意力機制。(只是添加了注意力機制,編碼的固定長度依然需要固定。所以實戰中需要通過數據確定一個合適的長度數值。短了無法表達文本內容,長了會造成計算資源浪費。)

實戰

我們的目標是為亞馬遜美食評論生成文本摘要。(這裡我只提取了我覺得有用的部分)

數據表述

這些評論通常很長而且具有可描述性。數據集下載:kaggleData。數據涵蓋了超過10年的時間,包括截至2012年10月的所有〜500,000條評論。這些評論包括產品,用戶信息,評級,純文本評論和摘要。它還包括來自所有其他亞馬遜類別的評論。

數據處理

由於評論文本和摘要中涉及的預處理步驟略有不同,因此我們需要定義兩個不同的函數來預處理評論和摘要。

評論文本處理

將所有字母小寫;移除HTML標籤;Contraction mapping;移除(‘s);刪除括號內的內容(覺得括號裡面的內容解釋說明不重要);消除標點符號和特殊字符;刪除停用詞;刪除低頻詞;

摘要文本處理

為摘要文本添加[start]和[end]。

數據分佈

通過數據統計,可以看到摘要與文本數據的長度分佈。通過數據可視化,我們可以將評論文本的長度限定在80,而摘要的長度限定在10。

建立Tokenizer

通過分詞器生成詞彙表,並將單詞文本序列轉為數值序列,方便計算機計算。

模型建立

我們可以選擇是否讓LSTM在每個時間步都會生成隱藏狀態h和記憶單元狀態c。選擇LSTM是否僅生成最後一個時間步的隱藏狀態h和記憶單元狀態c。選擇LSTM相互堆疊提高模型效果。選擇雙向LSTM,可以雙向處理文本數據,獲取更加豐富的上下文信息。使用beam search strategy代替貪婪方法argmax。根據BLEU分數評估模型的性能。可以選擇指針生成網絡,因為整數序列採用獨熱編碼的方式,所以損失函數採用了稀疏交叉熵,對內存友好。

數學理解注意力機制

1. 編碼器為源文本序列每一個時間步j都生成了一個隱藏狀態值hj。

2. 相似的工作,解碼器為目標文本每一個時間步i都生成了隱藏狀態值si。

3. alignment score: e_ij。用這個分數表示源文本中的第j步單詞與目標文本中第i步單詞的關聯度。可以用hj與si來計算這個分數值

根據所使用的得分函數的類型,有不同類型的注意力機制。這裡列舉一些流行的注意力機制:

4. 使用softmax函數對注意力參數的值進行歸一化。

5. 計算注意力權重 a_ij與編碼器hj的隱藏狀態乘積的線性總和,以產生注意力上下文向量Ci。

6. 將注意力上一下文向量Ci與目標隱藏層向量si級聯以產生新的注意力隱藏層向量Si。

7. 將注意力隱藏層向量傳入密集層產生yi。

英文原文:Comprehensive Guide to Text Summarization using Deep Learning in Python
公眾號【深度學習視覺】整理