在文本分析的過程中,將原始數據轉換為TXT文件非常關鍵,主要出于以下幾個方面的考慮:
? 文本分析通常需要對文本數據進行預處理,包括分詞、去停用詞、標準化等。TXT文件的簡單結構使得這些預處理任務更容易執行。
? 大多數文本分析和自然語言處理(NLP)工具都能夠直接處理TXT文件。將原始數據轉換為TXT文件可以確保與這些工具的兼容性,從而簡化分析流程。
? TXT文件通常比其他文件格式更小,這有助于節省存儲空間和提高處理速度。較小的文件大小也意味著需要較少的計算資源來處理文本數據,從而提高分析效率。
? 純文本格式使得使用正則表達式和其他文本挖掘技術來識別和提取文本中的模式變得更為容易和直接。
? TXT文件的簡單性使得更容易識別和處理缺失值、錯誤和其他數據質量問題,從而保證文本分析的準確性和可靠性。
將原始數據轉換為TXT文件是實現有效和準確文本分析的一個基本步驟,它幫助簡化和標準化文本分析流程,從而提高分析的效率和質量。以下代碼可以用來將pdf文件轉換為txt文件。
#!/usr/bin/env 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函數,并使用命令行參數列表作為參數
#!/usr/bin/env python3"""Script to convert PDFs to text files."""import unicodedata, os, pdf2txt, datetimeimport multiprocessingdef 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文件
本文鏈接:http://www.www897cc.com/showinfo-26-24322-0.html使用Python進行文本分析-將PDF文件多進程批量處理為csv文件
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: Golang 中的 Context 包
下一篇: 解決Docker網絡沖突的方法