栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

机器学习日记 1.飞桨与Python入门操作-实践:海量文件遍历、图像直方图统计、文本词频分析

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

机器学习日记 1.飞桨与Python入门操作-实践:海量文件遍历、图像直方图统计、文本词频分析

系列文章目录

暂无


文章目录

系列文章目录前言一、海量文件遍历

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')

这没什么好说的,记是肯定记不下来了,需要的时候现查吧==

运行结束之后,我们可以再检索一下结构看是否解压成功

2、文件遍历

建立两个字典,分别存储各子文件类型的数量和大小

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])))

最终得到的图像是这样的

因为我选的图像偏暗,所以灰度值较低的色素点偏多,这个数据应该还是比较合理的

2、分通道统计灰度直方图

一幅完整的图像,是由红色绿色蓝色三个通道组成的。他们共同作用产生了完整的图像(摘自百度百科)

这里引入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()


已经后悔了,我为什么要选滕王阁序做词频统计

总结

机器学习的入门第一节课就学到这里了,学到了一些简单的文件分析,图像分析,文本分析方法

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/753808.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号