摘要:復雜系統仿真的微博客虛假信息擴散模型研究面向影子分析的社交媒體競爭情報搜集面向人機協同的移動互聯網政務門戶探析經驗證。微博客的企業競爭情報搜集移動社交媒體用戶隱私保護對策研究注意這里的提示,原先的個文件沒有被再次抽取,只有個新文件被抽取。
本文為你展示,如何用Python把許多PDF文件的文本內容批量提取出來,并且整理存儲到數據框中,以便于后續的數據分析。
問題最近,讀者們在后臺的留言,愈發五花八門了。
寫了幾篇關于自然語言處理的文章后,一種呼聲漸強:
pdf中的文本內容,有沒有什么方便的方法提取出來呢?我能體會到讀者的心情。
我展示的例子中,文本數據都是直接可以讀入數據框工具做處理的。它們可能來自開放數據集合、網站API,或者爬蟲。
但是,有的時候,你會遇到需要處理指定格式數據的問題。
例如pdf。
許多的學術論文、研究報告,甚至是資料分享,都采用這種格式發布。
這時候,已經掌握了諸多自然語言分析工具的你,會頗有“拔劍四顧心茫然”的感覺——明明知道如何處理其中的文本信息,但就是隔著一個格式轉換的問題,做不來。
怎么辦?
辦法自然是有的,例如專用工具、在線轉換服務網站,甚至還可以手動復制粘貼嘛。
但是,咱們是看重效率的,對不對?
上述辦法,有的需要在網上傳輸大量內容,花費時間較多,而且可能帶來安全和隱私問題;有的需要專門花錢購買;有的干脆就不現實。
怎么辦?
好消息是,Python就可以幫助你高效、快速地批量提取pdf文本內容,而且和數據整理分析工具無縫銜接,為你后續的分析處理做好基礎服務工作。
數據為了更好地說明流程,我為你準備好了一個壓縮包。
里面包括本教程的代碼,以及我們要用到的數據。
請你到 這個網址 下載本教程配套的壓縮包。
下載后解壓,你會在生成的目錄(下稱“演示目錄”)里面看到以下內容。
演示目錄里面包含:
Pipfile: pipenv 配置文件,用來準備咱們變成需要用到的依賴包。后文會講解使用方法;
pdf_extractor.py: 利用pdfminer.six編寫的輔助函數。有了它你就可以直接調用pdfminer提供的pdf文本內容抽取功能,而不必考慮一大堆惱人的參數;
demo.ipynb: 已經為你寫好的本教程 Python 源代碼 (Jupyter Notebook格式)。
另外,演示目錄中還包括了2個文件夾。
這兩個文件夾里面,都是中文pdf文件,用來給你展示pdf內容抽取。
pdf文件夾內容如下:
newpdf文件夾內容如下:
代碼首先,我們讀入一些模塊,以進行文件操作。
import glob import os
前文提到過,演示目錄下,有兩個文件夾,分別是pdf和newpdf。
我們指定 pdf 文件所在路徑為其中的pdf文件夾。
pdf_path = "pdf/"
我們希望獲得所有 pdf 文件的路徑。用glob,一條命令就能完成這個功能。
pdfs = glob.glob("{}/*.pdf".format(pdf_path))
看看我們獲得的 pdf 文件路徑是否正確。
pdfs ["pdf/復雜系統仿真的微博客虛假信息擴散模型研究.pdf", "pdf/面向影子分析的社交媒體競爭情報搜集.pdf", "pdf/面向人機協同的移動互聯網政務門戶探析.pdf"]
經驗證。準確無誤。
下面我們利用 pdfminer 來從 pdf 文件中抽取內容。我們需要從輔助 Python 文件 pdf_extractor.py 中讀入函數 extract_pdf_content。
from pdf_extractor import extract_pdf_content
用這個函數,我們嘗試從 pdf 文件列表中的第一篇里,抽取內容,并且把文本保存在 content 變量里。
content = extract_pdf_content(pdfs[0])
我們看看 content 里都有什么:
content
顯然,內容抽取并不完美,頁眉頁腳等信息都混了進來。
不過,對于我們的許多文本分析用途來說,這無關緊要。
你會看到 content 的內容里面有許多的 n,這是什么呢?
我們用 print 函數,來顯示 content 的內容。
print(content)
可以清楚看到,那些 n 是換行符。
通過一個 pdf 文件的抽取測試,我們建立了信心。
下面,我們該建立辭典,批量抽取和存儲內容了。
mydict = {}
我們遍歷 pdfs 列表,把文件名稱(不包含目錄)作為鍵值。這樣,我們可以很容易看到,哪些pdf文件已經被抽取過了,哪些還沒有抽取。
為了讓這個過程更為清晰,我們讓Python輸出正在抽取的 pdf 文件名。
for pdf in pdfs: key = pdf.split("/")[-1] if not key in mydict: print("Extracting content from {} ...".format(pdf)) mydict[key] = extract_pdf_content(pdf)
抽取過程中,你會看到這些輸出信息:
Extracting content from pdf/復雜系統仿真的微博客虛假信息擴散模型研究.pdf ... Extracting content from pdf/面向影子分析的社交媒體競爭情報搜集.pdf ... Extracting content from pdf/面向人機協同的移動互聯網政務門戶探析.pdf ...
看看此時字典中的鍵值都有哪些:
mydict.keys() dict_keys(["復雜系統仿真的微博客虛假信息擴散模型研究.pdf", "面向影子分析的社交媒體競爭情報搜集.pdf", "面向人機協同的移動互聯網政務門戶探析.pdf"])
一切正常。
下面我們調用pandas,把字典變成數據框,以利于分析。
import pandas as pd
下面這條語句,就可以把字典轉換成數據框了。注意后面的reset_index()把原先字典鍵值生成的索引也轉換成了普通的列。
df = pd.DataFrame.from_dict(mydict, orient="index").reset_index()
然后我們重新命名列,以便于后續使用。
df.columns = ["path", "content"]
此時的數據框內容如下:
df
可以看到,我們的數據框擁有了pdf文件信息和全部文本內容。這樣你就可以使用關鍵詞抽取、情感分析、相似度計算等等諸多分析工具了。
篇幅所限,我們這里只用一個字符數量統計的例子來展示基本分析功能。
我們讓 Python 幫我們統計抽取內容的長度。
df["length"] = df.content.apply(lambda x: len(x))
此時的數據框內容發生以下變化:
df
多出的一列,就是 pdf 文本內容的字符數量。
為了在 Jupyter Notebook 里面正確展示繪圖結果,我們需要使用以下語句:
%matplotlib inline
下面,我們讓 Pandas 把字符長度一列的信息用柱狀圖標示出來。為了顯示的美觀,我們設置了圖片的長寬比例,并且把對應的pdf文件名稱以傾斜45度來展示。
如果對Python編程、網絡爬蟲、機器學習、數據挖掘、web開發、人工智能、面試經驗交流。感興趣可以519970686,群內會有不定期的發放免費的資料鏈接,這些資料都是從各個技術網站搜集、整理出來的,如果你有好的學習資料可以私聊發我,我會注明出處之后分享給大家。
import matplotlib.pyplot as plt plt.figure(figsize=(14, 6)) df.set_index("path").length.plot(kind="bar") plt.xticks(rotation=45)
可視化分析完成。
下面我們把剛才的分析流程整理成函數,以便于將來更方便地調用。
我們先整合pdf內容提取到字典的模塊:
def get_mydict_from_pdf_path(mydict, pdf_path): pdfs = glob.glob("{}/*.pdf".format(pdf_path)) for pdf in pdfs: key = pdf.split("/")[-1] if not key in mydict: print("Extracting content from {} ...".format(pdf)) mydict[key] = extract_pdf_content(pdf) return mydict
這里輸入是已有詞典和pdf文件夾路徑。輸出為新的詞典。
你可能會納悶為何還要輸入“已有詞典”。別著急,一會兒我用實際例子展示給你看。
下面這個函數非常直白——就是把詞典轉換成數據框。
def make_df_from_mydict(mydict): df = pd.DataFrame.from_dict(mydict, orient="index").reset_index() df.columns = ["path", "content"] return df
最后一個函數,用于繪制統計出來的字符數量。
def draw_df(df): df["length"] = df.content.apply(lambda x: len(x)) plt.figure(figsize=(14, 6)) df.set_index("path").length.plot(kind="bar") plt.xticks(rotation=45)
函數已經編好,下面我們來嘗試一下。
還記得演示目錄下有個子目錄,叫做newpdf對吧?
我們把其中的2個pdf文件,移動到pdf目錄下面。
這樣pdf目錄下面,就有了5個文件:
我們執行新整理出的3個函數。
首先輸入已有的詞典(注意此時里面已有3條記錄),pdf文件夾路徑沒變化。輸出是新的詞典。
mydict = get_mydict_from_pdf_path(mydict, pdf_path) Extracting content from pdf/微博客 Twitter 的企業競爭情報搜集.pdf ... Extracting content from pdf/移動社交媒體用戶隱私保護對策研究.pdf ...
注意這里的提示,原先的3個pdf文件沒有被再次抽取,只有2個新pdf文件被抽取。
咱們這里一共只有5個文件,所以你直觀上可能無法感受出顯著的區別。
但是,假設你原先已經用幾個小時,抽取了成百上千個pdf文件信息,結果你的老板又丟給你3個新的pdf文件……
如果你必須從頭抽取信息,恐怕會很崩潰吧。
這時候,使用咱們的函數,你可以在1分鐘之內把新的文件內容追加進去。
這差別,不小吧?
下面我們用新的詞典,構建數據框。
df = make_df_from_mydict(mydict)
我們繪制新的數據框里,pdf抽取文本字符數量。結果如下:
draw_df(df)小結
總結一下,本文為你介紹了以下知識點:
如何用glob批量讀取目錄下指定格式的文件路徑;
如何用pdfminer從pdf文件中抽取文本信息;
如何構建詞典,存儲與鍵值(本文中為文件名)對應的內容,并且避免重復處理數據;
如何將詞典數據結構輕松轉換為Pandas數據框,以便于后續數據分析。
如何用matplotlib和pandas自帶的繪圖函數輕松繪制柱狀統計圖形。
你之前做的數據分析工作中,遇到過需要從pdf文件抽取文本的任務嗎?你是如何處理的?有沒有更好的工具與方法?歡迎留言,把你的經驗和思考分享給大家,我們一起交流討論。
出處 https://blog.csdn.net/Stephen...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44913.html
摘要:在這之前,還是有必要對一些概念超輕量級反爬蟲方案后端掘金前言爬蟲和反爬蟲日益成為每家公司的標配系統。 爬蟲修煉之道——從網頁中提取結構化數據并保存(以爬取糗百文本板塊所有糗事為例) - 后端 - 掘金歡迎大家關注我的專題:爬蟲修煉之道 上篇 爬蟲修煉之道——編寫一個爬取多頁面的網絡爬蟲主要講解了如何使用python編寫一個可以下載多頁面的爬蟲,如何將相對URL轉為絕對URL,如何限速,...
摘要:任務批量抓取網頁文件有一個,里面有數千條指向下載鏈接的網頁地址,現在,需要批量抓取這些網頁地址中的文件。利用,具體邏輯是正常情況下,按次序下載文件,如果同一文件,下載失敗次數超過,則跳過,下載下一個文件,并記錄錯誤信息。 任務:批量抓取網頁pdf文件 有一個excel,里面有數千條指向pdf下載鏈接的網頁地址,現在,需要批量抓取這些網頁地址中的pdf文件。python環境: anaco...
摘要:任務批量抓取網頁文件有一個,里面有數千條指向下載鏈接的網頁地址,現在,需要批量抓取這些網頁地址中的文件。利用,具體邏輯是正常情況下,按次序下載文件,如果同一文件,下載失敗次數超過,則跳過,下載下一個文件,并記錄錯誤信息。 任務:批量抓取網頁pdf文件 有一個excel,里面有數千條指向pdf下載鏈接的網頁地址,現在,需要批量抓取這些網頁地址中的pdf文件。python環境: anaco...
摘要:至此登錄功能初步實現。為了方便我們快速定位到每節課的所有資源,可以把一節課的所有資源文件均命名為課名文件類型。可以看一下一個測試例子中的文件,部分內容如下到這里為止,我們已經成功完成爬取課程資源的目標,具體的代碼放在上。 原文地址 有時候我們需要把一些經典的東西收藏起來,時時回味,而Coursera上的一些課程無疑就是經典之作。Coursera中的大部分完結課程都提供了完整的配套教學資...
閱讀 2849·2021-11-22 11:56
閱讀 3553·2021-11-15 11:39
閱讀 898·2021-09-24 09:48
閱讀 758·2021-08-17 10:14
閱讀 1321·2019-08-30 15:55
閱讀 2753·2019-08-30 15:55
閱讀 1310·2019-08-30 15:44
閱讀 2774·2019-08-30 10:59