01.数据预处理之抽取文本信息

常见数据类型和数据采集

结构化数据

结构化的数据是指可以使用关系型数据库表示和存储,表现为二维形式的数据。一般特点是:数据以行为单位,一行数据表示一个实体的信息,每一行数据的属性是相同的。比如:

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


内容均来源于学习资料,在学习过程中进行记录,如有侵权联系作者进行删除

Change the world by program

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容