import os import re import json import pandas as pd from langchain_huggingface import HuggingFaceEmbeddings from langchain_community.vectorstores import FAISS from transformers import BertTokenizer, BertForSequenceClassification import torch import pdfplumber from typing import List, Dict, Tuple, Optional from tqdm import tqdm import warnings # 忽略警告 warnings.filterwarnings('ignore') # --------------------- 环境配置 --------------------- os.environ["FAISS_ALLOW_DANGEROUS_DESERIALIZATION"] = "TRUE" # --------------------- 本地资源路径 --------------------- BERT_LOCAL_PATH = r"C:\Users\weixi\Desktop\234\智能机器人\bert-base-chinese" KNOWLEDGE_SRC = r"C:\Users\weixi\Desktop\234\附件1" # PDF目录路径 QUESTIONS_PATH = r"C:\Users\weixi\Desktop\234\智能机器人\附件2.pdf" VECTOR_DB_PATH = "bert_vector_index" # --------------------- 增强版PDF解析器 --------------------- class PDFProcessor: """增强版PDF解析器,支持表格和文本混合提取""" def __init__(self): self.field_patterns = { "赛项名称": [ r'(?:竞
时间: 2025-05-20 15:43:27 浏览: 31
### 使用增强版PDF解析器提取表格和文本数据
为了实现从 PDF 文件中高效提取表格和文本数据,并结合 BERT 模型与 FAISS 向量库进行处理,可以按照以下方式设计流程。
#### 1. 增强版PDF解析器的选择
对于复杂的 PDF 文档(尤其是包含表格和文本混合的内容),推荐使用 `tabula-py` 和 `pandas` 结合的方式来提取表格数据,而针对纯文本部分,则可以选择更强大的工具如 `pdfplumber` 或 `Fitz (PyMuPDF)` 来完成。这些工具提供了更高的灵活性和准确性[^1]。
- **Tabula-PY**: 主要用于从 PDF 中读取表格数据并将其转换为 Pandas DataFrame。
- **PdfPlumber/Fitz**: 提供了对页面布局、字体样式以及复杂结构化内容的支持,适合于同时提取文本和图像等内容。
#### 2. 数据预处理阶段
一旦成功提取出原始数据之后,就需要对其进行清洗和标准化操作:
```python
import pdfplumber
from tabula import read_pdf
import pandas as pd
def extract_tables_from_pdf(pdf_path, pages="all"):
"""利用 Tabula 提取 PDF 表格"""
tables = read_pdf(pdf_path, pages=pages, multiple_tables=True)
return [table.dropna(how='all') for table in tables]
def extract_text_from_pdf(pdf_path):
"""利用 PdfPlumber 提取 PDF 纯文本"""
text_data = []
with pdfplumber.open(pdf_path) as pdf:
for page in pdf.pages:
text_data.append(page.extract_text())
return "\n".join(text_data)
# 示例调用
tables = extract_tables_from_pdf("example.pdf") # 获取所有表单
text_content = extract_text_from_pdf("example.pdf") # 获取全部文字
```
以上脚本展示了如何分别通过不同模块获取表格及非结构化的自由流动式段落信息[^1]。
#### 3. 应用BERT模型生成嵌入向量
接下来就是把得到的数据送入预先训练好的自然语言处理(NLP)框架下的句子编码器——这里选用的是基于 Transformer 架构构建而成的 Sentence-BERT 变体之一作为例子说明其工作原理:
```python
from sentence_transformers import SentenceTransformer
model_name = 'paraphrase-MiniLM-L6-v2' # 更轻量级版本
sentence_model = SentenceTransformer(model_name)
def generate_embeddings(sentences):
embeddings = sentence_model.encode(sentences, convert_to_tensor=True)
return embeddings.cpu().numpy()
sentences = ["This is an example.", "Another one here."]
embeddings = generate_embeddings(sentences)
print(embeddings.shape) # 输出形状应类似于(n_samples, dim_of_embedding_vector)
```
此代码片段定义了一个函数用来计算给定列表里每一句话对应的 embedding vector[^3]。
#### 4. 存储至FAISS索引以加速检索效率
最后一步便是把这些高维特征存放到专门优化过的内存映射文件当中去,这样做的好处是可以极大地减少磁盘 I/O 开销的同时还能保持较高的查询速度.
```python
import faiss
dimensionality = embeddings.shape[1]
index = faiss.IndexFlatL2(dimensionality) # 创建 L2 距离度量的空间对象实例
index.add(embeddings.astype('float32')) # 添加样本点集进入索引树形结构内部节点位置处
query_vec = generate_embeddings(["Find similar items to this."])[0].reshape(1,-1).astype('float32')
distances, indices = index.search(query_vec , k=5) # 寻找最近邻k个邻居
for i,dist in zip(indices.flatten(), distances.flatten()):
print(f"Index {i}: Distance={round(dist, 2)}")
```
上述程序演示了怎样建立简单的 FAISS Index 并执行近似最近邻搜索的任务[^3].
---
###
阅读全文
相关推荐


















