【ERNIE + PaddleOCR】 创建自己的论文字典,更好的写论文吧!

一、项目背景

        在撰写论文的过程中,许多作者习惯先以中文完成初稿,随后再将其翻译为英文。然而,这种翻译过程往往伴随着一系列挑战。尤其是在词汇选择和语法结构上,很容易使用到一些在学术论文中不常用或不符合规范的表达。为了克服这一难题,我结合PaddleOCR和ERNIE技术来构建一个模板论文的字典来解决这个问题。

二、项目方案

        首先,利用PaddleOCR技术,我能够从大量的学术论文中提取出关键的词汇和短语,这些词汇和短语往往代表着学术领域内的专业表达。随后,通过ERNIE的API,将这个字典告诉大模型,来提高翻译的准确性和规范性。

        在拥有了这样一个字典后,我能够确保在翻译过程中使用到的是那些符合学术规范的词汇,而单词形态与语法结构有关,所以也规范了语法结构。这不仅大大提高了翻译的准确性,还有效降低了因词汇和语法问题而导致的论文质量下降的风险。

        总的来说,通过结合PaddleOCR和ERNIE技术来构建论文翻译字典,我成功地解决了翻译过程中的词汇和语法问题,为我的论文写作提供了有力的支持。这种方法不仅提高了我的翻译效率,还使我的论文更加符合学术规范,为我在学术领域内的进一步研究奠定了坚实的基础。

三、数据说明

        准备好自己的参考论文的pdf文件即可。

四、代码实现

4.1 环境安装

        安装所需环境,需要安装PaddleOCR,最好从源代码进行安装,目前该项目更新较快,使用新版本更不容易出现错误。源代码安装首先根据requirements.txt安装所需环境以及一些必要的包(使用中报错提示需要安装一些额外的包)

%cd ~# 首先建议你先从github上下载PaddleOCR的源码,https://github.com/PaddlePaddle/PaddleOCR.git,我这里会先上传一份。
# 先不要使用左侧套件里的PaddleOCR,它的版本使用起来有各种小问题。
# 我这里先下载好了源代码并上传解压。
!unzip PaddleOCR-main.zip# 安装源码所依赖环境
%cd ~/PaddleOCR-main
!pip install --user -r requirements.txt
!pip install --user paddleclas PyMuPDF==1.19.0# 这里是因为它下载很慢,所以我就本地下载下来上传安装的,在线安装包有可能因为网络问题失败,多试几次或者下载下来离线安装
# !pip install /home/aistudio/work/opencv_python_headless-4.9.0.80-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl# 运行setup安装
# ******  注意,如果遇见安装超时或者其他原因导致安装环境失败,多半是网络问题,请多尝试几次。 ******
!python setup.py build install

4.2 PaddleOCR版面分析和文本识别

        有两种方法可以使用版面分析和文本识别,一种是命令行运行,一种是python代码运行。

# 我的pdf文件在work文件夹里面
%cd ~/work# 通过命令行进行版面分析和文本识别,不需要重现文档
!paddleocr --image_dir=molecular.pdf --type=structure --recovery=false --lang='en'

        这里我本来先使用的python代码实现,而没有使用命令行。结果发现目前代码有问题,无法通过官方案例解析pdf文件,代码会报错。下面我给了一个案例可以使用,此案例也合并到了官方代码中。

%cd ~/workimport os
import cv2
import numpy as np
from paddleocr import PPStructure,save_structure_res
from paddle.utils import try_import
from PIL import Imageocr_engine = PPStructure(table=False, ocr=True, show_log=True)save_folder = './output'
img_path = 'molecular.pdf'fitz = try_import("fitz")
imgs = []
with fitz.open(img_path) as pdf:for pg in range(0, pdf.page_count):page = pdf[pg]mat = fitz.Matrix(2, 2)pm = page.get_pixmap(matrix=mat, alpha=False)# if width or height > 2000 pixels, don't enlarge the imageif pm.width > 2000 or pm.height > 2000:pm = page.get_pixmap(matrix=fitz.Matrix(1, 1), alpha=False)img = Image.frombytes("RGB", [pm.width, pm.height], pm.samples)img = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)imgs.append(img)for index, img in enumerate(imgs):result = ocr_engine(img)save_structure_res(result, save_folder, os.path.basename(img_path).split('.')[0], index)for line in result:line.pop('img')print(line)

        我看了源码,发现代码会报错的原因在于,它没有对pdf文件做判断,且判断逻辑有问题,目前只适用于单page的图片或者gif。于是我改了相关代码,并提交了pull requests,修复了直接使用报错的BUG。

4.3 字典生成

        根据版面分析的结果,统计字典,以下代码为生成字典文件的代码。

# 读取output里对应的文本结果%cd ~
import os
import re
import dill# 假设所有txt文件都位于这个目录下  
directory = 'work/output/molecular'  # 获取目录下的所有txt文件  
txt_files = [f for f in os.listdir(directory) if f.endswith('.txt')]  
txt_files.sort(key=lambda x: int(re.search(r'res_(\d+)\.txt', x).group(1)))
print(txt_files)
result = {}
result_text = []
# 遍历每个txt文件  
for filename in txt_files:  file_path = os.path.join(directory, filename)line_list = []with open(file_path, 'r', encoding='utf-8') as file:  # 逐行读取文件内容for line in file:  # 尝试将字符串转换为字典  try:  data_dict = eval(line)  # 在这里处理你的字典数据line_list.append(data_dict)if data_dict['type'] == 'text' and isinstance(data_dict['res'], list):for res in data_dict['res']:result_text.append(res['text'])except Exception as e:  # 如果转换失败,打印错误信息  print(f"Error evaluating line in {filename}: {e}")result[filename] = line_list# 保存数据文件
dill.dump(result, open('result.pkl', 'wb'))
dill.dump(result_text, open('result_text.pkl', 'wb'))

        接下来是分词,本来想用PaddleNLP进行分词,但是我没有从官方文档里找到英文分词场景的介绍,都介绍的中文分词,所以还是使用的spacy,之后在研究怎么用吧。

        如果觉得没关系,也可以用paddleNLP本身的分词,之后会尝试一下。

%cd ~
!pip install spacy# 建议提前下载模型包,在线下载太慢了
# !pip install work/en_core_web_trf-3.7.3-py3-none-any.whl

        最后生成works列表并排序过滤。

%cd ~
import dill
import re
import spacy  # 加载spaCy的英文模型  
nlp = spacy.load('en_core_web_trf')  def process_sentences(sentences):  # 合并短句并处理  processed_text = ' '.join(sentences)  doc = nlp(processed_text)  # 提取单词  words = [token.text for token in doc if not token.is_stop and token.is_alpha]  return words  result_text = dill.load(open('result_text.pkl', 'rb'))
print(result_text)
# 提取并处理单词  
words = process_sentences(result_text)  # 打印提取的单词  
print(words)
dill.dump(words, open('words.pkl', 'wb'))

        将字典数据降序排序,并进行过滤(出现次数大于5的保留)

# 生成字典
from collections import defaultdict, OrderedDict
import dillwords = dill.load(open('words.pkl', 'rb'))
count_dict = defaultdict(int)
for word in words:count_dict[word] += 1
# 倒序排序
sorted_dict = OrderedDict(sorted(count_dict.items(), key=lambda x: x[1], reverse=True))# 过滤数据
filtered_words = [k+':'+str(v) for k, v in sorted_dict.items() if v > 5]
dict_str = ';'.join(filtered_words)print(filtered_words)

4.4 ERNIE翻译

        之后使用ERNIE Bot进行语句的翻译,并给他准备好的词典。

# 安装ERNIE Bot
!pip install --upgrade erniebot

设计prompt在后续使用

# 设计promptprompt = ("你现在帮我翻译中文语句为英文,用于论文写作,不要减少或增加内容,文风要严谨。""此外我会提供一个常用词典,请尽量使用词典里的单词进行翻译。""词典的格式为:word1:110,word2:105,word3:100......""冒号前是单词本身,冒号后是单词出现的频率。"# "现在我提供字典:"
)
prompt += dict_str
prompt += "现在我提供英文语句,你来翻译。英文语句为:"
print(prompt)

五、效果展示

        使用ernie-3.5来进行翻译,得到翻译的结果,可以看到不用字典和用字典有明显差别,不仅优化了单词还间接优化了语法。

import erniebotmodels = erniebot.Model.list()
print(models)# Set authentication params
erniebot.api_type = "aistudio"
erniebot.access_token = "你的token"content = ("对于分子,它的 2D 和 3D 形式描述了相同的原子集合,但使用结构的不同特征。""因此,关键挑战是在捕获不同公式中的结构知识并训练参数从两个信息中学习时具有表现力和兼容性。"
)# Create a chat completion
response = erniebot.ChatCompletion.create(model="ernie-3.5",messages=[{"role": "user", "content": prompt+content}]
)print(response.get_result())# 不用字典
# For molecules, their 2D and 3D forms represent the same set of atoms but use different structural features. Therefore, the key challenge lies in capturing the structural knowledge from different formulas and training the parameters to learn from the two sources of information in an expressive and compatible manner.# 使用字典
# For molecules, their 2D and 3D forms describe the same set of atoms, but use different characteristics of the structure. Therefore, the key challenge is to capture structural knowledge in different formulas and train parameters to be expressive and compatible when learning from both sources of information.

不用字典

        For molecules, their 2D and 3D forms represent the same set of atoms but use different structural features. Therefore, the key challenge lies in capturing the structural knowledge from different formulas and training the parameters to learn from the two sources of information in an expressive and compatible manner.

使用字典

        For molecules, their 2D and 3D forms describe the same set of atoms, but use different characteristics of the structure. Therefore, the key challenge is to capture structural knowledge in different formulas and train parameters to be expressive and compatible when learning from both sources of information.

        可以看到使用的单词和语法都有了变化,更符合论文的规范了。

六、总结提高

        在写代码过程中还发现了PaddleOCR存在的问题,虽然不知道能不能做出贡献,但还是挺开心的。分词目前还没有使用PaddleNLP,之后可以在研究研究。

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

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

相关文章

【学习笔记】Windows GDI绘图(七)图形路径GraphicsPath详解(下)

文章目录 前三篇回顾GraphicsPath方法Flatten压平(将曲线转成线段)GetBounds获取外接矩形GetLastPoint获取路径最后一个点IsOutlineVisibleIsVisiable是否在轮廓上或内部Reset重置Reverse逆转点的顺序Transform矩阵变换Wrap扭曲变换Widen将路径替换为指定画笔的填充区域 前三篇…

安卓手机APP开发__USB主机和配件概述

安卓手机APP开发__USB主机和配件概述 目录 概述 USB 配件模式 调试注意事项 选择合适的 USB 配件 API 支持 USB 主机模式 API 概览 清单和资源文件示例 概述 Android 通过 USB 配件和 USB 主机两种模式支持各种 USB 外围设备和 Android USB 配件(实现 Andr…

springboot学习记录--Maven setting配置

一、配置本地仓库 1 <!--自定义本地仓库路径--> Mirro&#xff1a;Maven 将从镜像仓库获取资源&#xff0c;不同的地理位置或具有更快的网络访问速度。 阿里云镜像&#xff1a; <mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorO…

TypeScript中的模块和命名空间:代码组织与封装

TypeScript中的模块和命名空间&#xff1a;代码组织与封装 引言 在TypeScript中&#xff0c;模块和命名空间是两种用于代码组织和封装的工具。模块用于将代码划分为独立的单元&#xff0c;而命名空间提供了一种将相关类型和值分组的方式。 基础知识 模块&#xff1a;通过文…

fastapi的简单实战,且用uvicorn将日志同时输出到控制台和日志文件中

简单描述 fastapi的简单实战&#xff0c;且用uvicorn将日志同时输出到控制台和日志文件中 main.py import signal import sys from contextlib import asynccontextmanagerfrom fastapi import FastAPI import uvicorn from fastapi.staticfiles import StaticFilesfrom set…

生成式AI导论2024-李宏毅

生成式AI导论2024-李宏毅 第0讲&#xff1a; 课程说明第1讲&#xff1a;生成式AI是什么第2講&#xff1a;今日的生成式人工智慧厲害在哪裡&#xff1f;從「工具」變為「工具人」 第0讲&#xff1a; 课程说明 生成式AI的入门课程 第1讲&#xff1a;生成式AI是什么 生成式人…

python调用阿里云通义千问(q-wen-max)API-创建智能体Agent

文章目录 Assistant API简介创建和使用Assistant API1、调用Assistant API夸克搜索回答问题2、Agent智能体构建Assistant API简介 百炼Assistant API能够让用户定制化构建一个assistant,这个assistant支持多种不同的指令(instruction)和描述(prompt),并且可以使用各类工…

AI预测福彩3D采取888=3策略+和值012路一缩定乾坤测试5月26日预测第2弹

昨天的8883大底成功命中&#xff0c;但是由于昨天杀了对子&#xff0c;结果昨天开了对子&#xff0c;导致最终与中奖号码擦肩而过。今天继续基于8883的大底&#xff0c;使用尽可能少的条件进行缩号&#xff0c;同时&#xff0c;今天将准备两套方案&#xff0c;一套是我自己的条…

队列——顺序存储

核心思路&#xff1a; 1、使用顺序存储的方式定义队列时&#xff0c;使用数组存储队列元素&#xff0c;然后声明两个int类型的指针——rear和front&#xff0c;分别指向队尾元素的下一个位置和队头元素的位置。 2、初始化队列时&#xff0c;队列的首尾指针都指向0 。 3、当队列…

2021 年 3 月青少年软编等考 C 语言二级真题解析

目录 T1. 与指定数字相同的数的个数思路分析 T2. 合法 C 标识符思路分析 T3. 计算鞍点思路分析 T4. 谁考了第 k 名思路分析 T5. 石头剪刀布思路分析 T1. 与指定数字相同的数的个数 输出一个整数序列中与指定数字相同的数的个数。 时间限制&#xff1a;1 s 内存限制&#xff1…

【CSS】计算属性 calc 函数

CSS 中的 calc() 函数是用于动态计算数值的函数。它可以在 属性的值中执行基本的数学运算&#xff0c;包括加法、减法、乘法和除法&#xff0c;以及使用 CSS 单位进行计算。 calc() 函数的语法如下&#xff1a; calc(expression) 其中 expression 是包含数学运算和 CSS 单位表…

英语学习笔记28——Where are they?

Where are they? 他们在哪里&#xff1f; 课文部分

【NumPy】关于numpy.median()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

贝叶斯算法:机器学习中的“黄金法则”与性能提升之道

&#x1f440;传送门&#x1f440; &#x1f50d;机器学习概述&#x1f340;贝叶斯算法原理&#x1f680;贝叶斯算法的应用✨文本分类✨医疗系统 &#x1f496;贝叶斯算法优化✨贝叶斯算法优化的主要步骤✨贝叶斯算法优化的优点✨贝叶斯算法优化的局限性 &#x1f697;贝叶斯算…

二维前缀异或和,1738. 找出第 K 大的异或坐标值

一、题目 1、题目描述 给你一个二维矩阵 matrix 和一个整数 k &#xff0c;矩阵大小为 m x n 由非负整数组成。 矩阵中坐标 (a, b) 的 值 可由对所有满足 0 < i < a < m 且 0 < j < b < n 的元素 matrix[i][j]&#xff08;下标从 0 开始计数&#xff09;执行…

「贪心算法」摆动序列

力扣原题链接&#xff0c;点击跳转。 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为摆动序列。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。简单来说&#xff0c;摆动…

【iOS开发】—— KVC

【iOS开发】—— KVC 一. KVC的定义key和keyPath的区别用法&#xff1a; 批量复制操作字典模型相互转化KVC的其他方法 KVC原理赋值原理取值原理 一. KVC的定义 KVC&#xff08;Key-value coding&#xff09;键值编码&#xff0c;就是指iOS的开发中&#xff0c;可以允许开发者通…

不用从头训练,通过知识融合创建强大的统一模型

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;大型语言模型&#xff08;LLMs&#xff09;的开发和训练是一个复杂且成本高昂的过程。数据需求是一个主要问题&#xff0c;因为训练这些模型需要大量的标注数据来保证其准确性和泛化能力&#xff1b;计算资源也是一个…

Java学习路线思维导图

目录 Java学习流程1.学习大纲2.Java开发中常用的DOS命令 Java入门学习思维导图 Java学习流程 通过大纲了解学习的重点&#xff0c;通过目录依次深入【注&#xff1a;Java环境的搭建百度&#xff0c;提升自己百度的能力】 1.学习大纲 学习流程如下&#xff1a; Java基础语法 …

网络安全架构之零信任安全

网络安全架构之零信任安全 文章目录 网络安全架构之零信任安全零信任安全时代背景安全世界“新旧时代”各种攻击风险层出不穷网络安全边界逐渐瓦解内外部威胁愈演愈烈 零信任架构零信任的理念在不可信的网络环境下重建信任构建自适应内生安全机制以身份为基石业务安全访问持续信…