暂无
文章目录
系列文章目录前言一、海量文件遍历
1、解压数据集2、文件遍历 二、图像直方图统计
1、统计所有通道的灰度直方图2、分通道统计灰度直方图 三、文本词频分析总结
前言
因为加了一个百度松果菁英班,所以最近机器学习的任务也要提上日程了
本次学习内容分三个部分:海量文件遍历、图像直方图统计、文本词频分析
一、海量文件遍历 1、解压数据集
首先我们要了解数据集的结构,找到我们需要解压的部分
!tree -L 3 ./data/
得到结构如下
可以看到我们需要解压的部分是
data/data10954/cat_12_test.zip
data/data10954/cat_12_train.zip
解压代码
import zipfile
import os
def unzip_data(src_path,target_path):
# 解压原始数据集,将src_path路径下的zip包解压至target_path目录下
if(not os.path.isdir(target_path)):
z = zipfile.ZipFile(src_path, 'r')
z.extractall(path=target_path)
z.close()
unzip_data('data/data10954/cat_12_test.zip','data/data10954/cat_12_test')
unzip_data('data/data10954/cat_12_train.zip','data/data10954/cat_12_train')
这没什么好说的,记是肯定记不下来了,需要的时候现查吧==
运行结束之后,我们可以再检索一下结构看是否解压成功
建立两个字典,分别存储各子文件类型的数量和大小
size_dict = {}
type_dict = {}
检索当前文件夹下的子文件或子目录,如果是目录,继续向里递归,如果是文件,分两种情况讨论
如果文件无后缀:
type_dict["None"] += 1
size_dict["None"] += os.path.getsize(temp_path) # temp_path为当前遍历到的文件
如果文件有后缀:
type_dict[type_name] += 1
size_dict[type_name] += os.path.getsize(temp_path)
完整代码如下
size_dict = {}
type_dict = {}
def get_size_type(path):
files = os.listdir(path)
for filename in files:
temp_path = os.path.join(path, filename)
if os.path.isdir(temp_path):
# 递归调用函数,实现深度文件名解析
get_size_type(temp_path)
elif os.path.isfile(temp_path):
# 获取文件后缀
type_name=os.path.splitext(temp_path)[1]
#无后缀名的文件
if not type_name:
type_dict.setdefault("None", 0)
type_dict["None"] += 1
size_dict.setdefault("None", 0)
size_dict["None"] += os.path.getsize(temp_path)
# 有后缀的文件
else:
type_dict.setdefault(type_name, 0)
type_dict[type_name] += 1
size_dict.setdefault(type_name, 0)
# 获取文件大小
size_dict[type_name] += os.path.getsize(temp_path)
path= "data/"
get_size_type(path)
最后统计输出一下,一个简单的文件遍历就做出来了
官方给的代码是这样的
for each_type in type_dict.keys():
print ("%5s下共有【%5s】的文件【%5d】个,占用内存【%7.2f】MB" %
(path,each_type,type_dict[each_type],
size_dict[each_type]/(1024*1024)))
print("总文件数: 【%d】"%(sum(type_dict.values())))
print("总内存大小:【%.2f】GB"%(sum(size_dict.values())/(1024**3)))
整个项目没什么难点,就是学习一下对文件的处理
二、图像直方图统计
首先上传了一张图做数据
打开文件夹的第一张就是它也懒得翻了,我们把这张图像用cv2.imread()读到程序中
img = cv2.imread('data/pic.jpeg',1)
1、统计所有通道的灰度直方图
直接统计所有通道最方便,不需要分类什么的,用plt.hist()函数绘制出该图像的灰度直方图
plt.figure()# 添加画布
img = cv2.imread('data/pic.jpeg',1)# 读取图像
#hist函数绘制直方图
#其中img.reshape([-1])是把图像中多维的数据转换成一维,因为hist函数只接受一维的数组
# 第二个参数256是横坐标范围
# 第三个参数[0,256]是数据显示范围
plt.hist(img.reshape([-1]),256,[0,256]);
plt.show()
img.reshape([-1])要是不好理解可以自己把数组导出来观察一下
print(np.array(img) )
print(".....................................................")
print(np.array(img.reshape([-1])))
最终得到的图像是这样的
因为我选的图像偏暗,所以灰度值较低的色素点偏多,这个数据应该还是比较合理的
一幅完整的图像,是由红色绿色蓝色三个通道组成的。他们共同作用产生了完整的图像(摘自百度百科)
这里引入calcHist函数
cv2.calcHist([images], [channels], mask, histSize, ranges[, hist[, accumulate ]])
imaes:输入的图像channels:选择图像的通道mask:掩膜,是一个大小和image一样的np数组,其中把需要处理的部分指定为1,不需要处理的部分指定为0,一般设置为None,表示处理整幅图像histSize:使用多少个bin(柱子),一般为256ranges:像素值的范围,一般为[0,255]表示0~255
实际上,对于分通道统计,我们可以这么写
import cv2
# import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('data/pic.jpeg',1)
histr1 = cv2.calcHist([img],[0],None,[256],[0,256]) #hist是一个shape为(256,1)的数组,表示0-255每个像素值对应的像素个数,下标即为相应的像素值
histr2 = cv2.calcHist([img],[1],None,[256],[0,256]) #hist是一个shape为(256,1)的数组,表示0-255每个像素值对应的像素个数,下标即为相应的像素值
histr3 = cv2.calcHist([img],[2],None,[256],[0,256]) #hist是一个shape为(256,1)的数组,表示0-255每个像素值对应的像素个数,下标即为相应的像素值
plt.plot(histr1,color = 'r')
plt.plot(histr2,color = 'g')
plt.plot(histr3,color = 'b')
plt.xlim([0,256])
plt.show()
得到图像如下
BUT
这么写多少是有点low了,作为一个新时代码农,我们要学会用遍历解决一些重复的代码
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('data/pic.jpeg',1)
color = ('r','g','b')
for i,col in enumerate(color):
histr = cv2.calcHist([img],[i],None,[256],[0,256])
#hist是一个shape为(256,1)的数组,表示0-255每个像素值对应的像素个数,下标即为相应的像素值
plt.plot(histr,color = col)
plt.xlim([0,256])
plt.show()
得到的结果是一样的
三、文本词频分析
在网上复制了一篇滕王阁序作为data
首先我们要把它读进来
with open('test.txt', 'r', encoding='UTF-8') as novelFile:
novel = novelFile.read()
先用jieba库进行分词
novelList = list(jieba.lcut(novel))
接下来做去停用词的处理,停用词的数据集我是在飞桨上随便找的一个文件stop.txt
先把停用词读进来
stopwords = [line.strip() for line in open('stop.txt', 'r', encoding='UTF-8').readlines()]
其中line.strip()的作用是删除数据中的换行符,因为我的stop文件中每一个停用词占了一行
遍历novelList,找到不在停用词库的词语
如果词语长度为1,不做考虑如果词语长度不为1:
novelDict[word] = novelDict.get(word, 0) + 1
这样我们就得到了一个词频字典,对他进行排序
novelListSorted = list(novelDict.items()) novelListSorted.sort(key=lambda e: e[1], reverse=True)
打印一下前十的词频看看结果
不得不说,王勃是真的优秀,全文几乎没用到重复的词()
更直观地,我们可以做个统计图总体观察一下
from matplotlib import pyplot as plt plt.figure() x = [c for c,v in novelListSorted] y = [v for c,v in novelListSorted] plt.plot(x[:10],y[:10],color='r') plt.show()
已经后悔了,我为什么要选滕王阁序做词频统计
机器学习的入门第一节课就学到这里了,学到了一些简单的文件分析,图像分析,文本分析方法



