將PDF轉換成Markdown時,發現Pymupdf4llm在轉換成表格時所產生的座標是錯誤的,gptpdf在擷取表格時,座標會是對的,另外在擷取圖片的部分gptpdf也比Pymupdf4llm的表現來的優異,因此在思考是否能夠將兩套件做整合,結合Pymupdf4llm能夠轉成Markdown的格式,以及gptpdf優異的擷取圖片表現,提升後續轉換成向量的品質,進而提升搜索的效率。
- 使用GPTPDF得到表格與圖片的PNG檔案,會回傳每頁的圖片座標以及圖片存放位址(image list)
- 使用PymuPDF得到一個Page chunk = True的文本以及Page chunk = False的純文本(因為若為False的話則不會顯示表格座標,若為True則會顯示,但因為希望文字不要被分頁切斷,因此純文字處理時會用Page chunk = False的文本(設一個為True content一個為False content。
- 先處理圖片資料此時會有三種狀況(以Pymupdf判斷表格數為主) (1) 該頁只有圖片 則將該頁的image list丟進LLM做Summary。 (2) 該頁只有表格 則使用正則表達式取出True content的markdown表格,並提供Image list中的圖片,一起丟進去LLM請他生成HTML的表格程式碼,最後在將False content中的表格部分的文字去除,如此一來純文字中就不會有表格的文字,避免後續Chunk時不小心把表格切錯。 (3) 該頁兩者皆有 透過座標位置來判斷該圖片是否為表格,由於Pymupdf與GPTPDF的座標邏輯皆為(x1,y1,x2,y2),且Pymupdf會分別給我們表格座標以及圖片座標,但如先前所述(x2,y2)並不準確,因此主要透過(x1,y1)的位置來判斷這張圖片是否為表格,且表格與圖片不容易重疊的特性,拿Pymupdf中的表格座標去尋找與其(x1,y1)最相近的(差值最小)且面積最相近的(差值最小),以(x1,y1)座標的差值為優先,若超過某個域值才會再找面積最相近,若還是超過某個域值則放棄,將該表格當作圖片處理,該張圖片即為GPTPDF所擷取的表格圖片,接著就分別針對表格與圖片處理(1)及(2)。 Image為GPTPDF所得到的圖片座標(有可能是圖片或是表格),Table為Pymupdf所得到的表格座標,並拿出(x1,y1)的座標來比較,可以看到Image_1與Table_A的差值最小,因此判定Image_1和Table_A是同一張表格。
- 33頁的東京都維基百科耗時8分鐘,PDF Parser的部分2分鐘,其餘的為LLM推理時間
role_prompt = """你是一個圖片摘要生成的機器人"""
local_prompt = """你是一個圖片摘要生成的機器人"""
table_role_prompt= """
你現在是一位專注於製作HTML表格的工程師,你的任務是要畫出一個可以顯示的表格。
"""
table_local_prompt = """
你現在是一個製作HTML表格的工程師,你的任務是將圖片中表格的架構以及markdown的表格中的內容作結合,你必須要做到:
1.請專注在圖片表格的結構,完整的表現出原本的架構。
2.請使用Markdown中的文字來填入表格中。
3.請注意合併儲存格,讓結構完整。
"""
2024-07-17 16:36:22,271 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
這是一張東京都的氣候圖表,顯示了每月的平均最高和最低溫度以及降雨量。圖表分為兩部分,分別以攝氏(°C)和華氏(°F)表示溫度,降雨量則分別以毫米(mm)和英寸(in)表示。
-
溫度:
- 1月:最高10°C,最低1°C
- 2月:最高10°C,最低2°C
- 3月:最高14°C,最低4°C
- 4月:最高19°C,最低9°C
- 5月:最高23°C,最低14°C
- 6月:最高26°C,最低18°C
- 7月:最高29°C,最低22°C
- 8月:最高31°C,最低23°C
- 9月:最高27°C,最低20°C
- 10月:最高22°C,最低14°C
- 11月:最高16°C,最低8°C
- 12月:最高12°C,最低4°C
-
降雨量:
- 1月:52 mm
- 2月:56 mm
- 3月:118 mm
- 4月:125 mm
- 5月:138 mm
- 6月:168 mm
- 7月:154 mm
- 8月:168 mm
- 9月:210 mm
- 10月:198 mm
- 11月:93 mm
- 12月:51 mm
-
溫度:
- 1月:最高49°F,最低34°F
- 2月:最高51°F,最低35°F
- 3月:最高56°F,最低40°F
- 4月:最高66°F,最低49°F
- 5月:最高73°F,最低57°F
- 6月:最高78°F,最低64°F
- 7月:最高85°F,最低71°F
- 8月:最高87°F,最低73°F
- 9月:最高80°F,最低67°F
- 10月:最高71°F,最低58°F
- 11月:最高61°F,最低47°F
- 12月:最高53°F,最低38°F
-
降雨量:
- 1月:2.1 in
- 2月:2.2 in
- 3月:4.6 in
- 4月:4.9 in
- 5月:5.4 in
- 6月:6.6 in
- 7月:6 in
- 8月:6.6 in
- 9月:8.3 in
- 10月:7.8 in
- 11月:3.6 in
- 12月:2 in
資料來源:[28]
2024-07-17 16:36:34,824 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" 以下是根據圖片中的表格架構以及提供的Markdown文字內容所製作的HTML表格:
月份 | 東京 | 全年 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1月 | 2月 | 3月 | 4月 | 5月 | 6月 | 7月 | 8月 | 9月 | 10月 | 11月 | 12月 | ||
历史最高温 °C(°F) | 22.6 (72.7) | 24.9 (76.8) | 28.1 (82.6) | 29.2 (84.6) | 32.6 (90.7) | 36.4 (97.5) | 39.5 (103.1) | 39.1 (102.4) | 38.1 (100.6) | 32.6 (90.7) | 27.3 (81.1) | 24.8 (76.6) | 39.5 (103.1) |
平均高温 °C (°F) | 9.8 (49.6) | 10.9 (51.6) | 14.2 (57.6) | 19.4 (66.9) | 23.6 (74.5) | 26.1 (79.0) | 29.9 (85.8) | 31.3 (88.3) | 27.5 (81.5) | 22.0 (71.6) | 16.7 (62.1) | 12.0 (53.6) | 20.3 (68.5) |
日均气温 °C (°F) | 5.4 (41.7) | 6.1 (43.0) | 9.4 (48.9) | 14.3 (57.7) | 18.8 (65.8) | 21.9 (71.4) | 25.7 (78.3) | 26.9 (80.4) | 23.3 (73.9) | 18.0 (64.4) | 12.5 (54.5) | 7.7 (45.9) | 15.8 (60.4) |
平均低温 °C (°F) | 1.2 (34.2) | 2.1 (35.8) | 5.0 (41.0) | 9.8 (49.6) | 14.6 (58.3) | 18.5 (65.3) | 22.4 (72.3) | 23.5 (74.3) | 20.3 (68.5) | 14.8 (58.6) | 8.8 (47.8) | 3.8 (38.8) | 12.1 (53.8) |
历史最低温 °C(°F) | −9.2 (15.4) | −7.9 (17.8) | −5.6 (21.9) | −3.1 (26.4) | 2.2 (36.0) | 8.5 (47.3) | 13.0 (55.4) | 15.4 (59.7) | 10.5 (50.9) | −0.5 (31.1) | −3.1 (26.4) | −6.8 (19.8) | −9.2 (15.4) |
平均降水量 mm(英寸) | 59.7 (2.35) | 56.5 (2.22) | 116.0 (4.57) | 133.7 (5.26) | 139.7 (5.50) | 167.8 (6.61) | 156.2 (6.15) | 154.7 (6.09) | 224.9 (8.85) | 234.8 (9.24) | 96.3 (3.79) | 57.9 (2.28) | 1,598.2 (62.91) |
平均降雪量 cm(英寸) | 4 (1.6) | 4 (1.6) | 0 (0) | 0 (0) | 0 (0) | 0 (0) | 0 (0) | 0 (0) | 0 (0) | 0 (0) | 0 (0) | 0 (0) | 8 (3.1) |
平均降水天数(≥ 0.5 mm) | 5.3 | 6.1 | 10.3 | 10.9 | 11.1 | 12.8 | 12.0 | 9.4 | 12.3 | 11.8 | 8.2 | 5.8 | 116 |
平均降雪天数(≥ 1 cm) | 0.7 | 0.8 | 0.2 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.1 | 1.8 |
平均相對濕度(%) | 51 | 52 | 57 | 62 | 68 | 75 | 76 | 74 | 75 | 71 | 64 | 56 | 65 |
月均日照時數 | 192.6 | 170.4 | 175.3 | 178.8 | 179.6 | 124.2 | 151.4 | 174.2 | 126.7 | 129.4 | 149.8 | 174.4 | 1,926.8 |
数据来源1:[28] | |||||||||||||
数据来源2:[37] |
2024-07-17 16:37:42,430 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" 這張圖表顯示了自1920年以來東京的人口變化趨勢。圖表中的數據點和標註顯示了幾個重要的里程碑:
- 1956年,東京人口超過800萬。
- 1963年,東京人口超過1000萬。
- 2001年,東京人口超過1200萬。
從圖表中可以看出,東京的人口在1920年為370萬,之後逐漸增長,並在1945年出現下降,隨後又迅速回升並持續增長。到2013年,東京的人口達到約1329萬。
2024-07-17 16:37:55,717 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" 以下是根據圖片中的表格結構和Markdown中的文字內容製作的HTML表格:
東京都區部 | 足立區、荒川區、板橋區、江戶川區、大田區、葛飾區、北區、江東區、品川區、澀谷區、新宿區、杉並區、墨田區、世田谷區、台東區、中央區、千代田區、豐島 區、中野區、練馬區、文京區、港區、目黑區 | |
多摩地域 | 市 | 昭島市、秋留野市、稻城市、青梅市、清瀨市、國立市、小金井市、國分寺市、小平市、狛江市、立川市、多摩市、調布市、西東京市、八王子市、羽村市、東久留米市、東村山 市、東大和市、日野市、府中市、福生市、町田市、三鷹市、武藏野市、武藏村山市 |
西多摩郡 | 奥多摩町、日之出町、瑞穗町、檜原村 | |
東京都島嶼部 | 大島支廳 | 大島町、利島村、新島村、神津島村 |
三宅支廳 | 三宅村、御藏島村 | |
八丈支廳 | 八丈町、青島村 | |
小笠原支廳 | 小笠原村 |
2024-07-17 16:39:47,572 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK" 以下是根據圖片中的表格架構以及提供的Markdown文字內容所製作的HTML表格:
城市 | 國家 | 締結日期 |
---|---|---|
紐約 | 美国 | 1960年 2月29日 |
北京 | 中华人民共和国 | 1979年 3月14日 |
巴黎 | 法國 | 1982年 7月14日 |
新南威爾士州 | 澳大利亞 | 1984年 5月 9日 |
首爾 | 韩国 | 1988年 9月 3日 |
雅加達 | 印度尼西亞 | 1989年10月23日 |
聖保羅州 | 巴西 | 1990年 6月13日 |
開羅省 | 埃及 | 1990年10月23日 |
莫斯科 | 俄羅斯 | 1991年 7月16日 |
柏林 | 德国 | 1994年 5月14日 |
羅馬 | 義大利 | 1996年 7月 5日 |
大倫敦 | 英国 | 2015年10月14日 |
這段HTML代碼將會生成一個表格,表格的結構和圖片中的表格一致,並且填入了提供的Markdown文字內容。
https://github.com/pymupdf/PyMuPDF
https://github.com/CosmosShadow/gptpdf