您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“怎么使用Python自然語(yǔ)言處理NLP創(chuàng)建摘要”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“怎么使用Python自然語(yǔ)言處理NLP創(chuàng)建摘要”吧!
應(yīng)該使用哪種總結(jié)方法
我使用提取摘要,因?yàn)槲铱梢詫⒋朔椒☉?yīng)用于許多文檔,而不必執(zhí)行大量(令人畏懼)的機(jī)器學(xué)習(xí)模型訓(xùn)練任務(wù)。
此外,提取摘要法比抽象摘要具有更好的總結(jié)效果,因?yàn)槌橄笳仨殢脑闹猩尚碌木渥樱@是一種比數(shù)據(jù)驅(qū)動(dòng)的方法提取重要句子更困難的方法。
如何創(chuàng)建自己的文本摘要器
我們將使用單詞直方圖來(lái)對(duì)句子的重要性進(jìn)行排序,然后創(chuàng)建一個(gè)總結(jié)。這樣做的好處是,你不需要訓(xùn)練你的模型來(lái)將其用于文檔。
文本摘要工作流
下面是我們將要遵循的工作流…
導(dǎo)入文本>>>>清理文本并拆分成句子>>刪除停用詞>>構(gòu)建單詞直方圖>>排名句子>>選擇前N個(gè)句子進(jìn)行提取摘要
(1) 示例文本
我用了一篇新聞文章的文本,標(biāo)題是蘋果以5000萬(wàn)美元收購(gòu)AI初創(chuàng)公司,以推進(jìn)其應(yīng)用程序。你可以在這里找到原始的新聞文章:https://analyticsindiamag.com/apple-acquires-ai-startup-for-50-million-to-advance-its-apps/
你還可以從Github下載文本文檔:https://github.com/louisteo9/personal-text-summarizer
(2) 導(dǎo)入庫(kù)
# 自然語(yǔ)言工具包(NLTK) import nltk nltk.download('stopwords') # 文本預(yù)處理的正則表達(dá)式 import re # 隊(duì)列算法求首句 import heapq # 數(shù)值計(jì)算的NumPy import numpy as np # 用于創(chuàng)建數(shù)據(jù)幀的pandas import pandas as pd # matplotlib繪圖 from matplotlib import pyplot as plt %matplotlib inline
(3) 導(dǎo)入文本并執(zhí)行預(yù)處理
有很多方法可以做到。這里的目標(biāo)是有一個(gè)干凈的文本,我們可以輸入到我們的模型中。
# 加載文本文件 with open('Apple_Acquires_AI_Startup.txt', 'r') as f: file_data = f.read()
這里,我們使用正則表達(dá)式來(lái)進(jìn)行文本預(yù)處理。我們將
(A)用空格(如果有的話…)替換參考編號(hào),即[1]、[10]、[20],
(B)用單個(gè)空格替換一個(gè)或多個(gè)空格。
text = file_data # 如果有,請(qǐng)用空格替換 text = re.sub(r'\[[0-9]*\]',' ',text) # 用單個(gè)空格替換一個(gè)或多個(gè)空格 text = re.sub(r'\s+',' ',text)
然后,我們用小寫(不帶特殊字符、數(shù)字和額外空格)形成一個(gè)干凈的文本,并將其分割成單個(gè)單詞,用于詞組分?jǐn)?shù)計(jì)算和構(gòu)詞直方圖。
形成一個(gè)干凈文本的原因是,算法不會(huì)把“理解”和“理解”作為兩個(gè)不同的詞來(lái)處理。
# 將所有大寫字符轉(zhuǎn)換為小寫字符 clean_text = text.lower() # 用空格替換[a-zA-Z0-9]以外的字符 clean_text = re.sub(r'\W',' ',clean_text) # 用空格替換數(shù)字 clean_text = re.sub(r'\d',' ',clean_text) # 用單個(gè)空格替換一個(gè)或多個(gè)空格 clean_text = re.sub(r'\s+',' ',clean_text)
(4) 將文本拆分為句子
我們使用NLTK sent_tokenize方法將文本拆分為句子。我們將評(píng)估每一句話的重要性,然后決定是否應(yīng)該將每一句都包含在總結(jié)中。
sentences = nltk.sent_tokenize(text)
(5) 刪除停用詞
停用詞是指不給句子增加太多意義的英語(yǔ)單詞。他們可以安全地被忽略,而不犧牲句子的意義。我們已經(jīng)下載了一個(gè)文件,其中包含英文停用詞
這里,我們將得到停用詞的列表,并將它們存儲(chǔ)在stop_word 變量中。
# 獲取停用詞列表 stop_words = nltk.corpus.stopwords.words('english')
(6) 構(gòu)建直方圖
讓我們根據(jù)每個(gè)單詞在整個(gè)文本中出現(xiàn)的次數(shù)來(lái)評(píng)估每個(gè)單詞的重要性。
我們將通過(guò)(1)將單詞拆分為干凈的文本,(2)刪除停用詞,然后(3)檢查文本中每個(gè)單詞的頻率。
# 創(chuàng)建空字典以容納單詞計(jì)數(shù) word_count = {} # 循環(huán)遍歷標(biāo)記化的單詞,刪除停用單詞并將單詞計(jì)數(shù)保存到字典中 for word in nltk.word_tokenize(clean_text): # remove stop words if word not in stop_words: # 將字?jǐn)?shù)保存到詞典 if word not in word_count.keys(): word_count[word] = 1 else: word_count[word] += 1
讓我們繪制單詞直方圖并查看結(jié)果。
plt.figure(figsize=(16,10)) plt.xticks(rotation = 90) plt.bar(word_count.keys(), word_count.values()) plt.show()
讓我們把它轉(zhuǎn)換成橫條圖,只顯示前20個(gè)單詞,下面有一個(gè)helper函數(shù)。
# helper 函數(shù),用于繪制最上面的單詞。 def plot_top_words(word_count_dict, show_top_n=20): word_count_table = pd.DataFrame.from_dict(word_count_dict, orient = 'index').rename(columns={0: 'score'}) word_count_table.sort_values(by='score').tail(show_top_n).plot(kind='barh', figsize=(10,10)) plt.show()
讓我們展示前20個(gè)單詞。
plot_top_words(word_count, 20)
從上面的圖中,我們可以看到“ai”和“apple”兩個(gè)詞出現(xiàn)在頂部。這是有道理的,因?yàn)檫@篇文章是關(guān)于蘋果收購(gòu)一家人工智能初創(chuàng)公司的。
(7) 根據(jù)分?jǐn)?shù)排列句子
現(xiàn)在,我們將根據(jù)句子得分對(duì)每個(gè)句子的重要性進(jìn)行排序。我們將:
刪除超過(guò)30個(gè)單詞的句子,認(rèn)識(shí)到長(zhǎng)句未必總是有意義的;
然后,從構(gòu)成句子的每個(gè)單詞中加上分?jǐn)?shù),形成句子分?jǐn)?shù)。
高分的句子將排在前面。前面的句子將形成我們的總結(jié)。
注意:根據(jù)我的經(jīng)驗(yàn),任何25到30個(gè)單詞都可以給你一個(gè)很好的總結(jié)。
# 創(chuàng)建空字典來(lái)存儲(chǔ)句子分?jǐn)?shù) sentence_score = {} # 循環(huán)通過(guò)標(biāo)記化的句子,只取少于30個(gè)單詞的句子,然后加上單詞分?jǐn)?shù)來(lái)形成句子分?jǐn)?shù) for sentence in sentences: # 檢查句子中的單詞是否在字?jǐn)?shù)字典中 for word in nltk.word_tokenize(sentence.lower()): if word in word_count.keys(): # 只接受少于30個(gè)單詞的句子 if len(sentence.split(' ')) < 30: # 把單詞分?jǐn)?shù)加到句子分?jǐn)?shù)上 if sentence not in sentence_score.keys(): sentence_score[sentence] = word_count[word] else: sentence_score[sentence] += word_count[word]
我們將句子-分?jǐn)?shù)字典轉(zhuǎn)換成一個(gè)數(shù)據(jù)框,并顯示sentence_score。
注意:字典不允許根據(jù)分?jǐn)?shù)對(duì)句子進(jìn)行排序,因此需要將字典中存儲(chǔ)的數(shù)據(jù)轉(zhuǎn)換為DataFrame。
df_sentence_score = pd.DataFrame.from_dict(sentence_score, orient = 'index').rename(columns={0: 'score'}) df_sentence_score.sort_values(by='score', ascending = False)
(8) 選擇前面的句子作為摘要
我們使用堆隊(duì)列算法來(lái)選擇前3個(gè)句子,并將它們存儲(chǔ)在best_quences變量中。
通常3-5句話就足夠了。根據(jù)文檔的長(zhǎng)度,可以隨意更改要顯示的最上面的句子數(shù)。
在本例中,我選擇了3,因?yàn)槲覀兊奈谋鞠鄬?duì)較短。
# 展示最好的三句話作為總結(jié) best_sentences = heapq.nlargest(3, sentence_score, key=sentence_score.get)
讓我們使用print和for loop函數(shù)顯示摘要文本。
print('SUMMARY') print('------------------------') # 根據(jù)原文中的句子順序顯示最上面的句子 for sentence in sentences: if sentence in best_sentences: print (sentence)
到此,相信大家對(duì)“怎么使用Python自然語(yǔ)言處理NLP創(chuàng)建摘要”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。