python统计千万级以上文本数据字频的一种思路
有个研究项目需要统计jieba分词结果的高频词并统计字频,之前一直利用python的字典格式特性及 not in 方式进行统计,代码片段如下:
#创建空字典
word_dict = {}
#result为包含需进行统计的数据列表
for item in result:
if item not in word_dict:
word_dict[item] = 1
else:
word_dict[item] += 1
#针对word_dict内的vlave值降序排列
word_dict_sort = sorted(word_dict.items(), key=lambda asd: asd[1], reverse=True)
for key in word_dict_sort:
wf2.writerow([key[0], key[1]]) #写入文件
这种思路在对少量数据进行统计时比较灵活,但在遇到海量数据时就会出现运算时间过长的问题,手头正好有一个2亿条数据量的词频统计需求,按照上面的思路,大概需要4个小时完成,因此只好转化思路,利用pandas和numpy来快速读 取数据并转换为list格式,利用collections库对文本list进行计数处理,具体代码如下:
# encoding=utf-8
import csv
import collections
import numpy as np
import pandas as pd
csv.field_size_limit(2147483647)
#生成词袋库
wf2 = csv.writer(open("file.csv", 'w', newline='', encoding='utf8'))
wf2.writerow(['no.','word','count'])
data = pd.read_csv("E:\\jieba_words_data.csv") #使用pd读取源文件
print('单词读取完毕')
train_data = np.array(data.T) #源文件为一维数据,需要对data进行倒置处理,data.T
train_x_list=train_data.tolist() #利用tolist()函数进行列表转化
print('单词入库,开始计数')
all_words = collections.Counter(train_x_list[0]) #利用Counter函数进行字频快速统计
print('计数处理完毕')
all_words_dict = dict(all_words) #将class格式转化为dict格式
print('字典转换完毕')
word_dict_sort = sorted(all_words_dict.items(), key=lambda item: item[1], reverse=True) #排序
print('排序转换完毕')
i = 1
for key in word_dict_sort:
wf2.writerow([i, key[0], key[1]]) #写入文件
i = i+1
print('正在写入'+str(i)+'条单词')
结果证明以上思路是基本符合需求的,2亿条的数据量,字频统计时间大概在120s左右,文本写入时间大概在300s左右,处理效率有很大提升。