每日ArXiv CV论文追踪:自动化筛选与简报生成实战
1. 为什么我要做这个每日ArXiv CV论文追踪项目做计算机视觉方向的研究或者工程落地最怕的一件事不是代码写不出来而是你埋头调了两周模型结果发现上周刚挂出来的某篇论文早就把这个问题解决了而且思路比你的更简洁。ArXiv每天更新的CV方向论文数量常年维持在几十到上百篇赶上会议截稿前后更是井喷。靠人工每天刷列表既不现实也容易漏掉真正有价值的工作。我从2023年开始系统性地做这件事中间换过好几套方案从最早的纯手动收藏到后来的关键词过滤再到现在的自动化流水线。这个项目就是把我这两年踩过的坑和沉淀下来的方法整理出来核心目标只有一个用尽可能低的维护成本每天稳定拿到一份经过筛选、带摘要、可快速浏览的CV论文清单。它适合几类人一是做CV方向研究的研究生和科研人员需要跟踪前沿动态二是做视觉相关产品的算法工程师想看看工业界之外有没有可借鉴的新思路三是刚入门想快速建立领域认知的新人。不管你用Python还是其他语言核心逻辑都是通用的。需要说明的是ArXiv本身是一个预印本平台论文未经同行评审质量参差不齐。所以这个项目的重点不只是抓下来更在于筛出来和读得动。下面我会把整个链路的每个环节拆开讲包括为什么这么设计、具体怎么操作、以及我实际跑下来遇到的问题。2. 数据源选择与抓取策略的取舍2.1 为什么优先用官方API而不是网页爬取很多人第一反应是写个爬虫去抓ArXiv的列表页。我早期也这么干过结论是不推荐除非你有特殊需求。原因有几个。第一ArXiv的页面结构会变虽然不频繁但每次改版你的解析逻辑就得跟着改维护成本高。第二网页抓取对服务器有压力频率控制不好容易被限流甚至封IP。第三官方提供了稳定的API接口返回结构化数据省去了大量解析工作。ArXiv的官方API支持按分类、日期范围、关键词等条件查询返回Atom格式的XML。对于CV方向核心分类是cs.CV但实际工作中我建议同时关注几个相关分类因为很多有价值的工作会挂在交叉分类下。下面是我常用的分类组合分类代码说明是否必选cs.CV计算机视觉主分类必选cs.LG机器学习很多视觉方法发这里建议cs.AI人工智能偏应用的工作可选eess.IV图像与视频处理建议cs.RO机器人涉及视觉感知的工作可选分类选多了噪音也大我的经验是cs.CV加eess.IV这个组合覆盖了大部分我关心的内容cs.LG可以加上但需要更强的过滤。2.2 API查询参数的实际配置ArXiv API的查询URL基本结构是这样的我用Python的requests来发请求import requests import urllib.parse base_url http://export.arxiv.org/api/query? # 构造查询按分类和日期 query_params { search_query: cat:cs.CV, start: 0, max_results: 200, sortBy: submittedDate, sortOrder: descending } url base_url urllib.parse.urlencode(query_params) response requests.get(url, timeout30)这里有几个参数值得展开说。max_results我一般设200因为一天cs.CV的新论文加上更新很少超过这个数设太大反而浪费带宽。sortBy用submittedDate配合descending保证拿到的是最新的。start用于分页如果200条不够就递增。注意ArXiv API对请求频率有要求官方建议两次请求之间至少间隔3秒。我实测下来如果只是每天跑一次完全不需要担心限流但如果你要批量拉取历史数据一定要加延时否则会被临时封禁。2.3 日期过滤的坑时区与更新机制ArXiv的更新机制有个特点它不是按自然日严格划分的。论文的published时间是首次提交时间updated时间是最后一次修订时间。而且ArXiv用的是东部时间ET跟北京时间差12到13个小时。这意味着你早上8点跑脚本拿到的最新论文可能包含前一天下午提交的。我踩过的坑是早期我用系统当前日期去过滤结果经常出现某天的论文被漏掉或者重复。后来改成拉取最近48小时的所有论文然后用updated时间做去重这样既不会漏也不会重复。去重的键用论文的ArXiv ID这个ID是唯一的。from datetime import datetime, timedelta # 拉取最近两天的然后按ID去重 cutoff datetime.utcnow() - timedelta(hours48) # 解析XML后对每篇论文检查updated时间这个48小时的窗口是我反复调整后的结果。窗口太小容易漏窗口太大去重压力大。如果你对时效性要求极高可以缩到24小时但建议配合更频繁的运行频率。3. 从原始列表到可用清单的过滤逻辑3.1 关键词白名单与黑名单的配合抓下来的原始列表动辄上百篇直接看是不现实的。我的做法是建两套词表白名单和黑名单。白名单是你关心的方向比如detection、segmentation、diffusion、transformer、3D、video等。黑名单是你不关心的比如medical如果你不做医疗、remote sensing如果你不做遥感、theoretical等。这里的关键是匹配策略。我试过三种标题匹配、摘要匹配、标题加摘要匹配。结论是标题匹配用于白名单摘要匹配用于黑名单。为什么因为标题里出现的关键词通常代表论文的核心方向而摘要里出现某个词可能只是顺带提了一句。比如一篇做通用检测的论文摘要里可能提到在医疗图像上也有潜在应用如果你用摘要做白名单就会把一堆不相关的论文拉进来。def match_keywords(paper, whitelist, blacklist): title paper[title].lower() abstract paper[abstract].lower() # 白名单看标题 if not any(kw in title for kw in whitelist): return False # 黑名单看标题和摘要 if any(kw in title or kw in abstract for kw in blacklist): return False return True这套逻辑跑下来100篇能筛到20到30篇量级刚好。3.2 用作者和机构做二次筛选关键词过滤有个盲区有些重要工作标题写得很朴素关键词匹配不到。这时候作者和机构信息就派上用场了。我会维护一个关注列表包含经常发高质量工作的研究者和机构。当一篇论文的作者出现在列表里即使关键词没匹配上也会被保留。这个列表不需要很大我目前也就几十个条目但覆盖了我所在细分方向的大部分活跃团队。获取作者信息直接从API返回的XML里解析author标签就行。机构信息API不直接提供需要从摘要或者PDF里提取成本较高我一般只对通过初筛的论文做这一步。提示作者列表要定期更新因为研究者会换机构、换方向。我一般每季度review一次把长期不相关或者质量下降的移除。3.3 去重与版本合并同一篇论文可能有多个版本v1、v2、v3ArXiv会给不同的ID后缀。如果你只按标题去重可能把不同版本的更新当成新论文。我的做法是按ArXiv ID的基础部分去重保留最新版本。比如2409.12345v2和2409.12345v1是同一篇只保留v2。另外还有一种情况同一批作者把一篇工作拆成多篇发或者内容高度重叠。这种靠ID去重解决不了需要看标题和摘要的相似度。我用的是简单的Jaccard相似度阈值设在0.7左右超过就认为是重复保留信息更全的那篇。这个阈值是我试出来的太低会误杀太高会漏掉。4. 让论文清单真正可读的加工环节4.1 摘要的提取与精简ArXiv的摘要有时候很长一段话两三百词快速浏览时很费劲。我的做法是对摘要做精简提取出研究问题、方法核心、主要结果三个要素。早期我想用规则来做后来发现效果不好现在改成用一个小型的文本摘要模型或者干脆用大模型API来做。如果你不想引入额外依赖一个折中方案是保留摘要的前两句话和最后一句话。前两句通常交代问题和动机最后一句通常是结论或效果。这个启发式规则我用了很久覆盖了大部分情况虽然不是完美但比看全文快多了。def summarize_abstract(abstract, max_sentences3): sentences abstract.split(. ) if len(sentences) max_sentences: return abstract # 取前两句和最后一句 return . .join(sentences[:2] [sentences[-1]])4.2 关键信息的结构化呈现光有摘要还不够我需要快速判断一篇论文值不值得细读。所以我会把几个关键字段单独拎出来任务类型、方法类别、数据集、是否开源。任务类型和方法类别可以从标题和摘要里用关键词映射数据集和开源信息需要额外处理。数据集信息通常在摘要里会提到用正则匹配常见数据集名称就行。开源信息比较麻烦ArXiv本身不提供我的做法是检查摘要里有没有code is available、github之类的字样有就标记为可能开源然后人工确认。这一步没法完全自动化但能省掉大量翻找的时间。字段提取方式准确率任务类型关键词映射高方法类别关键词映射中数据集正则匹配中高开源情况文本线索人工中4.3 生成每日简报的格式设计最终输出我用的是一份Markdown格式的简报每篇论文一个条目包含标题、作者、精简摘要、关键字段标签、ArXiv链接。为什么用Markdown因为它纯文本、易读、方便后续处理而且可以直接贴到笔记软件或者内部wiki里。条目的排序我按相关性打分而不是按时间。相关性分数由关键词匹配度、作者是否在关注列表、是否有开源代码等因素加权得到。这样每天打开简报最相关的工作排在最前面不用自己再筛一遍。### 论文标题 **作者**: 作者列表 **标签**: #检测 #Transformer #开源 **摘要**: 精简后的摘要内容 **链接**: https://arxiv.org/abs/2409.xxxxx这套格式我迭代了七八个版本现在这个是最顺手的。核心原则是一眼能看到关键信息想深入再点链接。5. 自动化运行与日常维护的实操细节5.1 定时任务的部署方式选择这个项目需要每天定时跑我用过三种方式本地cron、服务器cron、云函数。本地cron最简单但要求你的机器一直开着。服务器cron稳定但要维护一台服务器。云函数最省心按量付费但调试麻烦一些。我现在的方案是服务器cron加日志监控。脚本每天早上7点跑跑完把简报发到我的邮箱和笔记软件。为什么选7点因为ArXiv的更新高峰在东部时间的下午到晚上对应北京时间凌晨到早上7点跑能覆盖大部分前一天的更新。cron表达式很简单# 每天早上7点执行 0 7 * * * /usr/bin/python3 /path/to/arxiv_daily.py /var/log/arxiv.log 21关键是日志要留好出问题的时候能快速定位。我在脚本里加了详细的日志输出每个环节处理了多少篇、过滤掉多少、最终输出多少都记下来。5.2 失败重试与异常处理网络请求失败是常态尤其是访问外部API的时候。我的脚本里所有网络请求都包了重试逻辑最多重试3次每次间隔递增。如果3次都失败就记录错误并跳过不能让整个流程挂掉。import time def fetch_with_retry(url, max_retries3): for i in range(max_retries): try: resp requests.get(url, timeout30) if resp.status_code 200: return resp except Exception as e: print(fAttempt {i1} failed: {e}) time.sleep(2 ** i) # 指数退避 return None还有一个容易忽略的点API返回的内容可能不完整。我有一次遇到XML解析到一半报错查了半天发现是响应被截断了。后来加了长度校验太短的响应直接当失败处理。5.3 词表和关注列表的持续迭代这个项目最大的维护成本不在代码而在词表和关注列表的更新。研究方向会变热点会转移半年前的白名单可能现在就不适用了。我的做法是每月做一次回顾看看过去一个月筛出来的论文里有多少是我真正读了的有多少是误筛的。误筛率如果超过30%就说明词表需要调整。调整的方法不是拍脑袋加词而是去看那些被误筛的论文它们的标题里有什么共同特征把这些特征提炼成新的过滤规则。这个过程有点像调参需要耐心但效果是实打实的。我的经验是宁可稍微放宽一点也不要过滤太狠。漏掉一篇重要论文的代价远大于多看几篇不相关的。6. 实际跑下来遇到的几个典型问题6.1 摘要里的数学公式导致解析异常ArXiv的摘要里经常包含LaTeX公式比如$\alpha$、\mathcal{L}这种。这些内容在XML里是转义过的但解析出来之后如果直接展示会很乱。我早期的处理是直接正则删掉所有$...$之间的内容结果把一些关键信息也删了。后来改成保留公式但做简化把常见的希腊字母和符号映射成可读的文本比如\alpha变成alpha\mathcal{L}变成L。这样既保留了信息又不会太乱。这个映射表我维护了大概五六十个条目覆盖了大部分常见符号。6.2 跨分类论文的重复抓取前面提到我同时关注cs.CV和eess.IV问题是一篇论文可能同时挂在这两个分类下导致抓取时出现重复。虽然最后有去重环节但重复抓取浪费了请求配额。我的解决办法是在查询时就用OR逻辑合并分类而不是分两次查。search_querycat:cs.CVORcat:eess.IV这样一次请求就能拿到两个分类的并集ArXiv会自动去重。这个细节看起来小但实际跑起来能省不少事。6.3 简报太长导致的阅读疲劳最开始的简报我把所有筛出来的论文都放进去一天三四十篇看着就累。后来我做了分层核心推荐放最相关的5到10篇值得一看放次相关的10到15篇其他只列标题和链接。这样打开简报先看核心推荐有时间再往下翻。分层标准我用的是相关性分数分数怎么算前面提过。这个分层机制上线之后我每天花在浏览简报上的时间从半小时降到了十分钟左右效率提升很明显。7. 关于这套方法后续可以怎么调整这套流程我跑了两年整体是稳定的但也不是没有优化空间。如果你刚开始做我建议先从最简单的版本跑起来只抓cs.CV只用关键词白名单过滤输出一个简单的Markdown列表。跑通之后再逐步加去重、加分层、加作者关注。另外一个方向是引入语义相似度做过滤。关键词匹配的局限在于它只看字面不理解语义。比如目标检测和object detection是同一个意思但关键词匹配需要你手动把两种写法都加进去。用句向量模型做语义匹配可以解决这个问题代价是计算成本高一些。我目前在小范围试用效果不错但还没完全替换掉关键词方案。最后说一个我自己的体会工具是辅助读论文才是目的。我见过有人把追踪系统做得无比精致每天产出漂亮的报告但从来不认真读。这就本末倒置了。这套方法的价值在于帮你把噪音过滤掉把时间省下来花在真正重要的论文上。所以不要过度优化工具本身够用就行把精力留给阅读和思考。