??博客主頁(yè):是dream
??系列專欄:深度學(xué)習(xí)環(huán)境搭建、環(huán)境配置問題解決、自然語(yǔ)言處理、語(yǔ)音信號(hào)處理、項(xiàng)目開發(fā)
??每日語(yǔ)錄:要有最樸素的生活和最遙遠(yuǎn)??的夢(mèng)想,即使明天天寒地凍,山高水遠(yuǎn),路遠(yuǎn)馬亡。
??感謝大家點(diǎn)贊??收藏?指證??
前言
????????關(guān)鍵詞提取是將文本中的關(guān)鍵信息、核心概念或重要主題抽取出來的過程。這些關(guān)鍵詞可以幫助人們快速理解文本的主題,構(gòu)建文本摘要,提高搜索引擎的效率,甚至用于文本分類和信息檢索等應(yīng)用領(lǐng)域。因此,關(guān)鍵詞提取在文本分析和自然語(yǔ)言處理中具有廣泛的應(yīng)用前景。本文主要包括以下幾個(gè)內(nèi)容:
- 自然語(yǔ)言文本預(yù)處理
- TF-IDF算法詳解(三個(gè)維度:原理、流程圖、代碼)
- 好玩的中文關(guān)鍵詞詞云生成(解決亂碼問題)
????????本博客將深入探討自然語(yǔ)言處理中常用的TF-IDF算法,以多種方式展現(xiàn)TF-IDF算法的核心思想。
準(zhǔn)備工作
- 本文的代碼是通過python實(shí)現(xiàn)的,建議安裝一個(gè)pycharm,非常方便!
- 停用詞表(提取碼:peng):百度網(wǎng)盤 請(qǐng)輸入提取碼
- 文本文檔(提取碼:peng):百度網(wǎng)盤 請(qǐng)輸入提取碼
- 庫(kù)函數(shù) jieba、sklearn、matplotlib以及生詞詞云用到的wordcloud
以上的庫(kù)函數(shù)都可以通過pip安裝。
pip install 庫(kù)函數(shù)名字
自然語(yǔ)言文本預(yù)處理
????????一般情況下我們拿到的文本是不規(guī)范的,需要我們進(jìn)行一系列的預(yù)處理操作。????????
- 文本數(shù)據(jù)清洗:去除特殊符號(hào)、HTML標(biāo)簽、數(shù)字等無(wú)關(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),可以包含多個(gè)元素,每個(gè)元素可以是不同類型的數(shù)據(jù)(例如數(shù)字、字符串、其他列表等)。列表中的元素可以重復(fù)。
- 字符串(string)是一種有序的字符序列,通常用于表示文本。字符串的每個(gè)字符都有一個(gè)索引位置。
-
set
是一種無(wú)序的集合數(shù)據(jù)結(jié)構(gòu),它用于存儲(chǔ)不重復(fù)的元素。集合中的元素不按順序排列,并且每個(gè)元素在集合中只能出現(xiàn)一次。集合通常用于存儲(chǔ)一組唯一的值。
數(shù)據(jù)清洗
# 加載文檔集,對(duì)文檔集過濾詞性和停用詞
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
????????通過這一步,我們就得到一個(gè)包含精確分詞、詞性過濾和停用詞去除的文本數(shù)據(jù)。
????????預(yù)處理完成,接下來就是算法詳解和實(shí)現(xiàn)。
TF-IDF算法
????????TF-IDF(詞頻-逆文檔頻率)是一種用于衡量文本中詞語(yǔ)重要性的方法,特別適用于信息檢索和文本挖掘任務(wù)。下面我將深入講解TF-IDF的計(jì)算過程,以便更好地理解。
????????TF-IDF的計(jì)算過程可以分為兩個(gè)主要部分:詞頻(TF)和逆文檔頻率(IDF)。
1. 詞頻(TF - Term Frequency):
????????詞頻是指某個(gè)詞語(yǔ)在文檔中出現(xiàn)的頻率。TF表示了一個(gè)詞語(yǔ)在文檔中的重要性,通常通過以下公式計(jì)算:
?
標(biāo)準(zhǔn)公式:
?
其中:
- w 是要計(jì)算TF的詞語(yǔ)。
- d 是包含詞語(yǔ)的文檔。
- 分子是詞語(yǔ)在文檔中的出現(xiàn)次數(shù)。
- 分母是文檔中的總詞語(yǔ)數(shù)。
計(jì)算出的TF值表示了詞語(yǔ)在單個(gè)文檔中的相對(duì)重要性,值越大表示詞語(yǔ)在文檔中越重要。
2. 逆文檔頻率(IDF - Inverse Document Frequency):
????????逆文檔頻率度量了一個(gè)詞語(yǔ)在整個(gè)文檔集合中的重要性。IDF值越大,表示詞語(yǔ)在整個(gè)文檔集合中越不常見,因此在文檔中的重要性越高。IDF通常通過以下公式計(jì)算:
?
可理解為
?
其中:
- w 是要計(jì)算IDF的詞語(yǔ)。
- D 是文檔集合。
- 分子是文檔集合中的總文檔數(shù)。
- 分母是包含詞語(yǔ) w 的文檔數(shù),+1 是為了避免分母為零的情況。
計(jì)算出的IDF值反映了詞語(yǔ)的全局重要性,較不常見的詞語(yǔ)具有較高的IDF值。
3. TF-IDF的計(jì)算:
????????TF-IDF的計(jì)算是將詞頻(TF)和逆文檔頻率(IDF)相結(jié)合,以確定詞語(yǔ)在文檔中的整體重要性。計(jì)算公式如下:
?
其中:
- w 是要計(jì)算TF-IDF的詞語(yǔ)。
- d 是包含詞語(yǔ)的文檔。
- D 是文檔集合。
????????計(jì)算出的TF-IDF值表示了詞語(yǔ)在文檔 d 中的重要性,同時(shí)考慮了在整個(gè)文檔集合 D 中的全局重要性。
TF-IDF算法實(shí)例講解
????????假設(shè)我們有一個(gè)包含多篇文檔的文本集合,其中包括以下兩篇文檔:
????????文檔1:
自然語(yǔ)言處理(NLP)是一門研究人與計(jì)算機(jī)之間用自然語(yǔ)言進(jìn)行有效通信的領(lǐng)域。NLP的目標(biāo)是使計(jì)算機(jī)能夠理解、解釋和生成自然語(yǔ)言文本。
? ? ? ? 文檔2:
TF-IDF是一種常用于文本挖掘和信息檢索的算法。它用于衡量文檔中詞語(yǔ)的重要性,通過詞頻(TF)和逆文檔頻率(IDF)的計(jì)算來實(shí)現(xiàn)。
計(jì)算步驟:
-
詞頻(TF)計(jì)算:
- 對(duì)于文檔1,詞語(yǔ) "自然語(yǔ)言處理" 在文檔中出現(xiàn)的次數(shù)是1,文檔1的總詞語(yǔ)數(shù)為16。因此,TF("自然語(yǔ)言處理", 文檔1) = 1/16 = 0.0625。
- 對(duì)于文檔2,詞語(yǔ) "自然語(yǔ)言處理" 在文檔中沒有出現(xiàn),因此,TF("自然語(yǔ)言處理", 文檔2) = 0。
-
逆文檔頻率(IDF)計(jì)算:
- 假設(shè)文檔集合中總共有100篇文檔,其中包含詞語(yǔ) "自然語(yǔ)言處理" 的文檔數(shù)為10篇。那么,IDF("自然語(yǔ)言處理", 文檔集合) = ln(100 / (10 + 1)) ≈ 2.1972。
-
TF-IDF計(jì)算:
- 對(duì)于文檔1,TF-IDF("自然語(yǔ)言處理", 文檔1, 文檔集合) = 0.0625 * 2.1972 ≈ 0.1373。
- 對(duì)于文檔2,TF-IDF("自然語(yǔ)言處理", 文檔2, 文檔集合) = 0 * 2.1972 = 0。
????????通過這個(gè)例子,我們可以看到詞語(yǔ) "自然語(yǔ)言處理" 在文檔1中的TF-IDF值較高,因?yàn)樗谖臋n1中出現(xiàn),并且相對(duì)較少地出現(xiàn)在整個(gè)文檔集合中。在文檔2中,由于該詞語(yǔ)未出現(xiàn),其TF-IDF值為零。這樣,我們可以使用TF-IDF值來衡量詞語(yǔ)在文檔集合中的重要性。
TF-IDF算法流程圖展示
?
TF-IDF 算法代碼
? ? ? ? 這里是直接調(diào)用了TfidfVectorizer(),簡(jiǎn)單方便。
# 使用TF-IDF提取關(guān)鍵詞
def extract_keywords_tfidf(documents, top_n=20):
# 將過濾后的文檔集轉(zhuǎn)化為文本列表
documents_text = [' '.join(document) for document in documents]
# 創(chuàng)建TF-IDF向量化器
tfidf_vectorizer = TfidfVectorizer()
# 計(jì)算TF-IDF權(quán)重
tfidf_matrix = tfidf_vectorizer.fit_transform(documents_text)
# 獲取特征詞列表
features = tfidf_vectorizer.get_feature_names_out()
# 計(jì)算每個(gè)文檔中的關(guān)鍵詞
top_keywords_per_document = []
for doc_id in range(len(documents)):
document_tfidf_weights = tfidf_matrix[doc_id].toarray()[0]
top_keyword_indices = document_tfidf_weights.argsort()[-top_n:][::-1]
top_keywords = [features[idx] for idx in top_keyword_indices]
top_keywords_per_document.append(top_keywords)
return top_keywords_per_document
詞云生成
????????當(dāng)我們獲得了文本關(guān)鍵詞后,總不能還是打印輸出吧?為了更加直觀地展示它們,這里選擇使用詞云(Word Cloud)的形式進(jìn)行展示。
????????首先確保我們已經(jīng)安裝了wordcloud。
pip install wordcloud
為了避免亂碼這里建議下載中文字體,這里我直接分享給大家。
(提取碼:peng)百度網(wǎng)盤 請(qǐng)輸入提取碼
附上代碼:
def generate_wordcloud(keywords, title):
"""
生成詞云圖并顯示
參數(shù):
keywords (list): 包含關(guān)鍵詞的列表。
title (str): 詞云圖的標(biāo)題。
返回:
None
"""
# 將關(guān)鍵詞列表轉(zhuǎn)化為字符串
keywords_str = ' '.join(keywords)
# 指定中文字體文件路徑(根據(jù)實(shí)際情況替換為合適的路徑)
font_path = r'D:\my_homework\NLP_homework\NLP_test1\SimHei.ttf' # 替換為包含中文字符的字體文件路徑
# 創(chuàng)建詞云對(duì)象并指定字體
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-766103.html
結(jié)語(yǔ)
????????總的來說,關(guān)鍵詞提取是自然語(yǔ)言處理中的一項(xiàng)核心任務(wù),它為我們處理文本數(shù)據(jù)、挖掘文本信息提供了有力的工具和方法。希望本篇博客能夠幫助讀者更好地理解關(guān)鍵詞提取的基本原理和應(yīng)用,從而在實(shí)際項(xiàng)目中更加靈活和高效地處理文本數(shù)據(jù)。如果你對(duì)關(guān)鍵詞提取有更深入的興趣,也可以進(jìn)一步研究更多高級(jí)的關(guān)鍵詞提取算法和技術(shù)。感謝閱讀!文章來源地址http://www.zghlxwxcb.cn/news/detail-766103.html
本人目前正在學(xué)習(xí)自然語(yǔ)言處理(NLP)、語(yǔ)音信號(hào)識(shí)別、計(jì)算機(jī)視覺等相關(guān)知識(shí),關(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
# 加載文檔集,對(duì)文檔集過濾詞性和停用詞
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
# 使用TF-IDF提取關(guān)鍵詞
def extract_keywords_tfidf(documents, top_n=20):
# 將過濾后的文檔集轉(zhuǎn)化為文本列表
documents_text = [' '.join(document) for document in documents]
# 創(chuàng)建TF-IDF向量化器
tfidf_vectorizer = TfidfVectorizer()
# 計(jì)算TF-IDF權(quán)重
tfidf_matrix = tfidf_vectorizer.fit_transform(documents_text)
# 獲取特征詞列表
features = tfidf_vectorizer.get_feature_names_out()
# 計(jì)算每個(gè)文檔中的關(guān)鍵詞
top_keywords_per_document = []
for doc_id in range(len(documents)):
document_tfidf_weights = tfidf_matrix[doc_id].toarray()[0]
top_keyword_indices = document_tfidf_weights.argsort()[-top_n:][::-1]
top_keywords = [features[idx] for idx in top_keyword_indices]
top_keywords_per_document.append(top_keywords)
return top_keywords_per_document
def generate_wordcloud(keywords, title):
"""
生成詞云圖并顯示
參數(shù):
keywords (list): 包含關(guān)鍵詞的列表。
title (str): 詞云圖的標(biāo)題。
返回:
None
"""
# 將關(guān)鍵詞列表轉(zhuǎn)化為字符串
keywords_str = ' '.join(keywords)
# 指定中文字體文件路徑(根據(jù)實(shí)際情況替換為合適的路徑)
font_path = r'D:\my_homework\NLP_homework\NLP_test1\SimHei.ttf' # 替換為包含中文字符的字體文件路徑
# 創(chuàng)建詞云對(duì)象并指定字體
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()
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))
# 提取關(guān)鍵詞
top_keywords = extract_keywords_tfidf(documents)
# 打印每個(gè)文檔的前10個(gè)關(guān)鍵詞
for doc_id, keywords in enumerate(top_keywords):
print(f'文檔 {doc_id + 1} 的前10個(gè)關(guān)鍵詞: {", ".join(keywords)}')
document_keywords = top_keywords[19] # 假設(shè)第20個(gè)文檔的索引是19
generate_wordcloud(document_keywords, 'wordcloud')
到了這里,關(guān)于NLP自然語(yǔ)言處理——關(guān)鍵詞提取之 TF-IDF 算法(五分鐘帶你深刻領(lǐng)悟TF-IDF算法的精髓)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!