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

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

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

使用方法如下:

比如要使用蘋果商標的蒙版圖片,樣式前綴 fab,以 fa-為前綴的名稱 fa-apple,設置icon_name參數,icon_name='fab fa-apple'即可。
03 配色
配色是影響詞云顏值的又一大問題。stylecloud同樣找到了比較好的方案,配色方案使用高級調色板 palettable 來實現。
palettable 網站:https://jiffyclub.github.io/palettable/

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

/ 03 / wordcloud庫繪制詞云
wordcloud是優秀的詞云展示第三方庫 可以在命令行通過pip安裝。
pip?install?wordcloud?-i?http://pypi.douban.com/simple?--trusted-host?pypi.douban.com
wordcloud庫把詞云當作一個WordCloud對象。
wordcloud.WordCloud( ) 代表一個文本對應的詞云
可以根據文本中詞語出現的頻率等參數繪制詞云
繪制詞云的形狀,尺寸和顏色都可以設定
配置對象參數。

代碼實現:
#?-*-?coding:?UTF-8?-*-"""
@Author ?:葉庭云
@CSDN ???:https://yetingyun.blog.csdn.net/
"""import?jiebaimport?collectionsimport?refrom?wordcloud?import?WordCloudimport?matplotlib.pyplot?as?plt#?958條評論數據with?open('data.txt')?as?f:
????data?=?f.read()#?文本預處理??去除一些無用的字符???只提取出中文出來
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",?"")???#?去掉讀取每一行數據的\n
????????stop_words.add(i)for?word?in?seg_list_exact:#?設置停用詞并去除單個詞if?word?not?in?stop_words?and?len(word)?>?1:
????????result_list.append(word)
print(result_list)#?篩選后統計
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',??#?設置背景顏色??默認是black
????width=900,?height=600,
????max_words=100,????????????#?詞云顯示的最大詞語數量
????font_path='simhei.ttf',???#?設置字體??顯示中文
????max_font_size=99,?????????#?設置字體最大值
????min_font_size=16,?????????#?設置子圖最小值
????random_state=50???????????#?設置隨機生成狀態,即多少種配色方案
).generate_from_frequencies(word_counts)#?顯示生成的詞云圖片
plt.imshow(my_cloud,?interpolation='bilinear')#?顯示設置詞云圖中無坐標軸
plt.axis('off')
plt.show()
詞云圖:

/ 04 /?pyecharts庫的WordCloud繪制詞云
pyecharts是基于echarts的python庫,能夠繪制多種交互式圖表,和其他可視化庫不一樣,pyecharts支持鏈式調用。
也就是說添加圖表元素、修改圖表配置,只需要簡單的調用組件即可。
#?class?pyecharts.charts.WordCloudclass?WordCloud(
????#?初始化配置項,參考?`global_options.InitOpts`
????init_opts:?opts.InitOpts?=?opts.InitOpts()
)
#?func?pyecharts.charts.WordCloud.adddef?add(
????#?系列名稱,用于 tooltip 的顯示,legend 的圖例篩選。
????series_name:?str,
????#?系列數據項,[(word1,?count1),?(word2,?count2)]
????data_pair:?Sequence,
????#?詞云圖輪廓,有?'circle',?'cardioid',?'diamond',?'triangle-forward',?'triangle',?'pentagon',?'star'?可選
????shape:?str?=?"circle",
????#?自定義的圖片(目前支持?jpg,?jpeg,?png,?ico?的格式,其他的圖片格式待測試)
????#?該參數支持:
????#?1、 base64 (需要補充 data 頭);
????#?2、本地文件路徑(相對或者絕對路徑都可以)
????#?注:如果使用了 mask_image 之后第一次渲染會出現空白的情況,再刷新一次就可以了(Echarts 的問題)
????#?Echarts?Issue:?https://github.com/ecomfe/echarts-wordcloud/issues/74
????mask_image:?types.Optional[str]?=?None,
????#?單詞間隔
????word_gap:?Numeric?=?20,
????#?單詞字體大小范圍
????word_size_range=None,
????#?旋轉單詞角度
????rotate_step:?Numeric?=?45,
????#?距離左側的距離
????pos_left:?types.Optional[str]?=?None,
????#?距離頂部的距離
????pos_top:?types.Optional[str]?=?None,
????#?距離右側的距離
????pos_right:?types.Optional[str]?=?None,
????#?距離底部的距離
????pos_bottom:?types.Optional[str]?=?None,
????#?詞云圖的寬度
????width:?types.Optional[str]?=?None,
????#?詞云圖的高度
????height:?types.Optional[str]?=?None,
????#?允許詞云圖的數據展示在畫布范圍之外
????is_draw_out_of_bound:?bool?=?False,
????#?提示框組件配置項,參考?`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,
)
代碼實現:
#?-*-?coding:?UTF-8?-*-"""
@Author ?:葉庭云
@CSDN ???:https://yetingyun.blog.csdn.net/
"""import?jiebaimport?collectionsimport?refrom?pyecharts.charts?import?WordCloudfrom?pyecharts.globals?import?SymbolTypefrom?pyecharts?import?options?as?optsfrom?pyecharts.globals?import?ThemeType,?CurrentConfig
CurrentConfig.ONLINE_HOST?=?'D:/python/pyecharts-assets-master/assets/'#?958條評論數據with?open('data.txt')?as?f:
????data?=?f.read()#?文本預處理??去除一些無用的字符???只提取出中文出來
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",?"")???#?去掉讀取每一行數據的\n
????????stop_words.add(i)for?word?in?seg_list_exact:#?設置停用詞并去除單個詞if?word?not?in?stop_words?and?len(word)?>?1:
????????result_list.append(word)
print(result_list)#?篩選后統計
word_counts?=?collections.Counter(result_list)#?獲取前100最高頻的詞
word_counts_top100?=?word_counts.most_common(100)#?可以打印出來看看統計的詞頻
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('商品評論詞云圖'),
??????????????????????toolbox_opts=opts.ToolboxOpts(is_show=True,?orient='vertical'),
??????????????????????tooltip_opts=opts.TooltipOpts(is_show=True,?background_color='red',?border_color='yellow'))
word1.render("商品評論詞云圖.html")
詞云圖:

用pyecharts繪制的詞云圖渲染在網頁上,具有交互效果,還有很多的配置參數可以設置讓詞云圖看起來更美觀。
戀習Python
關注戀習Python,Python都好練好文章,我在看??