超燃的文字云效果,用Python就能輕松get!

本文轉(zhuǎn)載自公眾號(hào):數(shù)據(jù)森麟(ID:shujusenlin)
作者:葉庭云
鏈接:https://blog.csdn.net/fyfugoyfa
/ 01 / 詞云圖
詞云圖是一種用來(lái)展現(xiàn)高頻關(guān)鍵詞的可視化表達(dá),通過(guò)文字、色彩、圖形的搭配,產(chǎn)生有沖擊力地視覺(jué)效果,而且能夠傳達(dá)有價(jià)值的信息。
詞云就是通過(guò)形成“關(guān)鍵詞云層”或“關(guān)鍵詞渲染”,對(duì)網(wǎng)絡(luò)文本中出現(xiàn)頻率較高的“關(guān)鍵詞”的視覺(jué)上的突出。
詞云圖過(guò)濾掉大量的文本信息,使瀏覽網(wǎng)頁(yè)者只要一眼掃過(guò)文本就可以領(lǐng)略文本的主旨。
本文通過(guò)對(duì)已獲取的京東商品評(píng)論數(shù)據(jù)進(jìn)行預(yù)處理、文本分詞、詞頻統(tǒng)計(jì)、詞云展示,熟悉制作詞云的基本方法。
/ 02 / stylecloud庫(kù)繪制詞云
01 stylecloud簡(jiǎn)介
對(duì)自己而言,平時(shí)用 python 制作詞云主要使用wordcloud,如果在可視化的過(guò)程還要用 pyecharts 繪制其他圖,那么詞云也干脆就用pyecharts制作了。
stylecloud也是一個(gè) python 繪制詞云的包,是一位數(shù)據(jù)科學(xué)家 Max Woolf 基于 wordcloud 優(yōu)化改良而成。
并添加了一些更有用的功能,從而讓使用者更易創(chuàng)作出獨(dú)特并且顏值頗高的詞云。

安裝stylecloud庫(kù)。
pip?install?stylecloud?-i?http://pypi.douban.com/simple?--trusted-host?pypi.douban.com
stylecloud具有以下特點(diǎn):
為詞云提供(任意大?。┑膱D標(biāo)形狀(通過(guò) Font Awesome 5.11.2 獲得)
支持高級(jí)調(diào)色板(通過(guò) palettable 實(shí)現(xiàn))
為上述調(diào)色板提供直接梯度
支持讀取文本文件,或預(yù)生成的 CSV 文件(包含單詞和數(shù)字)
提供命令行接口
02 蒙版圖片
影響詞云顏值的問(wèn)題之一就是蒙版圖片的生成。
自己制作的蒙版圖片要么分辨率不統(tǒng)一,要么需要調(diào)整對(duì)比度,比較麻煩,stylecloud是直接使用 Font Awesome 這個(gè)現(xiàn)成的方案。
網(wǎng)址鏈接:https://fontawesome.com/license/free
在stylecloud \ static的文件夾下,有一個(gè) fontawesome.min 的 css 文件包含了大量的圖標(biāo),打開(kāi)查看里面的內(nèi)容,發(fā)現(xiàn)其中包含很多圖標(biāo)的代碼。

這種 css 層疊樣式表,咱也看不懂、也不知道咋用呀,多虧有中文網(wǎng)站分門別類羅列了圖標(biāo)的樣子和名字。
https://fa5.dashgame.com/#/%E5%9B%BE%E6%A0%87 里面有詳細(xì)的圖標(biāo)介紹和分類。

使用方法如下:

比如要使用蘋(píng)果商標(biāo)的蒙版圖片,樣式前綴 fab,以 fa-為前綴的名稱 fa-apple,設(shè)置icon_name參數(shù),icon_name='fab fa-apple'即可。
03 配色
配色是影響詞云顏值的又一大問(wèn)題。stylecloud同樣找到了比較好的方案,配色方案使用高級(jí)調(diào)色板 palettable 來(lái)實(shí)現(xiàn)。
palettable 網(wǎng)站:https://jiffyclub.github.io/palettable/

我們可以通過(guò)修改參數(shù) palette='配色方案' 來(lái)達(dá)到更改自己的詞云配色。
04?繪制詞云
gen_stylecloud() 主要參數(shù)如下:
text:輸入文本,最好在直接調(diào)用函數(shù)時(shí)使用。
file_path:輸入文本/CSV 的文件路徑
icon_name:stylecloud 形狀的圖標(biāo)名稱(如 fas fa-grin-beam),[default: fas fa-flag]
palette:控制調(diào)色方案,stylecloud的調(diào)色方案調(diào)用了palettable,這是一個(gè)非常實(shí)用的模塊,其內(nèi)部收集了數(shù)量驚人的大量的經(jīng)典調(diào)色方案,默認(rèn)為 cartocolors.qualitative.Bold_5
output_name:stylecloud 的輸出文本名。[default: stylecloud.png]
gradient:梯度方向,(其默認(rèn)值是?None,如果它的值不是?None,則?stylecloud?使用了方向性梯度)[default:?None]
size:控制輸出圖像文件的分辨率(因?yàn)閟tylecloud默認(rèn)輸出方形圖片,所以size傳入的單個(gè)整數(shù)代表長(zhǎng)和寬),默認(rèn)為512
font_path:stylecloud 所用字體 .ttf 文件的路徑。[default: uses included Staatliches font]
random_state:控制單詞和顏色的隨機(jī)狀態(tài)
background_color:字符串,控制詞云圖底色,可傳入顏色名稱或16進(jìn)制色彩,默認(rèn)為?white
max_font_size:stylecloud 中的最大字號(hào)?[default:?200]
max_words:stylecloud 可包含的最大單詞數(shù)?[default:?2000]
stopwords:bool型,控制是否開(kāi)啟去停用詞功能,默認(rèn)為True,調(diào)用自帶的英文停用詞表
custom_stopwords:傳入自定義的停用詞List,配合stopwords共同使用
代碼如下。
#?-*-?coding:?UTF-8?-*-
"""
@Author ?:葉庭云
@CSDN ???:https://yetingyun.blog.csdn.net/
"""
from?stylecloud?import?gen_stylecloud
import?jieba
import?re
import?random
#?讀取數(shù)據(jù)
with?open('datas.txt',?encoding='utf-8')?as?f:
????data?=?f.read()
#?文本預(yù)處理??去除一些無(wú)用的字符???只提取出中文出來(lái)
new_data?=?re.findall('[\u4e00-\u9fa5]+',?data,?re.S)
new_data?=?"/".join(new_data)
#?文本分詞
seg_list_exact?=?jieba.cut(new_data,?cut_all=True)
result_list?=?[]
with?open('stop_words.txt',?encoding='utf-8')?as?f:
????con?=?f.readlines()
????stop_words?=?set()
????for?i?in?con:
????????i?=?i.replace("\n",?"")???#?去掉讀取每一行數(shù)據(jù)的\n
????????stop_words.add(i)
for?word?in?seg_list_exact:
????#?設(shè)置停用詞并去除單個(gè)詞
????if?word?not?in?stop_words?and?len(word)?>?1:
????????result_list.append(word)
print(result_list)
#?個(gè)人推薦使用的palette配色方案??效果挺好看
#?colorbrewer.qualitative.Dark2_7
#?cartocolors.qualitative.Bold_5
#?colorbrewer.qualitative.Set1_8
gen_stylecloud(
????text='?'.join(result_list),???????????????#?文本數(shù)據(jù)
????size=600,?????????????????????????????????#?詞云圖大小
????font_path=r'?C:\Windows\Fonts\msyh.ttc',???#?中文詞云??顯示需要設(shè)置字體
????output_name='詞云.png',???????????????????#?輸出詞云圖名稱
????icon_name='fas?fa-grin-beam',?????????????#?圖標(biāo)
????palette=cartocolors.qualitative.Bold_5????#?設(shè)置配色方案
)
運(yùn)行效果如下:

/ 03 / wordcloud庫(kù)繪制詞云
wordcloud是優(yōu)秀的詞云展示第三方庫(kù) 可以在命令行通過(guò)pip安裝。
pip?install?wordcloud?-i?http://pypi.douban.com/simple?--trusted-host?pypi.douban.com
wordcloud庫(kù)把詞云當(dāng)作一個(gè)WordCloud對(duì)象。
wordcloud.WordCloud( ) 代表一個(gè)文本對(duì)應(yīng)的詞云
可以根據(jù)文本中詞語(yǔ)出現(xiàn)的頻率等參數(shù)繪制詞云
繪制詞云的形狀,尺寸和顏色都可以設(shè)定
配置對(duì)象參數(shù)。

代碼實(shí)現(xiàn):
#?-*-?coding:?UTF-8?-*-
"""
@Author ?:葉庭云
@CSDN ???:https://yetingyun.blog.csdn.net/
"""
import?jieba
import?collections
import?re
from?wordcloud?import?WordCloud
import?matplotlib.pyplot?as?plt
#?958條評(píng)論數(shù)據(jù)
with?open('data.txt')?as?f:
????data?=?f.read()
#?文本預(yù)處理??去除一些無(wú)用的字符???只提取出中文出來(lái)
new_data?=?re.findall('[\u4e00-\u9fa5]+',?data,?re.S)
new_data?=?"?".join(new_data)
#?文本分詞
seg_list_exact?=?jieba.cut(new_data,?cut_all=True)
result_list?=?[]
with?open('stop_words.txt',?encoding='utf-8')?as?f:
????con?=?f.readlines()
????stop_words?=?set()
????for?i?in?con:
????????i?=?i.replace("\n",?"")???#?去掉讀取每一行數(shù)據(jù)的\n
????????stop_words.add(i)
for?word?in?seg_list_exact:
????#?設(shè)置停用詞并去除單個(gè)詞
????if?word?not?in?stop_words?and?len(word)?>?1:
????????result_list.append(word)
print(result_list)
#?篩選后統(tǒng)計(jì)
word_counts?=?collections.Counter(result_list)
#?獲取前100最高頻的詞
word_counts_top100?=?word_counts.most_common(100)
print(word_counts_top100)
#?繪制詞云
my_cloud?=?WordCloud(
????background_color='white',??#?設(shè)置背景顏色??默認(rèn)是black
????width=900,?height=600,
????max_words=100,????????????#?詞云顯示的最大詞語(yǔ)數(shù)量
????font_path='simhei.ttf',???#?設(shè)置字體??顯示中文
????max_font_size=99,?????????#?設(shè)置字體最大值
????min_font_size=16,?????????#?設(shè)置子圖最小值
????random_state=50???????????#?設(shè)置隨機(jī)生成狀態(tài),即多少種配色方案
).generate_from_frequencies(word_counts)
#?顯示生成的詞云圖片
plt.imshow(my_cloud,?interpolation='bilinear')
#?顯示設(shè)置詞云圖中無(wú)坐標(biāo)軸
plt.axis('off')
plt.show()
詞云圖:

/ 04 /?pyecharts庫(kù)的WordCloud繪制詞云
pyecharts是基于echarts的python庫(kù),能夠繪制多種交互式圖表,和其他可視化庫(kù)不一樣,pyecharts支持鏈?zhǔn)秸{(diào)用。
也就是說(shuō)添加圖表元素、修改圖表配置,只需要簡(jiǎn)單的調(diào)用組件即可。
#?class?pyecharts.charts.WordCloud
class?WordCloud(
????#?初始化配置項(xiàng),參考?`global_options.InitOpts`
????init_opts:?opts.InitOpts?=?opts.InitOpts()
)
#?func?pyecharts.charts.WordCloud.add
def?add(
????#?系列名稱,用于 tooltip 的顯示,legend 的圖例篩選。
????series_name:?str,
????#?系列數(shù)據(jù)項(xiàng),[(word1,?count1),?(word2,?count2)]
????data_pair:?Sequence,
????#?詞云圖輪廓,有?'circle',?'cardioid',?'diamond',?'triangle-forward',?'triangle',?'pentagon',?'star'?可選
????shape:?str?=?"circle",
????#?自定義的圖片(目前支持?jpg,?jpeg,?png,?ico?的格式,其他的圖片格式待測(cè)試)
????#?該參數(shù)支持:
????#?1、 base64 (需要補(bǔ)充 data 頭);
????#?2、本地文件路徑(相對(duì)或者絕對(duì)路徑都可以)
????#?注:如果使用了 mask_image 之后第一次渲染會(huì)出現(xiàn)空白的情況,再刷新一次就可以了(Echarts 的問(wèn)題)
????#?Echarts?Issue:?https://github.com/ecomfe/echarts-wordcloud/issues/74
????mask_image:?types.Optional[str]?=?None,
????#?單詞間隔
????word_gap:?Numeric?=?20,
????#?單詞字體大小范圍
????word_size_range=None,
????#?旋轉(zhuǎn)單詞角度
????rotate_step:?Numeric?=?45,
????#?距離左側(cè)的距離
????pos_left:?types.Optional[str]?=?None,
????#?距離頂部的距離
????pos_top:?types.Optional[str]?=?None,
????#?距離右側(cè)的距離
????pos_right:?types.Optional[str]?=?None,
????#?距離底部的距離
????pos_bottom:?types.Optional[str]?=?None,
????#?詞云圖的寬度
????width:?types.Optional[str]?=?None,
????#?詞云圖的高度
????height:?types.Optional[str]?=?None,
????#?允許詞云圖的數(shù)據(jù)展示在畫(huà)布范圍之外
????is_draw_out_of_bound:?bool?=?False,
????#?提示框組件配置項(xiàng),參考?`series_options.TooltipOpts`
????tooltip_opts:?Union[opts.TooltipOpts,?dict,?None]?=?None,
????#?詞云圖文字的配置
????textstyle_opts:?types.TextStyle?=?None,
????#?詞云圖文字陰影的范圍
????emphasis_shadow_blur:?types.Optional[types.Numeric]?=?None,
????#?詞云圖文字陰影的顏色
????emphasis_shadow_color:?types.Optional[str]?=?None,
)
代碼實(shí)現(xiàn):
#?-*-?coding:?UTF-8?-*-
"""
@Author ?:葉庭云
@CSDN ???:https://yetingyun.blog.csdn.net/
"""
import?jieba
import?collections
import?re
from?pyecharts.charts?import?WordCloud
from?pyecharts.globals?import?SymbolType
from?pyecharts?import?options?as?opts
from?pyecharts.globals?import?ThemeType,?CurrentConfig
CurrentConfig.ONLINE_HOST?=?'D:/python/pyecharts-assets-master/assets/'
#?958條評(píng)論數(shù)據(jù)
with?open('data.txt')?as?f:
????data?=?f.read()
#?文本預(yù)處理??去除一些無(wú)用的字符???只提取出中文出來(lái)
new_data?=?re.findall('[\u4e00-\u9fa5]+',?data,?re.S)??#?只要字符串中的中文
new_data?=?"?".join(new_data)
#?文本分詞--精確模式分詞
seg_list_exact?=?jieba.cut(new_data,?cut_all=True)
result_list?=?[]
with?open('stop_words.txt',?encoding='utf-8')?as?f:
????con?=?f.readlines()
????stop_words?=?set()
????for?i?in?con:
????????i?=?i.replace("\n",?"")???#?去掉讀取每一行數(shù)據(jù)的\n
????????stop_words.add(i)
for?word?in?seg_list_exact:
????#?設(shè)置停用詞并去除單個(gè)詞
????if?word?not?in?stop_words?and?len(word)?>?1:
????????result_list.append(word)
print(result_list)
#?篩選后統(tǒng)計(jì)
word_counts?=?collections.Counter(result_list)
#?獲取前100最高頻的詞
word_counts_top100?=?word_counts.most_common(100)
#?可以打印出來(lái)看看統(tǒng)計(jì)的詞頻
print(word_counts_top100)
word1?=?WordCloud(init_opts=opts.InitOpts(width='1350px',?height='750px',?theme=ThemeType.MACARONS))
word1.add('詞頻',?data_pair=word_counts_top100,
??????????word_size_range=[15,?108],?textstyle_opts=opts.TextStyleOpts(font_family='cursive'),
??????????shape=SymbolType.DIAMOND)
word1.set_global_opts(title_opts=opts.TitleOpts('商品評(píng)論詞云圖'),
??????????????????????toolbox_opts=opts.ToolboxOpts(is_show=True,?orient='vertical'),
??????????????????????tooltip_opts=opts.TooltipOpts(is_show=True,?background_color='red',?border_color='yellow'))
word1.render("商品評(píng)論詞云圖.html")
詞云圖:

用pyecharts繪制的詞云圖渲染在網(wǎng)頁(yè)上,具有交互效果,還有很多的配置參數(shù)可以設(shè)置讓詞云圖看起來(lái)更美觀。
戀習(xí)Python 關(guān)注戀習(xí)Python,Python都好練 好文章,我在看??
