溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么使用Python自然語(yǔ)言處理NLP創(chuàng)建摘要

發(fā)布時(shí)間:2021-10-25 10:15:58 來(lái)源:億速云 閱讀:149 作者:iii 欄目:編程語(yǔ)言

本篇內(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()

怎么使用Python自然語(yǔ)言處理NLP創(chuàng)建摘要

讓我們把它轉(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)
怎么使用Python自然語(yǔ)言處理NLP創(chuàng)建摘要

從上面的圖中,我們可以看到“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)

怎么使用Python自然語(yǔ)言處理NLP創(chuàng)建摘要

(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í)!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI