基于論文的大模型應用:基于SmartETL的arXiv論文數據接入與預處理(三)

上一篇 介紹了數據接入處理的整體方案設計。本篇介紹基于SmartETL框架的流程實現。

5. 流程開發

5.1.簡單采集流程

從指定時間(yy年 mm月)開始,持續采集arXiv論文。基于月份和順序號,構造論文ID,進而下載論文PDF文件,保存到本地。

5.1.1.Loader設計

定制開發一個新的Loader“web.ArXivTaskEmit”,基于月份和順序號構造并輸出論文ID。每個月的順序號從00001到29999。輸出格式樣例:2503.00001(字符串)。代碼如下:

import time
import os
import jsonfrom wikidata_filter.util.dates import current_date
from wikidata_filter.loader.base import DataProviderclass ArXivTaskEmit(DataProvider):ts_file = ".arxiv.ts"def __init__(self, start_month: int = None, end_month: int = None):self.month = start_month or 2501self.seq = 1if os.path.exists(self.ts_file):with open(self.ts_file, encoding="utf8") as fin:nums = json.load(fin)self.month = nums[0]self.seq = nums[1]self.end_month = end_month or int(current_date('%y%m'))print(f"from {self.month}.{self.seq} to {self.end_month}")def write_ts(self):row = [self.month, self.seq]with open(self.ts_file, "w", encoding="utf8") as out:json.dump(row, out)def iter(self):while self.month <= self.end_month:while self.seq < 30000:new_id = f'{self.month}.{self.seq:05d}'print("processing:", new_id)yield new_idself.seq += 1self.write_ts()time.sleep(3)self.month += 1if self.month % 100 > 12:self.month += int(self.month/100)*100 + 101self.seq = 1self.write_ts()

5.1.2.Processor設計

處理過程包括:

  1. 將輸入數據包裝為dict結構。基于內置ToDict轉換算子。轉換后,數據變成:{‘d’: ‘2503.00001’}
  2. 構造PDF文件URL。基于內置ConcatFields轉換算子。轉換后,數據變成:{‘d’: 2503.00001’, ‘url_pdf’: ‘https://arxiv.org/pdf/2503.00001’}
  3. 構造保存本地的文件名。基于內置ConcatFields轉換算子。轉換后,數據變成:{‘d’: 2503.00001’, ‘url_pdf’: ‘https://arxiv.org/pdf/2503.00001’, ‘filename’: ‘data/arxiv/2503.00001.pdf’}
  4. 判斷文件不存在。基于內置Not算子,組合util.files.exists函數。
  5. 文件下載。基于內置Map算子,組合util.http.content函數,將獲取的文件內容(bytes類型)作為字段content的值。
  6. 保存文件。基于內置SaveFiles算子。
    上述流程SmartETL的YAML流程定義語法,基于已有的組件進行實例化,并通過Chain進行組合,形成順序處理流程,完成文件持續下載。

5.1.3.流程定義

name: arXiv簡單采集流程
description: 對指定時間范圍arXiv論文進行采集loader: web.ArXivTaskEmitnodes:as_dict: ToDictmake_url: ConcatFields('url_pdf', 'd', prefix=’https://arxiv.org/pdf/’)make_filename: ConcatFields('filename', 'd', prefix='data/arxiv/', suffix='.pdf')file_not_exists: Not('util.files.exists', key='filename')download: Map('util.http.content', key='url_pdf', target_key='content', most_times=3, ignore_error=True)save_file: WriteFiles('data/arxiv', name_key=’filename’)processor: Chain(as_dict, make_url, make_filename, file_not_exists, download, save_file)

5.2.論文搜索&HTML采集流程

針對指定關鍵詞,利用arXiv API搜索論文,下載論文HTML頁面。

5.2.1.Loader設計

通過命令行的交互輸入(input函數)獲取關鍵詞作為任務輸入。

5.2.2.Processor設計

處理過程包括:

  1. 通過命令行獲取用戶輸入關鍵詞。輸出數據為字符串,例如“RAG”。
  2. 基于輸入關鍵詞進行檢索,基于arXiv官網搜索API進行檢索。由于檢索結果為XML格式,基于xmltodict庫轉換為JSON格式,對論文結構附加url_pdfurl_html字段,表示PDF和HTML的下載鏈接。這一步采用定制開發函數gestata.arxiv.search,配合Map算子進行處理。
  3. 【可選的】數組打散。如果前一步search函數返回為數組結構,則需要通過Flat組件進行打散;如果為生成器yield方式返回,則框架自行處理。
  4. 下載HTML。內置util.http.content函數提供http請求(基于requests庫),結合Map算子,實現arxiv HTML文件下載,將獲取的文件內容(bytes)作為字段content的值。
  5. 過濾。判斷content是否為空,如果網絡連接失敗或者HTML文件本身不存在,就可以終止。
  6. 保存HTML。將前一步獲取的HTML內容(即content字段值)保存為文件。
    搜索核心代碼如下:
ARXIV_API_BASE = "http://export.arxiv.org/api/query"
ARXIV_BASE = "http://arxiv.org"def search(topic: str, max_results: int = 50):"""基于arXiv API的論文搜索"""if ':' not in topic:topic = 'all:' + topicparams = {"search_query": topic,"max_results": max_results,"sortBy": "lastUpdatedDate","sortOrder": "descending"}res = requests.get(ARXIV_API_BASE, params=params)doc = xmltodict.parse(res.text)feed = doc.get("feed")if "entry" not in feed:return []papers = feed.get("entry")for paper in papers:_id = paper["id"]_id = _id[_id.rfind('/')+1:]paper["_id"] = _idpaper["url_pdf"] = f"{ARXIV_BASE}/pdf/{_id}"paper["url_html"] = f"{ARXIV_BASE}/html/{_id}"return papers

在SmartETL框架最新設計中,通過將函數動態綁定為處理節點,只需要將業務處理邏輯實現為一個函數,就能夠在流程中進行調用,極大方便了數據處理算子開發流程。

5.2.3.流程定義

name: arXiv搜索采集流程
description: 基于用戶提供的關鍵詞進行arXiv論文并下載loader: Input('請輸入arXiv論文搜索關鍵詞:')nodes:search: Map('gestata.arxiv.search', max_results=10)download: Map('util.http.content', key='url_html', target_key='content', most_times=3, ignore_error=True)filter: FieldsNonEmpty('content')save: WriteFiles('data/arxiv', name_key='_id', suffix='.html')processor: Chain(search, Flat(), download, filter, save)

5.3.HTML解析建索引流程

對下載的HTML頁面進行解析,并對論文摘要和正文建立向量化索引。

5.3.1.HTML解析

由于arXiv論文的HTML頁面具有特定的網頁結構,通過lxml或beaultifulsoup庫,可實現對論文標題、作者、章節(包括其中的圖片、表格、公示等)列表、附錄、參考文獻等信息的精準識別。

5.3.2.Loader設計

可直接復用前文所述的自動生成論文ID的“web.ArXivTaskEmit”,也可以采用基于關鍵詞搜索的Input+gestata.arxiv.search

5.3.3.Processor設計

處理過程包括:

  1. HTML解析。設計函數組件gestata.arxiv.extract,從輸入的HTML(str類型)中進行論文結構抽取。注意,為了對HTML中的相對鏈接進行絕對定位,解析HTML時需要提供該HTML的基路徑(base path)。此外,設計的函數考慮到可能在其他地方調用,建議提供相關參數配置。
  2. 論文摘要索引。論文摘要是一個單獨的字段,并且通常長度較短,符合向量化索引chunk的長度要求,可以通過以下兩步建立索引:
    2.1 向量化。通過內置的model.embed.Local組件,調用embedding模型,生成摘要的向量
    2.2 寫向量庫。利用提前初始化的Qdrant組件,基于內置的DatabaseWriter組件進行寫入。
  3. 論文正文索引。論文包括多個章節(section),并且篇幅較長,通常需要進行chunk化拆分。一種簡單的方式先按section拆分(避免不同章節的內容成為一個chunk),然后根據段落和句子邊界進行長度拆分。過程如下:
    3.1 對sections進行打散,即轉成每個section作為一條記錄輸出。
    3.2 對每個section的content字段進行chunk化拆分并打散
    3.3 向量化。同上。
    3.4 寫向量庫。同上。

5.3.4.流程定義

name: arXiv論文HTML解析與索引流程
description: 對論文HTML進行解析并建立摘要和正文的向量索引loader: Directory('data/arxiv', '.html')nodes:qd: util.database.qdrant.Qdrant(**qdrant)select: SelectVal('data')extract: Map('gestata.arxiv.extract_from_html')vector1: model.embed.Local(api_base=bge_large_en, key='abstract', target_key='vector')write1: DatabaseWriter(qd, buffer_size=1, collection='chunk_abstract')chain1: Chain(Select('abstract'), vector1, write1)flat: FlatProperty('sections', inherit_props=True)select2: Select('content')chunk: Map('util.split.simple', key='content',target_key='chunks')flat_chunk: Flat(key='chunks')vector2: model.embed.Local(api_base=bge_large_en, key='chunks', target_key='vector')write2: DatabaseWriter(qd, buffer_size=1, collection='chunk_content')chain2: Chain(Select('sections', flat, select2, chunk, flat_chunk, vector2, write2)processor: Chain(select, extract, Fork(chain1, chain2, copy_data=True))

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

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

相關文章

[Swift]Xcode模擬器無法請求http接口問題

1.以前偷懶一直是這樣設置 <key>NSAppTransportSecurity</key> <dict><key>NSAllowsArbitraryLoads</key><true/><key>NSAllowsArbitraryLoadsInWebContent</key><true/> </dict> 現在我在Xcode16.3上&#xff…

Python基礎總結(八)之循環語句

文章目錄 一、for循環1.1 for循環格式1.2 for ...else1.3 for...break1.4 for...continue 二、while循環2.1 while循環格式2.2 while...break2.3 while...continue2.4 while ...else 循環語句就如其名&#xff0c;就是重復的執行一段代碼&#xff0c;直到滿足退出條件時&#x…

vuex實現同一頁面radio-group點擊不同按鈕顯示不同表單

本文實現的是點擊單一規格和多規格兩個按鈕會在頁面顯示不同的表單 方法一 <!-- 單規格和多規格的切換 --> <el-form label-width"80px" class"text-align-left"><el-form-item label"商品規格"><!-- 監聽skus_type的改…

AI編寫的“黑科技風格、自動刷新”的看板頁面

以下的 index.html 、 script.js 和 styles.css 文件&#xff0c;實現一個具有黑科技風格、自動刷新的能源管理系統實時監控看板。 html頁面 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name&q…

Vim使用完全指南:從基礎到高效編輯

Vim使用完全指南&#xff1a;從基礎到高效編輯 一、Vim簡介與基本概念 Vim&#xff08;Vi IMproved&#xff09;是從vi發展出來的一個功能強大的文本編輯器&#xff0c;以其高效性和靈活性著稱&#xff0c;特別適合程序開發和系統管理任務。與常規文本編輯器不同&#xff0c;…

時序約束高級進階使用詳解三:Create_Clock

目錄 一、前言 二、設計示例 2.1 設計代碼 2.2 schematic 2.3 no overwriteing 2.4 約束到非時鐘引腳 三、Create_clock應用 3.1 時鐘輸入端口 3.2 7系列高速收發器輸出管腳 3.3 部分原語的輸出管腳 3.4 主時鐘路徑上創建主時鐘 3.5 虛擬時鐘 3.6 差分時鐘的約束 …

箱線圖(盒須圖)QCPStatiBox

一、QCPStatisticalBox 概述 QCPStatisticalBox 是 QCustomPlot 中用于繪制箱線圖(盒須圖)的類&#xff0c;可以顯示數據的五個關鍵統計量&#xff1a;最小值、第一四分位數(Q1)、中位數、第三四分位數(Q3)和最大值&#xff0c;以及可能的異常值。 二、主要屬性 屬性類型描述…

人形機器人馬拉松:北京何以孕育“領跑者”?

“機器人每跑一小步&#xff0c;都是人類科技的一大步”&#xff0c;這句對阿姆斯特朗登月名言的仿寫&#xff0c;恰如其分地詮釋了全球首場人形機器人半程馬拉松賽事的里程碑意義。 2025年4月19日&#xff0c;北京亦莊半程馬拉松暨人形機器人半程馬拉松圓滿結束。在總長21.09…

基于Python的推薦算法的電影推薦系統的設計

標題:基于Python的推薦算法的電影推薦系統的設計與實現 內容:1.摘要 本文圍繞基于Python的推薦算法的電影推薦系統展開研究。背景在于隨著電影數量的急劇增加&#xff0c;用戶在海量電影中找到符合自身喜好的影片變得困難。目的是設計并實現一個高效準確的電影推薦系統&#x…

【深度學習】詳解矩陣乘法、點積,內積,外積、哈達瑪積極其應用|tensor系列02

博主簡介&#xff1a;努力學習的22級計算機科學與技術本科生一枚&#x1f338;博主主頁&#xff1a; Yaoyao2024往期回顧&#xff1a;【深度學習】你真的理解張量了嗎&#xff1f;|標量、向量、矩陣、張量的秩|01每日一言&#x1f33c;: “腦袋想不明白的&#xff0c;就用腳想”…

面試常用基礎算法

目錄 快速排序歸并排序堆排序 n n n皇后問題最大和子數組爬樓梯中心擴展法求最長回文子序列分割回文串動態規劃求最長回文子序列最長回文子串單調棧雙指針算法修改 分割回文串滑動窗口棧 快速排序 #include <iostream> #include <algorithm>using namespace std;…

相對路徑和絕對路徑解析

在 Linux/Unix 和文件系統中&#xff0c;絕對路徑和相對路徑是描述文件或目錄位置的兩種方式&#xff0c;它們的核心區別在于路徑的起點和使用場景。以下是詳細對比&#xff1a; 目錄 1. 定義與起點 2. 符號與語法 3. 使用場景 4. 實際示例 示例 1&#xff1a;定位文件 示…

【算法數據結構】leetcode37 解數獨

37. 解數獨 - 力扣&#xff08;LeetCode&#xff09; 題目描述&#xff1a; 題目要求每一行 &#xff0c;每一列&#xff0c;每個3*3 的子框只能出現一次。每個格子的數字范圍1-9. 需要遍歷每個空格填入可能的數字&#xff0c;并驗證符合規則。如果符合就填入&#xff0c;不符…

Vector的學習

vector簡介 vector的相關文檔對于想深入了解的同學可以參考這個文檔進行學習。 vector是表示可變大小數組的序列容器。 就像數組一樣&#xff0c;vector也采用的連續存儲空間來存儲元素。也就是意味著可以采用下標對vector的元素進行訪問&#xff0c;和數組一樣高效。但是又不…

Vue常用指令入門

1. v-for 作用&#xff1a;用于遍歷對象或數組 注意&#xff1a;需要提供key屬性&#xff0c;可以提高性能和避免渲染錯誤&#xff0c;值通常為index或item.id <li v-for"(item, index) in items" :key"index">{{ item }} </li>2. v-if,v-el…

在機器視覺檢測中為何選擇線陣工業相機?

線陣工業相機&#xff0c;顧名思義是成像傳感器呈“線”狀的。雖然也是二維圖像&#xff0c;但極寬&#xff0c;幾千個像素的寬度&#xff0c;而高度卻只有幾個像素的而已。一般在兩種情況下使用這種相機&#xff1a; 1. 被測視野為細長的帶狀&#xff0c;多用于滾筒上檢測的問…

線性DP:最長上升子序列(子序列可不連續,子數組必須連續)

目錄 Q1&#xff1a;簡單遍歷 Q2&#xff1a;變式&#xff08;加大數據量&#xff09; Q1&#xff1a;簡單遍歷 Dp問題 狀態表示 f(i,j) 集合所有以第i個數結尾的上升子序列集合-f(i,j)的值存的是什么序列長度最大值max- 狀態計算 &#xff08;其實質是集合的劃分&#xff09;…

【Web前端技術】第二節—HTML標簽(上)

hello&#xff01;好久不見—— 做出一個屬于自己的網站&#xff01; 云邊有個稻草人-個人主頁 Web前端技術—本篇文章所屬專欄 目錄 一、HTML 語法規范 1.1 基本語法概述 1.2 標簽關系 二、HTML 基本結構標簽 2.1 第一個 HTML 網頁 2.2 基本結構標簽總結 三、網頁開發…

論文降重GPT指令-實側有效從98%降低到8%

步驟1&#xff1a;文本接收 指令&#xff1a; 請用戶提供需要優化的文本內容。 對文本進行初步分析&#xff0c;識別文本的基本結構和風格。 操作&#xff1a; 接收并分析用戶提交的文本。 步驟2&#xff1a;文本優化 2.1 連接詞處理 指令&#xff1a; 刪除或替換連接詞&#x…

Jsp技術入門指南【九】詳細講解JSTL

Jsp技術入門指南【九】詳細講解JSTL 前言一、什么是JSTL&#xff1f;&#xff08;JavaServer Pages Standard Tag Library&#xff09;二、使用JSTL前的準備三、核心標簽庫常用標簽詳解1. <c:out>&#xff1a;輸出內容&#xff08;替代<% %>&#xff09;2. <c:i…