因为词云有利于体现文本信息,所以我就将那天无聊时爬取的《悲伤逆流成河》的评论处理了一下,生成了词云。

关于爬取影评的爬虫大概长这个样子(实际上是没有爬完的):

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/10/15 16:34
# @Author : Sa.Song
# @Desc : 爬取买猫眼电影悲伤逆流成河的评论
# @File : maoyan_BS.py
# @Software: PyCharm import requests
import json
import pymysql header = {
'Accept-Encoding':'gzip, deflate',
'Accept-Language':'zh-CN,zh;q=0.9',
'Connection':'keep-alive',
'Host':'m.maoyan.com',
'Referer':'http://m.maoyan.com/movie/1217236/comments?_v_=yes',
'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36'
}
num = 0
month = 9
day = 21 conn = pymysql.connect('118.24.26.224','root','','cnblogs')
cursor = conn.cursor() while True:
startTime = '2018-{0}-{1}'.format(month, day)
day += 1
if day == 31:
day = 1
month = 10
if day == 18:
break for i in range(67):
url = 'http://m.maoyan.com/mmdb/comments/movie/1217236.json?_v_=yes&offset={0}&startTime={1}%2010%3A16%3A18'.format(num, startTime)
num += 15
if num == 1005:
num = 0
print(url)
reslut = requests.get(url=url, headers=header)
data = json.loads(reslut.text)
if data['total'] == 0:
break
else:
message = data['cmts']
for i in message:
name = i.get('nickName')
sex = i.get('gender')
city = i.get('cityName')
user_grade = i.get('userLevel')
score = i.get('score')
content = i.get('content')
time = i.get('startTime')
if not sex:
sex = 0
sql = """insert into maoyan_comment(name,sex,city,user_grade,score,content,time) values("{0}","{1}","{2}","{3}","{4}","{5}","{6}")"""\
.format(name,sex,city,user_grade,score,pymysql.escape_string(content),time)
cursor.execute(sql)
print(content)
print(time)
print('--------------------------------------------------------------------->')
conn.commit()

在获取到文本之后我们就可以开始下面的工作了。

先说一下总体流程:

  获取文本-->对文本进行处理,分词(将完整的句子分割成一个一个的词语)-->加载停用词表剔除掉废词,无用词(如语气词等)-->根据分割好的词生成词云

介绍一下jieba:

  也叫“结巴”中文分词,一个强大且完善的中文分词组件,它对于许多语言都有实现版,python版本同时支持py2和py3

  jieba主要有一下几个特性:

    支持三种分词模式:

      (1)精准模式,将句子精确的分开,不会向字符串中添加字词,适合文本分析  

       (2) 全局模式,将句子中所有可以成词的词语都扫描出来,速度快,但是不能解决歧义

       (3)搜索引擎模式,在精准模式基础上,对长词进行再分割,使用隐马尔科夫模型

    支持繁体分词

    支持自定义词典

    MIT授权协议

  分词功能:

    jieba.cut方法接受三个参数:需要分割的字符串、cut_all 参数用来控制是否使用全模式, HMM参数用来控制是否使用NMM(隐马尔科夫模型)

    jieba.cut_for_search()接受两个参数:需要分词的字符串;是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细

    待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8

    jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode),或者用jieba.lcut 以及         jieba.lcut_for_search 直接返回 list

    jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定义分词器,可用于同时使用不同词典。jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。

  关键词提取功能:

    关键词提取基于两种算法: TF-IDF 算法 与 TextRank 算法

    (TF-IDF 算法)

      

      outstr 为待提取的文本

      topK 为返回几个词频最大的值

      withWeight 为是否返回词频,默认为False

      allowPOS 仅指定词性的词,默认为空,不筛选

     (TextRank 算法)

       

介绍一下wordcloud:

  wordcloud库是基于Python的词云生成器,支持py2与py3.

   wordcloud库最重要的类:WordCloud类,这个类的属性半酣了词云生成过程中的各项相关参数,方法则包含了文本分析,慈云的生成,绘制等一系列函数。

  属性(22个):  

 font_path : string //字体路径,需要展现什么字体就把该字体路径+后缀名写上,如:font_path = '黑体.ttf'

 width : int (default=400) //输出的画布宽度,默认为400像素

 height : int (default=200) //输出的画布高度,默认为200像素

 prefer_horizontal : float (default=0.90) //词语水平方向排版出现的频率,默认 0.9 (所以词语垂直方向排版出现频率为 0.1 )

 mask : nd-array or None (default=None) //如果参数为空,则使用二维遮罩绘制词云。如果 mask 非空,设置的宽高值将被忽略,遮罩形状被 mask 取代。

 除全白(#FFFFFF)的部分将不会绘制,其余部分会用于绘制词云。如:bg_pic = imread('读取一张图片.png'),

 背景图片的画布一定要设置为白色(#FFFFFF),然后显示的形状为不是白色的其他颜色。可以用ps工具将自己要显示的形状复制到一个纯白色的画布上再保存,就ok了。

 scale : float (default=1) //按照比例进行放大画布,如设置为1.5,则长和宽都是原来画布的1.5倍。

 min_font_size : int (default=4) //显示的最小的字体大小

 font_step : int (default=1) //字体步长,如果步长大于1,会加快运算但是可能导致结果出现较大的误差。

 max_words : number (default=200) //要显示的词的最大个数

 stopwords : set of strings or None //设置需要屏蔽的词,如果为空,则使用内置的STOPWORDS

 background_color : color value (default=”black”) //背景颜色,如

 background_color='white',背景颜色为白色。

 max_font_size : int or None (default=None) //显示的最大的字体大小

 mode : string (default=”RGB”) //当参数为“RGBA”并且

 background_color不为空时,背景为透明。

 relative_scaling : float (default=.5) //词频和字体大小的关联性

 color_func : callable, default=None //生成新颜色的函数,如果为空,则使用 self.color_func

 regexp : string or None (optional) //使用正则表达式分隔输入的文本

 collocations : bool, default=True //是否包括两个词的搭配

 colormap : string or matplotlib colormap, default=”viridis” //给每个单词随机分配颜色,若指定color_func,则忽略该方法。

 fit_words(frequencies) //根据词频生成词云【frequencies,为字典类型】

 generate(text) //根据文本生成词云

 generate_from_frequencies(frequencies[, ...]) //根据词频生成词云

 generate_from_text(text) //根据文本生成词云

 process_text(text) //将长文本分词并去除屏蔽词(此处指英语,中文分词还是需要自己用别的库先行实现,使用上面的 fit_words(frequencies) )

 recolor([random_state, color_func, colormap]) //对现有输出重新着色。重新上色会比重新生成整个词云快很多。

 to_array() //转化为 numpy array

 to_file(filename) //输出到文件

到这里jieba和wordcloud基本介绍就讲完了,下面主要是代码实现部分:

加载模块、读取本地文档、加载停用词表、加载字体(中文分词必须使用)、加载词云图片模板、对文档的处理

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/10/22 9:17
# @Author : Sa.Song
# @Desc : jieba分词与wordcloud提取词云
# @File : jieba_wordcloud.py
# @Software: PyCharm import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
import jieba.analyse with open(r'C:\Users\songsa\Desktop\maoyan_comment.txt', 'r', encoding='utf-8') as f: # 本地文本文档
text = f.read()
with open(r'C:\Users\songsa\Desktop\tingyongci1.txt', 'r') as f: # 本地的停用词表
tingyongci = f.read() path = r'C:\Users\songsa\Desktop\xia.jpg' # 本地的图片模板
font = r'C:\Users\songsa\Desktop\youyuan.TTF' # 本地的字体(中文分词要用) text = text.replace(',','')
text = text.replace('','')
text = text.replace('、','')
text = text.replace(';','')
text = text.replace('.','')
text = text.replace('。','')
str_list = jieba.cut(text, HMM=True) #使用精准模式来分词 '''加载停用词表并去掉停用词'''
outstr = ''
for word in str_list:
if word not in tingyongci:
if word != '\t':
outstr += word
outstr += ' '

这里的outstr就是分词后用‘ ’拼接起来的一个一个词云的字符串。

下面在生成词云时时其实是有两种方法的:一种时直接根据分好的词来生成词云(内部自动提取关键词)

使用的是它:  wc.generate_from_text(outstr)

img = Image.open(path)  # 打开图片
img_array = np.array(img) # 将图片转换为数组
wc = WordCloud(
background_color='black',
mask=img_array,
font_path=font,
# mode='RGBA',
max_words=30 # 提取的关键词的最大个数
)
wc.generate_from_text(outstr) # 根据切好的词来绘制词云图,自动提取关键词
# wc.generate_from_frequencies(new_outstr) # 根据给定的关键词和词频(字典格式)来画词云图
# plt.figure() # 创建一个画图窗口
plt.show()
wc.to_file(r'C:\Users\songsa\Desktop\a.png')

另一种是先根据分割好的词提取出关键词,然后利用关键词生成词云,

使用的是它: wc.generate_from_frequencies(new_outstr)

# for keyword in jieba.analyse.extract_tags(outstr, topK=20, withWeight=True):  # 根据词频来获取关键词
# print(keyword)
new_outstr = {}
for keyword in jieba.analyse.textrank(outstr, topK=30, withWeight=True): # 根据权重来获取关键词
new_outstr[keyword[0]] = keyword[1] img = Image.open(path) # 打开图片
img_array = np.array(img) # 将图片转换为数组
wc = WordCloud(
background_color='black',
mask=img_array,
font_path=font,
# mode='RGBA',
max_words=30 # 提取的关键词的最大个数
)
# wc.generate_from_text(outstr) # 根据切好的词来绘制词云图,自动提取关键词
wc.generate_from_frequencies(new_outstr) # 根据给定的关键词和词频(字典格式)来画词云图
# plt.figure() # 创建一个画图窗口
plt.show()
wc.to_file(r'C:\Users\songsa\Desktop\a.png')

但是这种方式还需要注意一点,就是选择根据词频来提取关键词还是根据权重来提取关键词。

这样的话,根据评论提取关键词并生成词云就成功了:

这是词云模板图片:

词云图片:

这里是我的停用词表和字体文件:

链接:https://pan.baidu.com/s/1U_9F0ux1voc4kX8l4UFRIw
提取码:r64t

想了解更多Python关于爬虫、数据分析的内容,欢迎大家关注我的微信公众号:悟道Python

  

使用jieba和wordcloud进行中文分词并生成《悲伤逆流成河》词云的更多相关文章

  1. python基础===jieba模块,Python 中文分词组件

    api参考地址:https://github.com/fxsjy/jieba/blob/master/README.md 安装自行百度 基本用法: import jieba #全模式 word = j ...

  2. py库: jieba (中文词频统计) 、collections (字频统计)、WordCloud (词云)

    先来个最简单的: # 查找列表中出现次数最多的值 ls = [1, 2, 3, 4, 5, 6, 1, 2, 1, 2, 1, 1] ls = ["呵呵", "呵呵&qu ...

  3. jieba分词wordcloud词云

    1.jieba库的基本介绍 (1).jieba是优秀的中文分词第三方库 中文文本需要通过分词获得单个的词语 jieba是优秀的中文分词第三方库,需要额外安装 jieba库提供三种分词模式,最简单只需掌 ...

  4. jieba (中文词频统计) 、collections (字频统计)、WordCloud (词云)

    py库: jieba (中文词频统计) .collections (字频统计).WordCloud (词云) 先来个最简单的: # 查找列表中出现次数最多的值 ls = [1, 2, 3, 4, 5, ...

  5. Python分词模块推荐:jieba中文分词

    一.结巴中文分词采用的算法 基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG)采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合对于未登录词,采 ...

  6. Python3+pdfminer+jieba+wordcloud+matplotlib生成词云(以深圳十三五规划纲要为例)

    一.各库功能说明 pdfminer----用于读取pdf文件的内容,python3安装pdfminer3k jieba----用于中文分词 wordcloud----用于生成词云 matplotlib ...

  7. Python基于jieba的中文词云

    今日学习了python的词云技术 from os import path from wordcloud import WordCloud import matplotlib.pyplot as plt ...

  8. 【中文分词】隐马尔可夫模型HMM

    Nianwen Xue在<Chinese Word Segmentation as Character Tagging>中将中文分词视作为序列标注问题(sequence labeling ...

  9. ubuntu 14.04中文分词 结巴分词

    在自然语言处理中,很常见的是要对文本数据进行分词处理.博主是代码小白,目前只是用python作为数据预处理的工具,而按照结巴中文分词的导语:做最好的python中文分词组件“jieba”.因而博主也就 ...

随机推荐

  1. 《从0到1学习Flink》—— Flink Data transformation(转换)

    前言 在第一篇介绍 Flink 的文章 <<从0到1学习Flink>-- Apache Flink 介绍> 中就说过 Flink 程序的结构 Flink 应用程序结构就是如上图 ...

  2. android 开发-Process and Thread

    目录 1 android中进程与线程 - Processes and Threads 1.1 进程 - Processes 1.1.1 进程的生命期 1.2 线程 - Threads 1.2.1 工作 ...

  3. HDU 5501——The Highest Mark——————【贪心+dp】

    The Highest Mark Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  4. <Linux系统isosize指令用法>

    isosize命令:iso9660文件系统大小显示 isosize命令用于显示iso9660文件系统的大小,还文件可以使普通文件,也可以是块设备,如/dev/sr0或者/dev/sda.如果没有相关选 ...

  5. Java中的for循环——通过示例学习Java编程(9)

      作者:CHAITANYA SINGH 来源:https://www.koofun.com/pro/kfpostsdetail?kfpostsid=21 循环用于反复执行同一组语句,直到满足特定条件 ...

  6. [LeetCode]9. Palindrome Number回文数

    Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same back ...

  7. enable orgmode latex preview to support retina on mac

    Table of Contents 1. enable orgmode latex preview to support retina on mac 1.1. get the proper versi ...

  8. JavaScript初始

    一.JavaScript基础 1.引入方式 <!--1 直接编写--> <script> alert('hello yuan') </script> <!-- ...

  9. Counting blessings can actually increase happiness and health by reminding us of the good things in life.

    Counting blessings can actually increase happiness and health by reminding us of the good things in ...

  10. 页面中引入百度地图,实例化后影响html5的表单元素date的上下箭头

    复现步骤: 使用百度地图的JavaScript的API,引入文件地址"http://api.map.baidu.com/api?key=&v=1.1&services=tru ...