如何使用Python+ChatGPT批量生成論文
用Python+ChatGPT批量生成論文概述
做算法研究離不開(kāi)閱讀大量論文。從海量論文中找到需要的論文往往耗費(fèi)算法團(tuán)隊(duì)不少的精力。
ChatGPT官方例子中有一個(gè)“TL;DR”摘要生成,非常適合生成論文摘要。
于是我用python+GPT-3 API開(kāi)發(fā)了一個(gè)工具,可以直接從arxiv地址生成論文概述。實(shí)現(xiàn)步驟如下:
下載論文
第一步,我們要先拿到論文正文。
從arxiv上下載論文非常簡(jiǎn)單,如果你知道論文編號(hào)(比如2302.08996),那么論文的pdf下載地址為:https://arxiv.org/pdf/[論文編號(hào)].pdf
。我們只需要發(fā)起網(wǎng)絡(luò)請(qǐng)求即可將論文下載到本地。
我這里使用requests
庫(kù)發(fā)起網(wǎng)絡(luò)請(qǐng)求,你可以使用任何你喜歡庫(kù)完成論文下載。
def download_paper(paper_id: str, file_name: Optional[str] = None) -> Optional[str]: """ 根據(jù)論文id將論文下載到本地 Parameters ----------- paper_id: str 論文id file_name: Optional[str] 本地文件名,如果為空則用論文id做文件名 Returns ------- result: Optional[str] 論文下載結(jié)果。成功則返回本地文件路徑,失敗則返回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轉(zhuǎn)文本
ChatGPT只接受文本輸入,所以拿到論文后,我們需要將pdf格式的論文轉(zhuǎn)換為純文本。這里給大家推薦一個(gè)好用的pdf轉(zhuǎn)文本庫(kù)——pdfplumber
。
pdfplumber
使用非常簡(jiǎn)單,只要打開(kāi)文件,即可通過(guò)pdfplumber.pages
獲取到每一頁(yè)pdf內(nèi)容。然后調(diào)用pdfplumber.Page
類的extract_text()
方法就能提取頁(yè)面的文本。示例代碼如下:
def pdf2txt(file_name: str | pdfplumber.PDF, page_start: int, page_end: int) -> str: """ Parameters ----------- file_name: str | pdfplumber.PDF pdf文件路徑或pdfplumber.PDF實(shí)例 page_start: int 要轉(zhuǎn)換的起始頁(yè)頁(yè)碼 page_end: int 要轉(zhuǎn)換的結(jié)束頁(yè)頁(yè)碼 Returns ------- content: str 轉(zhuǎn)換后的文本 """ 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對(duì)象") for page in pages[page_start:page_end]: content += page.extract_text() return content
上面的代碼會(huì)逐頁(yè)提取給定pdf文檔指定頁(yè)碼范圍內(nèi)的內(nèi)容并返回。
用GPT-3生成概述
有了文本,我們就可以用ChatGPT來(lái)生成概述了。
首先我們導(dǎo)入openai
庫(kù),并配置好參數(shù):
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明確的文本補(bǔ)全意圖
這里的tldr_tag
需要稍微解釋一下,這段字符串會(huì)添加在我們論文文本的末尾,用于提示ChatGPT我們要做的是上面文本的摘要。為了讓ChatGPT能夠?qū)⒄撐膬?nèi)容和我們給出的提示區(qū)分開(kāi)來(lái),在參數(shù)中我們?cè)O(shè)置了stop
,用于告訴ChatGPT輸入到哪里結(jié)束。
輸出概述
ChatGPT對(duì)輸入長(zhǎng)度是有限制的,因此我們不能一次性將整個(gè)論文內(nèi)容輸入進(jìn)去,需要一頁(yè)一頁(yè)得輸入并生成每一頁(yè)的概述。
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")
集成測(cè)試
將上面的代碼集成到一起,我們就可以得到一個(gè)完整可用的論文概述工具
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]: """ 根據(jù)論文id將論文下載到本地 Parameters ----------- paper_id: str 論文id file_name: Optional[str] 本地文件名,如果為空則用論文id做文件名 Returns ------- result: Optional[str] 論文下載結(jié)果。成功則返回本地文件路徑,失敗則返回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")
我用最新發(fā)出的2302.08996做測(cè)試,輸出如下:
Page 1:
We employ meta reinforcement learning to model short-duration trading in ?nancial 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:
上面每一頁(yè)的輸出都很好地概括了該頁(yè)的核心內(nèi)容,其中第四頁(yè)為空是因?yàn)檫@一頁(yè)絕大部分內(nèi)容是參考文獻(xiàn),ChatGPT也很聰明的沒(méi)有返回概述。
總結(jié)
試用了一天,我認(rèn)為模型對(duì)論文總結(jié)得很棒,用這個(gè)工具讀起論文來(lái)效率大增。盡管它永遠(yuǎn)可能取代實(shí)際閱讀整篇論文的重要過(guò)程,但卻可以作為探索發(fā)現(xiàn)更廣泛有趣科學(xué)的工具。
這篇文章更多的是一個(gè)概念的證明,如果想大規(guī)模用于生產(chǎn)還有很多細(xì)節(jié)要處理,比如pdf轉(zhuǎn)換的文本的格式,按頁(yè)轉(zhuǎn)換文本帶來(lái)得章節(jié)錯(cuò)位等問(wèn)題。然而,我覺(jué)得這些問(wèn)題都可以解決。在ChatGPT的加持下,我認(rèn)為我們比以往任何時(shí)候都更高效地處理更多科學(xué)信息。
到此這篇關(guān)于用Python+ChatGPT批量生成論文的文章就介紹到這了,更多相關(guān)Python+ChatGPT批量生成論文內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django RBAC權(quán)限管理設(shè)計(jì)過(guò)程詳解
這篇文章主要介紹了Django RBAC權(quán)限管理設(shè)計(jì)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08使用Python+OpenCV進(jìn)行卡類型及16位卡號(hào)數(shù)字的OCR功能
本文將使用Python+OpenCV實(shí)現(xiàn)模板匹配算法,以自動(dòng)識(shí)別卡的類型和以及16位卡號(hào)數(shù)字,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-08-08Python中常見(jiàn)的數(shù)據(jù)類型小結(jié)
這篇文章主要對(duì)Python中常見(jiàn)的數(shù)據(jù)類型進(jìn)行了總結(jié)歸納,很有參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08python通過(guò)自定義isnumber函數(shù)判斷字符串是否為數(shù)字的方法
這篇文章主要介紹了python通過(guò)自定義isnumber函數(shù)判斷字符串是否為數(shù)字的方法,涉及Python操作字符串判斷的相關(guān)技巧,需要的朋友可以參考下2015-04-04python實(shí)現(xiàn)在函數(shù)中修改變量值的方法
今天小編就為大家分享一篇python實(shí)現(xiàn)在函數(shù)中修改變量值的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07實(shí)現(xiàn)python版本的按任意鍵繼續(xù)/退出
本文給大家簡(jiǎn)單介紹了在windows以及l(fā)inux下實(shí)現(xiàn)python版本的按任意鍵繼續(xù)/退出功能,非常的簡(jiǎn)單實(shí)用,linux下稍微復(fù)雜些,有需要的小伙伴可以參考下2016-09-09Python直接使用plot()函數(shù)畫(huà)圖的方法實(shí)例
Python非常簡(jiǎn)單而又非常強(qiáng)大,它的功能之一就是畫(huà)出漂亮的圖表,實(shí)現(xiàn)數(shù)據(jù)的可視化,下面這篇文章主要給大家介紹了關(guān)于Python直接使用plot()函數(shù)畫(huà)圖的相關(guān)資料,需要的朋友可以參考下2022-05-05