文本可视化(词云图)

(一)文本可视化种类

(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')

⑥ 结果

manifold.jpg