词云的产生

假设我们现在要生成一个词云,我们首先需要一些文本文件才能根据文本生成词云。
第一步:获取文本信息(这里以某电影的前10页评论为例)

import threading    
import requests
from bs4 import  BeautifulSoup
# #      1). 爬取某一页的评论信息;
def getOnePageComment(id, pageNum):
    # 1). 根据页数确定start变量的值
    # 第一页: https://movie.douban.com/subject/26425063/comments?start=0&limit=20&sort=new_score&status=P
    # 第二页: https://movie.douban.com/subject/26425063/comments?start=20&limit=20&sort=new_score&status=P
    # 第三页: https://movie.douban.com/subject/26425063/comments?start=20&limit=40&sort=new_score&status=P
    start = (pageNum-1)*20
    url = "https://movie.douban.com/subject/%s/comments?start=%s&limit=20&sort=new_score&status=P" %(id, start)
    # 2). 爬取评论信息的网页内容
    content = requests.get(url).text
    # 3). 通过bs4分析网页
    soup = BeautifulSoup(content, 'lxml')
    # 分析网页得知, 所有的评论信息都是在span标签, 并且class为short;
    commentsList = soup.find_all('span', class_='short')
    pageComments = ""
    # 依次遍历每一个span标签, 获取标签里面的评论信息, 并将所有的评论信息存储到pageComments变量中;
    for commentTag in commentsList:
        pageComments += commentTag.text
    global  comments
    comments += pageComments


#      2).爬取某个电影的前10页评论信息;
id = '26425063'
comments = ''
threads = []
# 爬取前10页的评论信息;获取前几页就循环几次;
for pageNum in range(10): # 0 , 1 2 3 4...9
    pageNum = pageNum + 1
    # getOnePageComment(id, pageNum)
    # 通过启动多线程获取每页评论信息
    t = threading.Thread(target=getOnePageComment, args=(id, pageNum))
    threads.append(t)
    t.start()
#     等待所有的子线程执行结束, 再执行主线程内容;
_ = [thread.join() for thread in threads]
with open("%s.txt" %(id), 'w') as f:
    f.write(comments)

在这里插入图片描述

以上是我们获得的文本信息,但我们会发现有些东西是不需要的,例如:表情,标点符号等
所以我们要对数据进行筛选(数据清洗)

import re
import wordcloud
import jieba  ##这两个模块需要安装

# 1. 对于爬取的评论信息进行数据清洗(删除不必要的逗号, 句号, 表情, 只留下中文或者英文内容)
with open('./26425063.txt') as f:
    comments = f.read()
# 通过正则表达式实现
pattern = re.compile(r'([\u4e00-\u9fa5]+|[a-zA-Z]+)')  ###过滤为只剩汉字和英文的文本
deal_comments = re.findall(pattern, comments)
newComments = ''
for item in deal_comments:
    with open('l.txt','a+') as ff:
        ff.write(item)

词云的产生

import jieba
import  wordcloud


# 1). 切割中文, lcut返回一个列表, cut返回一个生成器;
result = jieba.lcut(open('./26425063.txt').read())


# 2). 绘制词云
wc = wordcloud.WordCloud(
    background_color='snow',
    font_path='./font/msyh.ttf',    # 处理中文数据时 ,字体要导入
    min_font_size=10,    # 图片中最小字体大小;
    max_font_size=50,   # 图片中最大字体大小;
    # width=500,  # 指定生成图片的宽度
    # max_words=500
)
wc.generate(",".join(result))
wc.to_file('wordcloud.png')

这是我们绘制的一般词云,当我们想要词云为某个形状时,就需要用图形了
在这里插入图片描述

import jieba
import  wordcloud
import numpy as np
from  PIL import Image



# 1). 切割中文, lcut返回一个列表, cut返回一个生成器;
result = jieba.lcut(open('./l.txt').read())
print(result)
imageObj = Image.open('./hello.png')
cloud_mask = np.array(imageObj)
# 4). 绘制词云
wc = wordcloud.WordCloud(
    mask=cloud_mask,
    background_color='snow',
    font_path='./msyh.ttf',    # 处理中文数据时 ,字体要导入
    min_font_size=10,    # 图片中最小字体大小;
    max_font_size=50,   # 图片中最大字体大小;
    # width=500,  # 指定生成图片的宽度
    max_words=300
)
wc.generate(",".join(result))
wc.to_file('wordcloud.png')

原图:

在这里插入图片描述
词云生成
在这里插入图片描述

当然,这里还有一点,我觉得应该说一下,在切割有些文档时,可能会出现将有些词语分隔开的情况,我们就可以先将被分开的这些词语写入一个文件中,然后先将该文档进行加载,在进行切割。
这样一来那些词语就不会被分开了。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值