默认情况下,SimpleDirectoryReader是可以处理各种类型文件的,但是,在处理一些PDF等特殊格式的文件时并不能很好地识别内容文本,它连格式文本也一起读了进来,这并不是我们想要的。
但是目前也没有一个好的内置的Reader能正确读取PDF的内容文本,只能自己来实现。
LlamaIndex自己提供了一个开源免费版的parser:liteparse,但是为了他家付费的Reader,他并没有将这个parser封装成一个Reader,这里我们就可以自己封装这个Reader。
首先引入这个python包:
shell
pip install liteparse
然后实现Reader:
python
from datetime import datetime
from typing import Any, Iterable
from liteparse import LiteParse
from llama_index.core import SimpleDirectoryReader, Document
from llama_index.core.readers.base import BaseReader
# 继承BaseReader
class PDFReader(BaseReader):
"""
using liteparse to parse PDF files
"""
def lazy_load_data(self, *args: Any, **load_kwargs: Any) -> Iterable[Document]:
documents = []
# 实例化一个liteparser,用于把pdf文件的内容文本读取出来
parser = LiteParse()
# 其实args是一个path和tuple
for path in args:
# 读取文本内容
result = parser.parse(str(path))
# 生成document
document = Document(
name=path.name,
text=result.text,
metadata={
"author": "Kurt Johnson",
"file_type": "application/pdf",
"file_path": str(path),
"file_name": path.name,
"creation_date": datetime.now().strftime("%Y-%m-%d"),
"last_modified_date": datetime.now().strftime("%Y-%m-%d"),
}
)
documents.append(document)
return documents
测试使用这个Reader:
python
if __name__ == '__main__':
# 实例一个pdf reader
parser = PDFReader()
# 设置pdf类型文件的reader
pdf_file_extractor = {".pdf": parser}
reader = SimpleDirectoryReader("./data", file_extractor=pdf_file_extractor)
# 开始处理文件
documents = reader.load_data()
for document in documents:
print(f'{document.metadata['file_name']} - {document.metadata['file_type']}')
print('-' * 80)
print(document.text)
print('-' * 80)
print('\n')
默认情况下会有报错的日志,虽然并不影响运行,但是可以解决掉:
- 下载相应的文件
shell
https://github.com/tesseract-ocr/tessdata/raw/main/eng.traineddata
https://github.com/tesseract-ocr/tessdata/raw/main/chi_sim.traineddata
- 把这两个文件放进
~/.tesseract-rs/tessdata目录