COVID19 line list 數據集分析 (2) wordcloud 詞雲分析

前言

上一篇文章(連接)咱們對COVID19_line_list數據集進行了清洗以及初步分析。本文中咱們將分析如何用詞雲來展現文本信息的概要。python

好比咱們從詞雲百度百科截取文字,製做詞雲。簡單來講,詞雲就是重要單詞的可視化,以下圖。 git

line list 數據集中有兩列很重要的文本信息,symptoms (症狀) 以及summary(摘要)。咱們能夠輕易的提出兩個問題:

  • COVID19 的主要症狀是什麼
  • 文本摘要的內容主要是什麼

咱們將用詞雲回答這兩個問題。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()
複製代碼

很不錯,已經有了初步的模樣,不過咱們仍是發現一些問題:

  • 有些詞過小了,幾乎看不見
  • 兩個fever 是個什麼東西?
  • 字體好模糊,不能更清楚嗎?

固然能解決,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 是最多見的症狀。

更modern的詞雲

這裏有一幅人類體形圖,咱們也能夠將這些症狀的詞條做爲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 多一些。

到此咱們的兩個問題都圓滿的經過詞雲回答了。

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()
複製代碼

總結

本文介紹了經典版以及畫面嵌套版的詞雲製做。使用詞雲能夠一目瞭然的獲取海量文本內容的關鍵信息。詞雲製做過程當中的一些坑咱們也進行了掩埋:

  • 畫面分辨率問題
  • 疊詞問題
  • 彩色畫面的嵌套問題
  • 中文亂碼的問題
相關文章
相關標籤/搜索