在建構 RAG (Retrieval-Augmented Generation) 系統前,最關鍵的步驟之一就是 從文件中擷取文字。這個過程通常稱為 文件截取 (document parsing / text extraction),目的是把各種不同格式的文件(如 PDF、Word、Markdown)轉換成乾淨的純文字,方便後續切分(chunking)、向量化(embedding)、以及檢索。
那為什麼要先截取文字?
大多數原始資料並不是以純文字存在,而是封裝在複雜格式中:
因此,我們需要使用合適的工具,把這些檔案「還原」成乾淨且可處理的文字。
這邊介紹幾個套件
我們以 交通部的機車法規選擇題 的第二頁文件做演示效果
pypdf 是一個專門處理 PDF 的 Python 套件,支援文字擷取、合併、分割頁面等功能。
優點是輕量、安裝方便,缺點是對於複雜排版(例如兩欄式 PDF)可能擷取效果不佳。
範例程式碼:
from pypdf import PdfReader
reader = PdfReader("sample.pdf")
print( reader.pages[1].extract_text())
輸出結果
機車法規選擇題
題號 答案 題 目 分類
編號
001 3 為了趕時間,(1)可以超速行駛(2)不必遵守交通規則(3)仍要依
規定駕駛。
11
002 1 防衛駕駛就是(1)能儘力採取合理謹慎行為加以防止車禍發生
(2)優良駕駛技術(3)良好生活習慣。
11
003 2 行車速度愈快,則煞車距離愈長,速度若增加1倍,煞車距離
即會增為(1)2倍(2)4倍(3)8倍。
11
004 2 行車速度愈快,駕駛人的視野(1)不變(2)愈狹窄(3)愈寬廣。 11
005 3 夜間行駛,應使用燈光,如市區照明清楚時,(1)戴有色眼鏡
(2)使用遠光燈(3)使用近光燈
11
006 1 行駛在積水路段,應(1)低速行駛(2)快速通過(3)多使用煞車。 11
007 1 肇事後,(1)保持現場,報警處理(2)與我無關趕快駛離(3)據理
力爭,以脫責任。
11
008 2 對肇事責任鑑定有異議,(1)絕對服從(2)向覆議機關申請覆議
(3)向警察機關提出告訴。
11
009 1
變換車道時,為預防因自己的駕駛死角而發生危險,應(1)提
前顯示方向燈,觀看照後鏡並擺頭查看(2)緊盯前方注意路況
(3)與前方車輛保持安全距離。
11
010 1
下列何者最接近防衛駕駛觀念?(1)即使自己遵守交通規則,還
是必須小心防範他人違規對自己造成傷害(2)選購耐撞車種,
並加強安全配備(3)騎在路中間,大家都看得到。
11
011 1
行車安全距離的描述,下列何者錯誤?(1)因機車車身小,故行
駛其後所保持的安全距離與同車速的汽車相比,可以再縮短
一些(2)即使停車時也該保持安全距離(3)被超車後應該略為減
速重新取得安全距離。
11
012 2
關於「購買安全帽注意事項」,下列何者錯誤?(1)必須貼有標
準檢驗局之認證合格標籤(2)安全帽受過強力撞擊後,若外觀
沒有損壞則不必更換(3)應選擇顏色鮮明或有反光材料之安全
帽。
11
013 2
請問應如何選購機車安全帽較為適當?(1)用工程用安全帽,又
輕又透風(2)選擇貼有標準檢驗局之認證合格標籤,比較有保
障(3)選深色的,比較不容易髒。
11
014 3 關於內輪差的敘述,何者錯誤?(1)車輛在轉彎時,後輪向內偏
移(2)軸距越長的車輛內輪差越大(3)小客車沒有內輪差。
11
015 1 機車駕駛人行經路面積水路段時應如何操作較恰當?(1)低速行
駛(2)多使用煞車(3)快速通過。
11
016 2 下列何者不是機車駕駛人在交岔路口轉彎前必要做的動作?(1)
減速、禮讓(2)開亮頭燈(3)顯示方向燈。
11
第2頁/共36頁
PyMuPDF 功能更強大,除了純文字,也能處理字體、圖片、座標資訊。若文件需要 更精準的文字擷取 或保留版面結構,這是比 pypdf 更靈活的選擇。
範例程式碼:
import fitz
file = fitz.open("sample.pdf")
print(file[1].get_text())
機車法規選擇題
題號
答案
題 目
分類
編號
001
3
為了趕時間,(1)可以超速行駛(2)不必遵守交通規則(3)仍要依
規定駕駛。
11
002
1
防衛駕駛就是(1)能儘力採取合理謹慎行為加以防止車禍發生
(2)優良駕駛技術(3)良好生活習慣。
11
003
2
行車速度愈快,則煞車距離愈長,速度若增加1倍,煞車距離
即會增為(1)2倍(2)4倍(3)8倍。
11
004
2
行車速度愈快,駕駛人的視野(1)不變(2)愈狹窄(3)愈寬廣。
11
005
3
夜間行駛,應使用燈光,如市區照明清楚時,(1)戴有色眼鏡
(2)使用遠光燈(3)使用近光燈
11
006
1
行駛在積水路段,應(1)低速行駛(2)快速通過(3)多使用煞車。
11
007
1
肇事後,(1)保持現場,報警處理(2)與我無關趕快駛離(3)據理
力爭,以脫責任。
11
008
2
對肇事責任鑑定有異議,(1)絕對服從(2)向覆議機關申請覆議
(3)向警察機關提出告訴。
11
009
1
變換車道時,為預防因自己的駕駛死角而發生危險,應(1)提
前顯示方向燈,觀看照後鏡並擺頭查看(2)緊盯前方注意路況
(3)與前方車輛保持安全距離。
11
010
1
下列何者最接近防衛駕駛觀念?(1)即使自己遵守交通規則,還
是必須小心防範他人違規對自己造成傷害(2)選購耐撞車種,
並加強安全配備(3)騎在路中間,大家都看得到。
11
011
1
行車安全距離的描述,下列何者錯誤?(1)因機車車身小,故行
駛其後所保持的安全距離與同車速的汽車相比,可以再縮短
一些(2)即使停車時也該保持安全距離(3)被超車後應該略為減
速重新取得安全距離。
11
012
2
關於「購買安全帽注意事項」,下列何者錯誤?(1)必須貼有標
準檢驗局之認證合格標籤(2)安全帽受過強力撞擊後,若外觀
沒有損壞則不必更換(3)應選擇顏色鮮明或有反光材料之安全
帽。
11
013
2
請問應如何選購機車安全帽較為適當?(1)用工程用安全帽,又
輕又透風(2)選擇貼有標準檢驗局之認證合格標籤,比較有保
障(3)選深色的,比較不容易髒。
11
014
3
關於內輪差的敘述,何者錯誤?(1)車輛在轉彎時,後輪向內偏
移(2)軸距越長的車輛內輪差越大(3)小客車沒有內輪差。
11
015
1
機車駕駛人行經路面積水路段時應如何操作較恰當?(1)低速行
駛(2)多使用煞車(3)快速通過。
11
016
2
下列何者不是機車駕駛人在交岔路口轉彎前必要做的動作?(1)
減速、禮讓(2)開亮頭燈(3)顯示方向燈。
11
第2頁/共36頁
Marker-PDF 能快速將文件轉換成 Markdown、JSON、HTML,並具備以下特點:
可輸出 結構化 JSON,支援自訂 Schema。
提供 LLM 輔助模式 (--use_llm),能進一步優化表格格式、數學式與跨頁內容的合併。
這些特性讓 Marker 特別適合用於 RAG 前處理,因為它不僅能輸出乾淨文字,還能保留結構資訊(例如標題、列表、表格),對之後的切分檢索更友好。
import re
from marker.models import create_model_dict
from marker.output import text_from_rendered
from marker.config.parser import ConfigParser
from marker.converters.pdf import PdfConverter
converter = PdfConverter(
config=ConfigParser({
"paginate_output": True
}).generate_config_dict(),
artifact_dict=create_model_dict()
)
rendered = converter("sample.pdf")
text, _, images = text_from_rendered(rendered)
text = re.split(r"\{\d+\}-+", text)
text.pop(0) # pop(0) 是因為 ["", "<page_1>", "<page_2>",...]
print(text[1])
| 題號 | 答案 | 題<br>目 | 分類<br>編號 |
|-----|----|-------------------------------------------------------------------------------------------------------------|----------|
| 001 | 3 | 為了趕時間,(1)可以超速行駛(2)不必遵守交通規則(3)仍要依<br>規定駕駛。 | 11 |
| 002 | 1 | 防衛駕駛就是(1)能儘力採取合理謹慎行為加以防止車禍發生<br>(2)優良駕駛技術(3)良好生活習慣。 | 11 |
| 003 | 2 | 行車速度愈快,則煞車距離愈長,速度若增加1倍,煞車距離<br>即會增為(1)2倍(2)4倍(3)8倍。 | 11 |
| 004 | 2 | 行車速度愈快,駕駛人的視野(1)不變(2)愈狹窄(3)愈寬廣。 | 11 |
| 005 | 3 | 夜間行駛,應使用燈光,如市區照明清楚時,(1)戴有色眼鏡<br>(2)使用遠光燈(3)使用近光燈 | 11 |
| 006 | 1 | 行駛在積水路段,應(1)低速行駛(2)快速通過(3)多使用煞車。 | 11 |
| 007 | 1 | 肇事後,(1)保持現場,報警處理(2)與我無關趕快駛離(3)據理<br>力爭,以脫責任。 | 11 |
| 008 | 2 | 對肇事責任鑑定有異議,(1)絕對服從(2)向覆議機關申請覆議<br>(3)向警察機關提出告訴。 | 11 |
| 009 | 1 | 變換車道時,為預防因自己的駕駛死角而發生危險,應(1)提<br>前顯示方向燈,觀看照後鏡並擺頭查看(2)緊盯前方注意路況<br>(3)與前方車輛保持安全距離。 | 11 |
| 010 | 1 | 下列何者最接近防衛駕駛觀念?(1)即使自己遵守交通規則,還<br>是必須小心防範他人違規對自己造成傷害(2)選購耐撞車種,<br>並加強安全配備(3)騎在路中間,大家都看得到。 | 11 |
| 011 | 1 | 行車安全距離的描述,下列何者錯誤?(1)因機車車身小,故行<br>駛其後所保持的安全距離與同車速的汽車相比,可以再縮短<br>一些(2)即使停車時也該保持安全距離(3)被超車後應該略為減<br>速重新取得安全距離。 | 11 |
| 012 | 2 | 關於「購買安全帽注意事項」,下列何者錯誤?(1)必須貼有標<br>準檢驗局之認證合格標籤(2)安全帽受過強力撞擊後,若外觀<br>沒有損壞則不必更換(3)應選擇顏色鮮明或有反光材料之安全<br>帽。 | 11 |
| 013 | 2 | 請問應如何選購機車安全帽較為適當?(1)用工程用安全帽,又<br>輕又透風(2)選擇貼有標準檢驗局之認證合格標籤,比較有保<br>障(3)選深色的,比較不容易髒。 | 11 |
| 014 | 3 | 關於內輪差的敘述,何者錯誤?(1)車輛在轉彎時,後輪向內偏<br>移(2)軸距越長的車輛內輪差越大(3)小客車沒有內輪差。 | 11 |
| 015 | 1 | 機車駕駛人行經路面積水路段時應如何操作較恰當?(1)低速行<br>駛(2)多使用煞車(3)快速通過。 | 11 |
| 016 | 2 | 下列何者不是機車駕駛人在交岔路口轉彎前必要做的動作?(1)<br>減速、禮讓(2)開亮頭燈(3)顯示方向燈。 | 11 |
#### 第2頁/共36頁