1. 關鍵詞提取技術
在本章,你將瞭解目前較為實用的關鍵詞提取技術。關鍵詞是代表文章重要內容的一組詞。對文本聚類、分類、自動摘要等起重要的作用。此外,它還能使人們便捷地瀏
覽和獲取信息。現實中大量文本不包含關鍵詞,自動提取關鍵詞技術也因此具有重要意義和價值。
一篇文檔的關鍵詞等同於最能表達文檔主旨的N個詞語,即對於文檔來説最重要的詞,因此,可以將文本關鍵詞抽取問題轉化為詞語重要性排序問題,選取排名前TopN個詞語作為文本關鍵詞。目前,主流的文本關鍵詞抽取方法主要有以下兩大類:
(1)基於統計的關鍵詞提取方法
該方法根據統計信息,如詞頻,來計算得到文檔中詞語的權重,按權重值排序提取關鍵詞。TF-IDF和TextRank均屬於此類方法,其中TF-IDF方法通過計算單文本詞頻(Term Frequency, TF)和逆文本頻率指數(Inverse Document Frequency, IDF)得到詞語權重;TextRank方法基於PageRank的思想,通過詞語共現窗口構建共現網絡,計算詞語得分。此類方法簡單易行,適用性較強,然而未考慮詞序問題。
(2)基於機器學習的關鍵詞提取方法
該方法包括了SVM、樸素貝葉斯等有監督學習方法,以及K-means、層次聚類等無監督學習方法。在此類方法中,模型的好壞取決於特徵提取,而深度學習正是特徵提取的一種有效方式。由Google推出的Word2Vec詞向量模型,是自然語言領域中具有代表性的學習工具。它在訓練語言模型的過程中將詞典映射到一個更抽象的向量空間中,每一個詞語通過高維向量表示,該向量空間中兩點之間的距離就對應兩個詞語的相似程度。
相對於有監督的方法而言,無監督的方法對數據的要求就低多了。既不需要一張人工生成、維護的詞表,也不需要人工標準語料輔助進行訓練。因此,這類算法在關鍵詞提取領域的應用更受到大家的青睞。本任務主要為大家介紹的就是一些目前較常用的無監督關鍵詞提取算法,分別是TF-IDF算法和TextRank算法。
2. TF-IDF算法
2.1 TF-IDF算法思想
詞頻(Term Frequency,TF)指某一給定詞語在當前文件中出現的頻率。由於同一個詞語在長文件中可能比短文件有更高的詞頻,因此根據文件的長度,需要對給定詞語進行歸一化,即用給定詞語的次數除以當前文件的總詞數。
逆向文件頻率(Inverse Document Frequency,IDF)是一個詞語普遍重要性的度量。即如果一個詞語只在很少的文件中出現,表示更能代表文件的主旨,它的權重也就越大;如果一個詞在大量文件中都出現,表示不清楚代表什麼內容,它的權重就應該小。分母加1是為了避免分母為0。
TF-IDF的主要思想是,如果某個詞語在一篇文章中出現的頻率高,並且在其他文章中較少出現,則認為該詞語能較好的代表當前文章的含義。即一個詞語的重要性與它在文檔中出現的次數成正比,與它在語料庫中文檔出現的頻率成反比。
計算公式如下:
2.1 TF-IDF文本關鍵詞抽取方法流程
TF-IDF是對文本所有候選關鍵詞進行加權處理,根據權值對關鍵詞進行排序。假設Dn為測試語料的大小,該算法的關鍵詞抽取步驟如下所示:
(1) 對於給定的文本D進行分詞、詞性標註和去除停用詞等數據預處理操作。本分採用結巴分詞,保留’n’,‘nz’,‘v’,‘vd’,‘vn’,‘l’,‘a’,'d’這幾個詞性的詞語,最終得到n個候選關鍵詞,即D=[t1,t2,…,tn] ;
(2) 計算詞語ti 在文本D中的詞頻;
(3) 計算詞語ti 在整個語料的IDF=log (Dn /(Dt +1)),Dt 為語料庫中詞語ti 出現的文檔個數;
(4) 計算得到詞語ti 的TF-IDF=TF*IDF,並重復(2)—(4)得到所有候選關鍵詞的TF-IDF數值;
(5) 對候選關鍵詞計算結果進行倒序排列,得到排名前TopN個詞彙作為文本關鍵詞。
3. TextRank算法
3.1PageRank算法思想
TextRank算法是基於PageRank算法的,因此,在介紹TextRank前不得不瞭解一下PageRank算法。
PageRank算法是Google的創始人拉里·佩奇和謝爾蓋·布林於1998年在斯坦福大學讀研究生期間發明的,是用於根據網頁間相互的超鏈接來計算網頁重要性的技術。該算法借鑑了學術界評判學術論文重要性的方法,即查看論文的被引用次數。基於以上想法,PageRank算法的核心思想是,認為網頁重要性由兩部分組成:
① 如果一個網頁被大量其他網頁鏈接到説明這個網頁比較重要,即被鏈接網頁的數量;
② 如果一個網頁被排名很高的網頁鏈接説明這個網頁比較重要,即被鏈接網頁的權重。
一般情況下,一個網頁的PageRank值(PR)計算公式如下所示:
PageRank計算公式
其中,PR(Pi)是第i個網頁的重要性排名即PR值;ɑ是阻尼係數,一般設置為0.85;N是網頁總數;Mpi 是所有對第i個網頁有出鏈的網頁集合;L(Pj)是第j 個網頁的出鏈數目。
初始時,假設所有網頁的排名都是1/N,根據上述公式計算出每個網頁的PR值,在不斷迭代趨於平穩的時候,停止迭代運算,得到最終結果。一般來講,只要10次左右的迭代基本上就收斂了。
3.2 TextRank文本關鍵詞抽取方法流程
TextRank算法是Mihalcea和Tarau於2004年在研究自動摘要提取過程中所提出來的,在PageRank算法的思路上做了改進。該算法把文本拆分成詞彙作為網絡節點,組成詞彙網絡圖模型,將詞語間的相似關係看成是一種推薦或投票關係,使其可以計算每一個詞語的重要性。
基於TextRank的文本關鍵詞抽取是利用局部詞彙關係,即共現窗口,對候選關鍵詞進行排序,該方法的步驟如下:
(1) 對於給定的文本D進行分詞、詞性標註和去除停用詞等數據預處理操作。本分採用結巴分詞,保留’n’,‘nz’,‘v’,‘vd’,‘vn’,‘l’,‘a’,'d’這幾個詞性的詞語,最終得到n個候選關鍵詞,即D=[t1,t2,…,tn] ;
(2) 構建候選關鍵詞圖G=(V,E),其中V為節點集,由候選關鍵詞組成,並採用共現關係構造任兩點之間的邊,兩個節點之間僅當它們對應的詞彙在長度為K的窗口中共現則存在邊,K表示窗口大小即最多共現K個詞彙;
(3) 根據公式迭代計算各節點的權重,直至收斂;
(4) 對節點權重進行倒序排列,得到排名前TopN個詞彙作為文本關鍵詞。
説明:Jieba庫中包含jieba.analyse.textrank函數可直接實現TextRank算法,本文采用該函數進行實驗。
4. 關鍵詞抽取步驟
訓練一個關鍵詞提取算法需要以下幾個步驟:
1)加載已有的文檔數據集。
2)加載停用詞表。
3)對數據集中的文檔進行分詞。
4)根據停用詞表,過濾干擾詞。
5)根據數據集訓練算法。
而根據訓練好的關鍵詞提取算法對新文檔進行關鍵詞提取要經過以下環節:
1)對新文檔進行分詞。
2)根據停用詞表,過濾干擾詞。
3)根據訓練好的算法提取關鍵詞。
任務實施:
文本關鍵詞抽取,是對文本信息進行高度凝練的一種有效手段,通過3-5個詞語準確概括文本的主題,幫助讀者快速理解文本信息。目前,用於文本關鍵詞提取的主要方法有四種:基於TF-IDF的關鍵詞抽取、基於TextRank的關鍵詞抽取、基於Word2Vec詞聚類的關鍵詞抽取,以及多種算法相融合的關鍵詞抽取。
本任務Python代碼的實現使用到了多個著名的第三方模塊,主要模塊如下所示:
(1)Jieba
目前使用最為廣泛的中文分詞組件。下載地址:https://pypi.python.org/pypi/jieba/
(2)Gensim
用於主題模型、文檔索引和大型語料相似度索引的python庫,主要用於自然語言處理(NLP)和信息檢索(IR)。下載地址:https://pypi.python.org/pypi/gensim
本實例中的維基中文語料處理和中文詞向量模型構建需要用到該模塊。
(3)Pandas
用於高效處理大型數據集、執行數據分析任務的python庫,是基於Numpy的工具包。下載地址:https://pypi.python.org/pypi/pandas/0.20.1
(4)Numpy
用於存儲和處理大型矩陣的工具包。下載地址:https://pypi.python.org/pypi/numpy
(5)Scikit-learn
用於機器學習的python工具包,python模塊引用名字為sklearn,安裝前還需要Numpy和Scipy兩個Python庫。官網地址:http://scikit-learn.org/stable/ 本實例中主要用到了該模塊中的feature_extraction、KMeans(k-means聚類算法)和PCA(pac降維算法)。
(6)Matplotlib
Matplotlib是一個python的圖形框架,用於繪製二維圖形。下載地址:https://pypi.python.org/pypi/matplotlib
1.基於TF-IDF的關鍵詞抽取
基於TF-IDF方法實現文本關鍵詞抽取的代碼執行步驟如下:
(1)讀取樣本源文件sample_data.csv;
(2)獲取每行記錄的標題和摘要字段,並拼接這兩個字段;
(3)加載自定義停用詞表stopWord.txt,並對拼接的文本進行數據預處理操作,包括分詞、篩選出符合詞性的詞語、去停用詞,用空格分隔拼接成文本;
(4)遍歷文本記錄,將預處理完成的文本放入文檔集corpus中;
(5)使用CountVectorizer()函數得到詞頻矩陣,a[j][i]表示第j個詞在第i篇文檔中的詞頻;
(6)使用TfidfTransformer()函數計算每個詞的tf-idf權值;
(7)得到詞袋模型中的關鍵詞以及對應的tf-idf矩陣;
(8)遍歷tf-idf矩陣,打印每篇文檔的詞彙以及對應的權重;
(9)對每篇文檔,按照詞語權重值降序排列,選取排名前topN個詞最為文本關鍵詞,並寫入數據框中;
(10)輸出數據框。
1.1 安裝相關依賴包
!pip install numpy==1.21.6
!pip install scikit-learn==1.0.2
!pip install jieba==0.42.1
!pip install pandas==1.3.5
!pip install matplotlib==3.5.2
!pip install wordcloud==1.8.1
import sys,codecs
import pandas as pd
import numpy as np
import jieba.posseg
import jieba.analyse
from sklearn import feature_extraction
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
1.2 讀取樣本源文件並查看數據
本任務將汽車行業的10篇專利作為樣本數據集,見文件“data/sample_data.csv”。文件中依順序包含編號(id)、標題(title)和摘要(abstract)三個字段,其中標題和摘要都要參與到關鍵詞的抽取。
運行以下代碼讀取數據集並展示
讀取數據集
dataFile = './data/sportss.csv'
data = pd.read_csv(dataFile)
data
運行以下代碼查看數據集中第一行摘要字段
data['abstract'][0] #查看第一個摘要
1.3 增加停用詞
由於本實例的樣本是體育新聞文本,詞彙專業性較高,需要人工新增停用詞,可直接在停用詞表中添加,一行為一個停用詞。
動手練習1
打開文件“data/stopWord.txt”,在文件前面新增“新浪”、“北京”、“時間”、“微博”這四個停用詞。
運行以下代碼,若出現以下內容。則説明操作正確。
['新浪\n', '北京\n', '時間\n', '微博\n']
with open("./data/stopWord.txt",encoding="utf-8") as f:
print(f.readlines()[:4])
TF-IDF權重:
1、CountVectorizer 構建詞頻矩陣
2、TfidfTransformer 構建tfidf權值計算
3、文本的關鍵字
4、對應的tfidf矩陣
動手練習2
- 在<1>處定義選取的詞性,我們需要
名詞、其他專名、普通動詞、動副詞、名動詞、習用語、形容詞、副詞; - 在<2>處添加“微博”到jieba字典中。
#在這裏手敲上面代碼並填補缺失代碼
def dataPrepos(text,stopkey):
l = []
pos = ["n", "ns", "v", "d", "vn", "l", "a", "ad"]
jieba.add_word("微博")
seg = jieba.posseg.cut(text)
for i in seg:
if i.word not in stopkey and i.flag in pos:
l.append(i.word)
return l
執行以下代碼,若出現以下結果,則説明填寫正確。
['湖人', '首發', '帶傷', '戰', '戰', '體育訊', '時間', '湖人', '主場', '迎戰', '比賽', '雙方', '戰成', '平', '本場', '比賽', '球隊', '重要', '雙方', '公佈', '首發', '陣容', '黃蜂隊', '扎', '官方', '湖人', '新聞動態', '專題', '湖人', '圖文', '直播室', '體育']
text = """黃蜂vs湖人首發:科比帶傷戰保羅 加索爾救贖之戰 新浪體育訊北京時間4月27日,
NBA季後賽首輪洛杉磯湖人主場迎戰新奧爾良黃蜂,此前的比賽中,雙方戰成2-2平,
因此本場比賽對於兩支球隊來説都非常重要,賽前雙方也公佈了首發陣容:
湖人隊:費舍爾、科比、阿泰斯特、加索爾、拜納姆黃蜂隊:保羅、貝里內利、阿里扎、蘭德里、奧卡福
[新浪NBA官方微博][新浪NBA湖人新聞動態微博][新浪NBA專題][黃蜂vs湖人圖文直播室](新浪體育)"""
stopkey = [w.strip() for w in codecs.open('./data/stopWord.txt', 'r', 'utf8').readlines()]
text = dataPrepos(text, stopkey)
print(text)
1.4 整理語料格式
動手練習3
- 在<1>處獲取每行記錄的id、標題和摘要字段;
- 在<2>處拼接標題和摘要兩個字段,並用“。”連接。
def getCorpus(data,stopkey):
idList = data.id
titleList =data.title
abstractList = data.abstract
corpus = []
for index in range(len(idList)):
text = ".".join([titleList[index], abstractList[index]])
text = dataPrepos(text,stopkey)
text = " ".join(text)
corpus.append(text)
return idList,titleList,abstractList,corpus
執行以下代碼,若出現以下結果,則説明填寫正確。
stopkey = [w.strip() for w in codecs.open('./data/stopWord.txt', 'r', 'utf8').readlines()]
idList, titleList, abstractList, corpus = getCorpus(data,stopkey)
print(corpus)
1.5 實現TF-IDF關鍵詞抽取
Python第三方工具包Scikit-learn提供了TFIDF算法的相關函數,本任務主要用到了sklearn.feature_extraction.text下的TfidfTransformer和CountVectorizer函數。其中,CountVectorizer函數用來構建語料庫的中的詞頻矩陣,TfidfTransformer函數用來計算詞語的tfidf權值。
注:TfidfTransformer()函數有一個參數smooth_idf,默認值是True,若設置為False,則IDF的計算公式為idf=log(Dn /Dt ) + 1。
CountVectorizer是屬於常見的特徵數值計算類,是一個文本特徵提取方法。對於每一個訓練文本,它只考慮每種詞彙在該訓練文本中出現的頻率。CountVectorizer會將文本中的詞語轉換為詞頻矩陣,它通過fit_transform函數計算各個詞語出現的次數。
CountVectorizer(input='content', encoding='utf-8', decode_error='strict', strip_accents=None, lowercase=True, preprocessor=None, tokenizer=None, stop_words=None, token_pattern='(?u)\b\w\w+\b', ngram_range=(1, 1), analyzer='word', max_df=1.0, min_df=1, max_features=None, vocabulary=None, binary=False, dtype=)
參數説明:
- ngram_range:詞組切分的長度範圍;
- max_df:可以設置為範圍在[0.0 1.0]的float,也可以設置為沒有範圍限制的int,默認為1.0。這個參數的作用是作為一個閾值,當構造語料庫的關鍵詞集的時候,如果某個詞的document frequence大於max_df, 這個詞不會被當作關鍵詞。如果這個參數是float, 則表示詞出現的次數與語料庫文檔數的百分比,如果是int,則表示詞出現的次數。如果參數中已經給定了vocabulary,則這個參數無效;
- min_df:類似於max_ df, 不同之處在於如果某個詞的document frequence小於min df, 則這個詞不會被當作關鍵詞;
- max_features:默認為None,可設為int, 對所有關鍵詞的term frequency進行降序排序,只取前max_ _features個作為關鍵詞集。
動手練習4
- 在<1>處使用CountVectorizer()函數得到詞頻矩陣,並添加參數decode_error="replace"以保存訓練特徵;
- 在<2>處使用TfidfTransformer()函數計算每個詞的tf-idf權值;
- 在<3>處使用get_feature_names()函數獲取詞袋模型中的關鍵詞。
#在這裏手敲上面代碼並填補缺失代碼
#tf-idf獲取文本top10關鍵詞
idList,titlelist,abstractList, corpus = getCorpus(data, stopkey)
# 1、構建詞頻矩陣,遊文本中的詞語轉換成詞頻矩陣
vectorizer = CountVectorizer(decode_error="replace")
X = vectorizer.fit_transform(corpus) # 河頻矩陣,a[i][j]表示i在個文本中的詞頻
# 2、統計每個詞的tf-idf值
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(X)
# 3、獲取詞袋模型中的關鏈詞
word = vectorizer.get_feature_names()
# 4、獲tf-idf矩陣,a[i]l]表示i詞在篇文本中的f-idf灰重
weight = tfidf.toarray()
# 打印並保存結果
def getKeywords_tfidf(idList, titleList, abstractList, weight):
ids, titles, keys = [], [], []
for i in range(len(weight)):
print (u"-------這裏輸出第", i+1 , u"篇文本的前 10 詞語tf-idf------")
ids.append(idList[i])
titles.append(titleList[i])
df_word,df_weight = [],[] # 當前文章的所有詞彙列表、詞彙對應權重列表
for j in range(len(word)):
df_word.append(word[j])
df_weight.append(weight[i][j])
df_word = pd.DataFrame(df_word,columns=['word'])
df_weight = pd.DataFrame(df_weight,columns=['weight'])
word_weight = pd.concat([df_word, df_weight], axis=1) # 拼接詞彙列表和權重列表
word_weight = word_weight.sort_values(by="weight",ascending = False) # 按照權重值降序排列
keyword = np.array(word_weight['word']) # 選擇詞彙列並轉成數組格式
word_split = [keyword[x] for x in range(0,10)] # 抽取前10個詞彙作為關鍵詞
print(word_weight[:10])
word_split = " ".join(word_split)
keys.append(word_split)
result = pd.DataFrame({"id": ids, "title": titles, "key": keys},columns=['id','title','key'])
return result
執行以下代碼,若出現以下結果,則説明填寫正確。
tf-idf關鍵詞抽取
result = getKeywords_tfidf(idList, titleList, abstractList, weight)
result.to_csv("result/keys_TFIDF.csv",index=False, encoding= "utf-8-sig")
1.6 詞典保存與預測
保存經過fit的vectorizer 與 經過fit的transformer,保存在models文件夾下。
import pickle
feature_path = 'models/feature.pkl'
with open(feature_path, 'wb') as fw:
pickle.dump(vectorizer.vocabulary_, fw)
動手練習5
- 參照上方代碼,在<1>處保存經過fit的
transformer; - 在<2>處使用
pickle.load加載transformer; - 在<3>處使用
transform函數測試數據。
#在這裏手敲上面代碼並填補缺失代碼
# 保存transformer
tfidftransformer_path = 'models/tfidftransformer.pkl'
with open(tfidftransformer_path, 'wb') as f:
pickle.dump(transformer, f)
# 加載特徵
feature_path = 'models/feature.pkl'
loaded_vec = CountVectorizer(decode_error="replace", vocabulary=pickle.load(open(feature_path, "rb")))
# 加TfidfTransformer
tfidftransformer_path = 'models/tfidftransformer.pkl'
tfidftransformer = pickle.load(open(tfidftransformer_path, 'rb'))
#測過用transform,表示測這數據,為List
test_data = ["這是一個測試文本"]
X_test = loaded_vec.transform(test_data)
test_tfidf = tfidftransformer.transform(X_test)
# 獲tf-idf矩陣,a[i][]表示j詞在篇文本中的tf-idf灰重
weight = test_tfidf.toarray()
運行以下代碼,若輸出為下面內容,則説明填寫正確。
tf-idf關鍵詞預測
testresult = getKeywords_tfidf(idList, titleList, abstractList, weight)
testresult.to_csv("result/testkeys_TFIDF.csv",index=False, encoding= "utf-8-sig")
2. 基於TextRank的關鍵詞抽取
基於TextRank方法實現文本關鍵詞抽取的代碼執行步驟如下:
(1)讀取樣本源文件sample_data.csv;
(2)獲取每行記錄的標題和摘要字段,並拼接這兩個字段;
(3)加載自定義停用詞表stopWord.txt;
(4)遍歷文本記錄,採用jieba.analyse.textrank函數篩選出指定詞性,以及topN個文本關鍵詞,並將結果存入數據框中;
(5)輸出結果。
2.1 使用jieba的textrank算法
採用jieba.analyse.textrank函數篩選出指定詞性,以及topN個文本關鍵詞,函數如下:
jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))
參數解釋如下:
string:待處理語句
topK:關鍵字的個數,默認20
withWeight:是否返回權重值,默認false
allowPOS:是否僅返回指定類型,默認為空
以下代碼是篩選出指定詞性,包括地名、名詞、名動詞和動詞,以及5個文本關鍵詞和相應權重的效果。
text = """
黃蜂vs湖人首發:科比帶傷戰保羅 加索爾救贖之戰 新浪體育訊北京時間4月27日,
NBA季後賽首輪洛杉磯湖人主場迎戰新奧爾良黃蜂,此前的比賽中,雙方戰成2-2平,
因此本場比賽對於兩支球隊來説都非常重要,賽前雙方也公佈了首發陣容:
湖人隊:費舍爾、科比、阿泰斯特、加索爾、拜納姆黃蜂隊:保羅、貝里內利、阿里扎、蘭德里、奧卡福
[新浪NBA官方微博][新浪NBA湖人新聞動態微博][新浪NBA專題][黃蜂vs湖人圖文直播室](新浪體育)
"""
jieba.analyse.textrank(text, topK=10, withWeight= True, allowPOS=('ns', 'n', 'vn', 'v'))
2.2 實現textrank關鍵詞抽取
動手練習6
- 在<1>處加載自定義停用詞表
./data/stopWord.txt; - 在<2>處採用jieba.analyse.textrank函數篩選出指定詞性(‘n’,‘nz’,‘v’,‘vd’,‘vn’,‘l’,‘a’,‘d’),以及topN個文本關鍵詞,不返回權重值。
import sys
import pandas as pd
import jieba.analyse
# 處理標題和摘要,提取關鍵詞
def getKeywords_textrank(data, topk):
idList, titleList, abstractList = data['id'], data['title'], data['abstract']
ids, titles, keys = [], [], []
for index in range(len(idList)):
text = '%s。%s' % (titleList[index], abstractList[index])
# 加載自定義停用詞表
jieba.analyse.set_stop_words('./data/stopWord.txt')
print(titleList[index], " 10 Keywords - TextRank :")
keywords = jieba.analyse.textrank(text, topK=topk, allowPOS=('n', 'nz', 'v', 'vd', 'vn', 'l', 'a', 'd'), withWeight=False)
word_split = " ".join(keywords)
print(word_split)
keys.append(word_split)
ids.append(idList[index])
titles.append(titleList[index])
result = pd.DataFrame({"id": ids, "title": titles, "key": keys}, columns=['id', 'title', 'key'])
return result
運行以下代碼,若出現下圖結果,則説明填寫正確。
result = getKeywords_textrank(data,10)
result.to_csv("result/keys_TR.csv",index=False, encoding= "utf-8-sig")
結果文件可以在result文件夾下查看。
2.3 繪製關鍵詞的詞雲圖
詞雲特點:出現頻率越多的單詞,字體越大,所以我們在分析文本中的關鍵詞的時候有重要作用。
wordcloud庫:用來生成詞雲文本,根據詞頻繪製詞雲圖像
import matplotlib.pyplot as plt
%matplotlib inline
import matplotlib
import pandas as pd
from wordcloud import WordCloud # 詞雲包
讀取數據,將其整理成wordcloud需要的格式。
filepath = "./result/keys_TR.csv"
text = pd.read_csv(filepath)
wc_text = ""
for l in text["key"]:
wc_text += str(l+" ")
wc_text
wordcloud.WordCloud()用於生成和繪製的Word雲對象,參數説明如下:
- font_path:str,要使用的字體(OTF或TTF)的字體路徑;
- width :int(默認=400),畫布的寬度;
- height :int(默認=200),畫布的高度;
- max_words :數字(默認=200),單詞的最大數量;
- stopwords :一組字符串或沒有將被刪除的單詞。如果沒有,將使用內置的STOPWORDS列表;
- background_color :顏色值(默認=“黑色”),背景色為字雲圖像;
- max_font_size : int或None(默認=None),為最大的字的最大字體大小。如果沒有,則使用圖像的高度。
matplotlib.rcParams['figure.figsize'] = (10.0,6.0)
# wc = WordCloud(font_path=font_path).generate(text)
wc = wordcloud.WordCloud(font_path='./data/simhei.ttf',background_color='white',max_font_size=80).generate(wc_text) # 加載詞雲文本
plt.imshow(wc, interpolation='bilinear')# 用plt顯示圖片
plt.axis("off") # 不顯示座標軸
plt.show() # 顯示圖片
動手練習7
用’keys_TFIDF.csv’數據來繪製一個心形詞雲圖。
- 在<1>處加載keys_TFIDF.csv數據集;
- 在<2>處讀取蒙版圖像,用Image.open函數打開蒙版圖像,並用np.array函數將其轉換為矩陣;
- 在<3>處添加蒙版參數。
#在這裏手敲上面代碼並填補缺失代碼
import numpy as np
from PIL import Image
# 讀取顯示的詞文件
filepath = './result/keys_TFIDF.csv'
text = pd.read_csv(filepath)
WC_text = ""
for l in text["key"]:
wc_text += str(l+" ")# 讀取蒙版圖像
heart_mask = np.array(Image.open("./data/heart.png"))
#創建詞雲對象
wc = WordCloud(font_path="./data/simhei.ttf",background_color='white',max_font_size=80,mask=heart_mask)
#生成詞雲
wc.generate(wc_text)
# 展示圖緣
plt.imshow(wc,interpolation='bilinear')# 用lt顯不圖片
plt.axis("off") # 不顯示華標熱
plt.show() # 顯示圖片
若出現以下結果,則説明填寫正確。