自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

使用Python進(jìn)行文本分析-將PDF文件多進(jìn)程批量處理為csv文件

開(kāi)發(fā) 前端
在文本分析的過(guò)程中,將原始數(shù)據(jù)轉(zhuǎn)換為T(mén)XT文件非常關(guān)鍵,主要出于以幾個(gè)方面的考慮.

在文本分析的過(guò)程中,將原始數(shù)據(jù)轉(zhuǎn)換為T(mén)XT文件非常關(guān)鍵,主要出于以下幾個(gè)方面的考慮:

1.格式簡(jiǎn)單與統(tǒng)一:

  • TXT文件是一種簡(jiǎn)單的文本格式,只包含純文本信息,不包含任何格式或樣式信息。這種簡(jiǎn)單和統(tǒng)一的格式有助于減少在文本分析過(guò)程中可能出現(xiàn)的混淆或誤解。
  • 其他格式的文檔,如PDF或Word文檔,可能包含圖像、表格和其他非文本元素,還可能包含復(fù)雜的格式和樣式,這些都可能干擾文本分析的過(guò)程。

2. 便于文本預(yù)處理:

  • ? 文本分析通常需要對(duì)文本數(shù)據(jù)進(jìn)行預(yù)處理,包括分詞、去停用詞、標(biāo)準(zhǔn)化等。TXT文件的簡(jiǎn)單結(jié)構(gòu)使得這些預(yù)處理任務(wù)更容易執(zhí)行。

  • ? 與其他文件格式相比,TXT文件不包含任何復(fù)雜的格式或元數(shù)據(jù),這有助于簡(jiǎn)化預(yù)處理步驟,減少可能出現(xiàn)的錯(cuò)誤和問(wèn)題。

3.兼容性:

  • ? 大多數(shù)文本分析和自然語(yǔ)言處理(NLP)工具都能夠直接處理TXT文件。將原始數(shù)據(jù)轉(zhuǎn)換為T(mén)XT文件可以確保與這些工具的兼容性,從而簡(jiǎn)化分析流程。

  • ? TXT文件是一種通用的文件格式,可以在不同的操作系統(tǒng)和軟件環(huán)境中輕松處理,而不需要特定的轉(zhuǎn)換或適配器。

4.節(jié)省資源:

  • ? TXT文件通常比其他文件格式更小,這有助于節(jié)省存儲(chǔ)空間和提高處理速度。較小的文件大小也意味著需要較少的計(jì)算資源來(lái)處理文本數(shù)據(jù),從而提高分析效率。

  • ? 簡(jiǎn)單的文本格式也意味著在處理時(shí)CPU和內(nèi)存的消耗較低,這對(duì)于大規(guī)模文本分析任務(wù)來(lái)說(shuō)是非常重要的。

5.便于文本挖掘和模式識(shí)別:

  • ? 純文本格式使得使用正則表達(dá)式和其他文本挖掘技術(shù)來(lái)識(shí)別和提取文本中的模式變得更為容易和直接。

  • ? 純文本數(shù)據(jù)也便于實(shí)現(xiàn)各種文本分析技術(shù),如情感分析、主題建模和實(shí)體識(shí)別等。

6.可讀性和可檢查性:

  • ? 人類(lèi)可以直接讀取和理解TXT文件,這對(duì)于檢查、調(diào)試和理解文本分析的結(jié)果非常重要。

7.數(shù)據(jù)清洗:

  • ? TXT文件的簡(jiǎn)單性使得更容易識(shí)別和處理缺失值、錯(cuò)誤和其他數(shù)據(jù)質(zhì)量問(wèn)題,從而保證文本分析的準(zhǔn)確性和可靠性。

將原始數(shù)據(jù)轉(zhuǎn)換為T(mén)XT文件是實(shí)現(xiàn)有效和準(zhǔn)確文本分析的一個(gè)基本步驟,它幫助簡(jiǎn)化和標(biāo)準(zhǔn)化文本分析流程,從而提高分析的效率和質(zhì)量。以下代碼可以用來(lái)將pdf文件轉(zhuǎn)換為txt文件。

pdf2txt.py

#!/usr/bin/env python  # 該行命令告訴操作系統(tǒng)使用 Python 解釋器執(zhí)行此文件
import sys  # 導(dǎo)入sys模塊,用于處理與Python解釋器和運(yùn)行時(shí)環(huán)境有關(guān)的操作
from pdfminer.pdfdocument import PDFDocument  # 從pdfminer模塊導(dǎo)入PDFDocument類(lèi),用于表示PDF文檔
from pdfminer.pdfparser import PDFParser  # 從pdfminer模塊導(dǎo)入PDFParser類(lèi),用于解析PDF文檔
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter  # 從pdfminer模塊導(dǎo)入資源管理和頁(yè)面解釋類(lèi)
from pdfminer.pdfdevice import PDFDevice, TagExtractor  # 從pdfminer模塊導(dǎo)入PDF設(shè)備和標(biāo)簽提取器類(lèi)
from pdfminer.pdfpage import PDFPage  # 從pdfminer模塊導(dǎo)入PDFPage類(lèi),用于表示PDF頁(yè)面
from pdfminer.converter import XMLConverter, HTMLConverter, TextConverter  # 從pdfminer模塊導(dǎo)入轉(zhuǎn)換器類(lèi),用于將PDF轉(zhuǎn)換為其他格式
from pdfminer.cmapdb import CMapDB  # 從pdfminer模塊導(dǎo)入字符映射數(shù)據(jù)庫(kù)類(lèi)
from pdfminer.layout import LAParams  # 從pdfminer模塊導(dǎo)入布局分析參數(shù)類(lèi)
from pdfminer.image import ImageWriter  # 從pdfminer模塊導(dǎo)入圖像寫(xiě)入類(lèi)

# 定義主函數(shù),argv是一個(gè)包含命令行參數(shù)的列表
def main(argv):
    import getopt  # 導(dǎo)入getopt模塊,用于解析命令行參數(shù)
    # 定義一個(gè)顯示用法的內(nèi)部函數(shù)
    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  # 返回一個(gè)錯(cuò)誤代碼
    try:
        # 使用getopt解析命令行參數(shù)
        (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()  # 如果沒(méi)有提供非選項(xiàng)參數(shù)(例如輸入文件),則顯示用法并退出
    # 初始化一些變量
    debug = 0  # 調(diào)試級(jí)別
    password = b''  # PDF密碼
    pagenos = set()  # 要處理的頁(yè)碼集
    maxpages = 0  # 最大頁(yè)數(shù)
    outfile = None  # 輸出文件名
    outtype = None  # 輸出類(lèi)型
    imagewriter = None  # 圖像寫(xiě)入對(duì)象
    rotation = 0  # 旋轉(zhuǎn)角度
    stripcontrol = False  # 是否剝離控制字符
    layoutmode = 'normal'  # 布局模式
    encoding = 'utf-8'  # 編碼方式
    pageno = 1  # 頁(yè)面號(hào)
    scale = 1  # 縮放因子
    caching = True  # 是否緩存
    showpageno = True  # 是否顯示頁(yè)面號(hào)
    laparams = LAParams()  # 布局分析參數(shù)對(duì)象
    for (k, v) in opts:  # 遍歷選項(xiàng)和值
        if k == '-d': debug += 1  # 設(shè)置調(diào)試級(jí)別
        elif k == '-P': password = v.encode('ascii')  # 設(shè)置密碼
        elif k == '-o': outfile = v  # 設(shè)置輸出文件名
        elif k == '-t': outtype = v  # 設(shè)置輸出類(lèi)型
        elif k == '-O': imagewriter = ImageWriter(v)  # 創(chuàng)建圖像寫(xiě)入對(duì)象
        elif k == '-c': encoding = v  # 設(shè)置編碼方式
        elif k == '-s': scale = float(v)  # 設(shè)置縮放因子
        elif k == '-R': rotation = int(v)  # 設(shè)置旋轉(zhuǎn)角度
        elif k == '-Y': layoutmode = v  # 設(shè)置布局模式
        elif k == '-p': pagenos.update(int(x)-1 for x in v.split(','))  # 更新頁(yè)碼集
        elif k == '-m': maxpages = int(v)  # 設(shè)置最大頁(yè)數(shù)
        elif k == '-S': stripcontrol = True  # 啟用剝離控制字符
        elif k == '-C': caching = False  # 禁用緩存
        elif k == '-n': laparams = None  # 禁用布局分析參數(shù)
        elif k == '-A': laparams.all_texts = True  # 啟用所有文本選項(xiàng)
        elif k == '-V': laparams.detect_vertical = True  # 啟用垂直檢測(cè)選項(xiàng)
        elif k == '-M': laparams.char_margin = float(v)  # 設(shè)置字符邊距
        elif k == '-W': laparams.word_margin = float(v)  # 設(shè)置單詞邊距
        elif k == '-L': laparams.line_margin = float(v)  # 設(shè)置行邊距
        elif k == '-F': laparams.boxes_flow = float(v)  # 設(shè)置框流
    # 設(shè)置調(diào)試級(jí)別
    PDFDocument.debug = debug
    PDFParser.debug = debug
    CMapDB.debug = debug
    PDFPageInterpreter.debug = debug
    # 創(chuàng)建PDF資源管理器對(duì)象
    rsrcmgr = PDFResourceManager(caching=caching)
    # 根據(jù)輸出類(lèi)型和選項(xiàng)創(chuàng)建相應(yīng)的PDF設(shè)備對(duì)象
    if not outtype:
        outtype = 'text'  # 默認(rèn)為文本輸出
        if outfile:
            if outfile.endswith('.htm') or outfile.endswith('.html'):
                outtype = 'html'  # 如果輸出文件名以.htm或.html結(jié)尾,則設(shè)置為html輸出
            elif outfile.endswith('.xml'):
                outtype = 'xml'  # 如果輸出文件名以.xml結(jié)尾,則設(shè)置為xml輸出
            elif outfile.endswith('.tag'):
                outtype = 'tag'  # 如果輸出文件名以.tag結(jié)尾,則設(shè)置為tag輸出
            elif outtype == 'tag':
        device = TagExtractor(rsrcmgr, outfp)  # 如果輸出類(lèi)型為'tag',則創(chuàng)建TagExtractor對(duì)象
    else:
        return usage()  # 如果不識(shí)別的輸出類(lèi)型,則顯示用法并退出

    for fname in args:  # 遍歷所有輸入文件名
        with open(fname, 'rb') as fp:  # 以二進(jìn)制讀模式打開(kāi)文件
            interpreter = PDFPageInterpreter(rsrcmgr, device)  # 創(chuàng)建PDF頁(yè)面解釋器對(duì)象
            # 遍歷PDF頁(yè)面,獲取頁(yè)面對(duì)象
            for page in PDFPage.get_pages(fp, pagenos,
                                          maxpages=maxpages, password=password,
                                          caching=caching, check_extractable=True):
                page.rotate = (page.rotate+rotation) % 360  # 設(shè)置頁(yè)面旋轉(zhuǎn)角度
                interpreter.process_page(page)  # 處理每個(gè)頁(yè)面

    device.close()  # 關(guān)閉設(shè)備對(duì)象,釋放資源
    outfp.close()  # 關(guān)閉輸出文件,釋放資源
    return  # 從主函數(shù)返回

# 檢查此模塊是否作為主模塊運(yùn)行
if __name__ == '__main__':
    sys.exit(main(sys.argv))  # 如果是,則調(diào)用main函數(shù),并使用命令行參數(shù)列表作為參數(shù)

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)  # 輸出正在嘗試轉(zhuǎn)換的文件信息
    try:
        pdf2txt.main(['-o', newDir + '/' + ID + '.txt', fileNamePDF])  # 調(diào)用pdf2txt.main來(lái)轉(zhuǎn)換PDF為文本
        print('Successfully converted: ' + ID)  # 轉(zhuǎn)換成功時(shí)的輸出
    except Exception as e:
        print('Failed to convert: ' + ID + f', Error: {e}')  # 轉(zhuǎn)換失敗時(shí)的輸出

def process_pdfs(pdf_list):
    with multiprocessing.Pool(20) as pool:  # 創(chuàng)建一個(gè)包含20個(gè)進(jìn)程的進(jìn)程池
        pool.starmap(convertPDFToText, pdf_list)  # 使用starmap來(lái)并行處理pdf_list中的每個(gè)元素,每個(gè)元素都是一個(gè)元組,它將被解包為convertPDFToText的參數(shù)

if __name__ == '__main__':

    directory = '../../Data/PDF/work'
    os.chdir(directory)  # 更改當(dāng)前工作目錄至PDF文件目錄

    # 指定保存轉(zhuǎn)換后文件的目錄
    newDir = '../TXT/work'
    # os.makedirs(newDir)  # 創(chuàng)建新目錄(如果需要的話)
    print('Placing converted files in: ' + newDir)  # 輸出轉(zhuǎn)換后文件將被放置的目錄

    pdf_list = []  # 創(chuàng)建一個(gè)空列表,用于保存將傳遞給convertPDFToText的參數(shù)元組
    i = 0  # 初始化計(jì)數(shù)器
    for fileNamePDF in os.listdir('./'):  # 遍歷當(dāng)前目錄中的所有文件
        i += 1  # 計(jì)數(shù)器遞增
        if fileNamePDF.find(".pdf") == -1:  # 如果文件不是PDF,跳過(guò)
            continue

        ID = fileNamePDF[:-4]  # 從文件名中獲取ID(去掉.pdf后綴)
        if os.path.isfile('../TXT/' + ID + '.txt'):  # 如果已經(jīng)存在對(duì)應(yīng)的文本文件,跳過(guò)
            continue

        pdf_list.append((i, ID, newDir, fileNamePDF))  # 將參數(shù)元組添加到pdf_list中

    process_pdfs(pdf_list)  # 調(diào)用process_pdfs函數(shù),傳遞pdf_list以并行處理PDF文件


責(zé)任編輯:華軒 來(lái)源: PaperCodeTips
相關(guān)推薦

2023-10-17 16:24:27

PythonCSV

2020-12-31 05:37:05

HiveUDFSQL

2023-11-28 15:18:24

Python

2023-07-05 07:36:36

SpringJava代碼

2024-09-25 08:00:00

Python文件處理

2016-12-14 09:32:49

FileChanne文件復(fù)制

2023-11-28 09:00:00

機(jī)器學(xué)習(xí)少樣本學(xué)習(xí)SetFit

2024-10-30 16:59:57

Python機(jī)器學(xué)習(xí)

2018-06-04 10:04:48

Python數(shù)據(jù)語(yǔ)言

2024-11-20 10:00:00

Python文件讀寫(xiě)

2021-08-30 07:57:26

OpenAttack文本對(duì)抗攻擊

2018-03-27 13:33:48

百度

2024-09-29 16:27:46

Python文件管理

2010-03-12 19:29:15

python svn腳

2009-12-04 16:49:33

PHP批量導(dǎo)出csv文

2010-03-05 09:40:08

Python遞歸

2022-08-17 12:35:26

Linux sed編輯器

2020-07-07 10:50:19

Python丄則表達(dá)文本

2024-04-28 11:39:17

紹csvkit數(shù)據(jù)分析

2016-11-16 15:05:42

情感分析
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)