如何使用 GPT API 从 PDF 出版物导出研究图表?

原文地址:how-to-use-gpt-api-to-export-a-research-graph-from-pdf-publications

揭示内部结构——提取研究实体和关系

2024 年 2 月 6 日

介绍

研究图是研究对象的结构化表示,它捕获有关实体的信息以及研究人员、组织、出版物、资助和研究数据之间的关系。目前,出版物以 PDF 文件形式提供,由于文本格式自由,因此很难解析 PDF 文件以提取结构化信息。在本文中,我们将尝试从出版物的 PDF 中创建研究图,方法是从文本中提取相关信息,并使用 OpenAI 将其组织成图结构。

4

OpenAI

在这项工作中,我们使用 OpenAI API 和 GPT 的新助手功能(目前处于测试阶段),将 PDF 文档转换为一组基于研究图模式的结构化 JSON 文件。

助手 API

Assistants API 允许你在应用程序中构建人工智能(AI)助理。助手可以根据预定准则使用模型、工具和信息回答用户的问题。这是一个测试版 API,目前正在积极开发中。使用助手 API,我们可以使用 OpenAI 托管的工具,如代码解释器和知识检索。在本文中,我们将重点介绍知识检索。

知识检索

有时,我们需要人工智能模型回答基于未知知识的查询,如用户提供的文档或敏感信息。我们可以使用助手 API 知识检索工具,用这些信息来增强模型。我们可以将文件上传到助手,它就会自动对文档进行分块,并创建和存储嵌入,从而在数据上实现矢量搜索。

举例说明

在我们的示例中,我们将向 OpenAI 助手和知识检索工具上传 PDF 格式的出版物文件,以获得给定出版物图模式的 JSON 输出。本示例中使用的出版物可通过以下链接访问

5

步骤 1

读取存储出版物 PDF 的输入路径和存储 JSON 输出的输出路径。

import configparser
config = configparser.ConfigParser()
config.read('{}/config.ini'.format(current_path))
input_path = config['DEFAULT']['Input-Path']
output_path = config['DEFAULT']['Output-Path']
debug = config['DEFAULT']['Debug']

步骤 2

从输入路径中获取所有 PDF 文件。

onlyfiles = [f for f in os.listdir(input_path) if os.path.isfile(os.path.join(input_path, f))]

步骤 3

然后,我们需要初始化助手以使用知识检索工具。为此,我们需要在 API 中指定 “检索 ”工具的类型。我们还需要指定助手的指令和要使用的 OpenAI 模型。

my_file_ids = []
if client.files.list().data==[]:for f in onlyfiles:file = client.files.create(file=open(input_path + f, "rb"),purpose='assistants')my_file_ids.append(file.id)
# Add the file to the assistant
assistant = client.beta.assistants.create(instructions = "You are a publication database support chatbot. Use pdf files uploaded to best respond to user queries in JSON.",model = "gpt-4-1106-preview",tools = [{"type": "retrieval"}],# Do not attach all files to the assistant, otherwise, it will mismatch the answers even though specify file ID in query messages.# We will attach to each message instead
)

步骤 4

然后,我们指定需要从出版物文件中提取的信息,并将其作为用户查询传递给助手。在对助手的指令进行试验后,我们发现在每条用户信息中要求使用 JSON 格式能产生最一致的输出。

user_msgs = ["Print the title of this paper in JSON","Print the authors of this paper in JSON","Print the abstract section of the paper in JSON","Print the keywords of the paper in JSON","Print the DOI number of the paper in JSON","Print the author affiliations of the paper in JSON","Print the reference section of the paper in JSON"]

步骤 5

下一步是将查询传递给助手以生成输出。我们需要为每个用户查询创建一个单独的线程对象,其中包含作为用户消息的查询。然后,我们运行线程并获取助手的答案。

all_results = []
for i in my_file_ids:print('\n#####')# the JSON result it can extract and parse, hopefullyfile_result = {}for q in user_msgs:# create thread, user message and run objects for each querythread = client.beta.threads.create()msg = client.beta.threads.messages.create(thread_id=thread.id,role="user",content=q,file_ids=[i] # specify the file/publication we want to extract from)print('\n',q)run = client.beta.threads.runs.create(thread_id=thread.id,assistant_id=assistant.id,additional_instructions="If answer cannot be found, print 'False'" # not very useful at the time of this presentation)# checking run status by retrieving updated object each timewhile run.status in ["queued",'in_progress']:print(run.status) time.sleep(5)run = client.beta.threads.runs.retrieve(thread_id=thread.id,run_id=run.id)# usually a rate limit errorif run.status=='failed':  logging.info("Run failed: ", run)if run.status=='completed':print("<Complete>")# extract updated message object, this includes user messagesmessages = client.beta.threads.messages.list(thread_id=thread.id)for m in messages:if m.role=='assistant':value = m.content[0].text.value # get the text responseif "json" not in value:if value=='False':logging.info("No answer found for ", str(q))else:logging.info("Not JSON output, maybe no answer found in the file or model is outdated: ", str(value))else:# clean the response and try to parse as jsonvalue = value.split("```")[1].split('json')[-1].strip()try: d = json.loads(value)file_result.update(d)print(d)except Exception as e:logging.info(f"Query {q} \nFailed to parse string to JSON: ", str(e))print(f"Query {q} \nFailed to parse string to JSON: ", str(e))all_results.append(file_result)

上述出版文件生成的 JSON 输出为:

[{'title': 'Dodes (diagnostic nodes) for Guideline Manipulation','authors': [{'name': 'PM Putora','affiliation': 'Department of Radiation-Oncology, Kantonsspital St. Gallen, St. Gallen, Switzerland'},{'name': 'M Blattner','affiliation': 'Laboratory for Web Science, Zürich, Switzerland'},{'name': 'A Papachristofilou','affiliation': 'Department of Radiation Oncology, University Hospital Basel, Basel, Switzerland'},{'name': 'F Mariotti','affiliation': 'Laboratory for Web Science, Zürich, Switzerland'},{'name': 'B Paoli','affiliation': 'Laboratory for Web Science, Zürich, Switzerland'},{'name': 'L Plasswilma','affiliation': 'Department of Radiation-Oncology, Kantonsspital St. Gallen, St. Gallen, Switzerland'}],'Abstract': {'Background': 'Treatment recommendations (guidelines) are commonly represented in text form. Based on parameters (questions) recommendations are defined (answers).','Objectives': 'To improve handling, alternative forms of representation are required.','Methods': 'The concept of Dodes (diagnostic nodes) has been developed. Dodes contain answers and questions. Dodes are based on linked nodes and additionally contain descriptive information and recommendations. Dodes are organized hierarchically into Dode trees. Dode categories must be defined to prevent redundancy.','Results': 'A centralized and neutral Dode database can provide standardization which is a requirement for the comparison of recommendations. Centralized administration of Dode categories can provide information about diagnostic criteria (Dode categories) underutilized in existing recommendations (Dode trees).','Conclusions': 'Representing clinical recommendations in Dode trees improves their manageability handling and updateability.'},'Keywords': ['dodes','ontology','semantic web','guidelines','recommendations','linked nodes'],'DOI': '10.5166/jroi-2-1-6','references': [{'ref_number': '[1]','authors': 'Mohler J Bahnson RR Boston B et al.','title': 'NCCN clinical practice guidelines in oncology: prostate cancer.','source': 'J Natl Compr Canc Netw.','year': '2010 Feb','volume_issue_pages': '8(2):162-200'},{'ref_number': '[2]','authors': 'Heidenreich A Aus G Bolla M et al.','title': 'EAU guidelines on prostate cancer.','source': 'Eur Urol.','year': '2008 Jan','volume_issue_pages': '53(1):68-80','notes': 'Epub 2007 Sep 19. Review.'},{'ref_number': '[3]','authors': 'Fairchild A Barnes E Ghosh S et al.','title': 'International patterns of practice in palliative radiotherapy for painful bone metastases: evidence-based practice?','source': 'Int J Radiat Oncol Biol Phys.','year': '2009 Dec 1','volume_issue_pages': '75(5):1501-10','notes': 'Epub 2009 May 21.'},{'ref_number': '[4]','authors': 'Lawrentschuk N Daljeet N Ma C et al.','title': "Prostate-specific antigen test result interpretation when combined with risk factors for recommendation of biopsy: a survey of urologist's practice patterns.",'source': 'Int Urol Nephrol.','year': '2010 Jun 12','notes': 'Epub ahead of print'},{'ref_number': '[5]','authors': 'Parmelli E Papini D Moja L et al.','title': 'Updating clinical recommendations for breast colorectal and lung cancer treatments: an opportunity to improve methodology and clinical relevance.','source': 'Ann Oncol.','year': '2010 Jul 19','notes': 'Epub ahead of print'},{'ref_number': '[6]','authors': 'Ahn HS Lee HJ Hahn S et al.','title': 'Evaluation of the Seventh American Joint Committee on Cancer/International Union Against Cancer Classification of gastric adenocarcinoma in comparison with the sixth classification.','source': 'Cancer.','year': '2010 Aug 24','notes': 'Epub ahead of print'},{'ref_number': '[7]','authors': 'Rami-Porta R Goldstraw P.','title': 'Strength and weakness of the new TNM classification for lung cancer.','source': 'Eur Respir J.','year': '2010 Aug','volume_issue_pages': '36(2):237-9'},{'ref_number': '[8]','authors': 'Sinn HP Helmchen B Wittekind CH.','title': 'TNM classification of breast cancer: Changes and comments on the 7th edition.','source': 'Pathologe.','year': '2010 Aug 15','notes': 'Epub ahead of print'},{'ref_number': '[9]','authors': 'Paleri V Mehanna H Wight RG.','title': "TNM classification of malignant tumours 7th edition: what's new for head and neck?",'source': 'Clin Otolaryngol.','year': '2010 Aug','volume_issue_pages': '35(4):270-2'},{'ref_number': '[10]','authors': 'Guarino N.','title': 'Formal Ontology and Information Systems','source': '1998 IOS Press'},{'ref_number': '[11]','authors': 'Uschold M Gruniger M.','title': 'Ontologies: Principles Methods and Applications.','source': 'Knowledge Engineering Review','year': '1996','volume_issue_pages': '11(2)'},{'ref_number': '[12]','authors': 'Aho A Garey M Ullman J.','title': 'The Transitive Reduction of a Directed Graph.','source': 'SIAM Journal on Computing','year': '1972','volume_issue_pages': '1(2): 131–137'},{'ref_number': '[13]','authors': 'Tai K','title': 'The tree-to-tree correction problem.','source': 'Journal of the Association for Computing Machinery (JACM)','year': '1979','volume_issue_pages': '26(3):422-433'}]}]

步骤 6

文件对象和助手对象需要清理,因为它们在 “检索 ”模式下需要花钱。此外,这也是一种良好的编码实践。

for f in client.files.list().data:client.files.delete(f.id)
# Retrieve and delete running assistants
my_assistants = client.beta.assistants.list(order="desc",
)
for a in my_assistants.data:    response = client.beta.assistants.delete(a.id)print(response)

步骤 7

下一步是使用 Python Networkx 软件包生成图形可视化。

import networkx as nx
import matplotlib.pyplot as plt
G = nx.DiGraph()
node_colors = []
key = "jroi/" + all_results[0]['title']
G.add_nodes_from([(all_results[0]['title'], {'doi': all_results[0]['DOI'], 'title': all_results[0]['title'], 'source': 'jroi', 'key': key})])
node_colors.append('#4ba9dc')
for author in all_results[0]['authors']:key = "jroi/" + author['name']G.add_nodes_from([(author['name'], {'key': key, 'local_id': author['name'], 'full_name': author['name'], 'source': 'jroi'})])G.add_edge(all_results[0]['title'], author['name'])node_colors.append('#63cc9e')
for reference in all_results[0]['references']:key = "jroi/" + reference['title']G.add_nodes_from([(reference['title'].split('.')[0][:25] + '...', {'title': reference['title'], 'source': 'jroi', 'key': key})])G.add_edge(all_results[0]['title'], reference['title'].split('.')[0][:25] + '...')node_colors.append('#4ba9dc')
pos = nx.spring_layout(G)
labels = nx.get_edge_attributes(G, 'label')
nx.draw(G, pos, with_labels=True, node_size=1000, node_color=node_colors, font_size=7, font_color='black')
nx.draw_networkx_edge_labels(G, pos, edge_labels=labels)
plt.savefig("graph_image.png")
plt.show()

可视化图表如下:

6

注:请注意,OpenAI 生成的输出结构可能因执行方式不同而不同。因此,你可能需要根据该结构更新上述代码。

结论

总之,利用 GPT API 从 PDF 出版物中提取研究图为研究人员和数据分析师提供了一个强大而高效的解决方案。该工作流程简化了将 PDF 出版物转换为结构化、可访问的研究图表的过程。但是,我们也必须仔细关注大型语言模型 (LLM) 生成的回复的不一致性。随着时间的推移,通过定期更新和改进提取模型,可以进一步提高准确性和相关性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/319416.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

brpc profiler

cpu profiler cpu profiler | bRPC MacOS的额外配置 在MacOS下&#xff0c;gperftools中的perl pprof脚本无法将函数地址转变成函数名&#xff0c;解决办法是&#xff1a; 安装standalone pprof&#xff0c;并把下载的pprof二进制文件路径写入环境变量GOOGLE_PPROF_BINARY_PA…

Microsoft 365 for Mac(Office 365)v16.84正式激活版

office 365 for mac包括Word、Excel、PowerPoint、Outlook、OneNote、OneDrive和Teams的更新。Office提供了跨应用程序的功能&#xff0c;帮助用户在更短的时间内创建令人惊叹的内容&#xff0c;您可以在这里创作、沟通、协作并完成重要工作。 Microsoft 365 for Mac(Office 36…

1. 深度学习笔记--神经网络中常见的激活函数

1. 介绍 每个激活函数的输入都是一个数字&#xff0c;然后对其进行某种固定的数学操作。激活函数给神经元引入了非线性因素&#xff0c;如果不用激活函数的话&#xff0c;无论神经网络有多少层&#xff0c;输出都是输入的线性组合。激活函数的意义在于它能够引入非线性特性&am…

【webrtc】MessageHandler 7: 基于线程的消息处理:切换main线程向observer发出通知

以当前线程作为main线程 RemoteAudioSource 作为一个handler 仅实现一个退出清理的功能 首先on message的处理会切换到main 线程 :main_thread_其次,这里在main 线程对sink_ 做清理再次,在main 线程做出状态改变,并能通知给所有的observer 做出on changed 行为。对接mediac…

clang:在 Win10 上编译 MIDI 音乐程序(二)

先从 Microsoft C Build Tools - Visual Studio 下载 1.73GB 安装 "Microsoft C Build Tools“ 访问 Swift.org - Download Swift 找到 Windows 10&#xff1a;x86_64 下载 swift-5.10-RELEASE-windows10.exe 大约490MB 建议安装在 D:\Swift\ &#xff0c;安装后大约占…

《金融研究》:普惠金融改革试验区DID工具变量数据(2012-2023年)

数据简介&#xff1a;本数据集包括普惠金融改革试验区和普惠金融服务乡村振兴改革试验区两类。 其中&#xff0c;河南兰考、浙江宁波、福建龙岩和宁德、江西赣州和吉安、陕西铜川五省七地为普惠金融改革试验区。山东临沂、浙江丽水、四川成都三地设立的是普惠金融服务乡村振兴…

手撸Mybatis(二)—— 配置项的获取

本专栏的源码&#xff1a;https://gitee.com/dhi-chen-xiaoyang/yang-mybatis。 配置项解析 在mybatis中&#xff0c;一般我们会定义一个mapper-config.xml文件&#xff0c;来配置数据库连接的相关信息&#xff0c;以及我们的mapperxml文件存放目录。在本章&#xff0c;我们会…

docker-compose启动mysql5.7报错

描述一下问题经过&#xff1a; 使用docker compose 部署mysql5.7 文件如下: 使用命名卷的情况下&#xff0c;匿名卷不存在该问题 services:mysql:restart: alwaysimage: mysql:5.7container_name: mysql-devports:- 3306:3306environment:- MYSQL_DATABASEdev- MYSQL_ROOT_PAS…

团队经理口才训练教案(3篇)

团队经理口才训练教案&#xff08;3篇&#xff09; **篇&#xff1a;基础口才训练 一、教学目标 让团队经理了解口才在团队管理中的重要性。 教授基础口才技巧&#xff0c;如发音、语速、语调等。 二、教学内容 口才的重要性 强调团队经理的口才能力对团队凝聚力、沟通…

详细介绍ARM-ORACLE Database 19c数据库下载

目录 1. 前言 2. 获取方式 2.1 ORACLE专栏 2.2 ORACLE下载站点 1. 前言 现有网络上已有非常多关于ORACLE数据库机下载的介绍&#xff0c;但对于ARM平台的介绍不多&#xff0c;借此机会我将该版的下载步骤做如下说明&#xff0c;希望能够一些不明之人提供帮助和参考 2. 获…

分享一篇关于AGI的短文:苦涩的教训

学习强化学习之父、加拿大计算机科学家理查德萨顿&#xff08; Richard S. Sutton &#xff09;2019年的经典文章《The Bitter Lesson&#xff08;苦涩的教训&#xff09;》。 文章指出&#xff0c;过去70年来AI研究走过的最大弯路&#xff0c;就是过于重视人类既有经验和知识&…

Flutter笔记:美工设计.导出视频到RIVE

Flutter笔记 美工设计.导出视频到RIVE - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28…

目标跟踪—卡尔曼滤波

目标跟踪—卡尔曼滤波 卡尔曼滤波引入 滤波是将信号中特定波段频率滤除的操作&#xff0c;是抑制和防止干扰的一项重要措施。是根据观察某一随机过程的结果&#xff0c;对另一与之有关的随机过程进行估计的概率理论与方法。 历史上最早考虑的是维纳滤波&#xff0c;后来R.E.卡…

原生IP和住宅IP有什么区别?

原生IP和住宅IP在多个方面存在显著的区别。 从定义和来源来看&#xff0c;原生IP是指未经NAT&#xff08;网络地址转换&#xff09;处理的真实、公网可路由的IP地址&#xff0c;它直接从互联网服务提供商&#xff08;ISP&#xff09;获得&#xff0c;而不是通过代理服务器或VP…

【MATLAB】解决不同版本MATLAB出现中文乱码的问题

解决不同版本MATLAB出现中文乱码的问题 方法1&#xff1a;更改保存类型为GBK方法2&#xff1a;记事本打开方法3&#xff1a;Notepad参考 低版本matlab打开高版本Matlab的.m文件时&#xff0c;出现中文乱码问题。比如下图&#xff1a; 出现原因为&#xff1a; 编码格式不统一问…

批量抓取某电影网站的下载链接

思路&#xff1a; 进入电影天堂首页&#xff0c;提取到主页面中的每一个电影的背后的那个urL地址 a. 拿到“2024必看热片”那一块的HTML代码 b. 从刚才拿到的HTML代码中提取到href的值访问子页面&#xff0c;提取到电影的名称以及下载地址 a. 拿到子页面的页面源代码 b. 数据提…

Ansys Speos|进行智能手机镜头杂散光分析

本例的目的是研究智能手机Camera系统的杂散光。杂散光是指光向相机传感器不需要的散光光或镜面光&#xff0c;是在光学设计中无意产生的&#xff0c;会降低相机系统的光学性能。 在本例中&#xff0c;光学透镜系统使用Ansys Zemax OpticStudio (ZOS)进行设计&#xff0c;并使用…

A Bug‘s Life (并查集)

//新生训练 #include <iostream> #include <algorithm> using namespace std; const int N 5000; int p[N], sz[N]; int n, m; int find(int x) {if (p[x] ! x)p[x] find(p[x]);return p[x]; } int main() {int T;scanf("%d", &T);for (int k 1; …

RabbitMQ之顺序消费

什么是顺序消费 例如&#xff1a;业务上产生者发送三条消息&#xff0c; 分别是对同一条数据的增加、修改、删除操作&#xff0c; 如果没有保证顺序消费&#xff0c;执行顺序可能变成删除、修改、增加&#xff0c;这就乱了。 如何保证顺序性 一般我们讨论如何保证消息的顺序性&…

Flask教程3:jinja2模板引擎

文章目录 模板的导入与使用 模板的导入与使用 Flask通过render_template来实现模板的渲染&#xff0c;要使用这个方法&#xff0c;我们需要导入from flask import rander_template&#xff0c;模板中注释需放在{# #}中 模板的第一个参数为指定的模板文件名称&#xff0c;如自定…