自動生成文字摘要
歡迎大家關注我們的網站和系列教程:http://www.tensorflownews.com/,學習更多的機器學習、深度學習的知識!
Revolver
本文提及的主要內容有:- 什麼是文字摘要生成
- 如何從網頁上提取資料
- 如何清洗資料
- 如何構建直方圖
- 如何計算句子分數
- 如何提取分數最高的句子/摘要
在繼續往下閱讀之前,我假設你已經瞭解下面幾個方面的基礎知識:
- 正則表示式
- 自然語言處理
- 網頁爬蟲
一、什麼是文字摘要生成
生成文字摘要的過程其實就是總結文字文件中心意思
生成摘要的主要思想是找到包含整個資料集“資訊”的資料子集。這種技術在當今行業內被廣泛使用。搜尋引擎就是一個例子; 其他還包括文件摘要生成,影象收集和視訊處理。文件摘要生成演算法試圖通過查詢資訊量最大的句子來建立整個文件的代表性摘要,而在影象摘要中,計算機則試圖找到最具代表性的顯著的影象。對於監控視訊,人們可能希望從平靜的環境影像中提取出重要事件。
自動摘要有兩種通用方法:提取和抽象。
二、如何從網頁上提取資料?
第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’)
第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
現在你可以看到我們提取出來的內容,但它看起來有點醜。我們使用BeautifulSoup來解析文件, 並以漂亮的方式來呈現文字。我還使用了prettify函式來使html語法看起來更美觀。
print(soup.prettify)
注意:維基百科中的大多數文章都是在<p>標籤下編寫的,但不同的網站可能採取不同的方式。例如,一些網站會把文字內容寫在<div>標籤下。
text = “”
for paragraph in soup.find_all(‘p’):
text += paragraph.text
print(text)
三、如何清洗資料
資料清洗指的是對資料集,資料表或資料庫中的所有資料,檢測並糾正(或刪除)損壞的或不準確的記錄的過程,也即識別資料中不完整,不正確,不準確或不相關的部分,然後替換,修改,或刪除這部分髒資料。
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()函式將大段的文字分解為句子
stop_words #list
四、如何構建直方圖
構建一個直方圖可以幫助你直觀地發現文章中比較特別的單詞。例如“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等)
五、如何計算句子分數
第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]
六、檢視句子得分
七、如何提取分數最高的句子作為簡短摘要
使用heapq從文章中找到得分最高的七個句子。
best_sentences = heapq.nlargest(7,sent2score,key=sent2score.get)
for sentences in best_sentences:
print(sentences,’\n’)
關於Artificial Neural Network這篇文章七條概括得最好的句子
原文連結
https://towardsdatascience.com/text-summarization-96079bf23e83
Github原始碼連結
https://github.com/mohitsharma44official/Text--Summarization