python应用学习(四)——wordcloud生成词云

  • 前言
  • 一、准备
  • 二、导入库
  • 三、基本功能实现
  • 四、爬取书评并制作词云
  • 最后



前言

朋友最近在公众号发一些好书好剧推荐,然后我想着帮帮忙,做一个书评的词云,说不定会有效果,说干就干,在网上收集资料,结合自己的需求终于还是完成了呀!

1、完成目标:

  爬取书评或者影评然后获取其评论词,并制作词云,如图所示

python wordcloud 词云颜色 python中wordcloud生成词云_python


2、内容预告

本文设计到知识点较多,在代码中会有注释,这里简单罗列一下
(1)python对字符串的处理(删除自己不想要的东西)——re库的使用
(2)python对文件的读写操作
(3)python对各类型数据包括字符串、列表、字典等的转换等处理
(4)爬虫相关内容
(5)jieba(结巴,哈哈哈)实用分词库的使用
(6)wordcloud 词云生成库的使用


一、准备

1、python环境

2、涉及到的python库需要 pip install 包名 安装

pip install jiebapip install wordcloud (文章涉及到的其他库如果没有也需要安装)

二、导入库

import jieba
from wordcloud import WordCloud

注意: 我在导入wordcloud的时候犯了一个哭笑不得的错误,错误提示是 ImportError:cannot import name ‘WordCloud’ ,当时感觉巨奇怪,怎么我的的电脑和别人的不一样???

python wordcloud 词云颜色 python中wordcloud生成词云_Image_02


后来发现原来是我把我的python文件名写的是“wordcloud.Py”结果自然会出问题,解决方法就是把文件名改了…

python wordcloud 词云颜色 python中wordcloud生成词云_Image_03

三、基本功能实现

实现对给定文本制作词云

# 简单对一定的文本制作词云(将所需文本放入wordcloudtext.txt文件中)
import re
import jieba
from wordcloud import WordCloud
import numpy
from PIL import Image

#创建词云
def create_wordcloud(content,savename):
    mask = numpy.array(Image.open("ball.jpg"))  #配置一个mask参数,生成该图片形状的词云
    contents = ''.join(content)   #拼接所给的内容,如果所给的是列表那么将列表中的内容拼接起来,如果是字典那么拼接其所有键
    content_cut = jieba.cut(contents,cut_all=False)   #jieba.cut用来分词,cut_all参数用来控制全模式或者精确模式分词
    content_space_split = ' '.join(content_cut)   #用空格将分词结果拼接起来
    result = WordCloud('simhei.ttf',
                   mask = mask,
                   background_color='white', # 背景颜色
                   width=1000,
                   height=600,).generate(content_space_split)#创建词云
    result.to_file('%s.png'%savename)  #将词云保存为图片

#删除文本中的非中文部分
def find_chinese(file):
    pattern = re.compile(r'[^\u4e00-\u9fa5]')
    chinese = re.sub(pattern, '', file)
    #print(chinese)
    return chinese

if __name__ == '__main__':
    with open ('D:\\ryc\python_learning\other\\3_wordcloud\wordcloudtext.txt','r') as f:#读取.txt文件内容(将想要制作词云的文本内容放入该文本文件中)
        content = f.read()
        content = find_chinese(content)
        content = re.sub('[我你他的了但是就还要不会那在有都才看也又太像可中却很到对时候能这而当没]','',content)  #去除文本中我你他之类的不想要的高频词
        print(content)
    create_wordcloud(content,'词云评论')

四、爬取书评并制作词云

import requests
import re
import jieba
from wordcloud import WordCloud
import numpy
from PIL import Image

#删除文本中的非中文部分
def find_chinese(file):
    pattern = re.compile(r'[^\u4e00-\u9fa5]')
    chinese = re.sub(pattern, '', file)
    return chinese

#爬取小王子的短评内容
def spider_xiaowangzi():
    commentres = ''
    with open ('D:\\ryc\python_learning\other\\3_wordcloud\spider_wordcloud.txt','w',encoding='utf-8') as f:
        url = 'https://book.douban.com/subject/1084336/comments/?percent_type=h&limit=20&status=P&sort=new_score'  #爬取目标地址
        header = {
            'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36',
            'Cookie' : 'll="118100"; bid=gr9hyjlFAIs; __utmz=30149280.1586961843.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); _vwo_uuid_v2=DAACAB21E936827CFA01C7ADE5CAF4293|cc739421584c029e0df955dae135ef07; __gads=ID=2846de2c51666e22:T=1587043991:S=ALNI_MaF-A9RTL8744UwEClUMK5nqOC8nw; _ga=GA1.2.507836951.1586961843; gr_user_id=3aa1d1e6-1a34-4b05-82ef-8066755b0ca9; __utmz=81379588.1587383782.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __yadk_uid=Ot4d328rVsOjtT0KtAdZE0rJH9jhIhlq; viewed="1007305"; ap_v=0,6.0; __utmc=30149280; __utma=30149280.507836951.1586961843.1588474302.1588476961.13; __utmt_douban=1; __utmb=30149280.1.10.1588476961; __utma=81379588.507836951.1586961843.1587445404.1588476961.5; __utmc=81379588; __utmt=1; __utmb=81379588.1.10.1588476961; _pk_id.100001.3ac3=bc45a2b0c4ddf6ec.1587383783.5.1588476961.1587445427.; _pk_ses.100001.3ac3=*'
        }  #带上请求头爬取才不至于被拦
        try :
            data = requests.get(url,headers = header).text
        except:
            print('爬取失败')
            exit ()
        #从爬取的data中解析出该部分内容(结果是一个列表)
        comment = re.findall('<span class="short">(.*?)</span>',data)  #<span class="short">十几岁的时候渴慕着小王子,一天之间可以看四十四次日落。是在多久之后才明白,看四十四次日落的小王子,他有多么难过。</span>

        for i in range(0,len(comment)):
            commentres = commentres + comment[i]   #将列表转换为一个完整的字符串
        commentres = find_chinese(commentres)      #去除其中的非中文部分
        commentres = re.sub('[我你他的了但是就还要不会那在有都才看也又太像可中却很说到对]','',commentres)  #去除文本中我你他之类的你不想要的高频词
            
        f.write("{duanpin}\n".format(duanpin = commentres)) #将结果写入.txt文件中
        #print (commentres)
        return commentres
        

def create_wordcloud(content,savename):
    mask = numpy.array(Image.open("ball.jpg"))    #配置一个mask参数,生成该图片形状的词云
    contents = ''.join(content)   #拼接所给的内容,如果所给的是列表那么将列表中的内容拼接起来,如果是字典那么拼接其所有键
    content_cut = jieba.cut(contents,cut_all=False)   #jieba.cut用来分词,cut_all参数用来控制全模式(True)或者精确模式分词(False)
    content_space_split = ' '.join(content_cut)    #用空格将分词结果拼接起来
    result = WordCloud('simhei.ttf',                
                   mask = mask,
                   background_color='white', # 背景颜色
                   width=1000,
                   height=600,).generate(content_space_split) #创建词云
    result.to_file('%s.png'%savename)  #将词云保存为图片

if __name__ == "__main__":
    comment = spider_xiaowangzi()
    create_wordcloud(comment,'小王子词云评论')

最后

类似有意思的python应用我会持续更新,有兴趣的小伙伴可以关注我,以及时获取更新内容哦!