课程地址:https://www.imooc.com/learn/1105
数据预处理简单来说就是:将原始数据装进一个预处理的黑匣子之后,产生出高质量数据,用来适应相关技术或算法模型。
将原始数据直接进行分类模型训练,由于原始数据存在许多干扰项,分类器准确率和召回率都比较低。
将原始数据放进预处理黑匣子后,会自动过滤掉干扰数据,并且会按照规约的方法体现每个词特征的重要性,然后将词特征压缩变换在数值型矩阵中,再通过分类器就会取得不错的效果,可以进行工程应用。
预处理前: 不完整、偏态、噪声、特征比重、特征维度、缺失值、错误值等问题;
预处理后: 存在完整、正态、干净、特征合适、特征维度合理、无缺失值等优点
功能设计:
算法思路:
# coding=utf-8
# Word文档信息提取
import fnmatch
import os
from win32com import client as wc
from 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 = dirs
else:
savePath = savePath
word2txtPath = os.path.join(savePath, new_name)
print('--->', word2txtPath)
# 4.加载文件提取的处理程序 word-->txt
wordapp = 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:
效果:
算法思路:
# coding=utf-8
# PDF文档信息提取
import os, fnmatch
from win32com import client as wc
from 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 = dirs
else:
savePath = savePath
pdf2txtPath = os.path.join(savePath, new_name)
print('--->', pdf2txtPath)
# 4.加载文件提取的处理程序 word-->txt
wordapp = 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
算法思路:
# coiding=utf8
"""
多格式文档文本抽取工具
"""
import os, fnmatch
from win32com import client as wc
from 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 = dirs
else:
savePath = savePath
new2txtPath = os.path.join(savePath, new_name)
print('--->', new2txtPath)
# 4.加载文件提取的处理程序 word-->txt
wordapp = 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-->txt
if fnmatch.fnmatch(filename, '*.pdf'):
new_name = filename[:-4] + '.txt'
else: return
elif typename == ".doc" or typename == ".docx": # word-->txt
if fnmatch.fnmatch(filename, '*.doc'):
new_name = filename[:-4] + '.txt'
elif fnmatch.fnmatch(filename, '*.docx'):
new_name = filename[:-5] + '.txt'
else: return
else:
print('警告:\n 您输入【',typename,'】不合法,本抽取工具仅支持doc/docx/pdf格式文件,请输入正确格式')
return
return new_name
if __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
# encoding: utf-8
import xlwt
import xlrd
"""
txt文件转换为excel文件(.xls/.xlsx)
filename:txt文本文件名称
xlsname:转换后的excel文件名
"""
def txt_xls(filename, xlsname):
try:
# 打开txt文本进行读取
f = open(filename)
xls = xlwt.Workbook()
# 生成excel的方法,声明excel
sheet = 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 values
except:
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:
pass
if __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)
算法思路:
# coding=utf8
"""
遍历目录文件,打印出所有文件的完整路径
"""
# 遍历目录处理子文件
import os, time
class 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.docx
totally cost 0.0 s
算法思路:
# coding=utf8
"""
批量抽取新闻文本信息(3类90条)
"""
import os, time
from _ctypes_test import func
import 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')
参考文章: