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

news2025/1/22 19:37:08

原文地址: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, hopefully
    file_result = {}
   
    for q in user_msgs:
        # create thread, user message and run objects for each query
        thread = 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 time
        while 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 error
        if run.status=='failed':  logging.info("Run failed: ", run)
        if run.status=='completed':
            print("<Complete>")
            # extract updated message object, this includes user messages
            messages = 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 response
                    if "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 json
                        value = 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.coloradmin.cn/o/1641035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java Jackson-jr 库使用介绍

介绍 Jackson-jr 是一个轻量级的Java JSON 处理库。这个库被设计用来替代 Jackson 的复杂性。对比 Jackson 的复杂 API&#xff0c;Jackson-jr 的启动速度更快&#xff0c;包大小更小。 虽然Jackson databind&#xff08;如ObjectMapper&#xff09;是通用数据绑定的良好选择…

Redis---------分布式锁Redisson

概述 Redisson入门 第一步&#xff1a;引入依赖 <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.13.6</version></dependency> 第二步&#xff1a;配置文件 import org.redisson…

django搭建一个AI博客进行YouTube视频自动生成文字博客

文章目录 一、生成Django框架二、项目代码&#xff08;前端&#xff09;1、编写前端代码&#xff08;正文界面&#xff09;1.1、生产html框架1.2、添加live preview扩展1.3、更改title元素中文本1.4、添加CDN&#xff08;CSS&#xff09;样式链接1.5、nav标签1.6、在body标签中…

全面了解俄罗斯的VK开户和Yandex投放及内容运营

俄罗斯的VKontakte&#xff08;简称VK&#xff09;和Yandex是两个重要的在线平台&#xff0c;对于希望在俄罗斯市场进行推广的企业来说&#xff0c;了解如何在这些平台上开户和投放广告以及内容运营是非常关键的。 俄罗斯vk广告如何开户&#xff1f; 通过上海上弦进行俄罗斯V…

ASP.NET网络在线考试系统

摘 要 随着计算机技术的发展和互联网时代的到来&#xff0c;人们已经进入了信息时代&#xff0c;也有人称为数字化时代。数在数字化的网络环境下&#xff0c;学生希望得到个性化的满足&#xff0c;根据自己的情况进行学习&#xff0c;同时也希望能够得到科学的评价&#xff0c…

(4)步态识别论文研读——增强时空显著性的跨视图步态识别

Enhanced Spatial-Temporal Salience for Cross-View Gait Recognition Enhanced Spatial-Temporal Salience for Cross-View Gait Recognition | IEEE Journals & Magazine | IEEE Xplore 摘要:步态识别可以单独或与其他生物特征相结合&#xff0c;用于个人识别和再识别…

242 基于matlab的3D路径规划

基于matlab的3D路径规划&#xff0c;蚁群算法&#xff08;ACO&#xff09;和天牛须&#xff08;BAS&#xff09;以及两种结合的三种优化方式&#xff0c;对3D路径规划的最短路径进行寻优。程序已调通&#xff0c;可直接运行。 242 3D路径规划 蚁群算法和天牛须 - 小红书 (xiaoh…

Redis---------实现更改数据业务,包括缓存更新,缓存穿透雪崩击穿的处理

三种更新策略 内存淘汰是Redis内存的自动操作&#xff0c;当内存快满了就会触发内存淘汰。超时剔除则是在存储Redis时加上其有限期(expire)&#xff0c;有限期一过就会自动删除掉。而主动更新则是自己编写代码去保持更新&#xff0c;所以接下来研究主动更新策略。 主动更新策略…

docker系列9:容器卷挂载(下)

传送门 docker系列1&#xff1a;docker安装 docker系列2&#xff1a;阿里云镜像加速器 docker系列3&#xff1a;docker镜像基本命令 docker系列4&#xff1a;docker容器基本命令 docker系列5&#xff1a;docker安装nginx docker系列6&#xff1a;docker安装redis docker系…

基于yolov8的苹果腐败检测系统,系统既支持图像检测,也支持视频和摄像实时检测(pytorch框架)【python源码+UI界面+功能源码详解】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示&#xff1a; 基于yolov8的苹果腐败检测系统&#xff0c;系统既支持图像检测&#xff0c;也支持视频和摄像实时检测_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov8的苹果腐败检测系统是在pytorc…

QT:label标签/进度条的使用

文章目录 设置不同格式的文本显示图片文本对齐/自动换行/缩进/边距LCDNumber倒计时 ProgressBar进度条 设置不同格式的文本 在文本格式中&#xff0c;存在富文本&#xff0c;makedown格式的文本&#xff0c;还有纯文本&#xff0c;下面就依据这三个进行举例 #include "w…

MySQL-SQL执行流程及原理

1、SQL执行流程 2、查询流程 查询缓存&#xff1a; MySQL服务器如果在查询缓存中存在该SQL语句&#xff0c;就直接将结果返回给客户端&#xff0c;没有就进入解析器解析阶段。&#xff08;MySQL 8.0 删除该功能&#xff09;解析器&#xff1a;在解析器中对SQL语句进行语法及语…

G1 - 生成对抗网络(GAN)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目录 理论知识生成器判别器基本原理 环境步骤环境设置数据准备模型设计模型训练模型效果展示 总结与心得体会 理论知识 生成对抗网络&#xff08;Generative …

Docker 加持的安卓手机:随身携带的知识库(一)

这篇文章聊聊&#xff0c;如何借助 Docker &#xff0c;尝试将一台五年前的手机&#xff0c;构建成一个随身携带的、本地化的知识库。 写在前面 本篇文章&#xff0c;我使用了一台去年从二手平台购入的五年前的手机&#xff0c;K20 Pro。 为了让它能够稳定持续的运行&#xf…

如何让 PDF 书签从杂乱无序整洁到明丽清新

1、拉取书签&#xff08;详细步骤看文末扩展阅读&#xff09; 原状态 —— 杂乱无序 自动整理后的状态 —— 错落有致&#xff0c;但摩肩接踵 2、开始整理 全选自动整理后的书签&#xff0c;剪切 访问中英混排排版优化 - 油条工具箱 https://utils.fun/cn-en 1 粘贴 → 2 …

SwiftUI 5.0(iOS 17.0,macOS 14.0+)新 Inspector 辅助视图之趣味漫谈

概览 在 SwiftUI 开发中,苹果为我们提供了多种辅助视图用来显示额外信息从而极大丰富了应用的表现力,比如:Alert、Sheet、ContextMenu 等等。 从 SwiftUI 5.0(iOS 17+)开始, 又增加了一种全新的辅助视图:Inspector。 在本篇博文中,您将学到如下内容: 概览1. Inspe…

自定义拦截器jwt登录校验接口模拟账号登录

五一闲在宿舍&#xff0c;本来想写一个自己的简易博客网站&#xff0c;发现vue基础太差&#xff0c;做不出来页面效果于是便放弃&#xff0c;但也没有完全放弃。于是我分析了一下简易博客的后端实现流程&#xff0c;除了最基本的crud以外&#xff0c;在自己目前的对接口的分析中…

MATLAB 微积分

MATLAB 微积分 MATLAB提供了多种方法来解决微分和积分问题&#xff0c;求解任意程度的微分方程式以及计算极限。最重要的是&#xff0c;您可以轻松求解复杂函数的图&#xff0c;并通过求解原始函数及其导数来检查图上的最大值&#xff0c;最小值和其他文具点。 本章将讨论微…

Linux专栏08:Linux基本指令之压缩解压缩指令

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Linux专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Linux基本指令之压缩解压缩指令 编号&#xff1a;08 文章目录 Linu…

在2-3-4树上实现连接与分裂操作的算法与实现

在2-3-4树上实现连接与分裂操作的算法与实现 引言1. 维护2-3-4树结点的高度属性伪代码示例 2. 实现连接操作伪代码示例 3. 证明简单路径p的划分性质4. 实现分裂操作伪代码示例 C代码示例结论 引言 2-3-4树是一种平衡搜索树&#xff0c;它保证了树的高度被有效控制&#xff0c;…