python实现词云图

时间:2024-01-30 19:21:27

引言

最近再参加网页设计大赛,任务量都在网页设计和网页修改,以至于落了好多天学习大数据的知识。今天比赛结束,正好写一篇网页大赛用到的技术

正文

我们做的是一个豆瓣top250数据分析的一个网页,其中有一项技术是用到了词云,今天正好把这项技术说说。

具体怎么做的呢,首先我们先爬取了豆瓣top250 220条关于某个电影的短评,然后将短评存到数据库,读取数据库,将关于该部电影的短评组成一句话,进行jieba分词,然后再过滤掉停用词,制作词云图,最后保存词云图.

步骤

1、导包

## 包的作用
import jieba  #分词
from wordcloud import WordCloud  #词云
from PIL import Image   #图片处理
import numpy as np  #将图片变成数组
import collections  #计数器
from matplotlib import pyplot as plt  #绘图
import sqlite3  #数据库

2、读取数据,并返回数据

def get_data(db_name,sql):
    #连接数据库
    conn = sqlite3.connect(db_name)
    #获取游标
    cursor = conn.cursor()
    #执行sql语句
    data = cursor.execute(sql)
    text = ""
    #拼接信息
    for item in data:
        text += item[0]+" "
    cursor.close()
    #关闭数据库
    conn.close()
    return text

3、进行分词,并返回字典。(name:对应的单词,value:单词出现的个数)

def cut_word(text):
    #分词:cut_all=False:精确模式 HMM=True:使用隐式马尔科夫
    cut = jieba.cut(text,cut_all=False,HMM=True)
    object_list = []
    #读取停用词
    with open("stop_word.txt", \'r\', encoding=\'UTF-8\') as meaninglessFile:
        stopwords = set(meaninglessFile.read().split(\'\n\'))
    stopwords.add(\' \')
    #如果单词不在停用词里,则添加
    for word in cut:
        if word not in stopwords:
            object_list.append(word)
    #collections.Counter 计数器,统计单词个数
    word_counts = collections.Counter(object_list)
    print(word_counts)
    return word_counts

4、生成词云图并保存

def get_cloud(word_counts,i):
    #遮罩图:必须是白底的
    img = Image.open(r\'./img/tree.jpg\')
    img_array = np.array(img)  #将图片变为数组
    wc = WordCloud(
        background_color = \'white\', # 背景颜色
        mask = img_array,  #遮罩图片
        font_path = \'msyh.ttc\'  #字体样式

    )
    wc.generate_from_frequencies(word_counts)  #生成词云图
    fig = plt.figure(1)
    plt.imshow(wc)  # 显示词云
    plt.axis(\'off\') # 关闭保存
    #plt.show()
    #调整边框
    plt.subplots_adjust(top=0.99, bottom=0.01, right=0.99, left=0.01, hspace=0, wspace=0)
    #保存图片
    plt.savefig(r\'./movie_img/movie{0}.jpg\'.format(i),dpi = 500)

5、总的代码

#-*- codeing = utf-8 -*-
#@Time : 2020/11/14 22:16
#@Author : 杨晓
#@File : testCloud.py
#@Software: PyCharm
## 包的作用
import jieba  #分词
from wordcloud import WordCloud  #词云
from PIL import Image   #图片处理
import numpy as np  #将图片变成数组
import collections  #计数器
from matplotlib import pyplot as plt  #绘图
import sqlite3  #数据库
# 获取短评信息
def get_data(db_name,sql):
    #连接数据库
    conn = sqlite3.connect(db_name)
    #获取游标
    cursor = conn.cursor()
    #执行sql语句
    data = cursor.execute(sql)
    text = ""
    for item in data:
        text += item[0]+" "
    cursor.close()
    #关闭数据库
    conn.close()
    return text

def cut_word(text):
    #分词:cut_all=False:精确模式 HMM=True:使用隐式马尔科夫
    cut = jieba.cut(text,cut_all=False,HMM=True)
    object_list = []
    #读取停用词
    with open("stop_word.txt", \'r\', encoding=\'UTF-8\') as meaninglessFile:
        stopwords = set(meaninglessFile.read().split(\'\n\'))
    stopwords.add(\' \')
    #如果单词不在停用词里,则添加
    for word in cut:
        if word not in stopwords:
            object_list.append(word)
    #collections.Counter 计数器,统计单词个数
    word_counts = collections.Counter(object_list)
    print(word_counts)
    return word_counts
def get_cloud(word_counts,i):
    #遮罩图:必须是白底的
    img = Image.open(r\'./img/tree.jpg\')
    img_array = np.array(img)  #将图片变为数组
    wc = WordCloud(
        background_color = \'white\', # 背景颜色
        mask = img_array,  #遮罩图片
        font_path = \'msyh.ttc\'  #字体样式

    )
    wc.generate_from_frequencies(word_counts)  #生成词云图
    fig = plt.figure(1)
    plt.imshow(wc)  # 显示词云
    plt.axis(\'off\') # 关闭保存
    #plt.show()
    #调整边框
    plt.subplots_adjust(top=0.99, bottom=0.01, right=0.99, left=0.01, hspace=0, wspace=0)
    #保存图片
    plt.savefig(r\'./movie_img/movie{0}.jpg\'.format(i),dpi = 500)

if __name__ == \'__main__\':
    for i in range(1,251):
        #编写查询语句
        sql = "select info from movie"+str(i)
        text = get_data(\'duanping\',sql)
        word_counts = cut_word(text)
        get_cloud(word_counts,i)

因为要生成250个词云图,所有才有for循环。具体要求请读者按照自己的需求更改main函数代码

运行结果:

肖申克的救赎:

王霸别姬