手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

大資料文摘發表於2018-12-27


手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

大資料文摘授權轉載自資料派THU

作者:Prateek Joshi

翻譯:王威力

校對:丁楠雅

TextRank 演算法是一種用於文字的基於圖的排序演算法,通過把文字分割成若干組成單元(句子),構建節點連線圖,用句子之間的相似度作為邊的權重,通過迴圈迭代計算句子的TextRank值,最後抽取排名高的句子組合成文字摘要。本文介紹了抽取型文字摘要演算法TextRank,並使用Python實現TextRank演算法在多篇單領域文字資料中抽取句子組成摘要的應用。

介紹

文字摘要是自然語言處理(NLP)的應用之一,一定會對我們的生活產生巨大影響。隨著數字媒體的發展和出版業的不斷增長,誰還會有時間完整地瀏覽整篇文章、文件、書籍來決定它們是否有用呢?值得高興的是,這項技術已經在這裡了。

你有沒有用過inshorts這個手機app?它是一個創新的新聞app,可以將新聞文章轉化成一篇60字的摘要,這正是我們將在本文中學習的內容——自動文字摘要。

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

自動文字摘要是自然語言處理(NLP)領域中最具挑戰性和最有趣的問題之一。它是一個從多種文字資源(如書籍、新聞文章、部落格帖子、研究類論文、電子郵件和微博)生成簡潔而有意義的文字摘要的過程。

由於大量文字資料的可獲得性,目前對自動文字摘要系統的需求激增。

通過本文,我們將探索文字摘要領域,將瞭解TextRank演算法原理,並將在Python中實現該演算法。上車,這將是一段有趣的旅程!

目錄

一、文字摘要方法

二、TextRank演算法介紹

三、問題背景介紹

四、TextRank演算法實現

五、下一步是什麼?

一、文字摘要方法


手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

早在20世紀50年代,自動文字摘要已經吸引了人們的關注。在20世紀50年代後期,Hans Peter Luhn發表了一篇名為《The automatic creation of literature abstract》的研究論文,它利用詞頻和片語頻率等特徵從文字中提取重要句子,用於總結內容。

參考連結:

http://courses.ischool.berkeley.edu/i256/f06/papers/luhn58.pdf

另一個重要研究是由Harold P Edmundson在20世紀60年代後期完成,他使用線索詞的出現(文字中出現的文章題目中的詞語)和句子的位置等方法來提取重要句子用於文字摘要。此後,許多重要和令人興奮的研究已經發表,以解決自動文字摘要的挑戰。

參考連結:

http://courses.ischool.berkeley.edu/i256/f06/papers/luhn58.pdf

文字摘要可以大致分為兩類——抽取型摘要和抽象型摘要:

  • 抽取型摘要:這種方法依賴於從文字中提取幾個部分,例如短語、句子,把它們堆疊起來建立摘要。因此,這種抽取型的方法最重要的是識別出適合總結文字的句子。

  • 抽象型摘要:這種方法應用先進的NLP技術生成一篇全新的總結。可能總結中的文字甚至沒有在原文中出現。

本文,我們將關注於抽取式摘要方法。

二、TextRank演算法介紹

在開始使用TextRank演算法之前,我們還應該熟悉另一種演算法——PageRank演算法。事實上它啟發了TextRank!PageRank主要用於對線上搜尋結果中的網頁進行排序。讓我們通過一個例子快速理解這個演算法的基礎。

PageRank演算法簡介:

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

圖 1 PageRank演算法

假設我們有4個網頁——w1,w2,w3,w4。這些頁面包含指向彼此的連結。有些頁面可能沒有連結,這些頁面被稱為懸空頁面。

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

  • w1有指向w2、w4的連結

  • w2有指向w3和w1的連結

  • w4僅指向w1

  • w3沒有指向的連結,因此為懸空頁面

為了對這些頁面進行排名,我們必須計算一個稱為PageRank的分數。這個分數是使用者訪問該頁面的概率。

為了獲得使用者從一個頁面跳轉到另一個頁面的概率,我們將建立一個正方形矩陣M,它有n行和n列,其中n是網頁的數量。

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

矩陣中得每個元素表示從一個頁面連結進另一個頁面的可能性。比如,如下高亮的方格包含的是從w1跳轉到w2的概率。

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

如下是概率初始化的步驟:

1. 從頁面i連線到頁面j的概率,也就是M[i][j],初始化為1/頁面i的出連結總數wi 

2. 如果頁面i沒有到頁面j的連結,那麼M[i][j]初始化為0

3. 如果一個頁面是懸空頁面,那麼假設它連結到其他頁面的概率為等可能的,因此M[i][j]初始化為1/頁面總數

因此在本例中,矩陣M初始化後如下:

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

最後,這個矩陣中的值將以迭代的方式更新,以獲得網頁排名。

三、TextRank演算法

現在我們已經掌握了PageRank,讓我們理解TextRank演算法。我列舉了以下兩種演算法的相似之處:

  • 用句子代替網頁

  • 任意兩個句子的相似性等價於網頁轉換概率

  • 相似性得分儲存在一個方形矩陣中,類似於PageRank的矩陣M

TextRank演算法是一種抽取式的無監督的文字摘要方法。讓我們看一下我們將遵循的TextRank演算法的流程:

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

1. 第一步是把所有文章整合成文字資料

2. 接下來把文字分割成單個句子

3. 然後,我們將為每個句子找到向量表示(詞向量)。

4. 計算句子向量間的相似性並存放在矩陣中

5. 然後將相似矩陣轉換為以句子為節點、相似性得分為邊的圖結構,用於句子TextRank計算。

6. 最後,一定數量的排名最高的句子構成最後的摘要。

讓我們啟動Jupyter Notebook,開始coding!

備註:如果你想了解更多圖論知識,我推薦你參考這篇文章

https://www.analyticsvidhya.com/blog/2018/09/introduction-graph-theory-applications-python/

三、問題背景介紹

作為一個網球愛好者,我一直試圖通過對儘可能多的網球新聞的閱讀瀏覽來使自己隨時瞭解這項運動的最新情況。然而,事實證明這已經是一項相當困難的工作!花費太多的資源和時間是一種浪費。

因此,我決定設計一個系統,通過掃描多篇文章為我提供一個要點整合的摘要。如何著手做這件事?這就是我將在本教程中向大家展示的內容。我們將在一個爬取得到的文章集合的文字資料集上應用TextRank演算法,以建立一個漂亮而簡潔的文章摘要。

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

請注意:這是一個單領域多文字的摘要任務,也就是說,我們以多篇文章輸入,生成的是一個單要點摘要。本文不討論多域文字摘要,但您可以自己嘗試一下。

資料集下載連結:

https://s3-ap-south-1.amazonaws.com/av-blog-media/wp-content/uploads/2018/10/tennis_articles_v4.csv

四、TextRank演算法實現

所以,不用再費心了,開啟你的Jupyter Notebook,讓我們實現我們迄今為止所學到的東西吧!

1. 匯入所需的庫

首先匯入解決本問題需要的庫

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

2. 讀入資料

現在讀取資料,在上文我已經提供了資料集的下載連結。

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

3. 檢查資料

讓我們快速瞭解以下資料。

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

資料集有三列,分別是‘article_id’,‘article_text’,和‘source’。我們對‘article_text’列的內容最感興趣,因為它包含了文章的文字內容。讓我們列印一些這個列裡的變數的值,具體看看它們是什麼樣。

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

輸出:

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

現在我們有兩種選擇,一個是總結單個文章,一個是對所有文章進行內容摘要。為了實現我們的目的,我們繼續後者。

4. 把文字分割成句子

下一步就是把文章的文字內容分割成單個的句子。我們將使用nltk庫中的sent_tokenize( )函式來實現。

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

列印出句子列表中的幾個元素。

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

輸出:

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

5. 下載GloVe詞向量

GloVe詞向量是單詞的向量表示。這些詞向量將用於生成表示句子的特徵向量。我們也可以使用Bag-of-Words或TF-IDF方法來為句子生成特徵,但這些方法忽略了單詞的順序,並且通常這些特徵的數量非常大。

我們將使用預訓練好的Wikipedia 2014 + Gigaword 5 (補充連結)GloVe向量,檔案大小是822 MB。

GloVe詞向量下載連結:

https://nlp.stanford.edu/data/glove.6B.zip

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

讓我們提取詞向量:

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

現在我們在字典中儲存了400000個不同術語的詞向量。

6. 文字預處理

儘可能減少文字資料的噪聲是一個好習慣,所以我們做一些基本的文字清洗(包括移除標點符號、數字、特殊字元,統一成小寫字母)。

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

去掉句子中出現的停用詞(一種語言的常用詞——is,am,of,in等)。如果尚未下載nltk-stop,則執行以下程式碼行:

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

現在我們可以匯入停用詞。

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

接下來定義移除我們的資料集中停用詞的函式。

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

我們將在GloVe詞向量的幫助下用clean_sentences(程式中用來儲存句子的列表變數)來為我們的資料集生成特徵向量。

7. 句子的特徵向量

現在,來為我們的句子生成特徵向量。我們首先獲取每個句子的所有組成詞的向量(從GloVe詞向量檔案中獲取,每個向量大小為100個元素),然後取這些向量的平均值,得出這個句子的合併向量為這個句子的特徵向量。

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

8. 相似矩陣準備

下一步是找出句子之間的相似性,我們將使用餘弦相似性來解決這個問題。讓我們為這個任務建立一個空的相似度矩陣,並用句子的餘弦相似度填充它。

首先定義一個n乘n的零矩陣,然後用句子間的餘弦相似度填充矩陣,這裡n是句子的總數。

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

將用餘弦相似度計算兩個句子之間的相似度。

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

用餘弦相似度初始化這個相似度矩陣。

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

9. 應用PageRank演算法 

在進行下一步之前,我們先將相似性矩陣sim_mat轉換為圖結構。這個圖的節點為句子,邊用句子之間的相似性分數表示。在這個圖上,我們將應用PageRank演算法來得到句子排名。

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

10. 摘要提取

最後,根據排名提取前N個句子,就可以用於生成摘要了。

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

手把手 | 基於TextRank演算法的文字摘要(附Python程式碼)

現在我們實現了一個棒極了、整齊的、簡潔、有用的文章總結!

五、下一步是什麼?

自動文字摘要是一個熱門的研究課題,在本文中我們僅僅討論了冰山一角。展望未來,我們將探索抽象文字摘要技術,其中深度學習扮演著重要的角色。此外,我們還可以研究下面的文字摘要任務:

1. 問題導向:

  • 多領域文字摘要

  • 單個文件的摘要

  • 跨語言文字摘要

    (文字來源是一種語言,文字總結用另一種語言)

2. 演算法導向:

  • 應用RNN和LSTM的文字摘要

  • 應用加強學習的文字摘要

  • 應用生成對抗神經網路(GAN)的文字摘要

後記

我希望這篇文章能幫助你理解自動文字摘要的概念。它有各種各樣的應用案例,並且已經產生了非常成功的應用程式。無論是在您的業務中利用,還是僅僅為了您自己的知識,文字摘要是所有NLP愛好者都應該熟悉的方法。 

我將在以後的文章中嘗試使用高階技術介紹抽象文字摘要技術。同時,請隨時使用下面的評論部分讓我知道你對這篇文章的想法或任何問題。

資料集下載連結:

https://s3-ap-south-1.amazonaws.com/av-blog-media/wp-content/uploads/2018/10/tennis_articles_v4.csv

演算法程式碼連結:

https://github.com/prateekjoshi565/textrank_text_summarization

相關報導:

https://www.analyticsvidhya.com/blog/2018/11/introduction-text-summarization-textrank-python/

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31562039/viewspace-2286669/,如需轉載,請註明出處,否則將追究法律責任。

相關文章