常见数据类型和数据采集
结构化数据
结构化的数据是指可以使用关系型数据库表示和存储,表现为二维形式的数据。一般特点是:数据以行为单位,一行数据表示一个实体的信息,每一行数据的属性是相同的。比如:
id | name | age | gender |
---|---|---|---|
1 | 张三 | 12 | 男 |
2 | 李四 | 13 | 女 |
3 | 王五 | 18 | 男 |
- 数据特点:关系模型数据,关系数据库表示。
- 常见格式:比如MySQL、Oracle、SqlServer等。
- 应用场合:数据库、系统网站、数据备份、ERP等。
- 数据采集:DB导出、SQL等方式。
结构化数据的存储和排列是很有规律的,这对查询和修改等操作很有帮助。但是,他的扩展性不好。
半结构化数据
半结构化数据是结构化数据的一种形式,它并不符合关系型数据库或其他数据表的形式关联起来的数据模型结构,但包含相关标记,用来分隔语义元素以及对记录和字段进行分层。因此,他也被成为自描述的结构。半结构化数据,属于同一类实体可以有不同的属性,即使它们被组合在一起,这些属性的顺序并不重要。常见的半结构数据有XML,如下:
<person>
<name>张三</name>
<age>12</age>
<gender>男</gender>
</person>
- 数据特点:非关系模型数据,还有一定的格式。
- 常见格式:比如Email、HTML、XML、JSON等。
- 应用场合:邮件系统、档案系统、新闻网站等。
- 数据采集:网络爬虫、数据解析等方式。
不同的半结构化数据的属性的个数是不定的。有些人说半结构化数据是以树或者图的数据结构存储的数据,上面的例子中,标签是树的根节点,和标签是子节点。通过这样的数据格式,可以自由的表达很多有用的信息,包括自我描述信息(元数据)。所以,半结构化数据的扩展性是很好的。
非结构化数据
就是没有固定结构的数据。各种文档、图片、视频/音频等都属于非结构化数据。对于这类数据,我们一般直接整体进行存储,而且一般存储为二进制的数据格式。
- 数据特点:没有固定格式的数据。
- 常见格式: Word、PDF、PPT、图片、音视频等。
- 应用场合:图片识别、人脸识别、医疗影像、文本分析等。
- 数据采集:网络爬虫、数据存档等方式。
从不同结构的存储中获取数据,构建文本或矩阵,提供给算法模型,从而产生价值。
文本抽取问题
存在的问题
- 格式转换后,识别乱码较多
- 不支持或限制批量处理
- 格式转换后的txt文件存在编码问题
- 生成目标文件标题和原标题不一致(例如:微博评论数据.doc -> ZXLKFJADSI.txt)
- 操作不灵活
自己打造文本抽取器
目标:
- 支持PDF/Word等转txt
- 自动过滤不符合指定格式的文件
- 生成的目标文件与源文件目录一直
- 生成文档采用统一的编码格式进行保存
- 支持默认保存路径和自定义保存路径
Pywin32实现格式转换
Word转txt的实现
思路
- 定义文件路径和转存路径 split
- 修改新的文件名 fnmatch
- 设置完整的保存路径 join
- 启动应用程序格式转换 Dispatch
- 保存文本 SaveAs
# coding=utf-8
"""
Description: Word文档信息提取
"""
import fnmatch
import os
from win32com import client
def word2txt(file_path, save_path=''):
"""
功能描述:Word文件转存txt,默认保存在根目录下,支持自定义
参数描述:1 filepPath 文件路径 2 savePath 保存路径
"""
# 切分文件路径为文件目录和文件名
dirs, filename = os.path.split(file_path)
print(dirs, '-----------', filename)
# 修改切分后的文件后缀
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
# 设置新的文件保存路径
if not save_path:
save_path = dirs
else:
save_path = save_path
txt_path = os.path.join(save_path, new_name)
print('保存路径-->', txt_path)
# 加载文本处理的处理程序,实现Word --> txt
print('开始转换...')
# 使用时根据文件默认打开方式进行选择
word_app = client.Dispatch('Word.Application') # office
# word_app = client.Dispatch("KWPS.Application") # WPS
txt = word_app.Documents.Open(file_path)
print('转换完成...')
# 保存
print('开始保存...')
txt.SaveAs(txt_path, 4) # 参数4代表抽取文本
print('保存完成...')
txt.Close()
if __name__ == '__main__':
word_file_path = os.path.abspath(r'../dataset/Corpus/word/6任务书参考模板.docx')
word2txt(word_file_path)
PDF转txt的实现
思路
- 定义文件路径和转存路径 split
- 修改新的文件名 fnmatch
- 设置完整的保存路径 join
- 启动应用程序格式转换 Dispatch
- 保存文本 SaveAs
# coding=utf-8
"""
Description: PDF文档信息提取
"""
import fnmatch
import os
from win32com import client
def pdf2txt(file_path, save_path=''):
"""
功能描述:PDF文件转存txt,默认保存在根目录下,支持自定义
参数描述:1 filepPath 文件路径 2 savePath 保存路径
"""
# 切分文件路径为文件目录和文件名
dirs, filename = os.path.split(file_path)
print(dirs, '-----------', filename)
# 修改切分后的文件后缀
if fnmatch.fnmatch(filename.lower(), '*.pdf'):
new_name = filename[:-4] + '.txt'
else:
print('格式有误,仅支持pdf格式')
return
# 设置新的文件保存路径
if not save_path:
save_path = dirs
else:
save_path = save_path
txt_path = os.path.join(save_path, new_name)
print('保存路径-->', txt_path)
# 加载文本处理的处理程序,实现Word --> txt
print('开始转换...')
# 使用时根据文件默认打开方式进行选择
pdf_app = client.Dispatch('Word.Application') # office
# pdf_app = client.Dispatch("KWPS.Application") # WPS
txt = pdf_app.Documents.Open(file_path)
print('转换完成...')
# 保存
print('开始保存...')
txt.SaveAs(txt_path, 4) # 参数4代表抽取文本
print('保存完成...')
txt.Close()
if __name__ == '__main__':
pdf_file_path = os.path.abspath(r'../dataset/Corpus/pdf/6任务书参考模板.pdf')
pdf2txt(pdf_file_path)
整合
思路
- 定义文件路径和转存路径 split
- 修改新的文件名 TranType(filename, typename)、fnmatch
- 设置完整的保存路径 join
- 启动应用程序格式转换 Dispatch
- 保存文本 SaveAs
# coding=utf-8
"""
Description:多格式文档文本抽取工具
"""
import fnmatch
import os
from win32com import client
def Files2Txt(file_path, save_path=''):
"""
功能描述:文件转存txt,默认保存在根目录下,支持自定义
:param file_path: 文件路径
:param save_path: 保存路径
"""
# 切分文件路径为文件目录和文件名
dirs, filename = os.path.split(file_path)
print(dirs, '-----------', filename)
# 修改切分后的文件后缀
# 获取文件后缀
typename = os.path.splitext(filename)[-1].lower()
new_name = tran_type(filename, typename)
# 设置新的文件保存路径
if not save_path:
save_path = dirs
else:
save_path = save_path
txt_path = os.path.join(save_path, new_name)
print('保存路径-->', txt_path)
# 加载文本处理的处理程序,实现Word --> txt
print('开始转换...')
# 使用时根据文件默认打开方式进行选择
word_app = client.Dispatch('Word.Application') # office
# word_app = client.Dispatch("KWPS.Application") # WPS
txt = word_app.Documents.Open(file_path)
print('转换完成...')
# 保存
print('开始保存...')
txt.SaveAs(txt_path, 4) # 参数4代表抽取文本
print('保存完成...')
txt.Close()
def tran_type(filename, typename):
"""
根据文件后缀修改文件名
:param filename: 文件名
:param typename: 后缀名
:return: 新文件名
"""
new_filename = ''
if typename == '.pdf':
# pdf --> txt
if fnmatch.fnmatch(filename, '*.pdf'):
new_filename = filename[:-4] + '.txt'
else:
return
elif typename == '.doc' or typename == '.docx':
# word --> txt
if fnmatch.fnmatch(filename, '*.doc'):
new_filename = filename[:-4] + '.txt'
elif fnmatch.fnmatch(filename, '*.docx'):
new_filename = filename[:-5] + '.txt'
else:
return
# 其他后缀情况自行判断
# elif typename == '.ppt':
# pass
else:
print('输入数据不合法')
return new_filename
if __name__ == '__main__':
word_file_path = os.path.abspath(r'../dataset/Corpus/word/6任务书参考模板.docx')
Files2Txt(word_file_path)
批量抽取
思路
- 遍历目录,获取目录下所有文件(递归)
- 对每个文件进行抽取
# coding=utf-8
"""
Description:批量处理文件
"""
import os
from ExtractText.ExtractTxt import file2txt
def get_all_file(root_path):
"""
获取目录下所有文件
:param root_path: 文件目录
:return: 目录下所有文件
"""
all_file = []
# 如果传入的是文件,那么直接返回
if os.path.isfile(root_path):
all_file.append(root_path)
# 如果传入的是目录,遍历递归目录,获取所有文件
elif os.path.isdir(root_path):
child_file = os.listdir(root_path)
for file in child_file:
path = os.path.join(root_path, file)
if os.path.isfile(path):
all_file.append(path)
# 如果自文件为目录,则递归处理
elif os.path.isdir(path):
all_file.extend(get_all_file(path))
return all_file
if __name__ == '__main__':
all_file = get_all_file('..\\dataset')
for file in all_file:
file_path = os.path.abspath(file)
print(file_path)
file2txt(file_path)
相关代码:https://gitee.com/tangjinghong/data_process
内容均来源于学习资料,在学习过程中进行记录,如有侵权联系作者进行删除