【文献copilot】调用文心一言api对论文逐段总结

文献copilot:调用文心一言api对论文逐段总结

当我读文献的时候,感觉读得太慢了,看翻译软件翻译的又觉得翻译的不好。于是我就写了个程序辅助我读文献,它可以逐段总结,输出格式是:原文+一句话总结+分段总结,每一段间用分割线分割。下面给大家看看输出结果。

image-20231019235811626

image-20231019235859586

输入

一个.txt文件,这个直接从论文的网页上复制粘贴到记事本里就行。我平常看nature的期刊比较多,nature的绝大多数都可以直接复制,很方便。一个小建议是鼠标通过导航栏,找到reference,然后自下而上选择一直到标题,复制粘贴即可。

大家可以用这个论文练练手:https://www.nature.com/articles/s41587-022-01448-2。

这种方法其实没有那么优雅和便捷,我也想过用爬虫直接爬取,不过一是因为每个期刊网站不一样,不太方便;二是因为爬虫其实会更慢一些。我还想过通过pdf直接转txt或者直接用pdf来进行总结,这个可行,因为像chatdoc就做成功了,而且非常好(不过chatdoc也不能自动化地逐段总结,并且收费,个性化程度不高),但是难度较大,并且我觉得没太大必要,这种方法已经满足我的需求了。

image-20231020000028411

image-20231020000323929

运行方式

首先把输入文件和输出文件的路径确定了:

  • filepath:论文.txt所在路径(这个斜杠/,不是这个\)
  • outpath:输出路径,可以和filepath一样

大家还需要配置一下文心一言的API_KEY、SECRET_KEY,这个网上教程很多。

import json
import os
import sys
import requests
from tqdm import tqdm
from md_translator import *# 下面两行是不同的运行方式
filename = sys.argv[1] # 这是用命令行的方式
# 这是在编辑器运行的方式
# filename = "论文名字.txt"filepath = "D:/"
outpath = "D:/"# 文心一言的API_KEY、SECRET_KEY
API_KEY = "你的API_KEY"
SECRET_KEY = "你的SECRET_KEY"

编译器内运行

赋值filename为对应的文件名就行,要带后缀。

filename = "论文名字.txt"

然后直接运行即可,会显示一个进度条,结束时会自动打开输出目录。

image-20231020001952388

命令行运行

编译器运行比较麻烦,每次得改文件名,还得点击运行,命令行就方便多了。

直接进到程序的目录,然后改好环境,第二个参数改为文件名即可:

python .\paper_reader.py "论文名字.txt"

image-20231020002204581

输出结果

会输出一个名为总结-论文名字.md的文件。

第一行大标题,论文名字,接着用分割线来分割每一段,上面是英文,下面是用中文的一句话总结和分段总结。

image-20231019235811626

源代码

paper_reader.py

import json
import os
import sys
import requests
from tqdm import tqdm
from md_translator import *# 下面两行是不同的运行方式
filename = sys.argv[1] # 这是用命令行的方式
# 这是在编辑器运行的方式
# filename = "论文名字.txt"filepath = "D:/"
outpath = "D:/"# 文心一言的API_KEY、SECRET_KEY
API_KEY = "你的API_KEY"
SECRET_KEY = "你的SECRET_KEY"f = open(outpath + '总结-' + filename.split('.')[0] + '.md', 'w', encoding='utf-8')
old_out = sys.stdout
sys.stdout = fdef ask_Q(question):url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions?access_token=" + get_access_token()payload = json.dumps({"messages": [{"role": "user","content": question}]})headers = {'Content-Type': 'application/json'}response = requests.request("POST", url, headers=headers, data=payload)return response# print(response.text)def get_access_token():"""使用 AK,SK 生成鉴权签名(Access Token):return: access_token,或是None(如果错误)"""url = "https://aip.baidubce.com/oauth/2.0/token"params = {"grant_type": "client_credentials", "client_id": API_KEY, "client_secret": SECRET_KEY}return str(requests.post(url, params=params).json().get("access_token"))# %%
md_origin = md_df(filepath + filename)# %%
import copymd_res = copy.deepcopy(md_origin)
for i_zyh in tqdm(range(md_origin.shape[0])):# for i_zyh in range(1):try:if md_origin.loc[i_zyh, 'type'] == 'text':# Input = '现在你是一个专业翻译家,一个具有生物学背景的生物信息学教授,你的目标是把生物学领域学术论文中的一段翻译成中文。请翻译时不要带翻译腔,而是要翻译得自然、流畅和地道,使用优美和高雅的表达方式。请注意,提供的段落是markdown格式的,你翻译后需要保留原格式,除了提供给我翻译后的文本,我还需要你分点帮我总结这一段的精要,并且用一句话总结。现在请翻译并总结:' + \#         md_origin.loc[i_zyh, 'content']Input = '现在你是一个生物学教授,你的目标是把生物学领域学术论文中的一个"自然段(paragraph)"[分点总结],并且用[一句话总结]。请注意,呈现方式为:“一句话总结\n:……;分段总结(用markdown的有序列表格式):1. ……;2. ……;3. ……、……”,现在请总结:' + \md_origin.loc[i_zyh, 'content']# Input = '晚上吃什么'ans = ask_Q(Input)ans = json.loads(ans.text)md_res.loc[i_zyh, 'content'] = ans['result']if i_zyh == 0:print('# ' + md_origin.loc[i_zyh, 'content'])else:print(md_origin.loc[i_zyh, 'content'])# print("第",i_zyh,"行")if i_zyh != 0:print(ans['result'])# f.write(ans['result'])print('')print('------')else:# print('------')print(md_res.loc[i_zyh, 'content'])print('')print('------')# f.write(md_res.loc[i_zyh, 'content'])except Exception:print('这一段报错了,不过问题不大')
# 恢复原来的输出流
sys.stdout = old_out# 关闭文件
f.close()os.startfile(outpath)
# print('文件输出路径:\n'+outpath + 'out' + filename)

md_translator.py


# 导入所需的库
import pandas as pd
import re# 定义一个函数,用于读取markdown文件,并按段落分割
def read_markdown(file):# 打开文件,读取内容with open(file, 'r', encoding='utf-8') as f:content = f.read()# 按换行符分割内容,得到一个列表lines = content.split('\n')# 定义一个空列表,用于存储分割后的段落paragraphs = []# 定义一个空字符串,用于拼接段落paragraph = ''# 遍历每一行for line in lines:# 如果是空行,说明段落结束,将拼接好的段落添加到列表中,并清空字符串if line == '':if paragraph != '':paragraphs.append(paragraph)paragraph = ''# 如果是代码块的开始或结束标志,也说明段落结束,将拼接好的段落添加到列表中,并清空字符串elif line.startswith('```'):if paragraph != '':paragraphs.append(paragraph)paragraph = ''# 将代码块的开始或结束标志也添加到列表中paragraphs.append(line)# 如果是图片链接,也说明段落结束,将拼接好的段落添加到列表中,并清空字符串elif re.match(r'!\[.*\]\(.*\)', line):if paragraph != '':paragraphs.append(paragraph)paragraph = ''# 将图片链接也添加到列表中paragraphs.append(line)# 否则,将当前行拼接到字符串中,并加上换行符else:paragraph += line + '\n'# 如果最后还有未添加的段落,也添加到列表中if paragraph != '':paragraphs.append(paragraph)# 返回分割后的段落列表return paragraphs# 定义一个函数,用于识别每个段落的类型(文本、代码、图片)
def identify_type(paragraph):# 如果是代码块的开始或结束标志,返回'code'if paragraph.startswith('```'):return 'code'# 如果是图片链接,返回'image'elif re.match(r'!\[.*\]\(.*\)', paragraph):return 'image'# 否则,返回'text'else:return 'text'def md_df(filepath):# 调用read_markdown函数,读取markdown文件,并按段落分割# paragraphs = read_markdown(filepath + 'data/CellWalkR_Vignette.md')paragraphs = read_markdown(filepath)# 创建一个空的dataframe,有两列:'content'和'type'md_origin = pd.DataFrame(columns=['content', 'type'])# 遍历每个段落,识别其类型,并添加到dataframe中for paragraph in paragraphs:type = identify_type(paragraph)md_origin = md_origin.append({'content': paragraph, 'type': type}, ignore_index=True)# 找到第二列等于"code"的行的索引code_indices = md_origin[md_origin['type'] == 'code'].index.tolist()# 两个两个地读取索引,并设置这两个索引之间行的第二列为"code"for i in range(0, len(code_indices), 2):start_index = code_indices[i]end_index = code_indices[i + 1] if i + 1 < len(code_indices) else None# 设置这两个索引之间行的第二列为"code"md_origin.loc[start_index:end_index - 1, 'type'] = 'code'# i=0# codes=[]# while i < md_origin.shape[0]-2:#     if md_origin.loc[i,'type'] == 'code':#         codes.append(1)#         md_origin.loc[i+1,'type'] = 'code'#         i+=2#     i+=1# 将DataFrame保存为CSV文件return md_origin
# md_origin.to_csv('md_df.csv', index=False)

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

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

相关文章

css钟表数字样式

如图&#xff1a; 代码 font-size: 28px;font-family: Yourname;font-weight: 500;color: #00e8ff;

CSS基础入门01

目录 1.CSS是什么 2.基本语法规范 3.引入方式 3.1内部样式表 3.2行内样式表 3.3外部样式 4.代码风格 4.1样式格式 4.2样式大小写 4.3空格规范 5.选择器 5.1选择器的功能 5.2选择器的种类 6.基础选择器 6.1标签选择器 6.2类选择器 6.3id 选择器 6.4通配符选择…

jQuery实现输入框提示并点击回显功能呢

html代码: <input type"text" id"affOrganization" name"affOrganization" class"form-control" placeholder"Search..." style"width: 300px" > <div class"search_suggest" id"gov_se…

黑豹程序员-架构师学习路线图-百科:开启分布式架构开发先河,让Java戴上全球第一的皇冠-EJB

文章目录 1、EJB的传奇2、什么是 EJB3、从拥抱到抛弃4、最终版EJB3.0 1、EJB的传奇 EJB这项技术其实已经消亡了&#xff0c;但为何我还专门单另拿出来讲呢&#xff1f;原因有三。 第一、EJB是J2EE雄霸全球的功臣&#xff0c;它把我们编程推向了分布式架构开发&#xff0c;为开…

Ubuntu的EFI分区无法删除

本文解决的问题&#xff1a;双系统装完后需要删除ubuntu的分区&#xff0c;但是EFI系统分区无法删除。 第一步&#xff1a;cmd中输入命令 diskpart 并回车&#xff0c;如图中①&#xff1b; 第二步&#xff1a;在弹出窗口②中依次输入如下命令即可删除EFI分区&#xff1b; /…

移动App安全检测的必要性,app安全测试报告的编写注意事项

随着移动互联网的迅猛发展&#xff0c;移动App已经成为人们日常生活中不可或缺的一部分。然而&#xff0c;虽然App给我们带来了便利和乐趣&#xff0c;但也伴随着一些潜在的安全风险。黑客、病毒、恶意软件等威胁着用户的隐私和财产安全&#xff0c;因此进行安全检测就显得尤为…

什么是USRP软件无线电设备?

什么是USRP软件无线电设备&#xff1f; USRP软件无线电设备提供软件定义的RF架构&#xff0c;可让工程师使用自定义信号处理功能来设计、原型验证和部署无线系统。从基于大型开放式FPGA的经济款到高性能无线电设备&#xff0c;多种硬件可满足您的不同需求。您可以使用LabVIEW或…

施密特正交化

相信大家在平时的期末考试中一定少不了对某某向量组执行标准正交化类型的题目。今天我们从这个题目入手&#xff0c;说明这个如何执行施密特正交化&#xff0c;以及为什么要进行正交化。 一、例子 例子&#xff1a;设 a 1 [ 1 2 − 1 ] a_1\begin{bmatrix}1\\2\\-1\end{bmat…

vulkan SDK安装

文章目录 一. vulcan官网二.安装流程 一. vulcan官网 https://vulkan.lunarg.com/sdk/home#windows 二.安装流程 点击下载 双击下载的*.exe进行安装 点击下一步 点击下一步 选择安装位置&#xff0c;点击下一步 点击全选&#xff0c;选择下一步 勾选同意&#xf…

PTrade财务数据获取函数的问题

前文介绍了PTrade的get_fundamentals函数&#xff0c;可以用于获取股票的财务数据。但在实际应用中&#xff0c;会遇到如下的问题。 前文我们通过将回测时间设置为2023-05-05进行回测调用get_fundamentals&#xff0c;得到如下查询结果&#xff1a; secu_codepubl_dateend_da…

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-[5]客户端与服务端连接

红队专题 招募六边形战士队员端操作系统SystemInfo类获取系统信息发送系统信息头文件声明头文件调用 未找到来自 OleAcc.dll 的导入LINK 招募六边形战士队员 一起学习 代码审计、安全开发、web攻防、逆向等。。。 私信联系 端 发送连接->进入主线程->返回socket->…

ps插件Coolorus for Mac中文激活版

Coolorus是一款非常实用的Photoshop插件&#xff0c;它为Photoshop增加了色环配色面板&#xff0c;让设计师可以更直观地选择颜色。同时&#xff0c;Coolorus还提供了多种专业配色方案&#xff0c;如鲜艳色、复古色、日常色等&#xff0c;设计师可以直接套用这些方案&#xff0…

Python中的内存管理:深入分析垃圾回收机制

python中有一个名为refchian的环状双向链表&#xff0c;python运行时创建的所有对象都会添加到refchain中。在refchain中的对象PyObject里都有一个ob_refcnt用来保存当前对象的引用计数器&#xff0c;就是该对象被引用的次数&#xff0c;当对象有新引用时ob_refcnt就会增加&…

SDK 窗口程序创建

目录 Windows 窗口 窗口的基本概念 创建一个窗口的流程 句柄 创建窗口 设计注册窗口类 创建窗口 显示和更新窗口 创建消息循环 消息循环 建立消息循环 窗口过程函数 窗口程序模板&#xff08;多字节&#xff09; 窗口程序模板&#xff08;Unicode&#xff09; Wi…

零基础学习HTML5(列表、表格、表单)

01-列表 作用&#xff1a;布局内容排列整齐的区域。 列表分类&#xff1a;无序列表、有序列表、定义列表。 无序列表 作用&#xff1a;布局排列整齐的不需要规定顺序的区域。 标签&#xff1a;ul 嵌套 li&#xff0c;ul 是无序列表&#xff0c;li 是列表条目。 <ul>…

【RTOS学习】信号量 | 互斥量 | 递归锁

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《RTOS学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 信号量 | 互斥量 | 递归锁 &#x1f37a;信号量&#x1f964;原理&#x1f964;使用信号量的函数&…

基于springboot实现java学习平台项目【项目源码+论文说明】

基于springboot实现java学习平台演示 摘要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括学习平台的网络应用&#xff0c;在外国学习平台已经是很普遍的方式&#xff0c;不过国内的管理平台可能还处于起步阶段。学习平台具…

使用 Typhoeus 和 Ruby 编写的爬虫程序

以下是一个使用 Typhoeus 和 Ruby 编写的爬虫程序&#xff0c;用于爬取 &#xff0c;同时使用了 jshk.com.cn/get_proxy 这段代码获取代理&#xff1a; #!/usr/bin/env rubyrequire typhoeus require jsondef get_proxyurl "https://www.duoip.cn/get_proxy"respon…

正则表达式[总结]

文章目录 1. 为什么要学习正则表达式2. 再提出几个问题&#xff1f;3. 解决之道-正则表达式4. 正则表达式基本介绍5. 正则表达式底层实现(重要)6. 正则表达式语法6.1 基本介绍6.2 元字符(Metacharacter)-转义号 \\\6.3 元字符-字符匹配符6.4 元字符-选择匹配符6.5 元字符-限定符…

vscode中4个json的区别和联系

在vscode中快捷键ctrlshiftp&#xff0c;然后输入setting&#xff0c;会出现下图几个选项 当不同设置之间出现冲突时&#xff0c;听谁的&#xff1a; Open Workspace Settings(JSON) > Open Settings(JSON) Open User Settings > Open Default Settings(JSON) Open Wo…