上一篇文章(連接)咱們對COVID19_line_list數據集進行了清洗以及初步分析。本文中咱們將分析如何用詞雲來展現文本信息的概要。python
好比咱們從詞雲百度百科截取文字,製做詞雲。簡單來講,詞雲就是重要單詞的可視化,以下圖。 git
line list 數據集中有兩列很重要的文本信息,symptoms (症狀) 以及summary(摘要)。咱們能夠輕易的提出兩個問題:咱們將用詞雲回答這兩個問題。github
python 做爲一個萬能膠水語言,各類有用的輪子天然不勝枚舉。wordcloud 即是專門用於製做詞雲的包。 安裝方式很簡單,pip便可。bash
數據咱們採用上篇中清理好的數據,這裏我將清理好的數據保存爲新的csv文件(COVID19_line_list_data_cleaned.csv)。app
第一步,導入必要的庫。oop
import matplotlib.pyplot as plt
import 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 格式。post
# prepare the text by using str.cat
all_symptoms = line_list_data_raw_df['symptom'].str.cat(sep=',')
print(type(all_symptoms))
複製代碼
<class 'str'>
複製代碼
能夠看到all_symptoms 已是str 格式。咱們先分析symptom 列,後續會處理summary列的信息。字體
借用經典的案例代碼,咱們先用默認的參數製做詞雲。ui
# fast show wordcloud
wordcloud = WordCloud().generate(all_symptoms)
plt.figure()
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()
複製代碼
很不錯,已經有了初步的模樣,不過咱們仍是發現一些問題:
固然能解決,wordCould 類帶有一些初始化參數,好比min_font_size控制最小的詞字體大小,像素大小經過width和height 來調節。默認的collocations 爲True,用於合併重要性/頻次至關的文本。設定這些參數,咱們能夠垂手可得的改善的詞雲畫面。spa
# change the resolution and cancel the collocations
wordcloud = 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 是最多見的症狀。
這裏有一幅人類體形圖,咱們也能夠將這些症狀的詞條做爲tag 刻畫在人物肖像上。這裏須要用到wordcloud的mask 參數。mask 顧名思義就是用於掩蓋一些像素。
加載圖像,而且轉化爲array做爲mask。print mask的信息,咱們能夠看到大批量的255 255 255。 這是一個好的mask,由於這個表明着白色,白色的區域咱們將不會用於填寫詞條,僅僅對有色區域進行填寫。# modern wordcloud
mask = 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 博客給出了必定的解釋。總之,零不是咱們想要的。
[[[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 多一些。
到此咱們的兩個問題都圓滿的經過詞雲回答了。
回到開篇的詞雲圖,咱們展現了一份中文詞雲。若是直接借用咱們今天的代碼可能會出現一些問題。這裏咱們僅僅貼出中文詞雲製做的代碼,以及一點注意事項。
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()
複製代碼
本文介紹了經典版以及畫面嵌套版的詞雲製做。使用詞雲能夠一目瞭然的獲取海量文本內容的關鍵信息。詞雲製做過程當中的一些坑咱們也進行了掩埋: