python中文词云生成_Python 词云生成
圖片來自網(wǎng)絡(luò)所謂“詞云”就是對網(wǎng)絡(luò)文本中出現(xiàn)頻率較高的“關(guān)鍵詞”予以視覺上的突出,形成“關(guān)鍵詞云層”或“關(guān)鍵詞渲染”,從而過濾掉大量的文本信息,使瀏覽網(wǎng)頁者只要一眼掃過文本就可以領(lǐng)略文本的主旨。
環(huán)境準(zhǔn)備python -m pip install wordclud
python -m pip install matplotlib
python -m pip install jieba
在Windows上,如無法成功安裝,可使用已經(jīng)編譯好的二進制包,下載安裝
wordcludPython用于生成詞云的庫。
wordclud 官方文檔
屬性簡述font_path字體路徑,做中文詞云必須設(shè)置字體,否則無法顯示
width輸出的畫布寬度,默認(rèn)為400像素
height輸出的畫布高度,默認(rèn)為200像素
mask如果參數(shù)為空,則使用二維遮罩繪制詞云。如果 mask 非空,設(shè)置的寬高值將被忽略,遮罩形狀被 mask 取
min_font_size顯示的最小的字體大小
max_font_size顯示的最大的字體大小
max_words要顯示的詞的最大個數(shù),默認(rèn)200
scale按照比例進行放大畫布,如設(shè)置為1.5,則長和寬都是原來畫布的1.5
color_func生成新顏色的函數(shù),如果為空,則使用 self.color_fun
prefer_horizontal詞語水平方向排版出現(xiàn)的頻率,默認(rèn) 0.9 (所以詞語垂直方向排版出現(xiàn)頻率為 0.1 )
stopwords設(shè)置需要屏蔽的詞,如果為空,則使用內(nèi)置的STOPWORDS
font_step字體步長,如果步長大于1,會加快運算但是可能導(dǎo)致結(jié)果出現(xiàn)較大的誤,默認(rèn)1
background_color背景顏色
relative_scaling詞頻和字體大小的關(guān)聯(lián)性,默認(rèn)0.5
mode當(dāng)參數(shù)為“RGBA”并且background_color不為空時,背景為透,默認(rèn)“RGB”
regexp使用正則表達式分隔輸入的文本
collocations是否包括兩個詞的搭配,默認(rèn)True
colormap給每個單詞隨機分配顏色,若指定color_func,則忽略該方法
matplotlib一個Python 2D繪圖庫。Matplotlib試圖讓簡單易事的事情成為可能。只需幾行代碼即可生成繪圖,直方圖,功率譜,條形圖,錯誤圖,散點圖等,該庫最常用于Python數(shù)據(jù)分析的可視化。
官方文檔
最小示例from wordcloud import WordCloud
import matplotlib.pyplot as plt
with open("野性的呼喚.txt", encoding="utf-8") as file:
word_cloud = WordCloud().generate(file.read())
plt.figure() # 創(chuàng)建一個圖形實例
plt.imshow(word_cloud, interpolation='bilinear')
plt.axis("off") # 不顯示坐標(biāo)軸
plt.show()
interpolation 參數(shù)的用法
中文詞云wordcloud 對中文分詞支持不足,因此需要配合jieba分詞庫使用from wordcloud import WordCloud
import matplotlib.pyplot as plt
with open("fanrenxiuxian.txt", encoding="gbk") as file:
word_cloud = WordCloud(font_path="c:\windows\Fonts\simhei.ttf",
background_color="white",
max_words=200,
max_font_size=100,
width=1000,
height=860).generate(file.read())
plt.figure() # 創(chuàng)建一個圖形實例
plt.imshow(word_cloud, interpolation='bilinear')
plt.axis("off") # 不顯示坐標(biāo)尺寸
plt.show()
添加圖片背景效果from wordcloud import WordCloud
from wordcloud import ImageColorGenerator
from matplotlib.image import imread
import matplotlib.pyplot as plt
back_img = imread("timg.jpg")
img_colors = ImageColorGenerator(back_img)
with open("fanrenxiuxian.txt", encoding="gbk") as file:
word_cloud = WordCloud(font_path="c:\windows\Fonts\simhei.ttf",
background_color="white",
max_words=200,
max_font_size=100,
width=1920,
mask=back_img,
height=1080).generate(file.read())
word_cloud.recolor(color_func=img_colors) # 替換默認(rèn)的字體顏色
plt.figure() # 創(chuàng)建一個圖形實例
plt.imshow(word_cloud, interpolation='bilinear')
plt.axis("off") # 不顯示坐標(biāo)尺寸
plt.show()
擴展:將圖片加載的幾種方法PIL.Image.open
scipy.misc.imread
skimage.io.imread
cv2.imread
matplotlib.image.imread
jieba
特點支持三種分詞模式:精確模式,試圖將句子最精確地切開,適合文本分析;
全模式,把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義;
搜索引擎模式,在精確模式的基礎(chǔ)上,對長詞再次切分,提高召回率,適合用于搜索引擎分詞
支持繁體分詞
支持自定義詞典
MIT 授權(quán)協(xié)議
簡單示例import jieba
with open("fanrenxiuxian.txt", 'r', encoding="gbk") as file:
# jieba.enable_parallel(4) 并行運算,類unix系統(tǒng),Windows不支持
seg_list = jieba.cut(file.read(), cut_all=False)
print("/".join(seg_list))
提取關(guān)鍵詞import jieba.analyse
# TF-IDF算法關(guān)鍵詞抽取
with open("fanrenxiuxian.txt", 'r', encoding="gbk") as file:
jieba.analyse.set_stop_words('stopwords.txt')
tags = jieba.analyse.extract_tags(file.read(), 100)
print(tags)
中文詞云實例
網(wǎng)絡(luò)上關(guān)于中文詞云的博客資料99.9%是對wordcloud官網(wǎng)示例的翻譯,我要說的是官方示例基本就是個大坑,不知道是不太放心上還是本身就是臨時工lowB程序員寫的。而國內(nèi)的博主習(xí)慣了粘貼復(fù)制,已經(jīng)喪失了獨立思考的能力,不假思索的就照搬,反正我是被坑了,用官方示例將一部《凡人修仙傳》在Windows上單線程生成詞云花了300多秒,而我經(jīng)過仔細閱讀jieba庫和wordcloud庫的API后,發(fā)現(xiàn)根本就不是官網(wǎng)示例那么個寫法,經(jīng)過我重新改造后,只需要大概60秒就能生成《凡人修仙傳》的詞云。
首先我們進入wordcloud文檔,找到 create wordcloud with chinese 這個示例,查看一下官方示例,代碼我這里就不貼了,點擊鏈接可直接跳轉(zhuǎn)第一種寫法
我們結(jié)合jieba庫,修改詞云代碼。這里使用WordCloud的stopwords參數(shù)加入停止詞,而不是像官方示例那樣去做遍歷篩選停止詞,特別是寫出if not (myword.strip() in f_stop_seg_list) and len(myword.strip()) > 1:這種低性能的代碼,就算是遍歷, len(myword.strip()) > 1也應(yīng)放在最前面去判斷,而不是把停止詞放在最前面去判斷,這樣大大的增加了時間復(fù)雜度。from wordcloud import WordCloud
from wordcloud import ImageColorGenerator
from matplotlib.image import imread
import matplotlib.pyplot as plt
import jieba, time
def get_stopwords():
with open("stopwords.txt", encoding='utf-8') as f_stop:
return f_stop.read().splitlines()
back_img = imread("timg.jpg")
img_colors = ImageColorGenerator(back_img)
with open("fanrenxiuxian.txt", encoding="gbk") as file:
stop_words = get_stopwords() # 獲取停止詞列表
seg_list = jieba.cut(file.read(), cut_all=False) # 返回一個生成器
cut_list = " ".join(seg_list)
word_cloud = WordCloud(font_path="c:\windows\Fonts\simhei.ttf",
background_color="white",
max_words=1000,
max_font_size=100,
width=1920,
stopwords=stop_words,
mask=back_img,
height=1080).generate(cut_list)
word_cloud.recolor(color_func=img_colors) # 替換默認(rèn)的字體顏色
plt.figure() # 創(chuàng)建一個圖形實例
plt.imshow(word_cloud, interpolation='bilinear')
plt.axis("off") # 不顯示坐標(biāo)尺寸
plt.show()第二種寫法
這里的第二種寫法基本就官方示例的寫法,只是略微調(diào)整了篩選停止詞時的判斷條件的順序from wordcloud import WordCloud
from wordcloud import ImageColorGenerator
from matplotlib.image import imread
import matplotlib.pyplot as plt
import jieba, time
def get_stopwords():
with open("stopwords.txt", encoding='utf-8') as f_stop:
return f_stop.read().splitlines()
back_img = imread("timg.jpg")
img_colors = ImageColorGenerator(back_img)
with open("fanrenxiuxian.txt", encoding="gbk") as file:
stop_words = get_stopwords() # 獲取停止詞列表
seg_list = jieba.cut(file.read(), cut_all=False) # 返回一個生成器
cut_list = "/".join(seg_list).split("/")
content_list = []
for word in cut_list:
if len(word.strip()) > 1 and not (word.strip() in stop_words):
content_list.append(word)
word_cloud = WordCloud(font_path="c:\windows\Fonts\simhei.ttf",
background_color="white",
max_words=200,
max_font_size=100,
width=1920,
mask=back_img,
height=1080).generate(' '.join(content_list))
word_cloud.recolor(color_func=img_colors) # 替換默認(rèn)的字體顏色
plt.figure() # 創(chuàng)建一個圖形實例
plt.imshow(word_cloud, interpolation='bilinear')
plt.axis("off") # 不顯示坐標(biāo)尺寸
plt.show()第三種寫法,最終版
這種是我推薦的做法。整個文本的分詞包括關(guān)鍵詞提取,我們都直接交給jieba庫去做就行了,WordCloud庫僅僅根據(jù)jieba庫返回的關(guān)鍵詞以及權(quán)重去生成詞云圖片就行。這里主要用到WordCloud庫的generate_from_frequencies這個函數(shù),API文檔給出的說明是Create a word_cloud from words and frequencies.,有了這個API,不知道官方中文詞云示例為什么還寫成那樣,難道是自己的API都不清楚嗎?令人費解from wordcloud import WordCloud
from wordcloud import ImageColorGenerator
from matplotlib.image import imread
import matplotlib.pyplot as plt
import jieba.analyse
back_img = imread("timg.jpg")
img_colors = ImageColorGenerator(back_img)
with open("fanrenxiuxian.txt", encoding="gbk") as file:
jieba.analyse.set_stop_words('stopwords.txt') # 設(shè)置止詞列表
tags = jieba.analyse.extract_tags(file.read(), 1000, withWeight=True)
data = {item[0]: item[1] for item in tags}
word_cloud = WordCloud(font_path="c:\windows\Fonts\simhei.ttf",
background_color="white",
max_words=1000,
max_font_size=100,
width=1920,
mask=back_img,
height=1080).generate_from_frequencies(data)
word_cloud.recolor(color_func=img_colors) # 替換默認(rèn)的字體顏色
plt.figure() # 創(chuàng)建一個圖形實例
plt.imshow(word_cloud, interpolation='bilinear')
plt.axis("off") # 不顯示坐標(biāo)尺寸
plt.show()
簡單說一下這里的stop_words停止詞其實就是需要被過濾掉的詞,比如一篇文章中肯定有無數(shù)個“的”、“了”之類的對于詞頻而言無意義詞,根據(jù)具體需求,一些副詞、邏輯連接詞之類的也都要過濾掉,否則就會影響準(zhǔn)確性。
由于我這里停止詞沒有單獨去添加,而是用了一個通用的停止詞表,導(dǎo)致最終生成的詞云不是特別準(zhǔn)確,這個就要大家自己去小心調(diào)試了
關(guān)注個人公眾號:編程之路從0到1編程之路從0到1
總結(jié)
以上是生活随笔為你收集整理的python中文词云生成_Python 词云生成的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java报错怎么看_IGV 哐当就不能用
- 下一篇: 美国的f16与中国的哪类战机相似?