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

Part 1: 你真的认识大数据吗?

我周围很多人,开口闭口都是云计算、大数据。你要是真的去追究什么事大数据,什么级别的数据才叫做大,那么他们多半是答不上来的。我见过好几个人,处理过的最大数据不过是几百M的csv文件,却整天在谈hadoop,spark之类的。这简直是拿大炮去打蚊子,真是浪费了材料。以我的实践经验来看,低于500G,甚至1TB的数据都是可以通过pandas这个数据利器来解决,最多加上dask这个利器。所以当你的数据只有几百M,几个G,或者几十个G的时候,就用你手头的单机电脑去完成它吧。

Part 2: 问题描述

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

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

Part 3: 问题难点

  1. 数据量太大,而我的电脑内存只有32G,无法将数据一次性装入内存。需要我们队数据进行分块处理。在解决问题之前,我们需要对要处理的数据一探究竟。我的数据来源是公开的,由MIT一位教授放在亚马逊用户评论数据,只需要给他发一个邮件,说一下自己的意图,就可以直接下载了。下面我结合着代码,介绍整个项目的流程。
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会根据你的内存情况来适当读取不超过内存大小的数据,在这里我建议如果你对神马spark,hadoop之类的不感兴趣,又想搞一些大数据方面的行当(不超过1TB),那么我还是建议你好好看一下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()

最后的结果如下图所示:

词云

稍后我会把完整的代码放在我的github上,如果你有疑惑或者想讨论的内容,请与我联系:
Email: 1527927373@qq.com
QQ :1527927373

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335

推荐阅读更多精彩内容