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

news2024/11/19 20:46:33

文献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 = f


def 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 copy

md_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.coloradmin.cn/o/1112340.html

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

相关文章

Kafka与MySQL的组合使用

根据上面给出的student表&#xff0c;编写Python程序完成如下操作&#xff1a; &#xff08;1&#xff09;读取student表的数据内容&#xff0c;将其转为JSON格式&#xff0c;发送给Kafka&#xff1b; 创建Student表的SQL语句如下&#xff1a; create table student( sno ch…

基于深度学习网络的蔬菜水果种类识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1数据集准备 4.2构建深度学习模型 4.3模型训练 4.4模型评估 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 clc; clear; close all; wa…

【C++】C++学习(模板+排序+测时)

本文主要记录使用模板函数来编写排序算法&#xff0c;并计算运行时间。 模板函数&#xff08;Template Function&#xff09;是一种通用函数&#xff0c;可以在其定义时不指定具体的参数类型&#xff0c;在调用时再根据需要指定具体类型。模板函数可以接受不同类型的参数&…

057:mapboxGL中layout,paint等属性的函数表达说明

第057个 点击查看专栏目录 本篇文章是mapbox的layer中layout,paint等属性的函数表达 mapbox中 Function 是什么 函数 Function 可以作为其 layout布局类属性和 paint 绘制类属性的属性值。在使用 Function 作为属性值时,实际上是一个对象。 layers的3种函数类型 Function …

error: unable to read askpass response from

报错信息 解决方法&#xff1a; 中文&#xff1a;文件-->设置-->版本控制-->Git-->勾选使用凭证帮助程序 英文&#xff1a;File -> Settings -> Version Control -> Git / Check "User credential Helper" 因为我的webstrom是中文版的&#…

Simulink 最基础教程(四)模型参数与全局变量

4.1模型参数 上面介绍常用模块的时候&#xff0c;都是找到模块&#xff0c;双击模块&#xff0c;设置参数。这些参数都是模块参数。与之相对的&#xff0c;是模型参数。一些说明&#xff1a; 1&#xff09;模型参数和模块参数并不是隶属关系&#xff0c;而是配合关系。当模型参…

起重机控制电路接线 - 基础与进阶(修订中...)

1.基础篇 起重机电气接线 - 理论与实践 - 知乎1.现场配电箱这是一台10吨电动葫芦的电器箱。你能看出这个起重机用到了几个电机吗&#xff1f;先看空开和继电器。 电机为了控制正反转&#xff0c;一般每个电机需要用到两个继电器。这上面有7个继电器&#xff0c;所以&#xff0…

数字图像处理实验记录四(图像的空间域增强-平滑处理)

前言&#xff1a;要是是实验报告赶工的话&#xff0c;建议总结上网抄&#xff0c;或者重构我的总结&#xff0c;仅供学习参考&#xff0c;不要照抄 文章目录 一、基础知识1&#xff0c;噪声2&#xff0c;椒盐噪声3&#xff0c;高斯噪声4&#xff0c;滤波器5&#xff0c;均值滤…

[云原生1.] Docker容器的简单介绍和基本管理

1. Docker容器的基本概述 1.1 简介 Docker是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵循了apache2.0协议开源。Docker是在Linux容器里运行应用的开源工具&#xff0c;是一种轻量级的“虚拟机”。Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级…

Unity之ShaderGraph如何实现无贴图水球效果

前言 我们今天来实现一个无贴图水球效果&#xff0c;如下图所示&#xff1a; 主要节点 UVSplit&#xff1a;可以获得UV在RGB三个颜色分别的分量 Remap&#xff1a;重映射节点 基于输入 In 值在输入In Min Max的 x 和 y 分量之间的线性插值&#xff0c;返回输入Out Min Max…

爬虫三大库

Requests库安装 Requests库的作用是请求网站获得网页数据 在pycharm中安装方式如下&#xff1a; 选择settings 选择Project Interpreter&#xff0c;单击号添加第三方库 BeautifulSoup库按同样方式安装。 Requests库 pycharm返回结果为<Response [200]>,说明请求网址成…

简单秒表设计仿真verilog跑表,源码/视频

名称&#xff1a;简单秒表设计仿真 软件&#xff1a;Quartus 语言&#xff1a;Verilog 代码功能&#xff1a; 秒表显示最低计时为10ms&#xff0c;最大为59:99&#xff0c;超出返回00&#xff1a;00 具有复位、启动、暂停三个按键 四个数码管分别显示4个时间数字。 演示…

了解 Elasticsearch 自动生成的文档 _id:重复是一个问题吗?

Elasticsearch 中自动生成的文档 ID 当你在未指定 ID 的情况下对文档建立索引时&#xff0c;Elasticsearch 会自动为该文档生成唯一的 ID。 该 ID 是 Base64 编码的 UUID&#xff0c;由多个部分组成&#xff0c;每个部分都有特定的用途。 ID 生成过程针对索引速度和存储效率进…

互联网Java工程师面试题·Java 总结篇·第九弹

目录 75、阐述 JDBC 操作数据库的步骤。 76、Statement 和 PreparedStatement 有什么区别&#xff1f;哪个性 能更好&#xff1f; 77、使用 JDBC 操作数据库时&#xff0c;如何提升读取数据的性能&#xff1f;如何提升更新数据的性能&#xff1f; 78、在进行数据库编程时&a…

git 查看本地秘钥

第一步&#xff1a; 1&#xff0c;打开终端或者命令行窗口&#xff0c;输入一下命令&#xff1a; cd ~/.ssh进入ssh目录 2&#xff0c;查看该目录下的所有文件&#xff0c;输入以下命令: ls -al该命令将显示ssh目录下的所有文件&#xff0c;包括秘钥文件和配置文件,如果不存…

100天掌握网络安全知识点!

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟…

C++ Primer 第十一章 关联容器 重点解读

1 map自定义排序 #include <map> #include <iostream> #include <functional> using namespace std; int main() {function<bool(pair<int, int>, pair<int, int>)> cmp [&](pair<int, int> p1, pair<int, int> p2) -&g…

设计模式-综合应用(一)

介绍 使用jQuery做一个模拟购物车的示例 用到的设计模式 工厂模式 单例模式装饰器模式 观察者模式状态模式 模板方法模式 代理模式 UML类图

leetcode - 319. Bulb Switcher

Description There are n bulbs that are initially off. You first turn on all the bulbs, then you turn off every second bulb. On the third round, you toggle every third bulb (turning on if it’s off or turning off if it’s on). For the ith round, you toggl…

Apollo的搭建

Apollo的搭建 1.环境准备 jdk : 1.8 mysql 5.6.5 2.下载 两种方式&#xff1a; a.下载源码自己编译&#xff08;需要修改源码的可以选择&#xff09; 源码&#xff1a;https://github.com/ctripcorp/apoll b.编译好的直接使用 地址&#xff1a;Releases apol…