Python Wordcloud 词云------实站:爬取起点网站《大王饶命》,结合词云展示数据

 

  1、Wordcloud介绍和安装

  2、Wordcloud 参数介绍

  3、Wordcloud 实现操作

实战:爬取小说网站,结合jieba 和wordcloud展示小说中最常见的词语,分析展示数据。

注明:本地文件要有图片,txt文本,就可拿到代码直接执行,如果不行联系:qq:3440037784

wordcloud 介绍和安装:

wordcloud 简单利用英语来看就是词云,它是以词语为基本单位,更加直观的展示出我们的内容。

wordcloud 的安装:pip3 install wordcloud

环境介绍: pycharm 2017.2.3 + python 3.5.0

  1. wordcloud 的基本格式
#导入词云
from wordcloud import WordCloud
#打开文件并且读取完全
f = open('1.txt','r')
#创建wc设个实例对象,里面可传递相应的参数
#generate根据文本生成词云
wc = WordCloud(
    background_color='white',
    width=500,
    height=366,
    margin=2
).generate(f.read())
#to_file 输出到文件
wc.to_file('./image/0.jpg')
运行结果入下所示:
带入图片的基本格式:

  #导入词云

from wordcloud import WordCloud
#图像处理函数pip install imageio
from imageio import imread
#打开文件并且读取完全
f = open('1.txt','r')

#Read an image from a file as an array
#解析图片,将图片变成一个数组
mk = imread('9.png')

#创建wc设个实例对象,里面可传递相应的参数
#generate根据文本生成词云
wc = WordCloud(
    mask=mk,
    background_color='white',
    width=500,
    height=366,
    margin=2

).generate(f.read())

#to_file 输出到文件
wc.to_file('./image/0.jpg')

 

Wordcloud 参数介绍

  mask:遮罩图,字的大小布局和颜色都会依据遮罩图生成。其实理论上这对字大小和清晰程度的影响不大,

  但是遮罩图色和背景色background_color如果易混淆,则可能是一个导致看起来不清晰的因素;

  另外遮罩图自身各个颜色之间的对比不强烈,也可能使图看起来层次感不够。

  background_color:背景色,默认黑。

  这个本来其实也不怎么影响清晰度,但是,就像之前在mask中提到的,如果遮罩图像颜色过浅、背景设置白色,

  可能导致字看起来“不清晰”。而实际上,我对一个浅色遮罩图分别用白、黑两种背景色后发现,

  黑色背景的强烈对比之下会有若干很浅也很小的词浮现出来,而之前因背景色、字色过于相近而几乎无法用肉眼看出这些词。

    mode:默认“RGB”。根据说明文档,如果想设置透明底色的云词图,那么可以设置background_color=None, mode="RGBA"

    max_font_size:最大字号。源文件中也有讲到,图的生成会依据最大字号等因素去自动判断词的布局。

  经测试,哪怕同一个图像,只要图本身尺寸不一样(比如我把一个300×300的图拉大到600×600再去当遮罩),那么同样的字号也是会有不同的效果。

  原理想想也很自然,字号决定了字的尺寸,而图的尺寸变了以后,最大字相对于图的尺寸比例自然就变了。

    min_font_size:最小字号。不设置的情况下,默认是4。

  尝试了设置比4大的字号,例如8、10,结果就是原本小于设定值且大于4号的词都直接不显示了,其它内容和未设置该值时都一样。

    relative_scaling:表示词频和云词图中字大小的关系参数,默认0.5。

  为0时,表示只考虑词排序,而不考虑词频数;为1时,表示两倍词频的词也会用两倍字号显示。

    scale:根据说明文档,当云词图很大的,加大该值会比使用更大的图更快,但值越高也会越慢(计算更复杂)。

  默认值是1。实际测试中,更大的值,确实输出图像看起来更精细(较小较浅的词会颜色更重,也感觉清楚,大的词差异不明显)。

  不过,可能由于我选的图不大、词也没有很多,所以差距并没有很大,缩小排列一下就基本上辨别不出多少差别了。

 

实战:爬取小说网站小说,并结合jieba 还有wordcloud 看看现在小说内容中都是有那些词语出现的多。
 

# -*- coding: utf-8 -*-
# @Time    : 2018/9/12 14:43
# @Author  : for
# @File    : 爬虫_词云.py
# @Software: PyCharm
import jieba
from scipy.misc import imread  # 这是一个处理图像的函数
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
import matplotlib.pyplot as plt
from urllib import request
import time
from lxml import etree
#定义请求的地址
url = "https://read.qidian.com/chapter/9r9u8W1evJUCpOPIBxLXdQ2/eSlFKP1Chzg1"
#请求的头部
headers = {
    "Referer": "https://www.qiushibaike.com/",
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
}
#构建请求
req = request.Request(url = url,headers = headers)
#发起请求
response = request.urlopen(req)
#接收返回的内容,返回的内容以类文件的形式返回
content = response.read().decode()
xpath_content =  etree.HTML(content)
new_content = xpath_content.xpath('//*[@id="chapter-382639401"]/div/div/p/text()')
with open('2.txt','w',encoding='utf-8') as f:
    for i in new_content:
        f.writelines(i.strip())
time.sleep(2)

back_color = imread('1.png')  # 解析该图片

wc = WordCloud(background_color='white',  # 背景颜色
               max_words=1000,  # 最大词数
               mask=back_color,  # 以该参数值作图绘制词云,这个参数不为空时,width和height会被忽略
               max_font_size=100,  # 显示字体的最大值
               stopwords=STOPWORDS.add('国'),  # 使用内置的屏蔽词,再添加'苟利国'
               # font_path="C:/Windows/Fonts/STFANGSO.ttf",  # 解决显示口字型乱码问题,可进入C:/Windows/Fonts/目录更换字体
               font_path='C:\Windows\Fonts\simfang.ttf',
               random_state=42,  # 为每个词返回一个PIL颜色
               # width=1000,  # 图片的宽
               # height=860  #图片的长
               )
# WordCloud各含义参数请点击 wordcloud参数

# 添加自己的词库分词,比如添加'金三胖'到jieba词库后,当你处理的文本中含有金三胖这个词,
jieba.add_word('我是王')

# 打开词源的文本文件
text = open('2.txt',encoding='utf-8').read()


# 该函数的作用就是把屏蔽词去掉,使用这个函数就不用在WordCloud参数中添加stopwords参数了
# 把你需要屏蔽的词全部放入一个stopwords文本文件里即可
def stop_words(texts):
    words_list = []
    word_generator = jieba.cut(texts, cut_all=False)  # 返回的是一个迭代器
    with open('stopwords.txt',encoding='utf-8') as f:
        str_text = f.read()
        unicode_text = str_text # 把str格式转成unicode格式
        f.close()  # stopwords文本中词的格式是'一词一行'
    for word in word_generator:
        if word.strip() not in str_text:
            words_list.append(word)
    return ' '.join(words_list)  # 注意是空格


text = stop_words(text)

wc.generate(text)
# 基于彩色图像生成相应彩色
image_colors = ImageColorGenerator(back_color)
# 显示图片

plt.imshow(wc)

# 关闭坐标轴
plt.axis('off')
# 绘制词云
plt.figure()
plt.imshow(wc.recolor(color_func=image_colors))
plt.axis('off')
# plt.show()
# 保存图片保存到当前路径下的image文件夹下,没有文件夹自行创建
wc.to_file('./image/maikou.png')

 

原创文章 49 获赞 23 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Smile_Mr/article/details/83108328
今日推荐