我在我的 M1 mac 上成功回答了多个 PDF 中的问题。但某些 pdf 存在一些问题。
我正在使用 Langchain 运行 anaconda。 PDF 的大小从 100K 到 3meg 不等。 Juypiter记事本运行时出现错误是:“index = VectorstoreIndexCreator().from_loaders(loaders)index”
阻止某些文件加载的错误是: “忽略(部分)ToUnicode 映射,因为 PDF 数据不符合格式。这可能会导致输出中出现 (cid) 值。开始和结束字节的长度不同。”
另一个错误也没关系: “未安装 detectorron2。无法使用 hi_res 分区策略。回退到使用快速策略进行分区。”
谢谢
完整代码如下。
-
#!pip install langchain
#!pip install unstructured
#!pip install openai
#!pip install chromadb
#!pip install Cython
#!pip install tiktoken
-
#load required packages
from langchain.document_loaders import UnstructuredPDFLoader
from langchain.indexes import VectorstoreIndexCreator
-
# set the openai key
import os
os.environ["OPENAI_API_KEY"] = ""
#your files
pdf_folder_path = "/Users/.../Documents/.../testpdfs"
#set the pdf folder path change this!!!
## pdf_folder_path = f'{root_dir}/data/'
## os.listdir(pdf_folder_path)
# loacation of the pdf file/files
#location of the pdf file/files.
loaders = [UnstructuredPDFLoader(os.path.join(pdf_folder_path, fn)) for fn in os.listdir(pdf_folder_path)]
#vector stores
#ImportError: Following dependencies are missing: pdfminer. Please install them using `pip install unstructured[local-inference]`.
#Chroma as vectorstore to index and search embeddings
#There are three main steps going on after the documents are loaded:
##Splitting documents into chunks
##Creating embeddings for each document
##Storing documents and embeddings in a vectorstore
index = VectorstoreIndexCreator().from_loaders(loaders)
index
#questions
%%time
#query
index.query_with_sources('Tell me about xyz')
我对Python知之甚少,我知道有些人觉得它很容易,有些人则不然。 我预计会出现一个错误来显示哪个 pdf 是错误的。
第一次回答问题,但我在构建东西时也遇到了同样的情况。在本例中,我创建了一个函数,该函数将使用与
UnstructuredPDFLoader
使用的相同基本源来处理 PDF。
from PyPDF2 import PdfReader
try:
pdf_reader = PdfReader(f)
for page_num in range(len(pdf_reader.pages)):
page = pdf_reader.pages[page_num]
except Exception as e:
print(f"Error processing file {pdf}: {str(e)} -- file Excluded from analysis")
您可以使用此位作为函数并循环遍历文件,以便找到有问题的文件。可能会创建一个列表并保存它们(或者只保存那些正在工作的)。
确保文件夹中的所有文件都是 pdf。
试试这个:
loaders = [UnstructuredPDFLoader(os.path.join(pdf_folder_path, fn)) for fn in os.listdir(pdf_folder_path) if fn.endswith('.pdf')]
这将避免加载操作系统创建的隐藏文件。