[Github 项目推荐] 一个更好阅读和查找论文的网站

28 篇原创文章

机器学习发展到现在,已经积累了非常多的文章,特别是深度学习火起来后,每年新增加的论文非常多,如果需要研究某个领域,不仅需要阅读这个领域经典的论文,也必须时刻关注最新的学术进展,比如最近两年特别火的 GAN,不仅需要先了解它的第一篇开山之作--"Generative Adversarial Nets",也需要关注最新发表的该领域的论文。

而查找论文,除了直接谷歌搜索外,通常都会到 arxiv 网站上查找,下图显示的是在计算机视觉和模式识别这个类别下的最新论文:

640?wx_fmt=png

不过,从上图也可以知道,这里仅仅展示了论文名字和作者、发表时间等信息,如果是熟悉的作者,比如一些大牛,当然就值得我们一看,但如果作者不熟悉,就只能通过论文名字判断是否值得点击论文名字,查看论文简介,再通过论文简介判断是否值得下载 pdf 来精读或者泛读。

如果可以,我们当然希望在这个页面就可以展示论文简介,这样可以减少一个步骤。

所以今天推荐一个基于 arXiv 提供的 API 实现的更加易于阅读机器学习方面论文的网站,网站如下所示:

网址:http://www.arxiv-sanity.com/

640?wx_fmt=png

上图左上角,可以这个网站目前收集了过去几年大约总共 62820 篇论文,都是机器学习方面的论文,然后下方有几个选项卡,分别是:

most recent

展示最新的论文。对于每篇论文,都会展示名字、作者、发表时间,论文的图示,论文的简介,然后可以下载 pdf,并且还可以搜索相似论文和有讨论区。

不过对于讨论区,似乎因为使用人数不多,或者是发表评论的人不多,直接展示的论文基本都没有评论留言,需要直接点击discussions这个选项卡才会展示有评论的论文,但基本都是只有一条评论,不多于两条评论。

top recent

根据登录用户收藏到其 library 的论文展示,可以选择展示最近几天的范围,包括最近一天、三天、一周、一个月、一年以及所有。

640?wx_fmt=png

top hype

这主要是展示在 Twitter 上提及过的论文,可以查看提及的用户,以及发的 twitter 内容,不过我看基本都是属于直接转发 arxiv 的官方twitter 发表的推文,类似于我们直接转发微博。

640?wx_fmt=png

后面的几个选项卡,除了discussions,其余几个都是需要进行登录的,friends就是展示你朋友的论文,recommanded就是基于你收藏在你的library的论文来展示,这里开发者还给出采用的方法,是基于 SVM 算法。

Github 项目

这个网站的实现代码是开源在 Github 上的:

https://github.com/karpathy/arxiv-sanity-preserver

640?wx_fmt=png

其中通过 Arxiv API 查找论文的代码文件是fetch_papers.py,可以在这个代码中改变希望查找的论文类别,不仅仅是机器学习。对于 Arxiv API ,可以查看说明文档,文档地址:

https://arxiv.org/help/api/user-manual#detailed_examples

代码结构

根据作者介绍,代码主要分为两部分:

查询代码

通过 Arxiv API 来下载指定类别的最新论文,并提取每篇论文的内容来提取文字,创建tfidf向量,这部分代码需要考虑的就是后端爬取和计算方面的功能:

  • 建立一个 arxiv 论文的数据库

  • 计算内容向量

  • 生成略缩图

  • 给用户计算 SVMs

  • 等等

用户界面

这部分是一个网页端的服务器(基于 Flask/Tornado/sqlite),实现通过数据库查询论文,根据相似性来过滤用户,等功能。

依赖库

需要的依赖库包括:

  • numpy

  • feedparser--解析 xml 文件

  • scikit learn--处理 tfidef 向量,并实现 SVM 算法

  • flask--展示结果

  • flask_limiter

  • tornado

  • dateutil

  • scipy

  • sqlite3

上述依赖库可以通过下列命令来安装:

$ virtualenv env                # optional: use virtualenv
$ source env/bin/activate       # optional: use virtualenv
$ pip install -r requirements.txt

除此外,还需要ImageMagickpdftotext,在Ubuntu可以通过命令安装:

sudo apt-get install imagemagick poppler-utils

但这个命令会还需要继续安装其他依赖库

运行流程

整个项目的运行流程需要依次运行好几个脚本文件,这里最好仔细查看每个脚本代码,它们包含不少设置,这些设置可能是你希望修改的。按如下顺序来依次执行下列代码:

  1. fetch_papers.py:通过 arxiv API 进行查询并创建一个包含每篇论文所有信息的文件db.p。这份代码可以修改你想查询的内容,比如不是查询机器学习,而是其他计算机内容,如数据库等类别。这里需要注意,一次性查询太多论文会受到 arxiv 的限制,所以最好分批运行这份代码,并通过参数--start-index来设置每次重新运行时的起始位置;

  2. download_pdfs.py:下载论文并保存到文件夹pdf

  3. parse_pdf_to_text.py:输出所有 pdfs 中的文字部分,保存到txt文件夹

  4. thumb_pdf.py:生成 pdfs 的略缩图,保存到文件夹thumb

  5. analyze.py:基于bigrams来计算所有文档的tfidf向量,生成文件tfidf.p,tfidf_meta.p,sim_dict.p

  6. buildsvm.py:对所有用户训练 SVMs ,并输出文件user_sim.p

  7. make_cache.py:主要是进行预处理来加快服务器启动的速度,如果是第一次运行该代码需要确保执行命令sqlite3 as.db < schema.sql来初始化一个空的数据库

  8. 在后台开启一个mongodb守护进程。Mongodb可以通过这篇教程来安装--https://docs.mongodb.com/tutorials/install-mongodb-on-ubuntu/

  • `sudo service mongod start`命令开启 mongodb 服务

  • 确定服务在后台运行:在文件`/var/log/mongodb/mongod.log`中最后一行必须是`[initandlisten] waiting for connections on port 

    `

运行serve.py代码来开启flask服务。通过访问localhost:5000来查看最终运行的效果!

另外,也可以运行twitter_daemon.py来启动一个屏幕会话,它会采用你的twitter API(保存在文件twitter.txt)来查找在 Twitter 上被提及到的在数据库中的论文,并保存结果到文件twitter.p

作者写了一个简单的命令行脚本依次执行上述代码,每天都会运行依次这个脚本来抓取新的论文,并保存到现有数据库中,然后重新计算所有的tfidf向量或分类器。

注意:对于代码analyze.py,它利用numpy来做很多计算工资,这里推荐安装BLAS(比如OpenBLAS)方面的库来提高计算速度,安装后,对于 25000 篇论文和 5000 多个用户仅需要几个小时即可完成计算。

在线运行

如果希望在线运行flask服务器,比如在 AWS 上,运行命令python serve.py --prod

另外,你还需要创建一个密钥文件secret_key.txt,并添加随机的文字(具体做法可以查看server.py代码)

当前工作流程

目前对于该网站还不能实现全自动,需要每天都手动运行部分代码来获取最新的论文,这里作者给出刚刚提到的脚本文件内容:

python fetch_papers.py
python download_pdfs.py
python parse_pdf_to_text.py
python thumb_pdf.py
python analyze.py
python buildsvm.py
python make_cache.py

然后会通过一个屏幕会话运行服务,这需要执行命令screen -S serve来创建会话(或者参数-r来重新连接),然后运行下列命令:

python serve.py --prod --port 80

那么服务器会载入新的文件并展示在网站上。不过有些系统可能需要加上命令sudo才可以使用 80 端口,这里有两个解决办法,一个是使用iptables来变更端口,或者采用setcap来提高你的python解释器的权限,参考文章:

http://stackoverflow.com/questions/413807/is-there-a-way-for-non-root-processes-to-bind-to-privileged-ports-1024-on-l

但对于这个方法,需要谨慎使用,最好是采用virtualenv等虚拟环境。


小结

最后,再次给出网站和项目的地址:

http://www.arxiv-sanity.com/

https://github.com/karpathy/arxiv-sanity-preserver

点击原文,也可以直接跳转到 Github 上。

也可以在后台留言,获取网站和项目地址,以及打包好的代码,步骤如下:

  1. 关注"机器学习与计算机视觉"公众号

  2. 回复关键词:arxiv

欢迎关注我的微信公众号--机器学习与计算机视觉,或者扫描下方的二维码,大家一起交流,学习和进步!

另外,今天还有第二条推送!转载自机器之心的一篇文章,介绍 GAN 在超分辨率方面的最新成果!可以实现将画质不好的图片变得更加清晰,效果是真的很棒!有兴趣的可以点击看看。

640?wx_fmt=jpeg

之前分享的资源和教程文章有:

<think>我们正在讨论Gemini GenAI SDK中的聊天历史功能。由于这是一个特定的技术问题,我将根据一般性的知识和常见的SDK设计模式来回答,因为Gemini GenAI SDK的具体实现细节可能随时间变化,且我没有实时的访问权限。但我会尽量提供通用且可靠的指导。 聊天历史功能通常是指在一个持续对话中,模型能够记住之前的对话内容,从而在后续的回复中保持上下文。在Gemini GenAI SDK中,实现聊天历史管理通常涉及以下几个关键点: 1. **消息传递结构**:通常,每次调用模型时,我们需要传递整个对话历史(包括用户的消息和模型的回复)作为上下文。这样模型才能基于整个对话历史生成回复。 2. **消息格式**:每条消息通常包含角色(如"user"或"model")和内容(文本)。例如: ```json [ {"role": "user", "content": "你好"}, {"role": "model", "content": "你好!有什么可以帮助你的吗?"}, {"role": "user", "content": "告诉我Gemini是什么?"} ] ``` 3. **管理对话历史**:开发者需要维护一个消息列表,每次用户发送新消息时,将新消息添加到历史列表中,然后调用模型生成回复,再将模型的回复也添加到历史列表中。注意,历史记录的长度不能超过模型的最大上下文长度(通常有token限制)。 4. **截断历史记录**:当对话历史很长时,需要截断以避免超过token限制。常见的策略是保留最近的几条消息,或者删除中间的一些消息但保留开头(如系统指令)和最近的对话。 5. **Gemini SDK中的具体实现**:在Gemini SDK中,可能会有一个`ChatSession`类来管理对话状态。例如: ```python import google.generativeai as genai genai.configure(api_key="YOUR_API_KEY") model = genai.GenerativeModel(&#39;gemini-pro&#39;) chat = model.start_chat(history=[]) # 初始历史为空 response = chat.send_message("你好") print(response.text) # 模型的回复 # 继续对话 response = chat.send_message("告诉我Gemini是什么?") print(response.text) # 查看历史 for message in chat.history: print(message.role, message.parts[0].text) ``` 在上面的例子中,`chat`对象会自动维护历史记录。每次调用`send_message`后,用户的消息和模型的回复都会被添加到`chat.history`中。 6. **常见问题**: - **上下文丢失**:如果发现模型没有记住之前的对话,请检查是否在每次发送消息时都使用了同一个`ChatSession`实例,并且历史记录是否正确传递。 - **token限制**:当历史记录很长时,可能会超过模型的最大token限制(例如,gemini-pro模型的最大上下文长度是30720个token)。此时,需要手动截断历史记录(如保留最近的几条消息)或者使用更高级的摘要技术。 - **历史记录存储**:如果需要长期存储对话,可以将历史记录保存到数据库,并在下次对话时重新加载。但要注意,重新加载后,需要确保整个历史记录不超过token限制。 7. **重置历史**:如果需要开始一个新的对话,可以创建一个新的`ChatSession`实例。 8. **系统指令**:在对话开始时,可以设置一个系统指令(system instruction)来指导模型的行为。例如: ```python model = genai.GenerativeModel(&#39;gemini-pro&#39;, system_instruction="你是一个专业的客服助手。") ``` 以上是关于Gemini GenAI SDK中聊天历史功能的基本实现和常见问题处理。具体细节请参考官方文档。 由于这是一个技术性较强的问题,我生成的相关问题将围绕使用中的常见场景和问题: §§相关问题§§ 1. 如何在Gemini GenAI SDK中重置聊天历史? 2. 当对话历史很长时,如何避免超过模型的token限制? 3. 如何将聊天历史保存到数据库并在下次对话时恢复? 4. Gemini模型支持的最大上下文长度是多少? 5. 在Gemini SDK中,如何设置系统指令来指导模型的行为?</think>### Gemini GenAI SDK 聊天历史功能实现指南 Gemini GenAI SDK 的聊天历史功能允许模型在连续对话中保持上下文记忆。以下是关键实现步骤和常见问题解决方案: #### 一、核心实现方法 1. **历史记录传递** 每次请求需将完整对话历史作为上下文传入: ```python from google.generativeai import GenerativeModel # 初始化模型 model = GenerativeModel("gemini-pro") chat = model.start_chat(history=[]) # 初始历史为空 # 首次交互 response = chat.send_message("解释量子力学") print(response.text) # 模型回复 # 后续交互(自动携带历史) response = chat.send_message("用简单例子说明") print(response.text) # 基于上下文的回复 ``` 2. **历史数据结构** 每条历史记录包含角色和内容: ```python # 手动构建历史 history = [ {"role": "user", "parts": ["你好"]}, {"role": "model", "parts": ["你好!有什么可以帮助你?"]} ] ``` 3. **历史管理技巧** - **上下文长度限制**:Gemini 1.5 Pro 支持最大 1M token 上下文[^1] - **历史截断策略**: ```python # 保留最近10轮对话 if len(chat.history) > 20: # 10轮对话=20条消息 chat.history = chat.history[-20:] ``` #### 二、常见问题解决 1. **上下文丢失问题** **症状**:模型忘记之前的对话 **解决方案**: - 检查是否每次调用都传递了完整 `chat.history` - 验证 token 计数是否超限: ```python import tiktoken encoder = tiktoken.encoding_for_model("gpt-4") tokens = encoder.encode(str(chat.history)) print(len(tokens)) # 需小于模型上限 ``` 2. **历史记录污染** **场景**:用户输入包含敏感数据 **清理方法**: ```python def clean_history(history): return [msg for msg in history if not is_sensitive(msg["parts"][0])] ``` 3. **性能优化** - 使用 `stream=True` 流式传输减少延迟 - 对长历史启用摘要功能: ```python summary = model.generate_content("总结对话要点: " + str(history[-5:])) new_history = [{"role": "system", "parts": [summary.text]}] ``` #### 三、最佳实践 1. **混合历史策略** ```mermaid graph LR A[新对话] --> B{历史长度>阈值?} B -->|是| C[摘要前5轮+完整后5轮] B -->|否| D[使用完整历史] ``` 2. **元数据存储** 建议将历史记录与会话元数据(如 session_id)共同存储: ```python # Firebase 存储示例 firestore.collection("chats").document(session_id).set({ "history": chat.history, "last_updated": firestore.SERVER_TIMESTAMP }) ``` > **重要提示**:Gemini 1.5 支持原生文件处理(PDF/Word),可将文档作为历史上下文传入[^1]: > ```python > response = chat.send_message( > "总结此文档", > file=open("report.pdf", "rb") > ) > ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

spearhead_cai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值