如何使用Python+ChatGPT批量生成论文
作者:JarodYv 发布时间:2023-10-01 20:30:17
用Python+ChatGPT批量生成论文概述
做算法研究离不开阅读大量论文。从海量论文中找到需要的论文往往耗费算法团队不少的精力。
ChatGPT官方例子中有一个“TL;DR”摘要生成,非常适合生成论文摘要。
于是我用python+GPT-3 API开发了一个工具,可以直接从arxiv地址生成论文概述。实现步骤如下:
下载论文
第一步,我们要先拿到论文正文。
从arxiv上下载论文非常简单,如果你知道论文编号(比如2302.08996),那么论文的pdf下载地址为:https://arxiv.org/pdf/[论文编号].pdf
。我们只需要发起网络请求即可将论文下载到本地。
我这里使用requests
库发起网络请求,你可以使用任何你喜欢库完成论文下载。
def download_paper(paper_id: str, file_name: Optional[str] = None) -> Optional[str]:
""" 根据论文id将论文下载到本地
Parameters
-----------
paper_id: str
论文id
file_name: Optional[str]
本地文件名,如果为空则用论文id做文件名
Returns
-------
result: Optional[str]
论文下载结果。成功则返回本地文件路径,失败则返回None
"""
paper_url = f"https://arxiv.org/pdf/{paper_id}.pdf"
if not file_name:
file_name = f"{paper_id}.pdf"
res = requests.get(url=paper_url)
if res.status_code == 200:
with open(file_name, "wb") as f:
f.write(res.content)
return file_name
return None
pdf转文本
ChatGPT只接受文本输入,所以拿到论文后,我们需要将pdf格式的论文转换为纯文本。这里给大家推荐一个好用的pdf转文本库——pdfplumber
。
pdfplumber
使用非常简单,只要打开文件,即可通过pdfplumber.pages
获取到每一页pdf内容。然后调用pdfplumber.Page
类的extract_text()
方法就能提取页面的文本。示例代码如下:
def pdf2txt(file_name: str | pdfplumber.PDF, page_start: int, page_end: int) -> str:
"""
Parameters
-----------
file_name: str | pdfplumber.PDF
pdf文件路径或pdfplumber.PDF实例
page_start: int
要转换的起始页页码
page_end: int
要转换的结束页页码
Returns
-------
content: str
转换后的文本
"""
content = ""
if isinstance(file_name, str):
pages = pdfplumber.open(file_name).pages
elif isinstance(file_name, pdfplumber.PDF):
pages = file_name.pages
else:
raise AttributeError("需要传入pdf路径或PDF对象")
for page in pages[page_start:page_end]:
content += page.extract_text()
return content
上面的代码会逐页提取给定pdf文档指定页码范围内的内容并返回。
用GPT-3生成概述
有了文本,我们就可以用ChatGPT来生成概述了。
首先我们导入openai
库,并配置好参数:
import openai
openai.api_key = "YOUR_API_KEY"
TLDRParameter = {
"model": "text-davinci-003",
"max_tokens": 2048,
"temperature": 0.3,
"top_p": 1.0,
"frequency_penalty": 0.0,
"presence_penalty": 0.0,
"stop": ["\n\n"]
}
tldr_tag = "\n\n tl;dr:" # 给ChatGPT明确的文本补全意图
这里的tldr_tag
需要稍微解释一下,这段字符串会添加在我们论文文本的末尾,用于提示ChatGPT我们要做的是上面文本的摘要。为了让ChatGPT能够将论文内容和我们给出的提示区分开来,在参数中我们设置了stop
,用于告诉ChatGPT输入到哪里结束。
输出概述
ChatGPT对输入长度是有限制的,因此我们不能一次性将整个论文内容输入进去,需要一页一页得输入并生成每一页的概述。
pages = pdfplumber.open(file_name).pages
for p in pages:
content = p.extract_text() + tldr_tag
response = openai.Completion.create(prompt=content, **TLDRParameter)
print(f"Page1 {index + 1}:\n")
print(response["choices"][0]["text"])
print("\n\n")
集成测试
将上面的代码集成到一起,我们就可以得到一个完整可用的论文概述工具
import requests
import pdfplumber
import openai
from typing import Optional
openai.api_key = "YOUR_API_KEY"
TLDRParameter = {
"model": "text-davinci-003",
"max_tokens": 2048,
"temperature": 0.3,
"top_p": 1.0,
"frequency_penalty": 0.0,
"presence_penalty": 0.0,
"stop": ["\n"]
}
tldr_tag = "\ntl;dr:"
def download_paper(paper_id: str, file_name: Optional[str] = None) -> Optional[str]:
""" 根据论文id将论文下载到本地
Parameters
-----------
paper_id: str
论文id
file_name: Optional[str]
本地文件名,如果为空则用论文id做文件名
Returns
-------
result: Optional[str]
论文下载结果。成功则返回本地文件路径,失败则返回None
"""
paper_url = f"https://arxiv.org/pdf/{paper_id}.pdf"
if not file_name:
file_name = f"{paper_id}.pdf"
res = requests.get(url=paper_url)
if res.status_code == 200:
with open(file_name, "wb") as f:
f.write(res.content)
return file_name
return None
if __name__ == '__main__':
file_name = download_paper('2302.08996')
pages = pdfplumber.open(file_name).pages
for index, page in enumerate(pages):
content = page.extract_text() + tldr_tag
response = openai.Completion.create(prompt=content, **TLDRParameter)
print(f"Page {index + 1}:\n")
print(response["choices"][0]["text"])
print("\n\n")
我用最新发出的2302.08996做测试,输出如下:
Page 1:
We employ meta reinforcement learning to model short-duration trading in financial markets as a sequential decision-making problem. We incorporate symbolic features based on frequently occurring patterns in price series to improve the performance of our meta-RL algorithm. Preliminary results on real data indicate that meta-RL and logical features are more effective than vanilla RL or primary price features alone.
Page 2:
Meta-learning techniques, such as Inductive Logic Programming (ILP) and RL2, can be used to train a trading agent on a new task with limited data.
Page 3:
We propose a meta-RL agent that can rapidly adapt to new reward patterns. We use PPO to train the agent and an LSTM agent. We also use hand-crafted features and learned logical features to augment the agent's neural network model. Results show that the agent outperforms vanilla reinforcement learning.
Page 4:
上面每一页的输出都很好地概括了该页的核心内容,其中第四页为空是因为这一页绝大部分内容是参考文献,ChatGPT也很聪明的没有返回概述。
来源:https://blog.csdn.net/jarodyv/article/details/129220264
猜你喜欢
- 在ASP中,直接使用“Insert into” 语句与使用ADO中AddNew方法有什么区别?哪一种更好呢?AddNew方法的实质就是封装了
- 例:公司员工采取三个轮班制度:凌晨0:00到早上8:00为第一班,早上8:00到下午4:00为第二班,下午4:00到晚上12:00为第三班。
- 模仿IE自动完成功能,支持Firefox.支持方向键操作运行代码框<!DOCTYPE HTML PUBLIC "-//W3C
- 本文实例为大家分享了微信小程序上传视频,供大家参考,具体内容如下微信开发者工具需要安装ffmpeg环境才能正常使用下面的官方方法。1、调用官
- 如何在SQL2000的查询中使用XML-Data?具体程序如下:orders.asp<%@ Language=VBScrip
- 问题:1.一个销售系统,设有各级代理商,每个代理商的表是这样设计的 数据库结构表1: 代理商资料表[id]
- CSS 文件的大小和所引起的 HTTP 的请求数是 CSS 性能的最关键因素回流(reflow)和渲染时间(非常!)没那么重要副本(dupl
- 采集文章给建站带来了很大的方便,特别是一些小网站,人员有限,资金有限,适当的使用采集功能可以很快丰富我们的网站,采集这么厉害可能你会觉的代码
- 代码如下:Create PROCEDURE Batch_Delete @TableName nvarchar(100), --表
- 本文实例讲述了Python疯狂填词程序实现方法。分享给大家供大家参考,具体如下:题目如下:创建一个疯狂填词程序,它将读入文件,并让用户在该文
- python除法负数商的取整方式与C++不同python:5 / -2 = -3若想和C++行为相同,可以使用 int(operator.t
- 注:所有文字,除注明网站类型外,其他均针对企业站点.请随时注意留言,若修改则会在首页提示文字里标注.若牵扯到业务方面的问题,我可能不会做过多
- Application对象 Application对象是个应用程序级的对象,用来在所有用户间共享信息,并可以在Web应用程序运行期间持久地保
- 在软件开发过程中经常会遇到数据库升迁的问题,原因比较多,如acsess访问速度比sql server慢、删除数据记录后access会留下空档
- 经过了上个星期的努力学习,对处理html又有了新的发现感觉真的很不错可以说js的威力在处理html代码方面我又有所领悟了1、截取特定长度字符
- 在运维场景下,我们经常需要在服务器上用正则表达式来匹配IP地址。shell和其它编程语言一样,也可以使用正则分组捕获,不过不能使用 $1或\
- composer是PHP中非常优秀的一个包管理工具,可以帮助我们来管理项目所需要依赖的所有包以及插件,也可以用来从packagist中创建一
- 上期回顾:亚马逊购物用户体验分析 (二)方便的导航元素任何网上商店的成功,至关重要的一点,就是用户可以简单轻松地使用导航条。基本店铺分类,用
- 我们在日常开发中,我们经常会面对复杂的子系统,其中包含许多相互关联的类和接口。直接使用这些类和接口可能会导致代码的复杂性增加,使得系统难以维
- 关于asp随机数的相关文章:asp生成一个不重复的随机数字 8个asp生成随机字符的函数 <html> <me