Python實(shí)現(xiàn)準(zhǔn)確獲取PDF文件中的標(biāo)題
想要在PDF文件中,解析獲取全部的標(biāo)題,是一件比較麻煩的事情。正是因?yàn)镻DF文件中的內(nèi)容可能是五花八門的格式(論文、財(cái)報(bào)、法律條文、圖書、報(bào)紙、等等)。
但是獲取標(biāo)題信息,又是一件非常重要的事情。標(biāo)題中往往蘊(yùn)含著非常多的概括性信息。本文將介紹一種較為準(zhǔn)確的提取標(biāo)題的方式。使用python組件+LLM。本文會(huì)給出調(diào)試后的可運(yùn)行代碼,以及prompt,還有運(yùn)行結(jié)果。
本文測(cè)試以一篇微軟的論文為例。論文地址:https://arxiv.org/pdf/2303.07678.pdf
一、技術(shù)選型
python組件使用 PyMuPDF,模型使用通義千問。
二、安裝使用 pdf解析工具 PyMuPDF
2.1 PyMuPDF安裝方式
pip install PyMuPDF
2.2 調(diào)試后的代碼
import fitz
def extract_titles_from_pdf(pdf_path, thres=1.1):
doc = fitz.open(pdf_path)
titles = []
for page_num in range(len(doc)):
page = doc.load_page(page_num)
blocks = page.get_text("dict")["blocks"]
# 獲取當(dāng)前頁(yè)的頁(yè)碼
page_number = page_num + 1
# 尋找每一頁(yè)可能的標(biāo)題
page_titles = []
for block in blocks:
# 獲取文本塊的字體大小
sizes = [span["size"] for line in block["lines"] for span in line["spans"]]
avg_size = sum(sizes) / max(len(sizes), 1)
# 判斷是否可能是標(biāo)題
if avg_size > thres:
text = " ".join([span["text"] for line in block["lines"] for span in line["spans"]])
# 排除正文、表格、圖片和公式,只保留可能的標(biāo)題
if not is_body_text(text) and not is_table(text) and not is_image(text) and not is_formula(text):
# 將標(biāo)題、頁(yè)碼添加到結(jié)果中
page_titles.append((text.strip(), page_number))
# 將該頁(yè)的標(biāo)題添加到結(jié)果列表中
titles += page_titles
return titles
def is_body_text(text):
# 根據(jù)文本的長(zhǎng)度和內(nèi)容等特征,判斷是否為正文
# 這里可以根據(jù)具體的PDF文件的特點(diǎn)來定義規(guī)則
# 以下只是一個(gè)示例,可能需要根據(jù)實(shí)際情況進(jìn)行調(diào)整
return len(text) > 100 or text.endswith(".") or text.endswith("?") or text.endswith("!")
def is_table(text):
# 根據(jù)文本的結(jié)構(gòu)和內(nèi)容特征,判斷是否為表格
# 這里可以根據(jù)表格的特點(diǎn)來定義規(guī)則
# 以下只是一個(gè)示例,可能需要根據(jù)實(shí)際情況進(jìn)行調(diào)整
return " " in text or "\t" in text or " | " in text
def is_image(text):
# 根據(jù)文本的特征,判斷是否為圖像
# 這里可以根據(jù)圖像的特點(diǎn)來定義規(guī)則
# 以下只是一個(gè)示例,可能需要根據(jù)實(shí)際情況進(jìn)行調(diào)整
return text.startswith("Image:") or text.startswith("Figure:")
def is_formula(text):
# 根據(jù)文本的特征,判斷是否為公式
# 這里可以根據(jù)公式的特點(diǎn)來定義規(guī)則
# 以下只是一個(gè)示例,可能需要根據(jù)實(shí)際情況進(jìn)行調(diào)整
return text.startswith("Formula:") or text.startswith("Equation:")
# 指定要解析的 PDF 文件路徑
pdf_path = "D:\\angus\\工作文檔\\paper\\Rewrite\\微軟query擴(kuò)寫 Query2doc Query Expansion with Large Language Models-2303.07678.pdf"
# 調(diào)用函數(shù)提取標(biāo)題內(nèi)容
titles_with_page_numbers = extract_titles_from_pdf(pdf_path)
# 打印提取到的標(biāo)題內(nèi)容和對(duì)應(yīng)的頁(yè)碼
for i, (title, page_number) in enumerate(titles_with_page_numbers):
print(f"Title {i + 1}: {title} (Page {page_number})")2.3 輸出的效果
此時(shí),輸出比較亂,還不能找到標(biāo)題,但是標(biāo)題已經(jīng)藏在了下邊的內(nèi)容中。接下來就是如何挖掘到真正的標(biāo)題。
Title 1: Query2doc: Query Expansion with Large Language Models (Page 1)
Title 2: Abstract (Page 1)
Title 3: 1 Introduction (Page 1)
Title 4: 2 Method (Page 2)
Title 5: Write a passage that answers the given query: (Page 2)
Title 6: LLM Prompts (Page 2)
Title 7: LLM Output (Page 2)
Title 8: Method Fine-tuning MS MARCO dev TREC DL 19 TREC DL 20 (Page 3)
Title 9: MRR@10 R@50 R@1k nDCG@10 nDCG@10 (Page 3)
Title 10: Sparse retrieval BM25 ? 18.4 58.5 85.7 51.2 ∗ 47.7 ∗ (Page 3)
Title 11: + query2doc ? 21.4 +3.0 65.3 +6.8 91.8 +6.1 66.2 +15.0 62.9 +15.2 (Page 3)
Title 12: BM25 + RM3 ? 15.8 56.7 86.4 52.2 47.4 docT5query ( Nogueira and Lin ) ? 27.7 75.6 94.7 64.2 - (Page 3)
Title 13: 3 Experiments (Page 3)
Title 14: 3.1 Setup (Page 3)
Title 15: 3.2 Main Results (Page 3)
Title 16: 4 Analysis (Page 3)
Title 17: DBpedia NFCorpus Scifact Trec-Covid Touche2020 (Page 4)
Title 18: BM25 31.3 32.5 66.5 65.6 36.7 + query2doc 37.0 +5.7 34.9 +2.4 68.6 +2.1 72.2 +6.6 39.8 +3.1 (Page 4)
Title 19: # params TREC 19 TREC 20 (Page 4)
Title 20: 1 10 30 50 100 (Page 4)
Title 21: % labeled data for fine-tuning (Page 4)
Title 22: 20 (Page 4)
Title 23: 22 (Page 4)
Title 24: 24 (Page 4)
Title 25: 26 (Page 4)
Title 26: 28 (Page 4)
Title 27: 30 (Page 4)
Title 28: 32 (Page 4)
Title 29: 34 (Page 4)
Title 30: 36 (Page 4)
Title 31: MRR on dev set (Page 4)
Title 32: 21.4 (Page 4)
Title 33: 27.3 (Page 4)
Title 34: 31.4 (Page 4)
Title 35: 32.8 (Page 4)
Title 36: 33.7 (Page 4)
Title 37: 22.7 (Page 4)
Title 38: 28.5 (Page 4)
Title 39: 32.1 (Page 4)
Title 40: 34.1 (Page 4)
Title 41: 35.1 (Page 4)
Title 42: DPR w/o query2doc DPR w/ query2doc (Page 4)
Title 43: TREC 19 TREC 20 (Page 4)
Title 44: BM25 + query2doc 66.2 62.9 w/ query only 51.2 47.7 w/ pseudo-doc only 48.7 44.5 (Page 4)
Title 45: 1 Refer to https://en.wikipedia.org/wiki/It’s_a_ Jungle_Out_There_(song) (Page 4)
Title 46: query who killed nicholas ii of russia (Page 5)
Title 47: query who sings monk theme song (Page 5)
Title 48: 5 Related Work (Page 5)
Title 49: 6 Conclusion (Page 5)
Title 50: Limitations (Page 6)
Title 51: LLM call Index search (Page 6)
Title 52: BM25 - 16ms + query2doc >2000ms 177ms (Page 6)
Title 53: References (Page 6)
Title 54: Vladimir Karpukhin, Barlas Oguz, Sewon Min, Patrick Lewis, Ledell Wu, Sergey Edunov, Danqi Chen, and (Page 6)
Title 55: A Implementation Details (Page 8)
Title 56: DPR w/ distillation (Page 8)
Title 57: For dense retrieval experiments in Table (Page 8)
Title 58: B Exploring Other Prompting Strategies (Page 8)
Title 59: DL 2019 DL 2020 (Page 8)
Title 60: Query2doc 69.2 64.5 + iterative prompt 68.6 64.8 (Page 8)
Title 61: Query: {{query}} (Page 8)
Title 62: # Begin of passage {{passage}} # End of passage (Page 8)
Title 63: query who sings hey good looking (Page 9)
Title 64: query trumbull marriott fax number (Page 9)
Title 65: query what is hra and hsa (Page 9)
Title 66: DL 2019 DL 2020 (Page 9)
Title 67: Average 64.8 60.9 Std dev. ± 1.14 ± 1.63 (Page 9)
Title 68: C Results Across Multiple Runs (Page 9)
Title 69: prompts (Page 10)
Title 70: Write a passage that answers the given query: (Page 10)
三、使用LLM提取標(biāo)題
期初,我還想通過規(guī)則來挖掘到真正的標(biāo)題。實(shí)際上由于文件五花八門,我們很難通過一個(gè)標(biāo)準(zhǔn)的規(guī)則去適應(yīng)各種各樣的文件。花了一上午的時(shí)間,連一篇論文的標(biāo)題都沒能準(zhǔn)確的提取出來。更何況去適配千奇百怪的文件呢?最后效果不一定好,而且會(huì)把自己累死。
于是想到了LLM,嘗試用LLM來提煉上個(gè)步驟中的輸出。
這里使用的是阿里的通義千問。
3.1 prompt
以下是一個(gè)文件的內(nèi)容,請(qǐng)幫我分析提取真正的標(biāo)題。
要求:只需要根據(jù)內(nèi)容,判斷是否可以是標(biāo)題。不要額外生成任何內(nèi)容?。?br />內(nèi)容如下 :
{Title 1: Query2doc: Query Expansion with Large Language Models (Page 1)
Title 2: Abstract (Page 1)
Title 3: 1 Introduction (Page 1)
Title 4: 2 Method (Page 2)
Title 5: Write a passage that answers the given query: (Page 2)
Title 6: LLM Prompts (Page 2)
Title 7: LLM Output (Page 2)
Title 8: Method Fine-tuning MS MARCO dev TREC DL 19 TREC DL 20 (Page 3)
Title 9: MRR@10 R@50 R@1k nDCG@10 nDCG@10 (Page 3)
Title 10: Sparse retrieval BM25 ? 18.4 58.5 85.7 51.2 ∗ 47.7 ∗ (Page 3)
Title 11: + query2doc ? 21.4 +3.0 65.3 +6.8 91.8 +6.1 66.2 +15.0 62.9 +15.2 (Page 3)
Title 12: BM25 + RM3 ? 15.8 56.7 86.4 52.2 47.4 docT5query ( Nogueira and Lin ) ? 27.7 75.6 94.7 64.2 - (Page 3)
Title 13: 3 Experiments (Page 3)
Title 14: 3.1 Setup (Page 3)
Title 15: 3.2 Main Results (Page 3)
Title 16: 4 Analysis (Page 3)
Title 17: DBpedia NFCorpus Scifact Trec-Covid Touche2020 (Page 4)
Title 18: BM25 31.3 32.5 66.5 65.6 36.7 + query2doc 37.0 +5.7 34.9 +2.4 68.6 +2.1 72.2 +6.6 39.8 +3.1 (Page 4)
Title 19: # params TREC 19 TREC 20 (Page 4)
Title 20: 1 10 30 50 100 (Page 4)
Title 21: % labeled data for fine-tuning (Page 4)
Title 22: 20 (Page 4)
Title 23: 22 (Page 4)
Title 24: 24 (Page 4)
Title 25: 26 (Page 4)
Title 26: 28 (Page 4)
Title 27: 30 (Page 4)
Title 28: 32 (Page 4)
Title 29: 34 (Page 4)
Title 30: 36 (Page 4)
Title 31: MRR on dev set (Page 4)
Title 32: 21.4 (Page 4)
Title 33: 27.3 (Page 4)
Title 34: 31.4 (Page 4)
Title 35: 32.8 (Page 4)
Title 36: 33.7 (Page 4)
Title 37: 22.7 (Page 4)
Title 38: 28.5 (Page 4)
Title 39: 32.1 (Page 4)
Title 40: 34.1 (Page 4)
Title 41: 35.1 (Page 4)
Title 42: DPR w/o query2doc DPR w/ query2doc (Page 4)
Title 43: TREC 19 TREC 20 (Page 4)
Title 44: BM25 + query2doc 66.2 62.9 w/ query only 51.2 47.7 w/ pseudo-doc only 48.7 44.5 (Page 4)
Title 45: 1 Refer to https://en.wikipedia.org/wiki/It’s_a_ Jungle_Out_There_(song) (Page 4)
Title 46: query who killed nicholas ii of russia (Page 5)
Title 47: query who sings monk theme song (Page 5)
Title 48: 5 Related Work (Page 5)
Title 49: 6 Conclusion (Page 5)
Title 50: Limitations (Page 6)
Title 51: LLM call Index search (Page 6)
Title 52: BM25 - 16ms + query2doc >2000ms 177ms (Page 6)
Title 53: References (Page 6)
Title 54: Vladimir Karpukhin, Barlas Oguz, Sewon Min, Patrick Lewis, Ledell Wu, Sergey Edunov, Danqi Chen, and (Page 6)
Title 55: A Implementation Details (Page 8)
Title 56: DPR w/ distillation (Page 8)
Title 57: For dense retrieval experiments in Table (Page 8)
Title 58: B Exploring Other Prompting Strategies (Page 8)
Title 59: DL 2019 DL 2020 (Page 8)
Title 60: Query2doc 69.2 64.5 + iterative prompt 68.6 64.8 (Page 8)
Title 61: Query: {{query}} (Page 8)
Title 62: # Begin of passage {{passage}} # End of passage (Page 8)
Title 63: query who sings hey good looking (Page 9)
Title 64: query trumbull marriott fax number (Page 9)
Title 65: query what is hra and hsa (Page 9)
Title 66: DL 2019 DL 2020 (Page 9)
Title 67: Average 64.8 60.9 Std dev. ± 1.14 ± 1.63 (Page 9)
Title 68: C Results Across Multiple Runs (Page 9)
Title 69: prompts (Page 10)
Title 70: Write a passage that answers the given query: (Page 10)}
3.2 LLM最后的輸出
基于內(nèi)容分析,真正的標(biāo)題可能包括但不限于以下幾項(xiàng):
Title 1: Query2doc: Query Expansion with Large Language Models (Page 1)
Title 2: Abstract (Page 1)
Title 3: 1 Introduction (Page 1)
Title 4: 2 Method (Page 2)
Title 13: 3 Experiments (Page 3)
Title 16: 4 Analysis (Page 3)
Title 48: 5 Related Work (Page 5)
Title 49: 6 Conclusion (Page 5)
Title 50: Limitations (Page 6)
Title 53: References (Page 6)
Title 55: A Implementation Details (Page 8)
Title 56: DPR w/ distillation (Page 8)
Title 58: B Exploring Other Prompting Strategies (Page 8)
Title 68: C Results Across Multiple Runs (Page 9)
以上這些標(biāo)題通常在學(xué)術(shù)論文或其他類型的技術(shù)文檔中作為各個(gè)主要部分的標(biāo)題使用,它們標(biāo)識(shí)了文檔結(jié)構(gòu)的不同章節(jié)和內(nèi)容主題。其他帶有編號(hào)的行更多的是文檔內(nèi)的副標(biāo)題、子章節(jié)、表格標(biāo)題或具體的數(shù)據(jù)說明,而非一級(jí)或二級(jí)標(biāo)題。
四、結(jié)論
在經(jīng)過LLM以后,最終標(biāo)題提取的準(zhǔn)確率已經(jīng)非常高了!除了提取出來標(biāo)題,我們還獲取到了頁(yè)碼。此時(shí)還可以去PDF頁(yè)面導(dǎo)航了。
不管是什么樣格式的文件,我們都可以先解析,大致獲取標(biāo)題,可能不準(zhǔn)確。然后再過一次模型,即可獲取到準(zhǔn)確的標(biāo)題。
五、思考
當(dāng)涉及到版面分析時(shí),可以使用文本塊的布局信息來判斷標(biāo)題。具體來說,可以根據(jù)文本塊的相對(duì)位置和字體大小等信息來識(shí)別可能的標(biāo)題。以下是一種可能的思路:
檢測(cè)文本塊的位置:首先,遍歷每一頁(yè)的文本塊,并獲取它們的位置信息。可以考慮使用文本塊的坐標(biāo)信息,例如左上角和右下角的坐標(biāo)。
檢測(cè)文本塊的字體大?。簩?duì)于每個(gè)文本塊,可以獲取其包含文本的字體大小。這將有助于識(shí)別較大的文本塊,通常標(biāo)題的字體大小較大。
根據(jù)位置和字體大小判斷標(biāo)題:結(jié)合文本塊的位置和字體大小信息,可以應(yīng)用一些啟發(fā)式規(guī)則來判斷哪些文本塊可能是標(biāo)題。例如,可以考慮位于頁(yè)面頂部且字體較大的文本塊,或者是與上一文本塊的垂直距離較遠(yuǎn)的文本塊。
合并相鄰文本塊:有時(shí)候,標(biāo)題可能被分割成多個(gè)文本塊。在識(shí)別可能的標(biāo)題后,可以嘗試將相鄰的文本塊合并成一個(gè)標(biāo)題。
去除重復(fù)和錯(cuò)誤的標(biāo)題:在提取了所有可能的標(biāo)題后,可以進(jìn)行一些后處理步驟,例如去除重復(fù)的標(biāo)題或者根據(jù)一些特定規(guī)則去除錯(cuò)誤的標(biāo)題。
綜上所述,通過結(jié)合文本塊的位置和字體大小信息,可以設(shè)計(jì)一種版面分析的方法來提取 PDF 文件中的標(biāo)題。這種方法可能會(huì)更加準(zhǔn)確和可靠,因?yàn)樗嗟乩昧宋谋镜牟季中畔ⅰ?/p>
以上就是Python實(shí)現(xiàn)準(zhǔn)確獲取PDF文件中的標(biāo)題的詳細(xì)內(nèi)容,更多關(guān)于Python獲取PDF文件標(biāo)題的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用Python實(shí)現(xiàn)一個(gè)本地視頻流媒體服務(wù)器
你是否曾經(jīng)想過在本地網(wǎng)絡(luò)上輕松地將電腦上的視頻分享給手機(jī)或平板電腦觀看?也許你下載了一部電影,想在客廳的智能電視上播放,卻不想費(fèi)力地拷貝文件,今天,小編將給大家介紹如何使用Python構(gòu)建一個(gè)簡(jiǎn)單的本地視頻流媒體服務(wù)器,需要的朋友可以參考下2025-04-04
基于Python設(shè)計(jì)實(shí)現(xiàn)一個(gè)高級(jí)IP掃描工具
在網(wǎng)絡(luò)運(yùn)維和安全審計(jì)工作中,IP掃描是基礎(chǔ)但至關(guān)重要的任務(wù),本文介紹一款基于Python開發(fā)的跨平臺(tái)IP掃描工具,它結(jié)合了簡(jiǎn)潔的GUI界面和高效的掃描引擎,能夠快速檢測(cè)主機(jī)可達(dá)性2025-06-06
python如何實(shí)現(xiàn)讀取并顯示圖片(不需要圖形界面)
這篇文章主要介紹了python如何實(shí)現(xiàn)讀取并顯示圖片,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
Python 的 sum() Pythonic 的求和方法詳細(xì)
Python 的內(nèi)置函數(shù)sum()是一種對(duì)數(shù)值列表求和的有效且Pythonic 的方法。將多個(gè)數(shù)字相加是許多計(jì)算中常見的中間步驟,因此sum()對(duì)于 Python 程序員來說是一個(gè)非常方便的工具。下面文章就讓我們一起來看具體內(nèi)容吧2021-10-10
Python使用keyboard庫(kù)實(shí)現(xiàn)鍵盤監(jiān)聽與自動(dòng)化控制的實(shí)戰(zhàn)指南
在自動(dòng)化辦公、游戲輔助、測(cè)試腳本、系統(tǒng)控制等場(chǎng)景中,我們經(jīng)常需要讓程序感知或模擬鍵盤行為,keyboard讓我們能夠在任意系統(tǒng)上輕松地監(jiān)聽鍵盤事件、模擬鍵盤輸入,甚至實(shí)現(xiàn)復(fù)雜的組合鍵操作,本文將帶你全面掌握keyboard庫(kù),從基礎(chǔ)用法到底層原理,再到高級(jí)自動(dòng)化項(xiàng)目實(shí)戰(zhàn)2025-10-10

