【python】数据分析案例

news2024/9/21 11:14:13

 目录

一、项目内容: 

第一步:获取评论数据

第二步:词频统计并可视化展示

第三步:绘制词云

二、项目实现: 

第一步:获取评论数据

 (1)导入python库

 (2)获取评论数据

 (3)保存json文件 

第二步:词频统计并可视化展示

 (4)解析json数据,获取评论字符串列表

 (5) 去除文本中特殊字符

 (6) 将数据保存在txt文件

 (7)从txt文件中获取评论字符串

 (8) 中文分词

 (9)去除停用词

(10) 绘制词频统计表

第三步:绘制词云

(11)绘制词云图

  (12)完整代码


一、项目内容: 

第一步:获取评论数据

  • 评论条数不少于100条

第二步:词频统计并可视化展示

  • 数据预处理:清理清洗评论中特殊字符(如:@#¥%、emoji表情符),清洗后结果存储为txt文档
  • 中文分词:添加新增词(如:青你、奥利给、冲鸭),去除停用词(如:哦、因此、不然、也好、但是)
  • 统计top10高频词
  • 可视化展示高频词

第三步:绘制词云

  • 根据词频生成词云
  • 可选项-添加背景图片,根据背景图片轮廓生成词云

二、项目实现: 

第一步:获取评论数据

  • 统计评论条数至少于100条

(1)导入python库

import json
import re
import requests
from bs4 import BeautifulSoup
import os
import time
import random
import jieba
import matplotlib.pyplot as plt
from wordcloud import WordCloud

 (2)获取评论数据

#爬取评论数据
def crawlData(start,limit):#start,limit爬取的评论序号和限制
    """
    爬取豆瓣Top250《肖申克的救赎》评论数据,返回评论字符串列表
    """
    comments=[]
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36'}
    url='https://movie.douban.com/subject/1292052/comments?start={}&limit={}&status=P&sort=new_score'.format(start,limit)
    try:
        response = requests.get(url,headers=headers)
        #print(response.status_code)

        #将一段文档传入BeautifulSoup的构造方法,就能得到一个文档的对象, 可以传入一段字符串
        soup = BeautifulSoup(response.text,'lxml')

        #返回的是class为short的<span>所有标签
        shorts = soup.find_all('span',{'class':'short'})
        #print(shorts)

        for short in shorts:
            strs = short.get_text()
            comments.append(strs)
            print("正在爬取数据,请稍后……")

    except Exception as e:
        print(e)
    return comments

(3)保存json文件 

#保存json文件
def saveJsonFile(comments,JsonFileName):
    jsons = []
    id = 0#给评论添加索引
    for com in comments:
        js = {}
        js['id'] = id
        js['comment'] = com
        jsons.append(js)
        id += 1
    jsons = str(jsons).replace('\'', '\"')#json中的索引都是双引号
    json_data = json.loads(jsons)
    with open('work/' + JsonFileName + '.json', 'w', encoding='UTF-8') as f:
        json.dump(json_data, f, ensure_ascii=False)
    print("数据已保存为%s.json"%saveJsonFile())

 100条评论,json文件预览:

第二步:词频统计并可视化展示

  • 数据预处理:清理清洗评论中特殊字符(如:@#¥%、emoji表情符),清洗后结果存储为txt文档
  • 中文分词:添加新增词(如:青你、奥利给、冲鸭),去除停用词(如:哦、因此、不然、也好、但是)
  • 统计top10高频词
  • 可视化展示高频词

(4)解析json数据,获取评论字符串列表

#解析json数据,获取评论字符串列表
def getTextForJson(JsonFileName):
    #打开json文件获取数据
    with open('work/' + JsonFileName + '.json', 'r', encoding='UTF-8') as file:
        comments = json.loads(file.read())  # json.loads解码JSON 数据。该函数返回Python 字段的数据类型
    text = []#文本存放列表
    for com in comments:
        text.append(com['comment'])
    return text

(5) 去除文本中特殊字符

# 去除文本中特殊字符
def clear_special_char(text):
    content=[]
    for con in text:
        con = re.sub(r"\n|\t|\r|\r\n|\n\r|\x08|\\", "", con)
        content.append(con)
    return content

(6) 将数据保存在txt文件

# 将数据保存在txt文件
def saveTxtFile(text,TxtFileName):
    contents = ''
    for txt in text:
        contents+=txt
    with open('work/' + TxtFileName + '.txt', 'w', encoding='UTF-8') as f:
        f.write(contents)
    print("数据已保存为%s.txt"%TxtFileName)

(7)从txt文件中获取评论字符串

# 从txt文件中获取评论字符串
def getTextForTxt(TxtFileName):
    with open('work/' + TxtFileName + '.txt', 'r', encoding='UTF-8') as file:
        text = file.read()
    return text

(8) 中文分词

# 中文分词
def fenci(text):
    words = jieba.cut(text.strip())
    return words

 (9)去除停用词

#去除停用词
def movestopwords(words):
    #创建停用词列表
    stopwords = [line.strip() for line in open('data\stopwords.txt', encoding='UTF-8').readlines()]#列表生成式
    # 将分词后的对象进行去除停用词
    strs = ''
    # 去停用词
    for word in words:
        if word not in stopwords:
            if word != '\t':
                strs += word
                strs += " "
    return strs

(10) 绘制词频统计表

#绘制词频统计表
def drawcounts(strs):
    words = jieba.lcut(strs)#精确模式分词
    counts = {}
    for word in words:
        if len(word) == 1:  # 排除单个字符分词的影响
            continue
        else:
            counts[word] = counts.get(word, 0) + 1
    # 按词频从高到低排序
    counts = sorted(counts.items(), key=lambda x: x[1], reverse=True)
    # 输出前10个
    for i in range(10):
        word, count = counts[i]
        print('{:<10}{:>5}'.format(word, count))
    # 绘制柱状图
    x_word=[]
    y_count=[]
    for i in range(10):
        word, count = counts[i]
        x_word.append(word)
        y_count.append(count)
    # 设置显示中文
    plt.rcParams['font.sans-serif'] = ['SimHei']
    # 设置图片大小
    plt.figure(figsize=(20, 15))
    plt.bar(range(len(y_count)), y_count, color='r', tick_label=x_word, facecolor='#9999ff', edgecolor='white')
    # 这里是调节横坐标的倾斜度,rotation是度数,以及设置刻度字体大小
    plt.xticks(rotation=45, fontsize=20)
    plt.yticks(fontsize=20)
    # plt.legend()
    plt.title('''《肖申克的救赎》评论词频统计''', fontsize=24)
    plt.savefig('./work/imgs/bar_result.jpg')
    plt.show()
    return

第三步:绘制词云

  • 根据词频生成词云
  • 可选项-添加背景图片,根据背景图片轮廓生成词云

(11)绘制词云图

#绘制词云图
def drawcloud(strs):
    # 生成对象
    wc = WordCloud(font_path="fonts\simhei.ttf", width=500, height=400, mode="RGBA",
                   background_color=None).generate(strs)
    # 显示词云图
    plt.imshow(wc, interpolation="bilinear")
    plt.axis("off")
    plt.show()
    # 保存文件
    wc.to_file("./work/imgs/WordCloud.png")

(12)完整代码

import json
import re
import requests
from bs4 import BeautifulSoup
import os
import time
import random
import jieba
import matplotlib.pyplot as plt
from wordcloud import WordCloud
#爬取评论数据
def crawlData(start,limit):#start,limit爬取的评论序号和限制
    """
    爬取豆瓣Top250《肖申克的救赎》评论数据,返回评论字符串列表
    """
    comments=[]
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36'}
    url='https://movie.douban.com/subject/1292052/comments?start={}&limit={}&status=P&sort=new_score'.format(start,limit)
    try:
        response = requests.get(url,headers=headers)
        #print(response.status_code)

        #将一段文档传入BeautifulSoup的构造方法,就能得到一个文档的对象, 可以传入一段字符串
        soup = BeautifulSoup(response.text,'lxml')

        #返回的是class为short的<span>所有标签
        shorts = soup.find_all('span',{'class':'short'})
        #print(shorts)

        for short in shorts:
            strs = short.get_text()
            comments.append(strs)
            print("正在爬取数据,请稍后……")

    except Exception as e:
        print(e)
    return comments

#保存json文件
def saveJsonFile(comments,JsonFileName):
    jsons = []
    id = 0#给评论添加索引
    for com in comments:
        js = {}
        js['id'] = id
        js['comment'] = com
        jsons.append(js)
        id += 1
    jsons = str(jsons).replace('\'', '\"')#json中的索引都是双引号
    json_data = json.loads(jsons)
    with open('work/' + JsonFileName + '.json', 'w', encoding='UTF-8') as f:
        json.dump(json_data, f, ensure_ascii=False)
    print("数据已保存为%s.json"%saveJsonFile())

#解析json数据,获取评论字符串列表
def getTextForJson(JsonFileName):
    #打开json文件获取数据
    with open('work/' + JsonFileName + '.json', 'r', encoding='UTF-8') as file:
        comments = json.loads(file.read())  # json.loads解码JSON 数据。该函数返回Python 字段的数据类型
    text = []#文本存放列表
    for com in comments:
        text.append(com['comment'])
    return text

# 去除文本中特殊字符
def clear_special_char(text):
    content=[]
    for con in text:
        con = re.sub(r"\n|\t|\r|\r\n|\n\r|\x08|\\", "", con)
        content.append(con)
    return content

# 将数据保存在txt文件
def saveTxtFile(text,TxtFileName):
    contents = ''
    for txt in text:
        contents+=txt
    with open('work/' + TxtFileName + '.txt', 'w', encoding='UTF-8') as f:
        f.write(contents)
    print("数据已保存为%s.txt"%TxtFileName)

# 从txt文件中获取评论字符串
def getTextForTxt(TxtFileName):
    with open('work/' + TxtFileName + '.txt', 'r', encoding='UTF-8') as file:
        text = file.read()
    return text

# 中文分词
def fenci(text):
    words = jieba.cut(text.strip())
    return words

#去除停用词
def movestopwords(words):
    #创建停用词列表
    stopwords = [line.strip() for line in open('data\stopwords.txt', encoding='UTF-8').readlines()]#列表生成式
    # 将分词后的对象进行去除停用词
    strs = ''
    # 去停用词
    for word in words:
        if word not in stopwords:
            if word != '\t':
                strs += word
                strs += " "
    return strs

#绘制词频统计表
def drawcounts(strs):
    words = jieba.lcut(strs)#精确模式分词
    counts = {}
    for word in words:
        if len(word) == 1:  # 排除单个字符分词的影响
            continue
        else:
            counts[word] = counts.get(word, 0) + 1
    # 按词频从高到低排序
    counts = sorted(counts.items(), key=lambda x: x[1], reverse=True)
    # 输出前10个
    for i in range(10):
        word, count = counts[i]
        print('{:<10}{:>5}'.format(word, count))
    # 绘制柱状图
    x_word=[]
    y_count=[]
    for i in range(10):
        word, count = counts[i]
        x_word.append(word)
        y_count.append(count)
    # 设置显示中文
    plt.rcParams['font.sans-serif'] = ['SimHei']
    # 设置图片大小
    plt.figure(figsize=(20, 15))
    plt.bar(range(len(y_count)), y_count, color='r', tick_label=x_word, facecolor='#9999ff', edgecolor='white')
    # 这里是调节横坐标的倾斜度,rotation是度数,以及设置刻度字体大小
    plt.xticks(rotation=45, fontsize=20)
    plt.yticks(fontsize=20)
    # plt.legend()
    plt.title('''《肖申克的救赎》评论词频统计''', fontsize=24)
    plt.savefig('./work/imgs/bar_result.jpg')
    plt.show()
    return

#绘制词云图
def drawcloud(strs):
    # 生成对象
    wc = WordCloud(font_path="fonts\simhei.ttf", width=500, height=400, mode="RGBA",
                   background_color=None).generate(strs)
    # 显示词云图
    plt.imshow(wc, interpolation="bilinear")
    plt.axis("off")
    plt.show()
    # 保存文件
    wc.to_file("./work/imgs/WordCloud.png")


if __name__ == "__main__":
    JsonFileName = 'hhh'
    TxtFileName = 'xxx'
    # 判断文件是否存在
    if os.path.exists('work/'+JsonFileName+'.json')==False:#不存在,爬取
        print("文件不存在,开始爬取页面。")
        # 1、爬取100条评论数据
        limit = 10  # 每页最大爬取条数
        comments = []
        for i in range(0, 10):
            comments += crawlData(i * limit, limit)
        print("数据爬取成功!")
        # 2、保存json数据
        saveJsonFile(comments,JsonFileName)
    else:
        print(JsonFileName+".json文件已存在。")
        # 3、从json文件中获取评论信息
        text = getTextForJson(JsonFileName)
        #print(text)
        #清理特殊字符
        text = clear_special_char(text)
        #print(text)
        #将清洗后的字符串保存在txt文件中
        if os.path.exists('work/'+TxtFileName+'.txt')==False:
            saveTxtFile(text, TxtFileName)
        else:
            print(TxtFileName+".txt文件已存在。")
            text = getTextForTxt(TxtFileName)#获取txt文本(str)
            print(text)
            #中文分词
            words = fenci(text)
            #for word in words:
            #    print(word)
            #去除停用词
            strs = movestopwords(words)
            print(strs)
            # 绘制词频统计表
            drawcounts(strs)
            # 绘制词云图
            drawcloud(strs)

源码链接:

链接:https://pan.baidu.com/s/1VYWl8QxfRS9oT9DMyBY9LQ 
提取码:jjdq 
--来自百度网盘超级会员V2000的分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/357932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

煤矿风险监测预警算法 YOLO

煤矿风险监测预警算法基于YOLO网络模型视觉分析&#xff0c;煤矿风险监测预警算法7*24小时不间断自动识别现场人员作业行为、着装合规情况以及传送皮带撕裂跑偏等风险异常情况。我们使用YOLO(你只看一次)算法进行对象检测。YOLO是一个聪明的卷积神经网络(CNN)&#xff0c;用于实…

Hive 2.3.0 安装部署(mysql 8.0)

Hive安装部署 一.Hive的安装 1、下载apache-hive-2.3.0-bin.tar.gz 可以自行下载其他版本&#xff1a;http://mirror.bit.edu.cn/apache/hive/ 2.3.0版本链接&#xff1a;https://pan.baidu.com/s/18NNVdfOeuQzhnOHVcFpnSw 提取码&#xff1a;xc2u 2、用mobaxterm或者其他连接…

【拦截器、过滤器、springAop】那些不为人知的隐秘

首先说到这几个词的时候&#xff0c;大家肯定都很熟悉了&#xff0c;甚至觉得这几个的区别刚刚毕业都能回答了&#xff0c;但是我想大家在实际应用过程中是真得会真正的使用吗&#xff1f;换言之&#xff0c;什么时候用过滤器什么时候使用拦截器&#xff0c;什么时候使用spring…

Atlassian Server用户新选择 | Data Center产品是否适合您的企业?

2021年&#xff0c;Atlassian宣布停止销售新的Server许可证在业内引起轩然大波。就在今年2月&#xff0c;Atlassian所有Server产品及插件均已停售。2024年2月&#xff0c;也就是一年不到&#xff0c;Atlassian将终止对Server产品及插件的所有支持。 此公告发布后&#xff0c;许…

Flink-DataStream API介绍(源算子、转换算子、输出算子)

文章目录DataStream API&#xff08;基础篇&#xff09;Flink 支持的数据类型执行环境&#xff08;Execution Environment&#xff09;创建执行环境执行模式(Execution Mode)触发程序执行源算子准备工作从集合中读取数据从文件读取数据从 Socket 读取数据从 Kafka 读取数据自定…

Spring Cloud Nacos实战(三)- 服务消费者注册和负载均衡,服务注册中心对比

目录Nacos服务消费者注册和负载均衡服务消费者具体配置新建Modulepomyml主启动测试远程调用与Ribbon什么是Ribbon具体使用验证Nacos自带负载均衡Nacos服务注册中心对比提升各种服务注册中心对比CAP模型CP原则&#xff1a;一致性 分区容错性原则AP原则&#xff1a;可用性原则 …

Unity 基于Netcode for gameObjects实现局域网同步

注意事项&#xff1a; 1.需要将unity升级到2021.3及以后的版本的稳定版本&#xff0c;使用不稳定的2022版本测试过&#xff0c;存在打包问题&#xff1a; 效果&#xff1a; 所需Package&#xff1a; 1.Netcode for gameObjects 2.Multiplayer Tools 该package是附带Netcode…

基于Spring Boot的零食商店

文章目录项目介绍主要功能截图&#xff1a;登录后台首页个人信息管理用户管理前台首页购物车部分代码展示设计总结项目获取方式&#x1f345; 作者主页&#xff1a;Java韩立 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关…

[Spring] 难理解的Aop编程 |入门?

作者&#xff1a;狮子也疯狂 专栏&#xff1a;《spring开发》 坚持做好每一步&#xff0c;幸运之神自然会驾凌在你的身上 目录一. &#x1f981; 前言二. &#x1f981; 常见概念2.1 常见术语2.2 AOP入门Ⅰ. &#x1f407; 功能场景Ⅱ. &#x1f407; 实现过程2.3 通知类型Ⅰ.…

使用frp配置内网机器访问

frp简介 frp 是一个开源、简洁易用、高性能的内网穿透和反向代理软件&#xff0c;支持 tcp, udp, http, https等协议。frp 项目官网是 https://github.com/fatedier/frp&#xff0c;软件下载地址为https://github.com/fatedier/frp/releases frp工作原理 服务端运行&#xf…

【GO】k8s 管理系统项目[前端部分--项目初始化]

【GO】k8s 管理系统项目[前端部分–项目初始化] 1. 项目概述 API部分已经完成了,着手开始前端部分.构建一个页面展示后端数据. 前端会使用到以下依赖 vue3框架element-plusxterm命令行模拟器nprogress进度条jsonwebtoken jwt token生成和校验json-editor-vue3/codemirror-e…

一文带你读懂Dockerfile

目录 一、概述 二、DockerFile构建过程解析 &#xff08;一&#xff09;Dockerfile内容基础知识 &#xff08;二&#xff09;Docker执行Dockerfile的大致流程 &#xff08;三&#xff09;总结 三、DockerFile常用保留字指令 四、案例 &#xff08;一&#xff09;自定义…

有了java基础,迅速学完Python并做了一份笔记-全套Python,建议收藏

面向过程Python简介Python和Java的解释方式对比Java&#xff1a;源代码 -> 编译成class -> Jvm解释运行Python&#xff1a;源代码 -> Python解释器解释运行我经常和身边的Java开发者开玩笑说&#xff1a;“Java真变态&#xff0c;别的语言都是要么直接编译要么直接解释…

Kaldi语音识别技术(六) ----- DTW和HMM-GMM

Kaldi语音识别技术(六) ----- DTW和HMM-GMM 文章目录Kaldi语音识别技术(六) ----- DTW和HMM-GMM前言一、语音识别概况二、语音识别基本原理三、DTW&#xff08;动态时间弯折&#xff09;算法四、GMM-HMM前言 前面的内容中我们完成了特征的提取,那么本章节我们主要进行理论部分…

IDEA全家桶式讲解 | IDEA安装、使用、断点调试、Git、插件 (第二篇)

目录 一&#xff1a;JavaEE阶段需要掌握的IDEA技能 1. 配置Tomcat 2. 配置Maven 3. IDEA连接数据库 4. 方便的特殊功能 5. 断点调试&#xff08;重点&#xff09; 6. IDEA中常用Git协同开发&#xff08;重点&#xff09; 7. 常用插件安装 一&#xff1a;JavaEE阶段需要…

Julia 语言环境安装

Julia 语言支持以下系统&#xff1a; LinuxFreeBSDmacOSWindowsAndroid Julia 安装包下载地址为&#xff1a;Download Julia。 Github 源码地址&#xff1a;GitHub - JuliaLang/julia: The Julia Programming Language。 国内镜像地址&#xff1a;Index of /julia-releases/…

Spring Boot框架基础介绍

Spring Boot 是一款基于 Spring 框架的开源应用程序开发工具&#xff0c;它旨在简化 Spring 应用程序的配置和开发过程。Spring Boot 提供了一种简单的方式来创建可独立运行的、生产级别的应用程序&#xff0c;并在需要时进行部署。Spring Boot 在微服务架构和云计算环境下得到…

nodejs基于vue垃圾回收分类网站

目录 1 绪论 1 1.1课题背景 1 1.2课题研究现状 1 1.3初步设计方法与实施方案 2 1.4本文研究内容 2 2 系统开发环境 4 2.1 JAVA简介 4 2.2MyEclipse环境配置 4 2.3 B/S结构简介 4 2.4MySQL数据库 5 2.5 SPRINGBOOT框架 5 3 系统分析 6 3.1系统可行性分析 6 3.1.1经济可行性 6 3.…

【C++修炼之路】18.map和set

每一个不曾起舞的日子都是对生命的辜负 map和setmap和set一.关联式容器二.set2.1 set的介绍2.2 set的使用1.set的模板参数列表2.set的构造3.set的迭代器4.set修改操作5.bound函数三.multiset四.map3.1 map的介绍3.2 map的使用1.map的模板参数说明2.pair的介绍3.map的[]重载五.m…

如何构建微服务架构?

相信很多人对微服务架构都会产生这样一些疑问&#xff0c;例如我要何时使用微服务架构?又如何将应用程序分解为微服务?分解后&#xff0c;要如何去搭建微服务架构?同时&#xff0c;在微服务架构中&#xff0c;因为会涉及到多个组件&#xff0c;那么这些组件又可以使用什么技…