PDF多表格結構識別與跨表語義對齊:基于對抗遷移的魯棒相似度度量模型

文章目錄

    • 一. 項目結構
    • 二.流程分析
      • 2.1 批處理器核心代碼解析
    • 三. 跨頁表格相似度匹配原理
      • 3.1 表頭內容相似度-特征向量歸一化
      • 3.2 表頭內容相似度-余弦相似度
      • 3.3 定時緩存清理


ocr掃描有其局限性。對于pdf文本類型這種pdfbox,aspose-pdf,spire直接提取文本的精準性更高。經過綜合對比我們覺得aspose和spire在讀取pdf文本方面較為優秀。基于此我們可能需要提取pdf中所有表格數據,完成數據錄入。但是表格數據不同,還存在跨頁表格問題。但是按照以下方案即可解決。本文的表格處理思想來源于mybatis的底層設計。

特征余弦相似度編輯距離
原理衡量向量方向的夾角(語義相似性)計算字符串轉換所需的最小操作次數(字符級差異)
輸入類型向量(如文本的TF-IDF或詞嵌入向量)字符串或序列
關注點語義層面的相似性(如主題、用詞)結構層面的差異(如拼寫錯誤、字符順序)
輸出范圍[-1, 1](通常取絕對值或歸一化為0-1)非負整數(0表示完全匹配)
計算復雜度O(n)(向量化后快速計算)O(n*m)(對長文本較慢)
典型應用文檔相似度、推薦系統、語義搜索拼寫糾錯、DNA序列比對、短文本模糊匹配

開源地址

一. 項目結構

本設計基于aspose-pdf實現

|-- SpringContextUtil.java
`-- pdf|-- AbstractTextMappingTemplate.java #抽象模板映射器 解析內容映射到結構化對象|-- PDFboxTable.java # 暫留擴展|-- PdfTableParsingEngine.java # 表格解析引擎 提供從PDF文檔中提取并處理表格數據的功能|-- StringEscapeUtil.java # 字符串轉義工具類 防止注入攻擊|-- TableBatchProcessor.java # 具體表格執行處理器 表格批處理器|-- annotation # 映射注解包|-- aspect # 注解處理器包|-- converter # 抽象模板映射器具體實現 包`-- entity # 想要映射的結構化對象包

二.流程分析

  1. 表格解析器提取pdf表格文本
  2. 表格批處理器負責具體執行表格解析
  3. 字符串轉義避免惡意攻擊
  4. 抽象映射器允許用戶具體實現映射實體

2.1 批處理器核心代碼解析

表格解析器每檢測一頁的所有表格,就提交到批處理器進行具體數據清洗,歸一化。以下是進行數據批處理的核心邏輯

    /*** 添加表格到批處理隊列** @param pageIndex 頁碼索引* @param tables    頁面中的表格列表*/public void addPageTables(int pageIndex, List<AbsorbedTable> tables) {// 資源限制檢查 一頁10個表格if (tables.size() > MAX_TABLES_PER_PAGE) {log.warn("頁面{}表格數量超過限制: {}", pageIndex, tables.size());// 截取前MAX_TABLES_PER_PAGE個表格tables = tables.subList(0, MAX_TABLES_PER_PAGE);}// 處理當前頁的表格List<StringBuilder> processedTables = new ArrayList<>();for (AbsorbedTable table : tables) {// 處理單個表格StringBuilder tableContent = processSingleTable(table);if (tableContent == null) continue;// 數據清洗PdfTableParsingEngine.cleanData(tableContent);// 生成表格指紋String tableFingerprint = generateTableFingerprint(tableContent);// 將表格指紋和內容存儲到跨頁表格緩存中crossPageTableCache.putIfAbsent(tableFingerprint, new CacheEntry(new StringBuilder(tableContent)));// 更新緩存條目的最后訪問時間crossPageTableCache.get(tableFingerprint).updateLastAccessTime();// 檢查是否為跨頁表格if (isCrossPageTable(tableFingerprint)) {// 合并跨頁表格tableContent = mergeCrossPageTable(tableContent, tableFingerprint);} else {// 異常檢測(連續重復表格)if (isDuplicateTable(tableFingerprint)) {log.warn("檢測到連續重復表格類型: {}", tableFingerprint);continue;}}// 添加到處理隊列processedTables.add(tableContent);}// 將處理后的表格添加到緩沖隊列if (!processedTables.isEmpty()) {try {// 嘗試添加到隊列,如果隊列已滿則提交當前隊列中的所有表格if (!tableBufferQueue.offer(processedTables, 100, TimeUnit.MILLISECONDS)) {log.info("緩沖隊列已滿,提交批處理任務");submitBatchTask();// 重新嘗試添加tableBufferQueue.put(processedTables);}} catch (InterruptedException e) {log.error("添加表格到緩沖隊列失敗: {}", e.getMessage());Thread.currentThread().interrupt();}}}

如上述代碼,

  • processSingleTable(AbsorbedTable table)用于具體解析表格內容并拼接成特定字符串。
  • cleanData(StringBuilder builder) 移除所有空白字符和換行符
  • generateTableFingerprint(StringBuilder tableContent) 用于識別跨頁表格相似度合并
  • crossPageTableCache 緩存跨頁表格,因為是以頁為單位檢測表格的。下一頁需要保留上一頁表格
  • mergeCrossPageTable(tableContent, tableFingerprint) 設定相似度大于85%且不為100%。為同一表格。進行合并。
  • submitBatchTask() 提交批處理任務
  • processBatchTables(List<List> batchTables) 獲取抽象映射器的具體實現。根據具體規則進行映射匹配

三. 跨頁表格相似度匹配原理

  • 1.根據特定表頭內容相似度
  • 2.根據表格樣式特征

3.1 表頭內容相似度-特征向量歸一化

字符串長度建議不要超過特征矩陣維度長度
使用余弦相似矩陣,比較兩個表頭字符串相似度.一般認為表頭字串很短,因此初始化16特征向量即可
表示我們可以把字符ascii映射到特征向量上,并通過單位向量歸一化結果。獲取第一塊內容字串的標準化特征向量。同理對第二塊內容字串做標準化計算。

    /*** 計算內容相似度(基于矢量相似度)** @param str1 字符串1* @param str2 字符串2* @return 內容相似度*/private double calculateContentSimilarity(String str1, String str2) {if (str1 == null || str2 == null) {throw new IllegalArgumentException("輸入字符串不能為空");}// 將字符串轉換為特征向量double[] vector1 = stringToVector(str1);double[] vector2 = stringToVector(str2);// 計算余弦相似度return cosineSimilarity(vector1, vector2);}/*** 將字符串轉換為特征向量** @param str 輸入字符串* @return 特征向量*/private double[] stringToVector(String str) {// 初始化特征向量double[] vector = new double[VECTOR_DIMENSION];// 創建字符頻率映射Map<Character, Integer> charFrequency = new HashMap<>();// 統計字符頻率for (char c : str.toCharArray()) {charFrequency.put(c, charFrequency.getOrDefault(c, 0) + 1);}// 將字符頻率映射到特征向量for (char c : charFrequency.keySet()) {int index = Math.abs(c) % VECTOR_DIMENSION;vector[index] += charFrequency.get(c);}// 歸一化向量normalizeVector(vector);return vector;}/*** 歸一化向量** @param vector 輸入向量*/private void normalizeVector(double[] vector) {double magnitude = 0.0;// 計算向量模長for (double value : vector) {magnitude += value * value;}magnitude = Math.sqrt(magnitude);// 歸一化向量if (magnitude > 0) {for (int i = 0; i < vector.length; i++) {vector[i] /= magnitude;}}}

3.2 表頭內容相似度-余弦相似度

  • 我們將原始特征向量進行標準化(歸一化)處理,使其轉化為單位向量(模長為1),從而消除向量尺度差異對相似性度量的影響。(注:此步驟確保所有向量處于同一量綱空間,使得后續計算具有可比性)
  • 對于兩個單位向量 u u u v v v,其點積在數值上等于它們的余弦相似度(即 c o s θ cosθ cosθ)。
    幾何意義:余弦相似度反映向量方向的接近程度,與向量維度無關。
    數學表達
    c o s θ = u ? v ∣ u ∣ ? ∣ v ∣ cosθ=\frac{u·v}{|u|·|v|} cosθ=u?vu?v?
    結果解釋
    cos ? θ ≈ 1 c o s θ ≈ 1 \cos\theta \approx 1cosθ≈1 cosθ1cosθ1:向量方向高度一致,對應字符串內容幾乎相同。
    cos ? θ ≈ 0 c o s θ ≈ 0 \cos\theta \approx 0cosθ≈0 cosθ0cosθ0:向量正交,字符串內容無相關性。
    應用示例:在文本匹配任務中,可通過該值量化兩段文本的語義相似性。

點積與哈達瑪積的區別:
點積輸出標量,用于衡量整體相似性;
哈達瑪積為元素級乘法,輸出同維向量,常用于局部特征交互。

    private double cosineSimilarity(double[] vector1, double[] vector2) {if (vector1.length != vector2.length) {throw new IllegalArgumentException("向量維度不匹配");}double dotProduct = 0.0;double magnitude1 = 0.0;double magnitude2 = 0.0;for (int i = 0; i < vector1.length; i++) {dotProduct += vector1[i] * vector2[i];magnitude1 += vector1[i] * vector1[i];magnitude2 += vector2[i] * vector2[i];}magnitude1 = Math.sqrt(magnitude1);magnitude2 = Math.sqrt(magnitude2);if (magnitude1 == 0.0 || magnitude2 == 0.0) {return 0.0;} else {return dotProduct / (magnitude1 * magnitude2);}}

3.3 定時緩存清理

由于我們為了保證跨頁表格的關聯關系。我們使用map集合保存上一頁表格內容。

    /*** 構造函數*/public TableBatchProcessor() {// 使用虛擬線程池處理批量映射任務this.executorService = Executors.newVirtualThreadPerTaskExecutor();// 初始化表格緩沖隊列this.tableBufferQueue = new LinkedBlockingQueue<>(BUFFER_CAPACITY);// 初始化表格類型計數器this.tableTypeCounter = new ConcurrentHashMap<>();// 初始化跨頁表格緩存this.crossPageTableCache = new ConcurrentHashMap<>();// 初始化緩存清理調度器this.cacheCleanupScheduler = Executors.newScheduledThreadPool(1);// 啟動定時清理任務this.cacheCleanupScheduler.scheduleAtFixedRate(this::cleanupCrossPageTableCache, 1, 1, TimeUnit.MINUTES);}

我設計了最早時間淘汰機制,同時為了進一步防止內存溢出。設計了map最大值。超出閾值清理所有。但顯然這是有問題的,可能導致跨表關聯關系斷開。因此先以拋出異常解決

    /*** 清理跨頁表格緩存(增強版)*/private void cleanupCrossPageTableCache() {long currentTime = System.currentTimeMillis();List<String> expiredKeys = new ArrayList<>();for (Map.Entry<String, CacheEntry> entry : crossPageTableCache.entrySet()) {if (currentTime - entry.getValue().lastAccessTime > CACHE_ENTRY_TTL) {expiredKeys.add(entry.getKey());}}// 限制緩存條目數量if (crossPageTableCache.size() > MAX_CACHE_ENTRIES) {crossPageTableCache.clear();throw new IllegalStateException("緩存條目數量超過限制");}for (String key : expiredKeys) {crossPageTableCache.remove(key);log.info("清理過期緩存條目: {}", key);}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899297.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899297.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899297.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

es 3期 第27節-運用Script腳本實現復雜需求

#### 1.Elasticsearch是數據庫&#xff0c;不是普通的Java應用程序&#xff0c;傳統數據庫需要的硬件資源同樣需要&#xff0c;提升性能最有效的就是升級硬件。 #### 2.Elasticsearch是文檔型數據庫&#xff0c;不是關系型數據庫&#xff0c;不具備嚴格的ACID事務特性&#xff…

23、web前端開發之html5(四)

十二. HTML5實踐示例 前面我們詳細講解了HTML5的特點&#xff0c;包括語義化標簽、增強的表單功能、多媒體元素&#xff08;如<video>和<audio>&#xff09;、Canvas繪圖、SVG集成以及離線存儲等。以下是一些詳細的HTML5實踐示例&#xff0c;展示如何使用HTML5的新…

海思燒錄工具HITool電視盒子刷機詳解

HiTool是華為開發的一款用于海思芯片設備的刷機和調試工具&#xff0c;可對搭載海思芯片的機頂盒、智能電視等設備進行固件燒錄、參數配置等操作。以下為你詳細介紹&#xff1a; 功能用途 固件燒錄&#xff1a;這是HiTool最主要的功能之一。它能夠將下載好的適配固件文件燒錄到…

軟考中級-軟件設計師 23種設計模式(內含詳細解析)

23種設計模式 &#x1f3af; 創建型設計模式&#x1f4cc; 抽象工廠&#xff08;Abstract Factory&#xff09; 設計模式&#x1f4cc; 工廠方法&#xff08;Factory Method&#xff09;設計模式&#x1f4cc; 單例&#xff08;Singleton&#xff09;設計模式&#x1f4cc; 生成…

thinkphp8.0\swoole的websocket應用

環境&#xff1a;centOS7.9、php8.3、thinkphp8.0\think-swoole4.1 我用的官方think-swoole插件 第一步&#xff1a;根據官方文檔&#xff0c;需要安裝此擴展插件 composer require topthink/think-swoole 第二步&#xff1a;在根目錄下config文件夾下編輯swoole.php配置文…

Ubuntu服務器掛載時遇到文件系統錯誤怎么辦

在Ubuntu服務器上掛載分區時&#xff0c;如果遇到文件系統錯誤&#xff0c;通常可能是由于磁盤損壞、文件系統損壞、不正確的卸載等原因造成的。以下是詳細的排查與修復步驟&#xff1a; 一、查看錯誤信息 首先&#xff0c;嘗試手動掛載并觀察具體錯誤&#xff1a; sudo mount …

【設計模式】策略模式(Strategy Pattern)詳解

策略模式&#xff08;Strategy Pattern&#xff09;詳解 一、策略模式的定義 策略模式&#xff08;Strategy Pattern&#xff09;是一種行為型設計模式&#xff0c;它定義了一組算法&#xff0c;將每個算法封裝起來&#xff0c;并使它們可以相互替換&#xff0c;從而讓算法的…

軟考筆記5——軟件工程基礎知識

第五章節——軟件工程基礎知識 軟件工程基礎知識 第五章節——軟件工程基礎知識一、軟件工程概述1. 計算機軟件2. 軟件工程基本原理3. 軟件生命周期4. 軟件過程 二、軟件過程模型1. 瀑布模型2. 增量模型3. 演化模型&#xff08;原型模型、螺旋模型)4. 噴泉模型5. 基于構建的開發…

Vim 實用指南

導航 簡介Vim 的來歷Vim 語言 Vim 的三種模式Normal&#xff08;普通模式&#xff09;Insert&#xff08;插入模式&#xff09;Visual&#xff08;可視模式&#xff09;三種模式轉換 普通模式實用技巧說明復制當前行并粘貼使用上一個命令撤銷上一個操作最常用的跳轉命令查找對應…

Git入門——常用指令匯總

以下是一份精心整理的 Git常用指令速查表&#xff0c;基本覆蓋日常開發使用場景&#xff0c;建議收藏備用&#x1f447; &#x1f527; 環境配置 指令作用git config --global user.name "你的名字"設置全局用戶名git config --global user.email "你的郵箱&qu…

常見中間件漏洞攻略-Jboss篇

一、CVE-2015-7501-Jboss JMXInvokerServlet 反序列化漏洞 第一步&#xff1a;開啟靶場 第二步&#xff1a;訪問該接口&#xff0c;發現直接下載&#xff0c;說明接?開放&#xff0c;此接?存在反序列化漏洞 http://47.103.81.25:8080/invoker/JMXInvokerServlet 第三步&…

播放本地視頻-實現視頻畫廊功能

實現一個視頻畫廊&#xff0c;播放本地視頻 可以切換不同視頻的功能 文章目錄 需求&#xff1a;場景實現方案遇到的坑播放器選擇界面顯示不全視頻友好顯示問題緩存 總結 需求&#xff1a; 實現一個視頻畫廊&#xff0c;播放本地視頻 可以切換不同視頻的功能 場景 圖片畫廊的…

從零構建大語言模型全棧開發指南:第二部分:模型架構設計與實現-2.2.2文本生成邏輯:Top-k采樣與溫度控制

?? 點擊關注不迷路 ?? 點擊關注不迷路 ?? 點擊關注不迷路 文章大綱 2.2.2 文本生成邏輯:Top-k采樣與溫度控制1. 文本生成的核心挑戰與數學框架1.1 自回歸生成的基本流程2. `Top-k`采樣原理與工程實現2.1 數學定義與算法流程2.2 PyTorch實現優化3. 溫度控制的數學本質與參…

為什么后端接口返回數字類型1.00前端會取到1?

這得從axios中得默認值說起&#xff1a; Axios 的 transformResponse axios 在接收到服務器的響應后&#xff0c;會通過一系列的轉換函數&#xff08;transformResponse&#xff09;來處理響應數據&#xff0c;使其適合在應用程序中使用。默認情況下&#xff0c;axios 的 tran…

【C++游戲引擎開發】《線性代數》(2):矩陣加減法與SIMD集成

一、矩陣加減法數學原理 1.1 定義 ?逐元素操作:運算僅針對相同位置的元素,不涉及矩陣乘法或行列變換。?交換律與結合律: 加法滿足交換律(A + B = B + A)和結合律( ( A + B ) + C = A + ( B + C ) )。 ?減法不滿足交換律(A ? B ≠ B ? A)。1.2 公式 ? C i j = …

openGauss關聯列數據類型不一致引起謂詞傳遞失敗

今天分享一個比較有意思的案例 注意&#xff1a;因為原始SQL很長&#xff0c;為了方便排版&#xff0c;簡化了SQL 下面SQL跑60秒才出結果&#xff0c;客戶請求優化 select dtcs.owner, dtcs.table_name, dtcs.column_name, dct.commentsfrom dba_tab_columns dtcsleft outer j…

01 相機標定與相機模型介紹

學完本文,您將了解不同相機模型分類、內參意義,及對應的應用代碼模型 標定的意義 建模三維世界點投影到二維圖像平面的過程。標定輸出的是相機模型。 相機模型 相機模型可以解理解為投影模型 +

Hyperlane:Rust Web開發的未來,釋放極致性能與簡潔之美

Hyperlane&#xff1a;Rust Web開發的未來&#xff0c;釋放極致性能與簡潔之美 你是否厭倦了復雜的Web框架&#xff0c;想要一個既高效又易用的工具來構建現代Web應用&#xff1f;Hyperlane正是你需要的答案&#xff01;作為專為Rust打造的輕量級、高性能HTTP服務器庫&#xf…

STM32學習筆記之振蕩器(原理篇)

&#x1f4e2;&#xff1a;如果你也對機器人、人工智能感興趣&#xff0c;看來我們志同道合? &#x1f4e2;&#xff1a;不妨瀏覽一下我的博客主頁【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸對你有幫助&#xff0c;可點贊 &#x1f44d;…

Stereolabs ZED Box Mini:機器人與自動化領域的人工智能視覺新選擇

在人工智能視覺技術快速發展的今天&#xff0c;其應用場景正在持續拓寬&#xff0c;從智能安防到工業自動化&#xff0c;從機器人技術到智能交通&#xff0c;各領域都在積極探索如何利用這一先進技術。而 Stereolabs 推出的ZED Box Mini&#xff0c;正是一款專為滿足這些多樣化…