文本可視化(詞雲圖)
(一)文本可視化種類
(1)基於文本內容的可視化
基於文本內容的可視化研究包括基於詞頻的可視化和基於詞匯分布的可視化,常用的有詞雲、分布圖和 Document Cards 等。
(2)基於文本關系的可視化
基於文本關系的可視化研究文本內外關系,幫助人們理解文本內容和發現規律。常用的可視化形式有樹狀圖、節點連接的網絡圖、力導向圖、疊式圖和 Word Tree 等。
(3)基於多層面信息的可視化
基於多層面信息的可視化主要研究如何結合信息的多個方面幫助用戶從更深層次理解文本數據,發現其內在規律。其中,包含時間信息和地理坐標的文本可視化近年來受到越來越多的關注。常用的有地理熱力圖、ThemeRiver、SparkClouds、TextFlow 和基於矩陣視圖的情感分析可視化等。
(二)詞雲實戰
(1)整體流程
獲取語料---->分詞(jieba、gensim)---->文本清洗(去停用詞等)---->統計詞頻---->繪制詞雲
(2)分步操作(代碼)
① 導入相關包
import jieba
import numpy as np
import pandas as pd
from wordcloud import WordCloud, ImageColorGenerator
import matplotlib.pyplot as plt
import os,sys
② 獲取語料
我是自己摘取論文中的幾段文字保存成manifold.txt文件。根據自己情況創建文件。path是語料文件的路徑。
# 文件路徑
path = 'D:\deep_learn\TextAnalysis\文本可視化'
filepath = os.path.join(path,'manifold.txt')
# 讀取文件
with open(filepath, 'r+', encoding='utf8') as f:
text = f.read()
③ 用jieba進行分詞
此處先添加了一個名詞‘多流形’,否則分詞分不出來。raw是形式為['流形','學習'......]的列表。可以直接用jieba.lcut()進行分詞直接得到列表。
# 結巴分詞
jieba.add_word("多流形")
raw = list(jieba.cut(text, cut_all=False))
④ 數據清洗
首先讀取停用詞,生成一個停用詞列表。然后進行數據清洗。得到干凈的文本pure_text
# 獲取停用詞列表
stopwords_path = os.path.join(path, 'stopwords.txt')
stopword_list = []
with open(stopwords_path, 'r+', encoding='utf8') as f:
for word in f.readlines():
if len(word)>0 and word != '\t\n':
stopword_list.append(word)
# 文本清洗 獲得干凈文本
pure_text = []
for word in raw:
if len(word)>1 and word != "\n\r":
if not word.isdigit(): #去數字
if word.strip() not in stopword_list: #去左右空格
pure_text.append(word.strip())
⑤ 統計詞頻
吧文本列表轉成pandas的Dataframe形式,然后進行詞頻統計。
# (1)用DataFrame操作
content = pd.DataFrame(pure_text, columns=['word'])
# 每個詞出現的頻率賦予一個新的列
content_new = content.groupby(by=['word'])['word'].agg({"count":np.size})
# 按頻率排序
content_new = content_new.reset_index().sort_values(by=['count'], ascending=False)
⑥ 繪制詞雲
此處采用默認方式,也可以用自定義方式。
wordcloud = WordCloud(font_path='./zi.ttf', background_color='white', max_font_size=80)
word_frequence = {x[0]:x[1] for x in content_new.head(100).values}
wordcloud = wordcloud.fit_words(word_frequence)
# 展示圖片
plt.imshow(wordcloud)
plt.axis("off")
plt.show()
# 保持圖片
wordcloud.to_file('./picture/manifold.jpg')