专栏首页机器学习AI算法工程利用pandas+python制作100G亚马逊用户评论数据词云

利用pandas+python制作100G亚马逊用户评论数据词云

我们手里面有一个差不多100G的亚马逊用户在购买商品后留下的评论数据(数据格式为json)。我们需要统计这100G数据中,出现频率最高的100个词语。然后制作一个词云表现表现出来,所谓的词云,就是类似于这样的一张图片

,显然还是图片让我们对单词出现的热度一目了然。

问题难点

  1. 数据量太大,而我的电脑内存只有32G,无法将数据一次性装入内存。需要我们队数据进行分块处理。在解决问题之前,我们需要对要处理的数据一探究竟。我的数据来源是公开的,由MIT一位教授放在亚马逊用户评论数据,http://jmcauley.ucsd.edu/data/amazon/ 只需要给他发一个邮件,说一下自己的意图,就可以直接下载了。下面我结合着代码,介绍整个项目的流程。

import dask.bag as db import ujson as json #听说用ujson解析比普通json快好几倍哦 import pandas as pd import numpy as np import gzip #解析gzip等压缩文件 import re b = db.from_filenames(r'E:\研究生阶段课程作业\python\zhihu_bigdata\complete.json.gz',encoding='utf-8').map(json.loads) b.take(1) #检查数据的格式 >>out[1]:'asin': 'B003UYU16G', 'helpful': [0, 0], 'overall': 5.0, 'reviewText': "It is and does exactly what the description said it would be and would do. Couldn't be happier with it.", 'reviewTime': '11 21, 2012', 'reviewerID': 'A00000262KYZUE4J55XGL', 'reviewerName': 'Steven N Elich', 'summary': "Does what it's supposed to do", 'unixReviewTime': 1353456000}

在这段代码中,我们首先读取complete.json.gz里面的数据,这里我用到了dask里面的bag类型,dask会根据你的内存情况来适当读取不超过内存大小的数据

。 因为我们只对里面的 "reviewText"字段感兴趣,我们对其他的字段直接忽略。在提取" "reviewText"数据之前,我们看一下需要处理多少行这样的数据。

print(sum([1 for _ in gzip.open(r'E:\研究生阶段课程作业\python\zhihu_bigdata\complete.json.gz')])) #计算用户的评论数目 out[2]:143674325 #差不多1.5亿行数据,在我电脑上跑了差不多三分钟

没错,只有一行数据,不用把数据全部装入内存,我们就可以计算这100G数据,究竟有多少个类似于out[1]这样的数据段。你问我为什么喜欢python,这就是理由,因为他强大,简洁,优雅,代码可读性好。

我们需要处理的数据差不多有100G,远超我们的内存极限。

采用的步骤如下:

step 1:对每一个用户数据,转化成字典结构。

step 2: 提取里面的 reviewText

step 3: 使用分词,把句子转化成单词

step 4:对每个单词进行hash,对于相同的hash值,写进txt文件

step 5: 对于同一个单词,肯定在一个txt文件中,分别统计单词的出现频率

step 6: 制作词云

在这片文章的剩下内容,我将针对这六个步骤进行详细讲解:

tempDir = 'E:/研究生阶段课程作业/python/好玩的数据分析/制作亚马逊200G用户评论词云' #把评论数据分散到这个文件下下面的100个txt文件 pattern = re.compile(r'\w+') #编译正则表达式,把短句转化成list def hashFile(): temp_path_list = [] for i in range(1,101): temp_path_list.append(open(tempDir+'/'+str(i)+'.txt',mode='w')) for each in (gzip.open(r'E:\研究生阶段课程作业\python\zhihu_bigdata\complete.json.gz')): sentence = eval(each) # turn string to dict words = sentence['reviewText'] #提取 reviewText words_list = pattern.findall(words) # example:words:"I love china" to words_list:["I","love","china"] #print(words_list) for word in words_list: if not word.lower() in stopwords and len(word) >= 2: #忽略一些太简单的单词,例如“a”,"an",把你不想要的的单词全部放在stopwords中。最好是set格式的stopwords。 word = word.lower() #全部为小写单词 print(hash(word)%100) #对单词进行hash,相同的单词一定会hash到同一个文件中 temp_path_list[hash(word)%100].write(word+'\n') #写入文件 for f in temp_path_list: f.close() hashFile()

以上的一段代码,首先是遍历100G的数据,提取每一行中的我们感兴趣的部分。然后使用正则表达式,把字符串转化成单词列表,过滤到我们不感兴趣的单词。对剩下的单词进行hash,这样我们可以把相同的单词写到同一个文件中,因为我们的目标是找出出现频率前1000的单词,那么我们只要对这1000个文件,各自找出出现频率在1000以内的单词,在进行排序,即可得出最终的结果。

经过上面的步骤,我们已经把可能相同的单词放在了一个文件中,共计100个文件 下面分别读取每个文件到一个列表中 计算每个列表出现频率最高的1000个单词 最后在找出100个文件中出现频率最高的1000个单词 import os from collections import Counter results = Counter() # 初始化 for root, dirs, files in os.walk(r'E:\研究生阶段课程作业\python\好玩的数据分析\制作亚马逊200G用户评论词云'): for file in files: with open(os.path.join(root, file)) as f: words_list = f.readlines() words_list = list(map(lambda x: x.strip('\n'),words_list)) word_common_1000 = Counter(words_list).most_common(1000) results.update(word_common_1000)

以上的一段代码,把100个txt里面的单词,分别遍历,找出每个出现频率为1000的单词,全部放在results中

import heapq words_fren_list = list(results.keys()) words_fren_list_100 = heapq.nlargest(100,words_fren_list,key = lambda x:x[1])

哈哈大功告成,特别提醒一下,这里我是用了一个小的trick,找出出现频率最高的100个单词的时候,我并没有对全部数据进行排序,而是使用了heaapq中的nlarges函数,可以提升不小的效率。

最后根据这些词出现的频率,画出词云。

from wordcloud import WordCloud wordcloud = WordCloud(max_font_size=40, relative_scaling=.5).fit_words(words_fren_list_100) import matplotlib.pyplot as plt plt.imshow(wordcloud) plt.axis("off") plt.imshow()

最后的结果如下图所示:

本文分享自微信公众号 - 大数据挖掘DT数据分析(datadw)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-04-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • LSTM模型预测效果惊人的好,深度学习做股票预测靠谱吗?

    给你讲个段子!真实的! 我去一家量化交易公司实习,一次meeting中,我和老总还有一个资深大佬谈机器学习在股票和期货里面的应用。 我:LSTM在时间...

    机器学习AI算法工程
  • 【趣味】数据挖掘(5)—分房与分类

    中老年回顾歌曲集中有这样一首歌:月亮在白莲花般的云朵里穿行,晚风吹来一阵阵欢乐的歌声,我们坐在高高的谷堆旁边,听妈妈讲那过去的事情……   歌词美,旋律也美...

    机器学习AI算法工程
  • 用NN(神经网络)实现数据的降维理论及练习

    数据降维的重要性就不必说了,而用NN(神经网络)来对数据进行大量的降维是从2006开始的,这起源于2006年science上的一篇文章:reducing the...

    机器学习AI算法工程
  • LeetCode MySQL 585. 2016年的投资(窗口函数over(partition by xx))

    写一个查询语句,将 2016 年 (TIV_2016) 所有成功投资的金额加起来,保留 2 位小数。

    Michael阿明
  • nodejs搭建websocket服务器

    前面我们了解了什么是websocket,下面用nodejs简单的搭建一个websocket服务器,我们使用nodejs-websocket这个npm包,看代码:

    挥刀北上
  • 利用Android画圆弧canvas.drawArc()实例详解

    在学习android中图形图像处理技术这部分内容时,对绘制圆弧函数canvas.drawArc()的用法、参数含义及画图原理很是不理解,在网上搜索了一些,加上自...

    砸漏
  • AnimatedList 介绍及使用

    AnimatedList提供了一种简单的方式使列表数据发生变化时加入过渡动画,AnimatedList实现“左进右出”动画效果如下:

    老孟Flutter
  • 10、借助POI实现Java生成并打印excel报表(1)

    10.1、了解 Apache POI 实际开发中,用到最多的是把数据库中数据导出生成报表,尤其是在生产管理或者财务系统中用的非常普遍。生成报表格式一般是EXC...

    YGingko
  • Java|Java8 新特性

    前言 Java8已经出现了很久了,但是呢,还是有很多人都还在习惯使用以前的来版本JDK,或者是以前老版本的编程方式。通过一段时间对Java8新特性的学习之后,自...

    算法与编程之美
  • 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用

    由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的...

    蒋金楠

扫码关注云+社区

领取腾讯云代金券