系列教程 | 用Jina搭建PDF搜索引擎Part 1
csdh11 2024-12-31 10:26 29 浏览
PDF Search 系列教程来咯,在 Part 1 中,我们将演示如何从 PDF 中提取、处理并存储图像及文本。
随着神经搜索 (Neural Search) 技术的普及,越来越多开发者,开始尝试用 Jina 解决非结构化数据的索引和搜索问题。本系列教程中,我们将演示如何用 Jina 搭建一个 PDF 搜索引擎。
具体内容如下:
* Part 1 将介绍如何从 PDF 中提取、处理并存储图像及文本
* Part 2 将演示如何将这些信息输入到 CLIP 中(CLIP 是一个可以理解图像及文本的深度学习模型)。提取 PDF 图像及文本信息后,CLIP 将生成索引,输入图像或文本,即可进行语义相似性搜索。
* Part 3 通过客户端及 Streamlit 前端,对索引进行搜索。
* Part 4 为其他相关演示,如提取元数据等。
前序简介:预期目标 & 技术栈
预期目标:搭建一个 PDF 搜索引擎,用户输入文本或上传图片,搜索引擎即可返回类似的图片和文本片段,并附带原始 PDF 链接。
本文将着重讲解如何将一个 900 多页的 PDF 处理成可供搜索的向量。
本教程将涉及以下技术栈:
DocArray:a data structure for unstructured data. 通过这个工具可以封装 PDF 文件、文本块、图像块以及搜索引擎的其他输入/输出。
Jina:为 DocArray Document 搭建流水线及神经搜索引擎,并将其扩展到云端。
Jina Hub:无需逐一创建处理单元,可直接使用云端可复用模块。
教程详解:提取 PDF 中的文本及图像
提取 PDF 中的文本及图像,有以下方法可供选择:
1. 用 Jina Hub 上的 PDFSegmenter Executor,提取 PDF 中文本块和图像块。
2. 用 ImageMagick 和 OCR 对 PDF 中的每一页进行截图。
3. 将 PDF 转换为 HTML,图片提取到目录,再次将 HTML 转换为文本(这里我们使用的是 Pandoc )。
本文将使用方法 1,提取 PDF 中的文本及图像。
1、创建 PDF(也可使用已有文件)
首先,我们需要一个示例文件,从维基百科中选择一个词条,并导出为 PDF 作为示例文档。本教程中我们用到的是 Rabbit 词条(也可以称为文章)。
本教程中使用的浏览器为 Chrome
注意:
* 禁用页眉、页脚等设置,以免索引中出现类似 4/798 页等无关信息。
* 可以尝试通过改变页面大小来避免分页
2、提取 PDF 中的文本及图像
借助 Jina Hub 中的 Executor,在 Flow 中运行并提取 PDF 中的数据。在 Jina 中,Flow 是执行重要任务的 Pipeline,可以建立可搜索的 PDF 文档索引,或通过索引进行搜索。
每个 Flow 包括多个 Executor,每个 Executor 负责一个小任务。这些 Executor 串联在一起,对 Document 进行端到端的处理。
这里我们用到了 Jina Hub 上的 Executor--PDFSegmenter。
使用 Jina Sandbox,即可释放本地资源,将运行转移到云端:
from docarray import DocumentArray
from jina import Flow
docs = DocumentArray.from_files("data/*.pdf", recursive=True)
flow = (
Flow()
.add(uses="jinahub+sandbox://PDFSegmenter", install_requirements=True, name="segmenter")
)
with flow:
indexed_docs = flow.index(docs)
将 PDF 文档转换为 DocumentArray 形式。在 Jina 中,每一段数据(文本、图像、PDF 等)都是一个Document,一组Document 组成一个 DocumentArray。
通过 documentary.from _ files () 即可从一个目录自动加载所有内容。
DocumentArray 输入到 Flow 后,处理过的 DocumentArray 将存储在 indexed _ docs 中。
在 rabbit.pdf 中, Indexed _ docs 只包含了一个包括文本块和图像块的 Document。
下图为 DocumentArray 摘要,其中包含了 indexed_docs.summary()
通过 indexed_docs[0].chunks.summary() 查看部分文本块或图像块:
如上图所示,Document 中一共包括 58 个块,分为 tensor(图像)和字符串(文本)。
从每个 chunk 中打印 chunk.content
chunks = indexed_docs[0].chunks
for chunk in chunks:
print(chunk.content)
图像的形式为 tensor,文本则是一段很长的字符串
3、处理数据
对数据进行以下处理:
* 将文本片段分片为更小的块,如句子。上述长字符串包含了过多信息,通过 sentencize,可以从每一个文本块中得到一个明确的语义信息。
* 对图像进行归一化处理,便于后续在深度学习模型中进行编码。
3.1 将文本进行分句 (sentencizing)
句子示例如下:
* It was a dark and stormy night.
* What do a raven and a writing desk have in common?
* Turn to p.13 to read about J.R.R. Tolkien pinging google.com in 3.4 seconds.
使用 Jina Hub 的 Sentencizer Executor,运行这些字符串。
from docarray import DocumentArray, Document
from jina import Executor
docs = DocumentArray(
[
Document(text="It was a dark and stormy night."),
Document(text="What do a raven and a writing desk have in common?"),
Document(text="Turn to p.13 to read about J.R.R. Tolkien pinging google.com in 3.4 seconds")
]
)
exec = Executor.from_hub("jinahub://Sentencizer")
exec.segment(docs, parameters={})
for doc in docs:
for chunk in doc.chunks:
print(chunk.text)
print("---")
输入上述三个句子后,得到以下输出:
上图可知 p.13 中的标点符号,被识别成了句号。这里可以借助 SpacySentencizer 进行优化。
SpacySentencizer 是一个 Executor,可以将 spaCy 的 sentencizer 集成到 Jina。
只需修改第 12 行代码如下:
from docarray import DocumentArray, Document
from jina import Executor
docs = DocumentArray(
[
Document(text="It was a dark and stormy night."),
Document(text="What do a raven and a writing desk have in common?"),
Document(text="Turn to p.13 to read about J.R.R. Tolkien pinging google.com in 3.4 seconds")
]
)
exec = Executor.from_hub("jinahub://SpacySentencizer")
exec.segment(docs, parameters={})
for doc in docs:
for chunk in doc.chunks:
print(chunk.text)
print("---")
现在的结果如下图所示:
将 Executor 添加到 Flow 中:
from docarray import DocumentArray
from jina import Flow
docs = DocumentArray.from_files("data/*.pdf", recursive=True)
flow = (
Flow()
.add(uses="jinahub+sandbox://PDFSegmenter", install_requirements=True, name="segmenter")
.add(uses=ChunkSentencizer, name="chunk_sentencizer")
)
with flow:
indexed_docs = flow.index(docs)
3.2 对图像进行归一化处理
from jina import Executor, requests
import numpy as np
class ImageNormalizer(Executor):
@requests(on="/index")
def normalize_chunks(self, docs, **kwargs):
for doc in docs:
for chunk in doc.chunks[...]:
if chunk.blob:
chunk.convert_blob_to_image_tensor()
if hasattr(chunk, "tensor"):
if chunk.tensor is not None:
chunk.convert_image_tensor_to_uri()
chunk.tags["image_datauri"] = chunk.uri
chunk.tensor = chunk.tensor.astype(np.uint8)
chunk.set_image_tensor_shape((64, 64))
chunk.set_image_tensor_normalization()
- 代码解读:
1-6: 通用 Executor 调用代码。第 5 行规定Executor 只有在调用索引 endpoint 时才能处理 Document。
8: 通过 [ ... ] 启用递归,依次对 chunk 进行处理。
9: 出现 blob 后将其转换为张量,以适应 CLIP 编码器。
12-18: 假设出现张量,我们需要把未处理张量的数据 uri 添加到元数据(即 tags)中,以便于后续检索并在前端展示图像。
为了防止文本块与图像块互相干扰:
from docarray import DocumentArray
from jina import Flow
docs = DocumentArray.from_files("data/*.pdf", recursive=True)
flow = (
Flow()
.add(uses="jinahub+sandbox://PDFSegmenter", install_requirements=True, name="segmenter")
.add(uses=ChunkSentencizer, name="chunk_sentencizer")
.add(uses=ImageNormalizer, name="image_normalizer")
)
with flow:
indexed_docs = flow.index(docs)
通过上述过程,我们实现了:
* 构建一个全新的 PDF
* 将 PDF 分成文本和图像两部分
* 进一步将文本块分割成句子块
* 对图像进行归一化处理
效果如下图所示:
通过一个新的 Executor--ChunkMerger,将文本块和图像块放在同一个 level:
from jina import Executor, requests
import numpy as np
class ImageNormalizer(Executor):
@requests(on="/index")
def normalize_chunks(self, docs, **kwargs):
...
class ChunkMerger(Executor):
@requests(on="/index")
def merge_chunks(self, docs, **kwargs):
for doc in docs: # level 0 document
for chunk in doc.chunks:
if doc.text:
docs.pop(chunk.id)
doc.chunks = doc.chunks[...]
完成分句 (sentencize) 后,将其直接放到 Flow 中,代码如下:
from docarray import DocumentArray
from executors import ChunkSentencizer, ChunkMerger, ImageNormalizer
from jina import Flow
docs = DocumentArray.from_files("data/*.pdf", recursive=True)
flow = (
Flow()
.add(uses="jinahub+sandbox://PDFSegmenter", install_requirements=True, name="segmenter")
.add(uses=ChunkSentencizer, name="chunk_sentencizer")
.add(uses=ChunkMerger, name="chunk_merger")
.add(uses=ImageNormalizer, name="image_normalizer")
)
with flow:
indexed_docs = flow.index(docs)
以上就是本系列教程 Part 1 的全部内容。在 Part 2 中,我们将为 Flow 添加一个编码器,使用 CLIP 将文本和图像编码为向量,从而简化的语义搜索的过程。
欢迎大家关注 Jina AI,持续关注本系列教程更新~
相关推荐
- 知名软件变“木马”:2小时感染10万电脑
-
近日,腾讯电脑管家监测发现,一款通过“驱动人生”升级通道,并同时利用“永恒之蓝”高危漏洞传播的木马突然爆发,仅2个小时受攻击用户就高达10万。腾讯电脑管家可精准拦截该病毒攻击,管家团队也将持续跟踪该款...
- 腾讯电脑管家发布病毒预警:“驱动人生木马”爆发,2小时感染10万台电脑
-
新华网天津12月15日电(记者周润健)腾讯电脑管家15日紧急发布病毒预警,14日下午,腾讯电脑管家监测发现,一款通过“驱动人生”升级通道,并同时利用“永恒之蓝”高危漏洞传播的木马突然爆发,仅2个小时受...
- 全新“撒旦”勒索病毒来袭 瑞星推出独家解密工具
-
新华社北京7月26日电瑞星威胁情报平台近日发现多起国内用户感染“撒旦”勒索病毒事件。据瑞星安全研究人员介绍,该病毒运行后会加密受害者计算机文件,加密完成后会用中英韩三国语言索取1个比特币作为赎金,并...
- 新勒索病毒“WannaCry”疯狂来袭 乌克兰副总理电脑中招
-
据外媒报道,从6月27日开始,一种新勒索病毒再次疯狂来袭,已席卷欧洲多个国家,连乌克兰副总理的电脑都已中招。报道称,这轮病毒足以与五月席卷全球的勒索病毒“WannaCry”的攻击性相提并论。该病毒代号...
- 蠕虫病毒利用“永恒之蓝”漏洞传播 单位局域网受威胁最大
-
日前,火绒安全团队通过“火绒威胁情报系统”发现蠕虫病毒“Worm/Sharp”正在全网传播,其中在政府、企业、学校、医院等单位的局域网具有非常强的传播能力。该病毒通过“永恒之蓝”漏洞、多个电脑常用端口...
- 新病毒爆发:利用“永恒之蓝”传播,2小时感染10万台电脑挖矿
-
驱动人生发布的声明。据腾讯安全专家介绍,通过追溯病毒传播链发现,该病毒自12月14日约14点,利用“驱动人生”、“人生日历”等软件最早开始传播,另有约30%的传播通过“永恒之蓝”漏洞在局域网内进行主动...
- 逍遥安卓模拟器定制手游电脑版 手机电脑账号完全互通
-
从今年起大量回合制端游转向手游方向,无论是《梦幻西游》、《大话西游》、《神武》还是刚刚发行的《问道》手游,都是非常重度需要大量时间来做任务挂机升级的游戏。很多人习惯了端游的时候一个电脑可以多开的玩法,...
- 安卓模拟器绿色U盘移动版 公司玩游戏无痕迹
-
安卓模拟器已经不稀奇了!随着安卓手游的盛行,特别是《梦幻西游手游》之类的重度手游发布,玩手游花的时间也越来越多。用手机玩这些游戏存在着屏幕小、点量少、费流量还有容易被电话打断,在电脑上用安卓模拟器玩游...
- 苹果推出 iCloud 照片和视频转移服务:可转移至谷歌相册
-
IT之家3月4日消息据MacRumors今日报道,苹果公司本周推出了一项新服务,帮助iCloud用户方便快捷的将其存储的照片和视频转移到谷歌照片上。苹果在其支持文档中表示,用户可以登...
- NAS PK台,4核带m.2的威联通TS-264C vs 双核TS-462C
-
因为618年中大促看到威联通TS-264C和TS-462C这两机型售价差不多,就做个比较以供参考。毕竟作为自2007年以来就一直卖威联通的NAS老油来说,对威联通各NAS机型的识别还是相当全面的,对不...
- 前端学AI(七):构造 RAG 系统评估测试数据集
-
引言在基于DeepSeek+Chroma+LangChain开发一个简单RAG系统...
- 惨重教训!调查显示挪威“英斯塔”号宙斯盾舰撞油轮后本不必“丧命”
-
最新公布的调查报告显示,挪威皇家海军“英斯塔”号护卫舰2018年11月与油轮相撞后,如果其舰员接受了更好的损管训练,并且对舰艇的稳定特性更加熟悉的话,这艘宙斯盾型战舰本来是可以挽救的。↑挪威“英斯塔”...
- 「必买」盘点2021年男人们的败家清单,越“败”越香
-
心里总想买点啥?看看《必买》,全网最有料的场景种草指南。草原割不尽,春风吹又生。在过去的2021年,不断被各种数码产品种草,一直在买买买,剁手不停。大部分产品都经过详细的对比做足了功课,也有部分是一时...
- 实现浏览器播放rtsp视频流的解决方案
-
有同学问道:需要实时播放摄像头rtsp视频流,而浏览器不能直接播放,怎样解决?实现这个需求可以通过插件或者转码来实现。要实现这个目的,可以采用的方案非常得多,有商业的也有开源的,这里主要列举一些开源的...
- ISO9000你知道多少?
-
1ISO9000族标准是什么?ISO9000族标准是指由国际标准化质量管理和质量保证技术委员会(ISO/TC176)制订的所有国际标准。ISO9000族标准可帮助各种类型和规模的组织实施并有效运行质...
- 一周热门
- 最近发表
- 标签列表
-
- mydisktest_v298 (34)
- document.appendchild (35)
- 头像打包下载 (61)
- acmecadconverter_8.52绿色版 (39)
- word文档批量处理大师破解版 (36)
- server2016安装密钥 (33)
- mysql 昨天的日期 (37)
- parsevideo (33)
- 个人网站源码 (37)
- centos7.4下载 (33)
- mysql 查询今天的数据 (34)
- intouch2014r2sp1永久授权 (36)
- 先锋影音源资2019 (35)
- jdk1.8.0_191下载 (33)
- axure9注册码 (33)
- pts/1 (33)
- spire.pdf 破解版 (35)
- shiro jwt (35)
- sklearn中文手册pdf (35)
- itextsharp使用手册 (33)
- 凯立德2012夏季版懒人包 (34)
- 冒险岛代码查询器 (34)
- 128*128png图片 (34)
- jdk1.8.0_131下载 (34)
- dos 删除目录下所有子目录及文件 (36)