当前位置: 首页 > news >正文

跟沐神学读论文-论文阅读管理

摘要

近期有读论文的需求,就需要去了解一下论文到底要怎么读,同一个系列之间的论文如何作整理和归纳,之前也有了解过市面上有成熟的论文阅读工具,但是对于学生党来讲没什么性价比,在B站上看到沐神有讲解他的思路Typora作为工作中的md生产工具,我有一点浅显的认识希望和大家交流学习。Typora可以作为编辑工具,之前有被同事安利过,但是那个时候md格式还并不了解,今天重拾起,简单来讲我的做法就是Typora+gitee形成云端存储的一套方案,配套使用我自己的一些脚本,可以很好的实现论文阅读的功能。

一:Typora的安装

Typora 是一个所见即所得的 Markdown 跨平台写作工具,目前已经发布正式版,并且更改为付费模式,0.11.18_beta 是最后一个免费的测试版,有需要的可以选择下载。

Windows 用户

下载地址: [https://github.com/iuxt/src/releases/download/2.0/typora-0-11-18.exe](https://github.com/iuxt/src/releases/download/2.0/typora-0-11-18.exe)

0.11.18 现在被远程施法了,会提示过期无法使用,可以使用 0.9.96 版

下载地址:https://github.com/iuxt/src/releases/download/2.0/typora-setup-x64_0.9.96.exe

Mac 用户

下载地址: https://github.com/iuxt/src/releases/download/2.0/typora-0-11-18.dmg

Ubuntu 用户

下载地址:https://github.com/iuxt/src/releases/download/2.0/Typora_Linux_0.11.18_amd64.deb

安装方法

使用 apt 安装:

sudo apt install ./Typora_Linux_0.11.18_amd64.deb

如此你就完成了笔记编辑器的安装。

二:Gitee的配置

https://gitee.com在这里去作账户注册和登陆,新建仓库
在这里插入图片描述在这里插入图片描述在本地新建立一个文件夹,在该文件下开命令行

#Git 全局设置:git config --global user.name "YourName"
git config --global user.email "YourInfo@user.noreply.gitee.com"#创建 git 仓库:mkdir paper
cd paper
git init 
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin https://gitee.com/YourName/paper.git
git push -u origin "master"#已有仓库?cd existing_git_repo
git remote add origin https://gitee.com/YourName/paper.git
git push -u origin "master"

如此每次更改后可以配合gitee去作同步。

三:脚本

脚本一:通过arxiv自动下载论文,提取论文标题,作者,日期,索引数等

arxiv_2_md.py

#!/usr/bin/env python3
import os
import re
import requests
import arxiv
from urllib.parse import urlparse, quotedef extract_arxiv_id(url: str) -> str:"""从arXiv链接中提取arXiv ID。形如:https://arxiv.org/abs/1605.08386则返回:1605.08386"""parsed = urlparse(url)if 'arxiv.org' not in parsed.netloc:raise ValueError("这不是一个有效的arXiv链接。")match = re.search(r'/abs/([0-9]+\.[0-9]+)', parsed.path)if not match:match = re.search(r'/pdf/([0-9]+\.[0-9]+)', parsed.path)if not match:raise ValueError("未能从链接中提取到arXiv ID。")return match.group(1)def fetch_arxiv_metadata(arxiv_id: str):"""使用arxiv Python包从arxiv获取元数据返回字典包含:title, authors, year, journal_ref, pdf_url"""search = arxiv.Search(id_list=[arxiv_id])paper = next(search.results(), None)if paper is None:raise ValueError("未能在arXiv找到对应论文信息。")journal_ref = paper.journal_ref if paper.journal_ref else "N/A"authors = [au.name for au in paper.authors]year = paper.published.yearreturn {"title": paper.title.strip(),"authors": authors,"year": year,"journal": journal_ref,"pdf_url": paper.pdf_url}def download_pdf(pdf_url: str, save_dir: str = "./pdfs") -> str:"""下载pdf文件到本地save_dir中,并返回本地文件相对路径。"""if not os.path.exists(save_dir):os.makedirs(save_dir)# 尝试从pdf_url中提取文件名basename = os.path.basename(pdf_url)if not basename.endswith(".pdf"):basename += ".pdf"local_filename = os.path.join(save_dir, basename)r = requests.get(pdf_url)r.raise_for_status()with open(local_filename, 'wb') as f:f.write(r.content)return local_filenamedef fetch_citation_count_by_arxiv_id(arxiv_id: str) -> int:"""调用 Semantic Scholar API 使用 ArXiv:<arxiv_id> 获取引用数。"""url = f"https://api.semanticscholar.org/graph/v1/paper/ArXiv:{arxiv_id}?fields=citationCount"r = requests.get(url)if r.status_code == 200:data = r.json()return data.get("citationCount", 0)return 0def fetch_citation_count_by_title(title: str) -> int:"""如果直接使用ArXiv ID获取不到合适引用数,则通过标题在 Semantic Scholar 搜索。取搜索结果中匹配度最高(即第一个结果)的citationCount作为参考。"""query = quote(title)url = f"https://api.semanticscholar.org/graph/v1/paper/search?query={query}&fields=title,citationCount"r = requests.get(url)if r.status_code == 200:data = r.json()papers = data.get("data", [])if papers:best_match = papers[0]if best_match["title"].lower().strip() == title.lower().strip():return best_match.get("citationCount", 0)return 0def fetch_citation_count(arxiv_id: str, title: str) -> int:"""尝试通过arxiv_id获取citationCount,如果为0则尝试通过标题获取。"""count = fetch_citation_count_by_arxiv_id(arxiv_id)if count == 0:# 如果通过arxiv_id获取不到或为0,尝试通过标题搜索count = fetch_citation_count_by_title(title)return countdef generate_markdown(md_filename: str, title: str, authors: list, journal: str, year: int, local_pdf_path: str, citation_count: int, arxiv_url: str):"""生成Markdown文件:包含标题、作者、期刊/会议信息、年份、本地PDF链接、原始arxiv链接和引用次数。"""authors_str = ", ".join(authors)rel_pdf_path = os.path.relpath(local_pdf_path)with open(md_filename, 'w', encoding='utf-8') as f:f.write(f"# {title}\n\n")f.write(f"- **Authors:** {authors_str}\n")f.write(f"- **Venue/Journal:** {journal}\n")f.write(f"- **Year:** {year}\n")f.write(f"- **Local PDF:** [{rel_pdf_path}]({rel_pdf_path})\n")f.write(f"- **ArXiv Link:** [{arxiv_url}]({arxiv_url})\n\n")f.write(f"**Citations:** {citation_count}\n")def main():# 输入 arxiv 链接arxiv_url = input("请输入arXiv链接:").strip()arxiv_id = extract_arxiv_id(arxiv_url)# 获取arxiv元数据meta = fetch_arxiv_metadata(arxiv_id)# 下载PDFlocal_pdf = download_pdf(meta["pdf_url"])# 获取引用数citation_count = fetch_citation_count(arxiv_id, meta["title"])# 询问用户md文件名default_md_name = f"{arxiv_id}.md"md_name_input = input(f"请输入要保存的Markdown文件名(不需扩展名,留空则使用 {default_md_name[:-3]}): ").strip()if md_name_input == "":md_filename = default_md_nameelse:md_filename = f"{md_name_input}.md"# 生成markdown文件generate_markdown(md_filename,meta["title"],meta["authors"],meta["journal"],meta["year"],local_pdf,citation_count,arxiv_url)print(f"Markdown文件已生成:{md_filename}")if __name__ == "__main__":main()

运行:

python ./arxiv_2_md.py

如果在输入arXiv后报错:

python ./arxiv_to_md_1.2.py 
请输入arXiv链接:https://arxiv.org/abs/2410.24207
/home/crist/WorkSpace/3D-reconstruction-paper/./arxiv_to_md_1.2.py:30: DeprecationWarning: The 'Search.results' method is deprecated, use 'Client.results' insteadpaper = next(search.results(), None)
Traceback (most recent call last):File "/home/crist/WorkSpace/3D-reconstruction-paper/./arxiv_to_md_1.2.py", line 150, in <module>main()File "/home/crist/WorkSpace/3D-reconstruction-paper/./arxiv_to_md_1.2.py", line 125, in mainlocal_pdf = download_pdf(meta["pdf_url"])^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "/home/crist/WorkSpace/3D-reconstruction-paper/./arxiv_to_md_1.2.py", line 56, in download_pdfr = requests.get(pdf_url)^^^^^^^^^^^^^^^^^^^^^File "/home/crist/miniconda3/lib/python3.12/site-packages/requests/api.py", line 73, in getreturn request("get", url, params=params, **kwargs)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "/home/crist/miniconda3/lib/python3.12/site-packages/requests/api.py", line 59, in requestreturn session.request(method=method, url=url, **kwargs)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "/home/crist/miniconda3/lib/python3.12/site-packages/requests/sessions.py", line 589, in requestresp = self.send(prep, **send_kwargs)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "/home/crist/miniconda3/lib/python3.12/site-packages/requests/sessions.py", line 703, in sendr = adapter.send(request, **kwargs)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "/home/crist/miniconda3/lib/python3.12/site-packages/requests/adapters.py", line 633, in sendconn = self.get_connection_with_tls_context(^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "/home/crist/miniconda3/lib/python3.12/site-packages/requests/adapters.py", line 483, in get_connection_with_tls_contextproxy_manager = self.proxy_manager_for(proxy)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "/home/crist/miniconda3/lib/python3.12/site-packages/requests/adapters.py", line 282, in proxy_manager_formanager = self.proxy_manager[proxy] = SOCKSProxyManager(^^^^^^^^^^^^^^^^^^File "/home/crist/miniconda3/lib/python3.12/site-packages/urllib3/contrib/socks.py", line 212, in __init__raise ValueError(f"Unable to determine SOCKS version from {proxy_url}")
ValueError: Unable to determine SOCKS version from socks://127.0.0.1:7890/

解决办法:

export ALL_PROXY=socks5://127.0.0.1:7890
export HTTP_PROXY=socks5://127.0.0.1:7890
export HTTPS_PROXY=socks5://127.0.0.1:7890

脚本二:
提取PDF中的图片,将我的脚本和pdf文件放到一起:

#!/usr/bin/env python3
import os
import subprocess
import tkinter as tk
from tkinter import messagebox, fontdef list_pdfs(directory="."):"""列出指定目录中的所有PDF文件并返回列表。"""pdfs = [f for f in os.listdir(directory) if f.lower().endswith('.pdf')]return pdfsdef extract_images(pdf_path, output_dir="images"):"""使用pdfimages从指定PDF中提取图片。"""if not os.path.exists(output_dir):os.makedirs(output_dir)base_name = os.path.splitext(os.path.basename(pdf_path))[0]output_prefix = os.path.join(output_dir, base_name)cmd = ["pdfimages", "-j", pdf_path, output_prefix]try:subprocess.run(cmd, check=True)return True, f"图片已提取到 {output_dir} 目录中,以 {base_name}-xxx 的形式命名。"except subprocess.CalledProcessError:return False, "提取图片失败,请确保已安装pdfimages工具。"def on_extract():selection = listbox.curselection()if not selection:messagebox.showwarning("警告", "请先选择一个PDF文件")returnindex = selection[0]pdf_file = pdfs[index]success, msg = extract_images(pdf_file)if success:messagebox.showinfo("提取完成", msg)else:messagebox.showerror("错误", msg)root = tk.Tk()
root.title("PDF图片提取器")# 设置全局字体
root.option_add("*Font", "Helvetica 12")pdfs = list_pdfs(".")frame = tk.Frame(root)
frame.pack(padx=10, pady=10, fill="both", expand=True)label = tk.Label(frame, text="请选择一个PDF文件:", font=("Helvetica", 12, "bold"))
label.pack(anchor="w")listbox = tk.Listbox(frame, height=10)
listbox.pack(fill="both", expand=True)for pdf in pdfs:listbox.insert(tk.END, pdf)if not pdfs:listbox.insert(tk.END, "当前目录未找到PDF文件")btn_frame = tk.Frame(root)
btn_frame.pack(pady=5)
extract_btn = tk.Button(btn_frame, text="提取图片", font=("Helvetica", 12))
extract_btn.config(command=on_extract)
extract_btn.pack()root.mainloop()

这样就可以把图片保存到img文件夹下了

相关文章:

跟沐神学读论文-论文阅读管理

摘要 近期有读论文的需求&#xff0c;就需要去了解一下论文到底要怎么读&#xff0c;同一个系列之间的论文如何作整理和归纳&#xff0c;之前也有了解过市面上有成熟的论文阅读工具&#xff0c;但是对于学生党来讲没什么性价比&#xff0c;在B站上看到沐神有讲解他的思路Typor…...

Python 参数配置使用 XML 文件的教程 || Python打包 || 模型部署

当配置项存储在外部文件&#xff08;如 XML、JSON&#xff09;时&#xff0c;修改配置无需重新编译和发布代码。通过更新 XML 文件即可调整参数&#xff0c;无需更改源代码&#xff0c;从而提升开发效率和代码可维护性。 1. 为什么选择 XML 配置文件 XML 配置文件具有多种优点…...

[SV]如何在UVM环境中使用C Model

在UVM环境中使用C Memory 一、C语言实现Memory 1.1 代码说明 Memory 初始化: memory_init() 函数将内存空间初始化为 0,并初始化互斥锁。AXI 写操作 (axi_write): 检查地址范围是否合法。使用 memcpy 将数据从输入缓冲区写入模拟内存。使用互斥锁保证线程安全。AXI 读操作 …...

十大开源的Cursor AI替代方案

随着AI的兴起&#xff0c;所使用的工具也在不断进步。Cursor AI 作为一个强大的编码助手&#xff0c;已经成为开发人员不可或缺的工具。开源替代方案提供了透明性、个性化和成本效益。本文深入探讨了Cursor AI 的十大开源替代方案&#xff0c;这些方案将丰富您的编码体验&#…...

相机光学(四十六)——镜头马达(VCM)控制策略模式

One Step Mode、Linear Slope Control&#xff08;LSC&#xff09;和Acceleration Control是三种不同的控制模式&#xff0c;它们在控制策略和应用场景上有所区别。这些控制模式在VCM中的应用是为了提高其性能&#xff0c;减少振动&#xff0c;加快响应速度&#xff0c;并提高定…...

专业140+总分410+浙江大学842信号系统与数字电路考研经验浙大电子信息与通信工程,真题,大纲,参考书。

考研落幕&#xff0c;本人本中游211&#xff0c;如愿以偿考入浙江大学&#xff0c;专业课842信号系统与数字电路140&#xff0c;总分410&#xff0c;和考前多次模考预期差距不大&#xff08;建议大家平时做好定期模考测试&#xff0c;直接从实战分数中&#xff0c;找到复习的脉…...

了解ARM的千兆以太网——RK3588

1. 简介 本文并不重点讲解调试内容&#xff0c;重点了解以太网在ARM设计中的框架以及在设备树以及驱动的一个整体框架。了解作为一个驱动开发人员当拿到一款未开发过的ARM板卡应该怎么去把网卡配置使用起来。 2. 基础知识介绍 在嵌入式ARM中实现以太网的解决方案通常有以下两种…...

JavaFX使用jfoenix的UI控件

jfoenix还是一个不错的样式&#xff0c;推荐使用&#xff0c;而且也可以支持scene builder中的拖拖拽拽 需要注意的是过高的javafx版本可能会使得某些样式或控件无法使用 比如alert控件&#xff0c;亲测javaFX 19版本可以正常使用 1.在pom.xml中引入依赖 GitHub地址https://gi…...

Linux(Ubuntu)命令大全——已分类整理,学习、查看更加方便直观!(2024年最新编制)

Hello! 认真好学的小伙伴们&#xff0c;大家好呀&#xff08;Respect~&#xff09;&#xff01;我是 H u a z z i Huazzi Huazzi&#xff0c;欢迎观看本篇博客&#xff0c;接下来让我们一起来学习 Ubuntu命令大全 吧&#xff01;祝你有所收获&#xff01; 文章目录 前言&#x…...

单片机:实现教学上下课的自动打玲(附带源码)

单片机实现教学上下课的自动打铃 在学校或其他教育机构中&#xff0c;定时的打铃系统被广泛应用&#xff0c;用于提醒学生和老师上下课的时间。一个简单的自动打铃系统可以通过单片机实现&#xff0c;结合蜂鸣器和定时器控制&#xff0c;可以在设定的时间点自动打铃&#xff0…...

进程通信方式---共享映射区(无血缘关系用的)

5.共享映射区&#xff08;无血缘关系用的&#xff09; 文章目录 5.共享映射区&#xff08;无血缘关系用的&#xff09;1.概述2.mmap&&munmap函数3.mmap注意事项4.mmap实现进程通信父子进程练习 无血缘关系 5.mmap匿名映射区 1.概述 原理&#xff1a;共享映射区是将文件…...

深度学习实战智能交通计数

本文采用YOLOv8作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv8以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对车辆目标数据集进行训练和优化&#xff0c;该数据集包含丰富的车辆目标图像样本…...

【MySQL】MySQL表的操作

【MySQL】MySQL表的操作 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;MySQL&#x1f34b; &#x1f33c;文章目录&#x1f33c; 1. 创建表 2. 查看表结构 3. 修改表 4. 删除表 1. 创建表 create table table_name(表名称)( fiel…...

Redis篇-12--数据结构篇4--Hash内存模型(数组,链表,压缩列表zipList,哈希表,短结构)

Redis的Hash数据结构用于存储键值对&#xff08;key-value形式&#xff09;的集合&#xff08;类似java中HashMap或对象&#xff09;。为了在保证高效性能的同时节省内存&#xff0c;Redis对Hash的底层实现进行了多种优化。特别是通过使用压缩列表&#xff08;ziplist&#xff…...

二、windows环境下vscode使用wsl教程

本篇文件介绍了在windows系统使用vscode如何连接使用wsl&#xff0c;方便wsl在vscode进行开发。 1、插件安装 双击桌面vscode&#xff0c;按快捷键CtrlShiftX打开插件市场&#xff0c;搜索【WSL】点击安装即可。 2、开启WSL的linux子系统 点击左下方图标【Open a Remote Win…...

Qwen2-VL微调体验

1.配置环境 2.数据集准备 3.模型下载 4.注册SwanLab 5.微调 6.训练过程可视化 1.配置环境 本博客使用的是2B模型&#xff0c;所以仅用了单卡3090&#xff0c;若大一点的模型&#xff0c;自行根据实际情况准备显卡 安装Python>3.8 安装Qwen2-VL必要的库 pip install…...

论文的模拟环境和实验环境

模拟环境和实验环境 在撰写SCI计算机领域论文时,模拟环境和实验环境是两个重要的概念,它们之间存在显著的差异。 模拟环境主要是利用计算机、数学方法等手段对实际系统进行描述和分析的过程。在计算机科学中,模拟环境可以用于模拟各种算法、系统或网络的行为,以便在不需要…...

MySQL EXPLAIN 详解:一眼看懂查询计划

在日常的数据库开发中&#xff0c;我们经常需要分析 SQL 查询性能&#xff0c;而 EXPLAIN 是 MySQL 提供的利器&#xff0c;可以帮我们快速理解查询计划&#xff0c;优化慢查询。本文将详细解析 EXPLAIN 的输出字段及其含义&#xff0c;并结合实际案例分享优化思路。 一、什么是…...

自动呼入机器人如何与人工客服进行无缝切换?

自动呼入机器人如何与人工客服进行无缝切换&#xff1f; 原作者&#xff1a;开源呼叫中心FreeIPCC&#xff0c;其Github&#xff1a;https://github.com/lihaiya/freeipcc 自动呼入机器人与人工客服的无缝切换详解 自动呼入机器人与人工客服之间的无缝切换是确保客户体验连续…...

二分类模型的性能评价指标

1. 混淆矩阵 (Confusion Matrix) 预测正类预测负类实际正类 (P)True Positive (TP)False Negative (FN)实际负类 (N)False Positive (FP)True Negative (TN) True Positive (TP): 模型正确预测为正类的样本数。True Negative (TN): 模型正确预测为负类的样本数。False Positi…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术&#xff0c;它们扮演着完全不同的角色&#xff1a; Redis: 内存数据库/数据结构存储 本质&#xff1a; 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能&#xff1a; 提供丰…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)

第一篇&#xff1a;Liunx环境下搭建PaddlePaddle 3.0基础环境&#xff08;Liunx Centos8.5安装Python3.10pip3.10&#xff09; 一&#xff1a;前言二&#xff1a;安装编译依赖二&#xff1a;安装Python3.10三&#xff1a;安装PIP3.10四&#xff1a;安装Paddlepaddle基础框架4.1…...

JS红宝书笔记 - 3.3 变量

要定义变量&#xff0c;可以使用var操作符&#xff0c;后跟变量名 ES实现变量初始化&#xff0c;因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符&#xff0c;可以创建一个全局变量 如果需要定义…...