自動生成文本摘要

自動生成文本摘要

譯者 | Revolver

導讀:這篇文章介紹的主要內容是關於自動生成文本摘要。我們要嘗試讓計算機為我們提取一篇文章的重要信息,並用一句話概括出來。

本文提及的主要內容有:

  • 什麼是文本摘要生成
  • 如何從網頁上提取數據
  • ·如何清洗數據
  • 如何構建直方圖
  • ·如何計算句子分數
  • 如何提取分數最高的句子/摘要

在繼續往下閱讀之前,我假設你已經瞭解下面幾個方面的基礎知識:

  • 正則表達式
  • 自然語言處理
  • 網頁爬蟲

1. 什麼是文本摘要生成

生成文本摘要的過程其實就是總結文本文檔中心意思的過程,目的是創建包含原始文檔主要內容的摘要。

生成摘要的主要思想是找到包含整個數據集"信息"的數據子集。這種技術在當今行業內被廣泛使用。搜索引擎就是一個例子; 其他還包括文檔摘要生成,圖像收集和視頻處理。文檔摘要生成算法試圖通過查找信息量最大的句子來創建整個文檔的代表性摘要,而在圖像摘要中,計算機則試圖找到最具代表性的顯著的圖像。對於監控視頻,人們可能希望從平靜的環境影像中提取出重要事件。

自動摘要有兩種通用方法:提取和抽象。

2. 如何從網頁上提取數據?

第1步:導入庫/包

Beautiful Soup(bs)是一個Python庫,用於從HTML和XML文件中提取數據。你可以把它和你最喜歡的解析器一起搭配使用,它們一起提供了一種符合我們習慣的導航,搜索和修改解析樹的方法。這通常可以節省程序員數小時或數天的工作量。

Urllib是一個集合多個URL處理模塊的軟件包:

urllib.request 用於打開url鏈接並讀取內容

urllib.error 包含由urllib.request拋出的異常值

urllib.parse 用於解析URL

urllib.robotparser用於解析 robots.txt 文件

re模塊提供了類似於在Perl語言裡的正則表達式匹配操作功能。

nltk是一個幫助構建處理人類語言數據的Python程序的強大平臺。它為 50多種語料庫和詞法資源提供了易於使用的接口(如WordNet),還提供了一套用於分類,分詞,詞幹提取,標註,解析和語義推理的文本處理工具庫。

heapq這個模塊提供了一個堆隊列算法的實現,也稱為優先隊列算法。

import bs4 as bs
import urllib.request
import re
import nltk
import heapq

接下來檢查一下數據包中的stopwords包(停用詞)和punkt包是否更新到最新。

nltk.download('stopwords')
nltk.download('punkt')
自動生成文本摘要

圖1

第2步:提取數據

這裡選用了維基上的 Artificial Neural Network 這個頁面為例子來說明。你可以根據需要選擇其他任何文章。

page = urllib.request.urlopen("https://en.wikipedia.org/wiki/Artificial_neural_network").read()
soup = bs.BeautifulSoup(page,'lxml')
print(page) #print the page
自動生成文本摘要

圖2

現在你可以看到我們提取出來的內容,但它看起來有點醜。我們使用BeautifulSoup來解析文檔, 並以漂亮的方式來呈現文本。我還使用了prettify函數來使html語法看起來更美觀。

print(soup.prettify)
自動生成文本摘要

圖3

注意:維基百科中的大多數文章都是在

標籤下編寫的,但不同的網站可能採取不同的方式。例如,一些網站會把文字內容寫在

標籤下。
text = ""
for paragraph in soup.find_all('p'):
text += paragraph.text
print(text)
自動生成文本摘要

圖4

3. 如何清洗數據

數據清洗指的是對數據集,數據表或數據庫中的所有數據,檢測並糾正(或刪除)損壞的或不準確的記錄的過程,也即識別數據中不完整,不正確,不準確或不相關的部分,然後替換,修改,或刪除這部分髒數據。

text = re.sub(r'\[[0-9]*\]',' ',text)
text = re.sub(r'\s+',' ',text)
clean_text = text.lower()

clean_text = re.sub(r'\W',' ',clean_text)
clean_text = re.sub(r'\d',' ',clean_text)
clean_text = re.sub(r'\s+',' ',clean_text)
sentences = nltk.sent_tokenize(text)
stop_words = nltk.corpus.stopwords.words('english')
print(sentences)

第1行:刪除文本中由類似[1],[2]表示的所有引用(參見上面的輸出文本段)

第2行:用單個空格替換了所有額外的空格

第3行:轉換成小寫

第4,5,6行:移除所有額外的標點符號,數字,額外空格等。

第7行:使用sent_tokenize()函數將大段的文本分解為句子

自動生成文本摘要

圖5

stop_words #list
自動生成文本摘要

圖6

4. 如何構建直方圖

構建一個直方圖可以幫助你直觀地發現文章中比較特別的單詞。例如"Geoffrey Hinton is the god father of deep learning. And I love deep learning"這一句,需要計算每個不同的單詞出現在句子中的次數,例如"deep"和"learning"都出現兩次,其餘的單詞在一個句子中只出現一次。但在現實世界中,你有成千上萬條句子,要具體找出每個單詞出現多少次就需要構建直方圖來表現。

word2count = {} #line 1
for word in nltk.word_tokenize(clean_text): #line 2
if word not in stop_words: #line 3
if word not in word2count.keys():
word2count[word]=1
else:
word2count[word]+=1
for key in word2count.keys(): #line 4
word2count[key]=word2count[key]/max(word2count.values())

第1行:創建一個空字典

第2行:使用word_tokenize分詞clean _text分詞,對每個單詞循環

第3行:檢查單詞是否在stop_words中,然後再次檢查單詞是否在word2count的鍵集中,不在則把word2count [word]置為1,否則word2count [word] 加1。

第4行:計算加權直方圖(參見下面的輸出,你可以看到對每個單詞計算了權重而不是計數。 例如有 'artificial':0.3620689等)

自動生成文本摘要

圖7

5. 如何計算句子分數

第1行:創建一個空字典

第2行:對sentences中每個sentence進行循環

第3行:將sentence轉換成小寫並分詞,對每個word循環

第4行:使用if檢查word2count.keys()中是否存在該單詞

第5行:這裡我指定計算句子長度小於30的那部分,你可以根據需要更改

第6行:再次使用if-else條件,判斷如果句子不存在於sentence2keys()中,則執行 sent2score [sentence] = word2count [word],否則執行 sent2score [sentence] + = word2count [word]

# 計算句子分數
sent2score = {}
for sentence in sentences:
for word in nltk.word_tokenize(sentence.lower()):
if word in word2count.keys():
if len(sentence.split(' '))<30:
if sentence not in sent2score.keys():
sent2score[sentence]=word2count[word]
else:
sent2score[sentence]+=word2count[word]

6. 查看句子得分

自動生成文本摘要

圖8

7. 如何提取分數最高的句子作為簡短摘要

使用heapq從文章中找到得分最高的七個句子。

best_sentences = heapq.nlargest(7,sent2score,key=sent2score.get)
for sentences in best_sentences:
print(sentences,'\n')

關於Artificial Neural Network這篇文章七條概括得最好的句子

自動生成文本摘要

圖9

對深度學習感興趣,熱愛Tensorflow的小夥伴,歡迎關注我們的網站!http://www.panchuang.net 我們的公眾號:磐創AI。


分享到:


相關文章: