安装wordcloud_COVID19数据分析实战:WordCloud 词云分析
↑↑點擊上方藍字,回復資料,N個G的驚喜
前言
上一篇文章(鏈接)我們對COVID19_line_list數據集進行了清洗以及初步分析。本文中我們將分析如何用詞云來展示文本信息的概要。
比如我們從詞云百度百科截取文字,制作詞云。簡單來說,詞云就是重要單詞的可視化,如下圖。
line list 數據集中有兩列很重要的文本信息,symptoms (癥狀) 以及summary(摘要)。我們可以輕易的提出兩個問題:
- COVID19 的主要癥狀是什么
- 文本摘要的內容主要是什么
我們將用詞云回答這兩個問題。
python 作為一個萬能膠水語言,各種有用的輪子自然不勝枚舉。wordcloud 便是專門用于制作詞云的包。安裝方式很簡單,pip即可。
準備數據
數據我們采用上篇中清理好的數據,這里我將清理好的數據保存為新的csv文件(COVID19_line_list_data_cleaned.csv)。
第一步,導入必要的庫。
import matplotlib.pyplot as pltimport numpy as np
import pandas as pd
from PIL import Image
from wordcloud import ImageColorGenerator
from wordcloud import WordCloud
import jieba
# read the data
line_list_data_cleaned_file = 'data/COVID19_line_list_data_cleaned.csv'
line_list_data_raw_df = pd.read_csv(line_list_data_cleaned_file)
我們需要分析的是symptom 和summary 兩列的信息。wordcloud 分析的文本為str 格式,因此我們需要將dataframe 每一行的數據組合成一個str 格式。
# prepare the text by using str.catall_symptoms = line_list_data_raw_df['symptom'].str.cat(sep=',')
print(type(all_symptoms))
可以看到all_symptoms 已經是str 格式。我們先分析symptom 列,后續會處理summary列的信息。
快速做經典詞云
借用經典的案例代碼,我們先用默認的參數制作詞云。
# fast show wordcloudwordcloud = WordCloud().generate(all_symptoms)
plt.figure()
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()
很不錯,已經有了初步的模樣,不過我們還是發現一些問題:
- 有些詞太小了,幾乎看不見
- 兩個fever 是個什么東西?
- 字體好模糊,不能更清楚嗎?
當然能解決,wordCould 類帶有一些初始化參數,比如min_font_size控制最小的詞字體大小,像素大小通過width和height 來調節。默認的collocations 為True,用于合并重要性/頻次相當的文本。設定這些參數,我們可以輕而易舉的改善的詞云畫面。
# change the resolution and cancel the collocationswordcloud = WordCloud(
min_font_size=10,
width=800,
height=400,
collocations=False).generate(all_symptoms)
plt.figure()
plt.imshow(wordcloud)
plt.axis("off")
plt.show()
一款經典版的詞云就出爐了,看上去很不錯。我們的第一個問題也有了答案:fever 和cough 是最常見的癥狀。
更modern的詞云
這里有一幅人類體形圖,我們也可以將這些癥狀的詞條作為tag 刻畫在人物肖像上。這里需要用到wordcloud的mask 參數。mask 顧名思義就是用于掩蓋一些像素。
加載圖像,并且轉化為array作為mask。print mask的信息,我們可以看到大批量的255 255 255。這是一個好的mask,因為這個代表著白色,白色的區域我們將不會用于填寫詞條,僅僅對有色區域進行填寫。
# modern wordcloudmask = np.array(Image.open('data/human_body_shape.png'))
print(mask)
[[255 255 255 0]
[255 255 255 0]
[255 255 255 0]
...
[255 255 255 0]
[255 255 255 0]
[255 255 255 0]]
[[255 255 255 0]
[255 255 255 0]
[255 255 255 0]
...
[255 255 255 0]
[255 255 255 0]
[255 255 255 0]]
[[255 255 255 0]
[255 255 255 0]
[255 255 255 0]
...
[255 255 255 0]
[255 255 255 0]
[255 255 255 0]]]
再次創建wordcloud,代碼幾乎和上次雷同,僅僅是添加一個mask參數,以及設定圖像的線條寬度contour_width 以及顏色contour_color。
wordcloud = WordCloud(background_color="white",
min_font_size=10,
width=800,
height=400,
mask=mask,
collocations=False,
contour_width=2,
contour_color='black').generate(all_symptoms)
plt.figure()
plt.imshow(wordcloud)
plt.axis("off")
plt.show()
效果看起來比經典款的要好一些,但是還有一些瑕疵。我們可以看到body 輪廓中很多空白處,這是因為symptom 統計的詞條類數目比較少,無法填滿圖像。
彩色圖像詞云
很明顯,summary 列的信息量要遠遠大于symptom,下面我們可以分析該列數據。這次我們選擇一幅彩色圖像,我把human換成robot。幾乎同樣的代碼,再次運行。
mask = np.array(Image.open('data/robot.png'))all_summary = line_list_data_raw_df['summary'].str.cat(sep=',')
image_colors = ImageColorGenerator(mask)
wordcloud = WordCloud(
background_color="white",
min_font_size=10,
width=800,
height=400,
mask=mask,
collocations=False,
contour_width=1,
contour_color='black').generate(all_summary)
plt.figure()
plt.imshow(
wordcloud.recolor(
color_func=image_colors),
interpolation="bilinear")
plt.axis("off")
plt.show()
結果。。。oops, 說好的機器人呢?怎么只有兩個眼睛和幾個大門牙,一定是mask出了問題。
我們打印一下創建的mask矩陣。一堆堆零,邊框明明是白色的,為什么是零呢?datacamp 博客給出了一定的解釋(https://www.datacamp.com/community/tutorials/wordcloud-python)。總之,零不是我們想要的。
[[[0 0 0 0][0 0 0 0]
[0 0 0 0]
...
[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]
...
[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]
...
[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
...
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]
...
[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]
...
[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]
...
[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]]
解決方案也很簡單,替換0為255,然后重新制作詞云。
mask[mask == 0] = 255可愛的機器人終于出現了。
回到我們開始提到的問題,我們可以看到summary主要是關于新確認的(new confirmed)一些COVID 案例,病人(patient)可能和Wuhan相關。而且我們可以看到樣本中male 似乎比female 多一些。
到此我們的兩個問題都圓滿的通過詞云回答了。
bonus: 中文詞云
回到開篇的詞云圖,我們展示了一份中文詞云。如果直接借用我們今天的代碼可能會出現一些問題。這里我們僅僅貼出中文詞云制作的代碼,以及一點注意事項。
- 處理畫面出現顯示異常,可能是字體的問題。
- 畫面中詞分割不好?用jieba
ciyun.csv 就是從百度詞條隨便截取的,你可以換成任意的文章。
ciyun = 'data/ciyun.csv'with open(ciyun) as f:
ciyun_str = f.read()
def jieba_processing_txt(text):
mywordlist = []
seg_list = jieba.cut(text, cut_all=False)
liststr = "/ ".join(seg_list)
for myword in liststr.split('/'):
if len(myword.strip()) > 1:
mywordlist.append(myword)
return ' '.join(mywordlist)
font = 'data/SourceHanSerifCN-Light.otf' # 可以下載或者用電腦的自帶的字體
wordcloud = WordCloud(
min_font_size=10,
width=800,
height=400,
collocations=False,font_path=font).generate(jieba_processing_txt(ciyun_str))
plt.figure()
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()
總結
本文介紹了經典版以及畫面嵌套版的詞云制作。使用詞云可以一目了然的獲取海量文本內容的關鍵信息。詞云制作過程中的一些坑我們也進行了掩埋:
- 畫面分辨率問題
- 疊詞問題
- 彩色畫面的嵌套問題
- 中文亂碼的問題
作者:琥珀里有波羅的海
https://juejin.im/post/5ebe85185188255fd54df565
加入機器學習微信群請后臺回復【入群】推薦閱讀:
徹底搞懂機器學習中的正則化
機器學習數學基礎與理論(書單)機器學習中需要了解的 5 種采樣方法Pandas切片操作:一個很容易忽視的錯誤歡迎挑戰!14個數據分析和機器學習項目!附數據集復旦大學機器學習、深度學習視頻公開課,附PDF課件下載“為沉迷學習點贊↓ 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的安装wordcloud_COVID19数据分析实战:WordCloud 词云分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML和css学术报告,清华大学 张超
- 下一篇: java 黑窗运行_javaday1 如