??博客主頁:是dream
??系列專欄:深度學(xué)習(xí)環(huán)境搭建、環(huán)境配置問題解決、自然語言處理、語音信號處理、項目開發(fā)
??每日語錄:你要做沖出的黑馬???而不是墜落的星星。
??感謝大家點(diǎn)贊??收藏?指正??
前言
????????關(guān)鍵詞提取是將文本中的關(guān)鍵信息、核心概念或重要主題抽取出來的過程。這些關(guān)鍵詞可以幫助人們快速理解文本的主題,構(gòu)建文本摘要,提高搜索引擎的效率,甚至用于文本分類和信息檢索等應(yīng)用領(lǐng)域。因此,關(guān)鍵詞提取在文本分析和自然語言處理中具有廣泛的應(yīng)用前景。本文主要包括以下幾個內(nèi)容:
- ?自然語言文本預(yù)處理
- ?TextRank算法詳解(三個維度:原理、流程圖、代碼)
- ?好玩的中文關(guān)鍵詞詞云生成(解決亂碼問題)
??本博客將深入探討自然語言處理中常用的TextRank算法,以多種方式展現(xiàn)TextRank算法的核心思想。
準(zhǔn)備工作
- 本文的代碼是通過python實現(xiàn)的,建議安裝一個pycharm,非常方便!
- 停用詞表:https://pan.baidu.com/s/1OBy5piej31EuuAZbMEzVEw?pwd=peng
- 文本文檔:百度網(wǎng)盤 請輸入提取碼
- 庫函數(shù) jieba、sklearn、matplotlib以及生詞詞云用到的wordcloud
?
自然語言文本預(yù)處理
??一般情況下我們拿到的文本是不規(guī)范的,需要我們進(jìn)行一系列的預(yù)處理操作。????????
- 文本數(shù)據(jù)清洗:去除特殊符號、HTML標(biāo)簽、數(shù)字等無關(guān)字符。
- 分詞:將文本拆分成單詞或詞組。
- 停用詞去除:排除常見的停用詞,如“的”、“在”等,以減少噪音。
停用詞提取
????????在前邊的準(zhǔn)備工作中,你已經(jīng)獲得了停用詞表,通過以下代碼提取停用詞。
# 獲取停用詞
def load_stopwords(stopwords_file):
stopwords = set()
with open(stopwords_file, 'r', encoding='utf-8') as f:
for line in f:
stopwords.add(line.strip())
return stopwords
????????在這里提一嘴,在編程中,set 是一種數(shù)據(jù)結(jié)構(gòu),它類似于列表(list)或字符串(string),但具有一些不同的特點(diǎn)。
- 列表(list)是一種有序的數(shù)據(jù)結(jié)構(gòu),可以包含多個元素,每個元素可以是不同類型的數(shù)據(jù)(例如數(shù)字、字符串、其他列表等)。列表中的元素可以重復(fù)。
- 字符串(string)是一種有序的字符序列,通常用于表示文本。字符串的每個字符都有一個索引位置。
- set 是一種無序的集合數(shù)據(jù)結(jié)構(gòu),它用于存儲不重復(fù)的元素。集合中的元素不按順序排列,并且每個元素在集合中只能出現(xiàn)一次。集合通常用于存儲一組唯一的值。
數(shù)據(jù)清洗
# 加載文檔集,對文檔集過濾詞性和停用詞
def filter_documents(data_path, stopwords):
documents = []
with open(data_path, 'r', encoding='utf-8') as f:
for line in f:
document = []
words = pseg.cut(line.strip())
for word, flag in words:
if flag.startswith('n') and word not in stopwords and len(word) > 1:
document.append(word)
documents.append(document)
return documents
??????? 通過這一步,我們就得到一個包含精確分詞、詞性過濾和停用詞去除的文本數(shù)據(jù)。
????????預(yù)處理完成,接下來就是算法詳解和實現(xiàn)。
TextRank算法
????????算法思想:TextRank算法是一種用于文本摘要和關(guān)鍵詞提取的基于圖的算法,它借鑒了PageRank算法的思想,用于自動提取文本中重要的句子或關(guān)鍵詞。下面我將詳細(xì)講解TextRank算法的思想和工作原理。
1. 文本預(yù)處理
????????前邊我們已經(jīng)完成了文本預(yù)處理的工作。
2. 構(gòu)建圖
????????TextRank算法的核心思想是將文本表示為圖,其中句子或詞語是圖中的節(jié)點(diǎn),它們之間的關(guān)系是邊。構(gòu)建圖的過程包括以下步驟:
????????2.1. 節(jié)點(diǎn)表示
????????每個句子或詞語都被表示為圖中的一個節(jié)點(diǎn)。通常,可以使用詞向量(Word Embeddings)來表示詞語,這些詞向量可以通過預(yù)訓(xùn)練的詞嵌入模型(如Word2Vec或GloVe)獲取。對于句子,可以使用句向量來表示,通常是將句子中所有詞語的詞向量進(jìn)行平均或加權(quán)平均。
????????2.2. 邊的構(gòu)建
????????接下來,需要確定節(jié)點(diǎn)之間的關(guān)系,即邊。通常使用某種相似度度量來計算節(jié)點(diǎn)之間的相似性,例如余弦相似度。節(jié)點(diǎn)之間的相似度可以根據(jù)節(jié)點(diǎn)的詞向量或其他特征來計算。如果相似度超過一個預(yù)定的閾值,則在兩個節(jié)點(diǎn)之間建立一條邊。
3. 計算句子或詞語的重要性
????????一旦構(gòu)建了圖,就可以使用類似PageRank的算法來計算每個節(jié)點(diǎn)(句子或詞語)的重要性分?jǐn)?shù)。TextRank算法使用迭代的方式計算這些分?jǐn)?shù),直到收斂為止。以下是計算節(jié)點(diǎn)重要性的步驟:
????????3.1. 初始化分?jǐn)?shù)
????????為每個節(jié)點(diǎn)初始化一個初始重要性分?jǐn)?shù),通常可以設(shè)置為相等的值。
????????3.2. 迭代計算
????????重要性分?jǐn)?shù)的計算通過多輪迭代進(jìn)行,每一輪都根據(jù)與其相連接的節(jié)點(diǎn)的重要性來更新節(jié)點(diǎn)自身的重要性分?jǐn)?shù)。更新公式如下:
Score(A) = (1 - d) + d * Σ (Score(B) / OutDegree(B))
A
是當(dāng)前節(jié)點(diǎn)的重要性分?jǐn)?shù),需要更新的節(jié)點(diǎn)。B
是與節(jié)點(diǎn)A
有邊相連的節(jié)點(diǎn)。d
是阻尼因子(damping factor),通常取一個介于0和1之間的值,用于平衡迭代過程中的隨機(jī)瀏覽和節(jié)點(diǎn)之間的相互連接。Score(B)
是節(jié)點(diǎn)B
的當(dāng)前重要性分?jǐn)?shù)。OutDegree(B)
是節(jié)點(diǎn)B
的出度,表示與節(jié)點(diǎn)B
相連的邊的數(shù)量。
3.3. 收斂
????????迭代計算會一直進(jìn)行,直到重要性分?jǐn)?shù)收斂,即分?jǐn)?shù)的變化不再顯著。
4. 選擇重要的句子或詞語
????????一旦計算出每個節(jié)點(diǎn)的重要性分?jǐn)?shù),就可以根據(jù)這些分?jǐn)?shù)來選擇最重要的句子或詞語作為文本摘要或關(guān)鍵詞。通常,可以根據(jù)分?jǐn)?shù)排名來選擇前N個句子或詞語。
流程圖實現(xiàn)
代碼實現(xiàn)
# 使用TextRank提取關(guān)鍵詞
def extract_keywords_textrank(documents, top_n=10):
top_keywords_per_document = []
tr4w = TextRank4Keyword()
for document in documents:
text = ' '.join(document)
tr4w.analyze(text=text, lower=True, window=2)
keywords = tr4w.get_keywords(top_n, word_min_len=2)
top_keywords_per_document.append([keyword.word for keyword in keywords])
return top_keywords_per_document
詞云生成
? ? ? ? 為了使提取到的關(guān)鍵詞更加直觀,這里我們詞云的形式展現(xiàn)。首先需要確保你的環(huán)境已經(jīng)安裝了詞云可以通過以下命令安裝wordcloud。
????????有的同學(xué)在生成詞語的時候,會出現(xiàn)亂碼的問題,為了避免亂碼建議下載中文字體,這里我直接分享給大家。(提取碼:peng)百度網(wǎng)盤 請輸入提取碼 (baidu.com)
def generate_wordcloud(keywords, title):
"""
生成詞云圖并顯示
參數(shù):
keywords (list): 包含關(guān)鍵詞的列表。
title (str): 詞云圖的標(biāo)題。
返回:
None
"""
# 將關(guān)鍵詞列表轉(zhuǎn)化為字符串
keywords_str = ' '.join(keywords)
# 指定中文字體文件路徑(根據(jù)實際情況替換為合適的路徑)
font_path = r'D:\my_homework\NLP_homework\NLP_test1\SimHei.ttf' # 替換為包含中文字符的字體文件路徑
# 創(chuàng)建詞云對象并指定字體
wordcloud = WordCloud(width=800, height=400, background_color='white', font_path=font_path).generate(keywords_str)
# 顯示詞云圖
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.title(f'wordcloud - {title}')
plt.show()
效果展示:
文章來源:http://www.zghlxwxcb.cn/news/detail-766489.html
結(jié)語:
????????總的來說,TextRank算法是一種有效的自動化關(guān)鍵詞提取方法,它不需要依賴領(lǐng)域知識或語法規(guī)則,只需要基于文本本身的統(tǒng)計信息就能得到關(guān)鍵詞,因此在各種自然語言處理任務(wù)中都具有廣泛的應(yīng)用前景。文章來源地址http://www.zghlxwxcb.cn/news/detail-766489.html
本人目前正在學(xué)習(xí)自然語言處理(NLP)、語音信號識別、計算機(jī)視覺等相關(guān)知識,關(guān)注我,后續(xù),我將分享更多人工智能tips!最后附上整段代碼!
import jieba
import jieba.posseg as pseg
from sklearn.feature_extraction.text import TfidfVectorizer
from textrank4zh import TextRank4Keyword
import matplotlib.pyplot as plt
from wordcloud import WordCloud
# 獲取停用詞
def load_stopwords(stopwords_file):
stopwords = set()
with open(stopwords_file, 'r', encoding='utf-8') as f:
for line in f:
stopwords.add(line.strip())
return stopwords
# 加載文檔集,對文檔集過濾詞性和停用詞
def filter_documents(data_path, stopwords):
documents = []
with open(data_path, 'r', encoding='utf-8') as f:
for line in f:
document = []
words = pseg.cut(line.strip())
for word, flag in words:
if flag.startswith('n') and word not in stopwords and len(word) > 1:
document.append(word)
documents.append(document)
return documents
def generate_wordcloud(keywords, title):
"""
生成詞云圖并顯示
參數(shù):
keywords (list): 包含關(guān)鍵詞的列表。
title (str): 詞云圖的標(biāo)題。
返回:
None
"""
# 將關(guān)鍵詞列表轉(zhuǎn)化為字符串
keywords_str = ' '.join(keywords)
# 指定中文字體文件路徑(根據(jù)實際情況替換為合適的路徑)
font_path = r'D:\my_homework\NLP_homework\NLP_test1\SimHei.ttf' # 替換為包含中文字符的字體文件路徑
# 創(chuàng)建詞云對象并指定字體
wordcloud = WordCloud(width=800, height=400, background_color='white', font_path=font_path).generate(keywords_str)
# 顯示詞云圖
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.title(f'wordcloud - {title}')
plt.show()
# 使用TextRank提取關(guān)鍵詞
def extract_keywords_textrank(documents, top_n=10):
top_keywords_per_document = []
tr4w = TextRank4Keyword()
for document in documents:
text = ' '.join(document)
tr4w.analyze(text=text, lower=True, window=2)
keywords = tr4w.get_keywords(top_n, word_min_len=2)
top_keywords_per_document.append([keyword.word for keyword in keywords])
return top_keywords_per_document
if __name__ == "__main__":
stopwords_file = r'D:\my_homework\NLP_homework\NLP_test1\stopword.txt' # 停用詞文件路徑
data_path = r'D:\my_homework\NLP_homework\NLP_test1\corpus4keyword.txt' # 文檔集文件路徑
stopwords = load_stopwords(stopwords_file)
documents = filter_documents(data_path, stopwords)
print('停用詞表的大小為:', len(stopwords))
print('文檔的數(shù)量為', len(documents))
top_keywords1 = extract_keywords_textrank(documents)
# 打印每個文檔的前10個關(guān)鍵詞
for doc_id, keywords in enumerate(top_keywords1):
print(f'文檔 {doc_id + 1} 的前10個關(guān)鍵詞: {", ".join(keywords)}')
document_keywords = top_keywords1[19] # 假設(shè)第20個文檔的索引是19
generate_wordcloud(document_keywords, 'wordcloud')
到了這里,關(guān)于NLP自然語言處理——關(guān)鍵詞提取之 TextRank 算法(五分鐘帶你深刻領(lǐng)悟TextRank算法的精髓)保姆級教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!