您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

使用Python进行文本分析-将PDF文件多进程批量处理为csv文件

时间:2023-11-14 13:50:52  来源:微信公众号  作者:PaperCodeTips

在文本分析的过程中,将原始数据转换为TXT文件非常关键,主要出于以下几个方面的考虑:

使用Python进行文本分析-将PDF文件多进程批量处理为csv文件

1.格式简单与统一:

  • TXT文件是一种简单的文本格式,只包含纯文本信息,不包含任何格式或样式信息。这种简单和统一的格式有助于减少在文本分析过程中可能出现的混淆或误解。
  • 其他格式的文档,如PDF或word文档,可能包含图像、表格和其他非文本元素,还可能包含复杂的格式和样式,这些都可能干扰文本分析的过程。

2. 便于文本预处理:

  • • 文本分析通常需要对文本数据进行预处理,包括分词、去停用词、标准化等。TXT文件的简单结构使得这些预处理任务更容易执行。

  • • 与其他文件格式相比,TXT文件不包含任何复杂的格式或元数据,这有助于简化预处理步骤,减少可能出现的错误和问题。

3.兼容性:

  • • 大多数文本分析和自然语言处理(NLP)工具都能够直接处理TXT文件。将原始数据转换为TXT文件可以确保与这些工具的兼容性,从而简化分析流程。

  • • TXT文件是一种通用的文件格式,可以在不同的操作系统和软件环境中轻松处理,而不需要特定的转换或适配器。

4.节省资源:

  • • TXT文件通常比其他文件格式更小,这有助于节省存储空间和提高处理速度。较小的文件大小也意味着需要较少的计算资源来处理文本数据,从而提高分析效率。

  • • 简单的文本格式也意味着在处理时CPU和内存的消耗较低,这对于大规模文本分析任务来说是非常重要的。

5.便于文本挖掘和模式识别:

  • • 纯文本格式使得使用正则表达式和其他文本挖掘技术来识别和提取文本中的模式变得更为容易和直接。

  • • 纯文本数据也便于实现各种文本分析技术,如情感分析、主题建模和实体识别等。

6.可读性和可检查性:

  • • 人类可以直接读取和理解TXT文件,这对于检查、调试和理解文本分析的结果非常重要。

7.数据清洗:

  • • TXT文件的简单性使得更容易识别和处理缺失值、错误和其他数据质量问题,从而保证文本分析的准确性和可靠性。

将原始数据转换为TXT文件是实现有效和准确文本分析的一个基本步骤,它帮助简化和标准化文本分析流程,从而提高分析的效率和质量。以下代码可以用来将pdf文件转换为txt文件。

pdf2txt.py

#!/usr/bin/env Python/ target=_blank class=infotextkey>Python  # 该行命令告诉操作系统使用 Python 解释器执行此文件
import sys  # 导入sys模块,用于处理与Python解释器和运行时环境有关的操作
from pdfminer.pdfdocument import PDFDocument  # 从pdfminer模块导入PDFDocument类,用于表示PDF文档
from pdfminer.pdfparser import PDFParser  # 从pdfminer模块导入PDFParser类,用于解析PDF文档
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter  # 从pdfminer模块导入资源管理和页面解释类
from pdfminer.pdfdevice import PDFDevice, TagExtractor  # 从pdfminer模块导入PDF设备和标签提取器类
from pdfminer.pdfpage import PDFPage  # 从pdfminer模块导入PDFPage类,用于表示PDF页面
from pdfminer.converter import XMLConverter, htmlConverter, TextConverter  # 从pdfminer模块导入转换器类,用于将PDF转换为其他格式
from pdfminer.cmapdb import CMapDB  # 从pdfminer模块导入字符映射数据库类
from pdfminer.layout import LAParams  # 从pdfminer模块导入布局分析参数类
from pdfminer.image import ImageWriter  # 从pdfminer模块导入图像写入类

# 定义主函数,argv是一个包含命令行参数的列表
def mAIn(argv):
    import getopt  # 导入getopt模块,用于解析命令行参数
    # 定义一个显示用法的内部函数
    def usage():
        print ('usage: %s [-P password] [-o output] [-t text|html|xml|tag]'
               ' [-O output_dir] [-c encoding] [-s scale] [-R rotation]'
               ' [-Y normal|loose|exact] [-p pagenos] [-m maxpages]'
               ' [-S] [-C] [-n] [-A] [-V] [-M char_margin] [-L line_margin]'
               ' [-W word_margin] [-F boxes_flow] [-d] input.pdf ...' % argv[0])
        return 100  # 返回一个错误代码
    try:
        # 使用getopt解析命令行参数
        (opts, args) = getopt.getopt(argv[1:], 'dP:o:t:O:c:s:R:Y:p:m:SCnAVM:W:L:F:')
    except getopt.GetoptError:
        return usage()  # 如果解析失败,则显示用法并退出
    if not args: return usage()  # 如果没有提供非选项参数(例如输入文件),则显示用法并退出
    # 初始化一些变量
    debug = 0  # 调试级别
    password = b''  # PDF密码
    pagenos = set()  # 要处理的页码集
    maxpages = 0  # 最大页数
    outfile = None  # 输出文件名
    outtype = None  # 输出类型
    imagewriter = None  # 图像写入对象
    rotation = 0  # 旋转角度
    stripcontrol = False  # 是否剥离控制字符
    layoutmode = 'normal'  # 布局模式
    encoding = 'utf-8'  # 编码方式
    pageno = 1  # 页面号
    scale = 1  # 缩放因子
    caching = True  # 是否缓存
    showpageno = True  # 是否显示页面号
    laparams = LAParams()  # 布局分析参数对象
    for (k, v) in opts:  # 遍历选项和值
        if k == '-d': debug += 1  # 设置调试级别
        elif k == '-P': password = v.encode('ascii')  # 设置密码
        elif k == '-o': outfile = v  # 设置输出文件名
        elif k == '-t': outtype = v  # 设置输出类型
        elif k == '-O': imagewriter = ImageWriter(v)  # 创建图像写入对象
        elif k == '-c': encoding = v  # 设置编码方式
        elif k == '-s': scale = float(v)  # 设置缩放因子
        elif k == '-R': rotation = int(v)  # 设置旋转角度
        elif k == '-Y': layoutmode = v  # 设置布局模式
        elif k == '-p': pagenos.update(int(x)-1 for x in v.split(','))  # 更新页码集
        elif k == '-m': maxpages = int(v)  # 设置最大页数
        elif k == '-S': stripcontrol = True  # 启用剥离控制字符
        elif k == '-C': caching = False  # 禁用缓存
        elif k == '-n': laparams = None  # 禁用布局分析参数
        elif k == '-A': laparams.all_texts = True  # 启用所有文本选项
        elif k == '-V': laparams.detect_vertical = True  # 启用垂直检测选项
        elif k == '-M': laparams.char_margin = float(v)  # 设置字符边距
        elif k == '-W': laparams.word_margin = float(v)  # 设置单词边距
        elif k == '-L': laparams.line_margin = float(v)  # 设置行边距
        elif k == '-F': laparams.boxes_flow = float(v)  # 设置框流
    # 设置调试级别
    PDFDocument.debug = debug
    PDFParser.debug = debug
    CMapDB.debug = debug
    PDFPageInterpreter.debug = debug
    # 创建PDF资源管理器对象
    rsrcmgr = PDFResourceManager(caching=caching)
    # 根据输出类型和选项创建相应的PDF设备对象
    if not outtype:
        outtype = 'text'  # 默认为文本输出
        if outfile:
            if outfile.endswith('.htm') or outfile.endswith('.html'):
                outtype = 'html'  # 如果输出文件名以.htm或.html结尾,则设置为html输出
            elif outfile.endswith('.xml'):
                outtype = 'xml'  # 如果输出文件名以.xml结尾,则设置为xml输出
            elif outfile.endswith('.tag'):
                outtype = 'tag'  # 如果输出文件名以.tag结尾,则设置为tag输出
            elif outtype == 'tag':
        device = TagExtractor(rsrcmgr, outfp)  # 如果输出类型为'tag',则创建TagExtractor对象
    else:
        return usage()  # 如果不识别的输出类型,则显示用法并退出

    for fname in args:  # 遍历所有输入文件名
        with open(fname, 'rb') as fp:  # 以二进制读模式打开文件
            interpreter = PDFPageInterpreter(rsrcmgr, device)  # 创建PDF页面解释器对象
            # 遍历PDF页面,获取页面对象
            for page in PDFPage.get_pages(fp, pagenos,
                                          maxpages=maxpages, password=password,
                                          caching=caching, check_extractable=True):
                page.rotate = (page.rotate+rotation) % 360  # 设置页面旋转角度
                interpreter.process_page(page)  # 处理每个页面

    device.close()  # 关闭设备对象,释放资源
    outfp.close()  # 关闭输出文件,释放资源
    return  # 从主函数返回

# 检查此模块是否作为主模块运行
if __name__ == '__main__':
    sys.exit(main(sys.argv))  # 如果是,则调用main函数,并使用命令行参数列表作为参数

convertPDF.py

#!/usr/bin/env python3
"""
Script to convert PDFs to text files.

"""

import  unicodedata, os, pdf2txt, datetime

import multiprocessing
def convertPDFToText(i, ID, newDir, fileNamePDF):
    print('Trying to convert: ' + str(i) + ', ' + ID)  # 输出正在尝试转换的文件信息
    try:
        pdf2txt.main(['-o', newDir + '/' + ID + '.txt', fileNamePDF])  # 调用pdf2txt.main来转换PDF为文本
        print('Successfully converted: ' + ID)  # 转换成功时的输出
    except Exception as e:
        print('Failed to convert: ' + ID + f', Error: {e}')  # 转换失败时的输出

def process_pdfs(pdf_list):
    with multiprocessing.Pool(20) as pool:  # 创建一个包含20个进程的进程池
        pool.starmap(convertPDFToText, pdf_list)  # 使用starmap来并行处理pdf_list中的每个元素,每个元素都是一个元组,它将被解包为convertPDFToText的参数

if __name__ == '__main__':

    directory = '../../Data/PDF/work'
    os.chdir(directory)  # 更改当前工作目录至PDF文件目录

    # 指定保存转换后文件的目录
    newDir = '../TXT/work'
    # os.makedirs(newDir)  # 创建新目录(如果需要的话)
    print('Placing converted files in: ' + newDir)  # 输出转换后文件将被放置的目录

    pdf_list = []  # 创建一个空列表,用于保存将传递给convertPDFToText的参数元组
    i = 0  # 初始化计数器
    for fileNamePDF in os.listdir('./'):  # 遍历当前目录中的所有文件
        i += 1  # 计数器递增
        if fileNamePDF.find(".pdf") == -1:  # 如果文件不是PDF,跳过
            continue

        ID = fileNamePDF[:-4]  # 从文件名中获取ID(去掉.pdf后缀)
        if os.path.isfile('../TXT/' + ID + '.txt'):  # 如果已经存在对应的文本文件,跳过
            continue

        pdf_list.Append((i, ID, newDir, fileNamePDF))  # 将参数元组添加到pdf_list中

    process_pdfs(pdf_list)  # 调用process_pdfs函数,传递pdf_list以并行处理PDF文件


Tags:Python   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Python 可视化:Plotly 库使用基础
当使用 Plotly 进行数据可视化时,我们可以通过以下示例展示多种绘图方法,每个示例都会有详细的注释和说明。1.创建折线图import plotly.graph_objects as go# 示例1: 创建简单...【详细内容】
2024-04-01  Search: Python  点击:(8)  评论:(0)  加入收藏
Python 办公神器:教你使用 Python 批量制作 PPT
介绍本文将介绍如何使用openpyxl和pptx库来批量制作PPT奖状。本文假设你已经安装了python和这两个库。本文的场景是:一名基层人员,要给一次比赛活动获奖的500名选手制作奖状,并...【详细内容】
2024-03-26  Search: Python  点击:(15)  评论:(0)  加入收藏
Python实现工厂模式、抽象工厂,单例模式
工厂模式是一种常见的设计模式,它可以帮助我们创建对象的过程更加灵活和可扩展。在Python中,我们可以使用函数和类来实现工厂模式。一、Python中实现工厂模式工厂模式是一种常...【详细内容】
2024-03-07  Search: Python  点击:(31)  评论:(0)  加入收藏
不可不学的Python技巧:字典推导式使用全攻略
Python的字典推导式是一种优雅而强大的工具,用于创建字典(dict)。这种方法不仅代码更加简洁,而且执行效率高。无论你是Python新手还是有经验的开发者,掌握字典推导式都将是你技能...【详细内容】
2024-02-22  Search: Python  点击:(32)  评论:(0)  加入收藏
如何进行Python代码的代码重构和优化?
Python是一种高级编程语言,它具有简洁、易于理解和易于维护的特点。然而,代码重构和优化对于保持代码质量和性能至关重要。什么是代码重构?代码重构是指在不改变代码外部行为的...【详细内容】
2024-02-22  Search: Python  点击:(32)  评论:(0)  加入收藏
Python开发者必备的八个PyCharm插件
在编写代码的过程中,括号几乎无处不在,以至于有时我们会拼命辨别哪个闭合括号与哪个开头的括号相匹配。这款插件能帮助解决这个众所周知的问题。前言在PyCharm中浏览插件列表...【详细内容】
2024-01-26  Search: Python  点击:(84)  评论:(0)  加入收藏
Python的Graphlib库,再也不用手敲图结构了
Python中的graphlib库是一个功能强大且易于使用的工具。graphlib提供了许多功能,可以帮助您创建、操作和分析图形对象。本文将介绍graphlib库的主要用法,并提供一些示例代码和...【详细内容】
2024-01-26  Search: Python  点击:(86)  评论:(0)  加入收藏
大语言模型插件功能在携程的Python实践
作者简介成学,携程高级安全研发工程师,关注Python/Golang后端开发、大语言模型等领域。一、背景2023年初,科技圈最火爆的话题莫过于大语言模型了,它是一种全新的聊天机器人模型,...【详细内容】
2024-01-26  Search: Python  点击:(73)  评论:(0)  加入收藏
如何使用Python、Apache Kafka和云平台构建健壮的实时数据管道
译者 | 李睿审校 | 重楼在当今竞争激烈的市场环境中,为了生存和发展,企业必须能够实时收集、处理和响应数据。无论是检测欺诈、个性化用户体验还是监控系统,现在都需要接近即时...【详细内容】
2024-01-26  Search: Python  点击:(46)  评论:(0)  加入收藏
Python分布式爬虫打造搜索引擎
简单分布式爬虫结构主从模式是指由一台主机作为控制节点负责所有运行网络爬虫的主机进行管理,爬虫只需要从控制节点那里接收任务,并把新生成任务提交给控制节点就可以了,在这个...【详细内容】
2024-01-25  Search: Python  点击:(58)  评论:(0)  加入收藏
▌简易百科推荐
Python 可视化:Plotly 库使用基础
当使用 Plotly 进行数据可视化时,我们可以通过以下示例展示多种绘图方法,每个示例都会有详细的注释和说明。1.创建折线图import plotly.graph_objects as go# 示例1: 创建简单...【详细内容】
2024-04-01  Python技术    Tags:Python   点击:(8)  评论:(0)  加入收藏
Python 办公神器:教你使用 Python 批量制作 PPT
介绍本文将介绍如何使用openpyxl和pptx库来批量制作PPT奖状。本文假设你已经安装了python和这两个库。本文的场景是:一名基层人员,要给一次比赛活动获奖的500名选手制作奖状,并...【详细内容】
2024-03-26  Python技术  微信公众号  Tags:Python   点击:(15)  评论:(0)  加入收藏
Python实现工厂模式、抽象工厂,单例模式
工厂模式是一种常见的设计模式,它可以帮助我们创建对象的过程更加灵活和可扩展。在Python中,我们可以使用函数和类来实现工厂模式。一、Python中实现工厂模式工厂模式是一种常...【详细内容】
2024-03-07  Python都知道  微信公众号  Tags:Python   点击:(31)  评论:(0)  加入收藏
不可不学的Python技巧:字典推导式使用全攻略
Python的字典推导式是一种优雅而强大的工具,用于创建字典(dict)。这种方法不仅代码更加简洁,而且执行效率高。无论你是Python新手还是有经验的开发者,掌握字典推导式都将是你技能...【详细内容】
2024-02-22  子午Python  微信公众号  Tags:Python技巧   点击:(32)  评论:(0)  加入收藏
如何进行Python代码的代码重构和优化?
Python是一种高级编程语言,它具有简洁、易于理解和易于维护的特点。然而,代码重构和优化对于保持代码质量和性能至关重要。什么是代码重构?代码重构是指在不改变代码外部行为的...【详细内容】
2024-02-22  编程技术汇    Tags:Python代码   点击:(32)  评论:(0)  加入收藏
Python开发者必备的八个PyCharm插件
在编写代码的过程中,括号几乎无处不在,以至于有时我们会拼命辨别哪个闭合括号与哪个开头的括号相匹配。这款插件能帮助解决这个众所周知的问题。前言在PyCharm中浏览插件列表...【详细内容】
2024-01-26  Python学研大本营  微信公众号  Tags:PyCharm插件   点击:(84)  评论:(0)  加入收藏
Python的Graphlib库,再也不用手敲图结构了
Python中的graphlib库是一个功能强大且易于使用的工具。graphlib提供了许多功能,可以帮助您创建、操作和分析图形对象。本文将介绍graphlib库的主要用法,并提供一些示例代码和...【详细内容】
2024-01-26  科学随想录  微信公众号  Tags:Graphlib库   点击:(86)  评论:(0)  加入收藏
Python分布式爬虫打造搜索引擎
简单分布式爬虫结构主从模式是指由一台主机作为控制节点负责所有运行网络爬虫的主机进行管理,爬虫只需要从控制节点那里接收任务,并把新生成任务提交给控制节点就可以了,在这个...【详细内容】
2024-01-25  大雷家吃饭    Tags:Python   点击:(58)  评论:(0)  加入收藏
使用Python进行数据分析,需要哪些步骤?
Python是一门动态的、面向对象的脚本语言,同时也是一门简约,通俗易懂的编程语言。Python入门简单,代码可读性强,一段好的Python代码,阅读起来像是在读一篇外语文章。Python这种特...【详细内容】
2024-01-15  程序员不二    Tags:Python   点击:(161)  评论:(0)  加入收藏
Python语言的特点及应用场景, 同其它语言对比优势
Python语言作为一种高级编程语言,具有许多独特的特点和优势,这使得它在众多编程语言中脱颖而出。在本文中,我们将探讨Python语言的特点、应用场景以及与其他语言的对比优势。一...【详细内容】
2024-01-09    今日头条  Tags:Python语言   点击:(251)  评论:(0)  加入收藏
站内最新
站内热门
站内头条