每日最新頭條.有趣資訊

文章太長不想看?ML 文本自動摘要了解一下

選自floydhub

作者Alfrick Opidi

機器之心編譯

參與:杜偉、張倩

我們在閱讀新聞報導等實時性文章時,需要快速歸納出文章的大意。但是,如果將一篇很長的文章歸納成一個能夠涵蓋原文中心思想的小段落,則需要我們耗費大量時間。本文介紹了自然語言處理中的兩種文本自動摘要生成方法——抽取式和抽象式文本摘要。這兩種方法通過計算文本中句子成分的權重來生成摘要,可以大大節省通讀全文以及歸納總結主要信息的時間,為讀者提供方便。

你是否曾將一篇冗長的文檔歸納為一個小的段落?你用了多長時間呢?手動歸納總結耗費時間、枯燥乏味。文本自動摘要可以克服此類難題,幫你輕鬆歸納出一篇文章的中心思想。

文本摘要方法能夠對冗長文本進行簡潔準確的總結,同時將重點放在傳達有用信息的章節,而又不失去文章大意。

文本自動摘要旨在將冗長文檔變成縮寫版本,若手動完成則可能非常麻煩且成本高昂。

在生成需要的摘要文本之前,機器學習算法可被訓練用以理解文檔,識別傳達重要事實和信息的章節。

使用文本摘要機器學習算法生成一篇在線新聞文章的摘要。

文本自動摘要的必要性

隨著目前數字空間中數據的爆炸式增長,而大多又是非結構化的文本數據,因而需要開發文本自動摘要工具,使人們可以輕易獲知文本大意。當前,我們可以快速訪問大量信息。但是,大多數信息冗長、無關緊要,還可能無法傳達其本意。例如,如果你想從一篇在線新聞報導中搜尋一些特定信息,你也許要吃透報導內容,花費大量時間剔除雜訊,之後才能找到自己想要了解的信息。所以,使用能夠提取有用信息並剔除無關緊要和無用數據的自動文本摘要生成器變得非常重要。文本摘要的實現可以增強文檔的可讀性,減少搜尋信息的時間,獲得更多適用於特定領域的信息。

文本自動摘要的主要類型

從廣義的角度看,自然語言處理(NLP)中有兩種文本摘要生成方法:抽取式和抽象式。

抽取式摘要(extraction-based summarization)

在抽取式摘要中,抽取一段文本中表示重點內容的單詞子集,並結合起來生成摘要。我們可以將抽取式摘要看作是一支熒光筆-從源文本中抽取主要信息。

熒光筆 = 抽取式摘要

在機器學習中,抽取式摘要通常需要衡量基本句子成分的權重,並根據權重結果生成摘要。

不同類型的算法和方法均可用於衡量句子的權重,之後根據各成分之間的關聯性和相似性進行排序-並進一步將這些成分連接起來以生成摘要。

如下例所示:

抽取式摘要

如上例所示,抽取式摘要由熒光筆標黃的單詞組成,生成摘要的語法可能不準確。

抽象式摘要

在抽象式摘要中,高級深度學習方法(advanced deep learning technique)用於解釋和縮寫原始文檔,就像人類所做的一樣。將抽象式摘要想象成一支鋼筆-它能生成或許不屬於源文檔的新句子。

鋼筆 = 抽象式摘要

由於抽象式機器學習算法能夠生成表示源文本中最重要信息的新短語和句子,所以這些抽象式算法有助於克服抽取式摘要中的語法不準確問題。

如下例所示:

抽象式摘要。

儘管抽象式文本摘要的表現更好,但開發相關算法需要複雜的深度學習技巧和語言模型。

為了獲得合理產出,抽象式摘要方法必須能夠解決諸多自然語言處理問題,如自然語言生成、語義表征和推理排序(inference permutation)。

同樣地,抽取式文本摘要方法依然大受歡迎。在本文中,我們將重點介紹抽象式文本摘要方法。

如何執行文本摘要

我們使用以下一段話展示如何執行文本摘要抽取:

我們依照以下步驟對這段話作總結,同時盡可能保留原意。

第一步:將這段話轉換成句子

首先,我們將這段話分割成相應的句子。轉換成句子的最佳方法是在句點(period)出現時提取一個句子。

第二步:文本處理

接下來,我們在文本處理中移除停止詞(那些沒有實際意義的常見詞,如「and」和「the」)、數字、標點符號以及句子中的其他特殊字元。

句子成分的過濾有助於移除冗余和不重要的信息,這些信息對文本意圖的表達或許沒有任何價值。

以下是文本處理結果:

第三步:分詞

切分各個句子,列出句子中的所有單詞。

以下是單詞列表:

第四步:評估單詞的加權出現頻率(occurrence frequency)

緊接著,我們計算所有單詞的加權出現頻率。為此,我們用每個單詞的出現頻率除以這段話中出現最多次的單詞的頻率,在這段話中出現最多的是 Peter,總共出現了三次。

下表給出了每個單詞的加權出現頻率。

第五步:用相應的加權頻率替代原句中的各個單詞,然後計算總和。

我們在文本處理步驟中已經移除了停止詞和特殊字元等無關緊要的單詞,因而它們的加權頻率為零,也就沒有必要在計算時加上。

根據所有單詞的加權頻率總和,我們可以推導出:第一個句子在整段話中的權重最大。所以,第一個句子能夠對這段話的意思作出最具代表性的總結。

此外,如果第一個句子與第三個句子(該句的權重在整段話中排第二)相結合,則可以作出更好的總結。

以上例子只是基本說明了如何在機器學習中執行抽取式文本摘要。現在,我們看看如何在創建實際摘要生成器中運用上述概念。

維基百科文章的文本摘要

讓我們動手創建一個可以簡化冗長 web 文章中信息的文本摘要生成器。為簡單起見,除了 Python 的 NLTK toolkit,我們不使用任何其他機器學習庫(machine learning library)。

以下是摘要生成器的代碼 blueprint:

依照下列步驟使用 Python 語言創建一個簡單的文本摘要生成器。

第一步:準備數據

在這個例子中,我們想總結一下這篇 Wikipedia 文章的信息,這篇文章只是對 20 世紀發生的主要事件進行概述。

為了獲取這篇文章的文本,我們將使用 Beautiful Soup 庫。

以下是抓取文章內容的代碼:

在以上代碼中,我們首先導入抓取網頁數據所必需的庫。BeautifulSoup 庫用於解析網頁內容,而 urllib library 用於連接網頁和檢索 HTML。

BeautifulSoup 將輸入文本轉化為 Unicode 字元,將輸出文本轉化為 UTF-8 字元,省去了從 web 上抓取文本時處理不同字元集編碼的麻煩。

我們使用 urllib.request 程序中的 urlopen 函數打開網頁。之後,使用 read 函數讀取所抓取的數據對象。為了解析數據,我們調用 BeautifulSoup 對象,並向它傳遞兩個參數,即 article_read 和 html.parser。

find_all 函數用於傳回 HTML 中出現的所有

元素。此外,.text 使我們只能選擇

元素中的文本。

第二步:處理數據

為盡可能確保廢棄的文本數據無噪聲,我們將執行一些基本的文本清理(text cleaning)。為協助完成這一處理過程,我們將從 NLTK 庫中導入一個停止詞列表。

我們還將引入 PorterStemmer,這是一種將單詞還原成詞根形式的算法。例如,單詞 cleaning、cleaned 和 cleaner 都可以還原成詞根 clean。

此外,我們還將創建一個包含文本中每一單詞出現頻率的字典表。我們將依次讀取文本及相應單詞,以消除所有停止詞。

之後,我們將檢查單詞是否出現在 frequency_table 中。如果一個單詞之前就在字典中,則其值更新 1。否則,如果一個單詞首次被識別到,則其值設置為 1。

例如,頻率表應如下所示:

代碼如下:

第三步:將文章分割成句子

為了將 article_content 分割成一個句子集,我們將使用 NLTK 庫中的內置方法。

第四步:確定句子的加權頻率

為了評估文本中每個句子的分數,我們將分析每個單詞的出現頻率。在這種情況下,我們將根據句子中的單詞對該句進行評分,也就是加上句子中每個重要單詞的出現頻率。

請看以下代碼:

重要的是,為了避免長句的分數必然高於短句,我們用每個句子的分數除以該句中的單詞數。

另外,為了優化字典記憶體,我們任意添加 sentence[:7],這指的是每個句子的前七個字元。但在較長的文檔中,你很可能遇到具有相同首個 n_chars 的句子,這時最好使用哈希函數(hash function)或 index 函數(index function)來處理此類極端情況(edge-cases),避免衝突。

第五步:計算句子閾值

為了進一步調整適合摘要的句子類型,我們將創建句子的平均分。借助於這個閾值,我們可以避免選擇分數低於平均分的句子。

代碼如下:

第六步:生成摘要

最後,我們擁有了所有必需的參數,因而現在可以生成文章摘要了。

代碼如下:

總結

下圖展示了創建文本摘要算法的工作流程。

以下是機器學習中簡單抽取式文本摘要生成器的完整代碼:

點擊原文中的以下按鈕在 FloydHub Notebook 上運行代碼:

在這個例子中,我們所採用的閾值是平均分的 1.5 倍。這個超參數值(hyperparameter value)在幾次試驗後為我們生成了良好的結果。當然,你可以根據自身的偏好對數值進行微調,並改進摘要生成效果。

下圖是 Wikipedia 文章的生成摘要。

使用文本摘要算法生成的 Wikipedia 文章摘要。

如你所見,運行代碼可以對冗長的 Wikipedia 文章進行總結,並簡要概述 20 世紀發生的主要事件。

儘管如此,我們還可以改進摘要生成器,使之更好地生成長篇幅文本的簡潔、精確摘要。

更多內容

當然,本文只是簡要介紹了機器學習中使用文本摘要算法所能實現的功能。

若想了解更多有關該主題,特別是抽象式文本摘要的知識,下面一些有用的資源可以為你提供幫助:

有沒有可能將兩種方法(抽象式和抽取式文本自動摘要)相結合?這是指針生成網絡(pointer generator network)的主要原理,該網絡通過結合抽取(指向)和抽象(生成)取得了最佳效果。

圖源:"Taming Recurrent Neural Networks for Better Summarization"

《WikiHow: A Large Scale Text Summarization Dataset》一文提出了一個新的大規模文本自動摘要數據集 WikiHow,該數據集包含提取自 WikiHow 在線知識庫的 230000 多篇文章。目前可用的大多數數據集的規模不足以訓練序列到序列模型,它們也許只能提供有限的摘要,並且更適合執行抽取式摘要。但是,WikiHow 數據集規模大,質量高,能夠在抽象式文本摘要中獲得最優結果。

《Pretraining-Based Natural Language Generation for Text Summarization》一文提出了一個基於序列到序列範式的獨特二階段模型。該模型同時在編碼器和解碼器側利用 BERT,並在學習過程中注重強化目標。當該模型在一些基準數據集上進行評估時,結果顯示,該方法在文本自動摘要中表現更好,尤其相較於其他傳統系統而言。

本文為機器之心編譯,轉載請聯繫本公眾號獲得授權。

------------------------------------------------

獲得更多的PTT最新消息
按讚加入粉絲團