课程地址:/learn/1105
1. 数据预处理简介
1.1 什么是数据预处理
数据预处理简单来说就是:将原始数据装进一个预处理的黑匣子之后,产生出高质量数据,用来适应相关技术或算法模型。
将原始数据直接进行分类模型训练,由于原始数据存在许多干扰项,分类器准确率和召回率都比较低。
将原始数据放进预处理黑匣子后,会自动过滤掉干扰数据,并且会按照规约的方法体现每个词特征的重要性,然后将词特征压缩变换在数值型矩阵中,再通过分类器就会取得不错的效果,可以进行工程应用。
预处理前:不完整、偏态、噪声、特征比重、特征维度、缺失值、错误值等问题;
预处理后:存在完整、正态、干净、特征合适、特征维度合理、无缺失值等优点
1.2 预处理流程
数据清理通过填写缺失值、光滑噪声数据、识别或删除离群点并解决不一致性来清理数据。
目标:格式标准化、异常数据清理、错误纠正、重复数据的清除。数据集成
将数据由多个数据源合并成一个一致的数据存储,如数据仓库。数据变换
通过平滑聚集、数据概化、规范化等方式将数据转换成适用于的形式。如把数据压缩到0.0-1.0数值区间。数据归约
往往数据量非常大,得到数据集的规约表示,它小得多,但仍接近保持原数据的完整性,结果与规约前结果相同或几乎相同。
2. Python数据预处理之抽取文本信息
2.1 常见数据类型与数据采集
2.1.1 结构化数据
数据特点:关系模型数据,关系数据库表示。例子:如MySQL、Oracle、SQL Server等。应用场景:数据库、系统网站、数据备份、ERP等。数据采集:DB导出、SQL等方式。2.1.2 半结构化数据
数据特点:非关系模型数据,有一定的格式。常见格式:如Email、HTML、XML、JSON等。应用场合:邮件系统、档案系统、新闻网站等。数据采集:网络爬虫、数据解析等方式。2.1.3 非结构化数据
数据特点:没有固定格式的数据。常见格式:Word、PDF、PPT、图片、音视频等。应用场合:图片识别、人脸识别、医疗影像、文本分析等。数据采集:网络爬虫、数据存档等方式。2.2 文本抽取问题
格式转换后,识别乱码较多不支持或限制支持批量处理格式转换后的txt文件存在编码问题生成目标文件标题跟原标题不一致操作不够灵活便捷功能设计:
支持PDF/Word等转TXT自动过滤不符合指定格式的文件生成的目标文件与原文件目录一致生成文档采用统一的编码格式保存(如:UTF-8)支持默认保存路径和自定义保存路径
2.3 Word转TXT算法实现
算法思路:
定义文件路径和转存路径:split修改新的文件名:fnmatch设置完整的保存路径:join启动应用程序格式转换:Dispatch保存文本:SaveAs
# coding=utf-8# Word文档信息提取import fnmatchimport osfrom win32com import client as wcfrom win32com.client import Dispatch"""功能描述:word文件转存txt,默认保存在根目录下,支持自定义参数描述:1.filePath:文件路径;2.savePath:保存路径"""def wordtotxt(filePath, savePath=''):# 1.切分文件路径为文件目录和文件名dirs, filename = os.path.split(filePath)# print(dirs, '\n', filename)# 2.修改切分后的文件后缀new_name = ""if fnmatch.fnmatch(filename, '*.doc'):new_name = filename[:-4]+'.txt'elif fnmatch.fnmatch(filename, '*.docx'):new_name = filename[:-5]+'.txt'else:print('格式不正确,仅支持doc/docx格式!')return# 3.设置新的文件保存路径if savePath=='':savePath = dirselse:savePath = savePathword2txtPath = os.path.join(savePath, new_name)print('--->', word2txtPath)# 4.加载文件提取的处理程序 word-->txtwordapp = wc.Dispatch('Word.Application')mytxt = wordapp.Documents.Open(filePath)# 5.保存文本信息mytxt.SaveAs(word2txtPath, 4) # 参数4代表抽取文本mytxt.Close()if __name__ == '__main__':# 获取绝对路径filePath = os.path.abspath(r'test.docx')filePath2 = os.path.abspath(r'PCB线路板的组成及部分主要功能.doc')wordtotxt(filePath)wordtotxt(filePath2)
test.docx:
PCB线路板的组成及部分主要功能.doc:
效果:
2.4 PDF转TXT算法实现
算法思路:
定义文件路径和转存路径:split修改新的文件名:fnmatch设置完整的保存路径:join启动应用程序格式转换:Dispatch保存文本:SaveAs
# coding=utf-8# PDF文档信息提取import os, fnmatchfrom win32com import client as wcfrom win32com.client import Dispatch"""功能描述:pdf文件转存txt,默认保存在根目录下,支持自定义参数描述:1.filePath:文件路径;2.savePath:保存路径"""def pdftotxt(filePath, savePath = ""):# 1.切分文件路径为文件目录和文件名dirs, filename = os.path.split(filePath)# print(dirs, '\n', filename)# 2.修改切分后的文件后缀new_name = ""if fnmatch.fnmatch(filename, '*.pdf') or fnmatch.fnmatch(filename, '*.PDF'):# 截取至倒数第4位new_name = filename[:-4] + '.txt'else:print('格式不正确,仅支持pdf格式!')return# 3.设置新的文件保存路径if savePath == '':savePath = dirselse:savePath = savePathpdf2txtPath = os.path.join(savePath, new_name)print('--->', pdf2txtPath)# 4.加载文件提取的处理程序 word-->txtwordapp = wc.Dispatch('Word.Application')mytxt = wordapp.Documents.Open(filePath)# 5.保存文本信息mytxt.SaveAs(pdf2txtPath, 4) # 参数4代表抽取文本mytxt.Close()if __name__ == '__main__':# 获取绝对路径filePath = os.path.abspath(r'test.docx')filePath2 = os.path.abspath(r'PCB线路板的组成及部分主要功能.doc')filePath3 = os.path.abspath(r'test.pdf')pdftotxt(filePath)pdftotxt(filePath2)pdftotxt(filePath3)
执行效果:
格式不正确,仅支持pdf格式!格式不正确,仅支持pdf格式!---> E:\pythonProject\DataProcess\test.txt
2.5 文本抽取工具与编码
算法思路:
定义文件夹路径和转存路径:split修改新的文件名:TranType(filename, typename)、fnmatch设置完整的保存路径:join启动应用程序格式转换:Dispatch保存文本:SaveAs
# coiding=utf8"""多格式文档文本抽取工具"""import os, fnmatchfrom win32com import client as wcfrom win32com.client import Dispatch"""功能描述:抽取多文档文本,默认保存在根目录下,支持自定义参数描述:1.filePath:文件路径;2.savePath:保存路径"""def filetotxt(filePath, savePath=""):# 1.切分文件路径为文件目录和文件名dirs, filename = os.path.split(filePath)# print(dirs, '\n', filename)# 2.修改切分后的文件后缀typename = os.path.splitext(filename)[-1].lower() # 获得文件后缀new_name = tranType(filename, typename)# 3.设置新的文件保存路径if savePath == '':savePath = dirselse:savePath = savePathnew2txtPath = os.path.join(savePath, new_name)print('--->', new2txtPath)# 4.加载文件提取的处理程序 word-->txtwordapp = wc.Dispatch('Word.Application')mytxt = wordapp.Documents.Open(filePath)# 5.保存文本信息mytxt.SaveAs(new2txtPath, 4) # 参数4代表抽取文本mytxt.Close()"""功能描述:根据文件后缀修改文件名参数描述:1.filename:文件路径;2.typename:文件后缀返回参数:new_name 返回修改后新的文件名"""def tranType(filename, typename):new_name = ''if typename == '.pdf': # pdf-->txtif fnmatch.fnmatch(filename, '*.pdf'):new_name = filename[:-4] + '.txt'else: returnelif typename == ".doc" or typename == ".docx": # word-->txtif fnmatch.fnmatch(filename, '*.doc'):new_name = filename[:-4] + '.txt'elif fnmatch.fnmatch(filename, '*.docx'):new_name = filename[:-5] + '.txt'else: returnelse:print('警告:\n 您输入【',typename,'】不合法,本抽取工具仅支持doc/docx/pdf格式文件,请输入正确格式')returnreturn new_nameif __name__ == '__main__':# 获取绝对路径filePath = os.path.abspath(r'test2.docx')filePath2 = os.path.abspath(r'PCB线路板的组成及部分主要功能.doc')filePath3 = os.path.abspath(r'test.pdf')filetotxt(filePath)filetotxt(filePath2)filetotxt(filePath3)
---> E:\pythonProject\DataProcess\test2.txt---> E:\pythonProject\DataProcess\PCB线路板的组成及部分主要功能.txt---> E:\pythonProject\DataProcess\test.txt
2.6 Excel转TXT
# encoding: utf-8import xlwtimport xlrd"""txt文件转换为excel文件(.xls/.xlsx)filename:txt文本文件名称xlsname:转换后的excel文件名"""def txt_xls(filename, xlsname):try:# 打开txt文本进行读取f = open(filename)xls = xlwt.Workbook()# 生成excel的方法,声明excelsheet = xls.add_sheet('Sheet1', cell_overwrite_ok=True)x = 0 # excel开始写的位置# 循环,读取文本中的所有内容while True:# 按行循环,读取文本文件line = f.readline()if not line:break # 如果没有内容,则退出循环for i in range(len(line.split(','))):item = line.split(',')[i]sheet.write(x, i, item) # x表示行,i表示列x += 1 # excel另起一行f.close()xls.save(xlsname) # 保存xls文件except:raise"""返回一行数据row_data:行数据"""def row2str(row_data):try:values = ""for i in range(len(row_data)):if i == len(row_data) - 1:values = values + str(row_data[i])else:# 使用英文逗号作为分隔符values = values + str(row_data[i]) + ","return valuesexcept:raise"""excel文件转换为txt文件xls_name:excel文件名称txt_name:txt文件名称"""def xls_txt(xls_name, txt_name):try:# 创建工作簿对象wb = xlrd.open_workbook(xls_name)# 文件读写方式为追加file = open(txt_name, "a")sheet = wb.sheets()[0] # 获取第一个工作表# 获取工作表的行数rows = sheet.nrows# 获取工作表的列数col_cnt = sheet.ncols# 跳过第一行for i in range(1, rows):row_data = sheet.row_values(i)# 将行数据转成字符串row_values = row2str(row_data)# 将字符串写入新文件,每行结束则换行file.writelines(row_values + "\r")# 关闭写入的文件file.close()except:passif __name__ == '__main__':xls_name = 'LOL英雄.xls'txt_name = 'test.txt'xls_txt(xls_name, txt_name)filename = "test.txt"xlsname = "test.xls"txt_xls(filename, xlsname)
LOL英雄.xls:
执行效果:
2.7 遍历读取文件
算法思路:
遍历文件的类TraversalFun:TraversalDir、AllFiles遍历目录文件TraversalDir:AllFiles(self.rootDir)递归遍历文件AllFiles:AllFiles(self, rootDir)判断是否为文件isfile:打印出文件名判断是否是目录isdir:递归遍历
# coding=utf8"""遍历目录文件,打印出所有文件的完整路径"""# 遍历目录处理子文件import os, timeclass TraversalFun():# 1.初始化,rootDir目录文件路径def __init__(self, rootDir):self.rootDir = rootDir# 2.遍历目录文件def TraversalDir(self):TraversalFun.AllFiles(self, self.rootDir)# 3.递归算法遍历所有文件,并打印文件名(非目录文件)def AllFiles(self, rootDir):# 获取根目录下所有文件for lists in os.listdir(rootDir):path = os.path.join(rootDir, lists)print(path)if __name__ == '__main__':time_start = time.time()rootDir = r"."tra = TraversalFun(rootDir)tra.TraversalDir()time_end = time.time()print('totally cost', (time_end - time_start), 's')
执行结果:
.\.idea.\ConvFormat.py.\ExtractTxt.py.\new_.\PCB线路板的组成及部分主要功能.doc.\PCB线路板的组成及部分主要功能.txt.\pdf2txt.py.\test.pdf.\test.py.\test.txt.\test2.docx.\test2.xls.\TraverFiles.py.\word2txt.py.\__pycache__.\~$test2.docxtotally cost 0.0 s
2.8 实战案例:遍历文本,批量抽取文本内容
算法思路:
引用外部文本抽取模块:import ExtractTxt as ET参数方法使用:TraversalFUn(rootDir, ET.Files2Txt, saveDir)创建保存根目录:os.path.abspath递归遍历文件:func(path, save_dir)
# coding=utf8"""批量抽取新闻文本信息(3类90条)"""import os, timefrom _ctypes_test import funcimport ExtractTxt as ET"""功能描述:遍历目录处理子文件,抽取其文本参数描述:1.rootDir:根目录,2.func:方法参数,3.saveDir:保存路径"""class TraversalFun():# 1.初始化,rootDir目录文件路径def __init__(self, rootDir, func=None, saveDir=''):self.rootDir = rootDir # 目录文件夹路径self.func = func # 方法参数,实现文本提取self.saveDir = saveDir # 文件夹保存路径# 2.遍历目录文件def TraversalDir(self):# 切分文件目录和文件名dirs, filename = os.path.split(self.rootDir)# 保存目录save_dir = ""if self.saveDir == "":save_dir = os.path.abspath(os.path.join(dirs, "new_"+filename))else:save_dir = self.saveDir# 创建保存路径if not os.path.exists(save_dir):# 不存在则创建os.makedirs(save_dir)print("保存目录:\n", save_dir)# 遍历文件,抽取txt文本内容TraversalFun.AllFiles(self, self.rootDir, save_dir)# 3.递归算法遍历所有文件,并打印文件名(非目录文件)def AllFiles(self, rootDir, save_dir=''):# 获取根目录下所有文件for lists in os.listdir(rootDir):path = os.path.join(rootDir, lists)# 核心算法,对文件类型信息抽取并保存if os.path.isfile(path):self.func(os.path.abspath(path), os.path.abspath(save_dir))# 递归遍历目录if os.path.isdir(path):newsave_dir = os.path.join(save_dir, lists)if not os.path.exists(newsave_dir):# 不存在则创建os.mkdir(newsave_dir)TraversalFun.AllFiles(self, path, newsave_dir)# 主函数设置if __name__ == '__main__':time_start = time.time()saveDir = r'E:' # 自定义保存路径rootDir = r"."tra = TraversalFun(rootDir, ET.filetotxt, saveDir)tra.TraversalDir()time_end = time.time()print('totally cost', (time_end - time_start)*1000, 'ms')
参考文章:
/developer/article/1194468/hankyoon/p/13606783.html/article/1281852527922397184.htm