文章目录
- 前言
- 一、 类的初始化方法 `__init__`
- 二、 方法 `file2docs`
- 三、 方法 `docs2texts`
- 四、 方法 `file2text`
- 五、 方法 `file_exist`
- 六、 方法 `get_size`
- 1. 功能
- 2. 返回
- 总结
前言
前几篇讲了向量库的创建和索引的创建,我们可以去langchain-chatchat里看看,作者实现的类是怎么写的,可以学习一下作者的封装方法。我们可以先来看看KnowledgeFile
类。
KnowledgeFile
类用于管理知识库目录中的文件,提供文件加载、文本分割等功能。它需要文件存在于磁盘上才能进行向量化等操作。以下是对该类的详细解析:
一、 类的初始化方法 __init__
def __init__(
self,
filename: str,
knowledge_base_name: str,
loader_kwargs: Dict = {},
):
'''
对应知识库目录中的文件,必须是磁盘上存在的才能进行向量化等操作。
'''
self.kb_name = knowledge_base_name
self.filename = str(Path(filename).as_posix())
self.ext = os.path.splitext(filename)[-1].lower()
if self.ext not in SUPPORTED_EXTS:
raise ValueError(f"暂未支持的文件格式 {self.filename}")
self.loader_kwargs = loader_kwargs
self.filepath = get_file_path(knowledge_base_name, filename)
self.docs = None
self.splited_docs = None
self.document_loader_name = get_LoaderClass(self.ext)
self.text_splitter_name = TEXT_SPLITTER_NAME
1. 参数解析
filename
: 文件名。knowledge_base_name
: 知识库的名称。loader_kwargs
: 加载器的额外参数。
2. 初始化步骤
- 设置知识库名称 (
kb_name
)。 - 将文件名转换为 POSIX 路径格式 (
filename
)。 - 获取文件扩展名并转换为小写 (
ext
)。 - 检查文件扩展名是否受支持,不支持则抛出异常。
- 设置加载器的额外参数 (
loader_kwargs
)。 - 生成文件路径 (
filepath
)。 - 初始化文档内容 (
docs
) 和分割后的文档 (splited_docs
) 为None
。 - 根据文件扩展名获取相应的加载器类名 (
document_loader_name
)。 - 设置文本分割器名称 (
text_splitter_name
)。
二、 方法 file2docs
def file2docs(self, refresh: bool = False):
if self.docs is None or refresh:
logger.info(f"{self.document_loader_name} used for {self.filepath}")
loader = get_loader(loader_name=self.document_loader_name,
file_path=self.filepath,
loader_kwargs=self.loader_kwargs)
self.docs = loader.load()
return self.docs
1. 功能
将文件加载为文档对象。
2. 参数
refresh
: 是否重新加载文档。
3. 步骤
1) 如果 docs
为 None
或 refresh
为 True
,则重新加载文档。
2) 记录加载器使用日志。
3) 根据加载器名称和文件路径获取加载器实例。
4) 使用加载器加载文档并存储在 docs
属性中。
5) 返回加载的文档。
三、 方法 docs2texts
def docs2texts(
self,
docs: List[Document] = None,
zh_title_enhance: bool = ZH_TITLE_ENHANCE,
refresh: bool = False,
chunk_size: int = CHUNK_SIZE,
chunk_overlap: int = OVERLAP_SIZE,
text_splitter: TextSplitter = None,
):
docs = docs or self.file2docs(refresh=refresh)
if not docs:
return []
if self.ext not in [".csv"]:
if text_splitter is None:
text_splitter = make_text_splitter(splitter_name=self.text_splitter_name, chunk_size=chunk_size,
chunk_overlap=chunk_overlap)
if self.text_splitter_name == "MarkdownHeaderTextSplitter":
docs = text_splitter.split_text(docs[0].page_content)
else:
docs = text_splitter.split_documents(docs)
if not docs:
return []
print(f"文档切分示例:{docs[0]}")
if zh_title_enhance:
docs = func_zh_title_enhance(docs)
self.splited_docs = docs
return self.splited_docs
1. 功能
将文档对象分割为更小的文本块,并可进行中文标题增强。
2. 参数
docs
: 文档列表,如果为None
则调用file2docs
加载文档。zh_title_enhance
: 是否进行中文标题增强。refresh
: 是否重新加载文档。chunk_size
: 文本块大小。chunk_overlap
: 文本块重叠大小。text_splitter
: 文本分割器实例。
3. 步骤
1) 如果未提供 docs
,则调用 file2docs
方法加载文档。
2) 如果 docs
为空,返回空列表。
3) 如果文件扩展名不是 .csv
,则进行文本分割:
- 如果未提供 text_splitter
,则根据配置创建文本分割器。
- 根据文本分割器名称选择分割方法。
4) 如果分割后的文档为空,返回空列表。
5) 输出文档切分示例。
6) 如果启用中文标题增强,则调用 func_zh_title_enhance
方法。
7) 将分割后的文档存储在 splited_docs
属性中并返回。
四、 方法 file2text
def file2text(
self,
zh_title_enhance: bool = ZH_TITLE_ENHANCE,
refresh: bool = False,
chunk_size: int = CHUNK_SIZE,
chunk_overlap: int = OVERLAP_SIZE,
text_splitter: TextSplitter = None,
):
if self.splited_docs is None or refresh:
docs = self.file2docs()
self.splited_docs = self.docs2texts(docs=docs,
zh_title_enhance=zh_title_enhance,
refresh=refresh,
chunk_size=chunk_size,
chunk_overlap=chunk_overlap,
text_splitter=text_splitter)
return self.splited_docs
1. 功能
将文件加载并分割为文本块。
2. 参数
zh_title_enhance
: 是否进行中文标题增强。refresh
: 是否重新加载文档。chunk_size
: 文本块大小。chunk_overlap
: 文本块重叠大小。text_splitter
: 文本分割器实例。
3. 步骤
1) 如果 splited_docs
为 None
或 refresh
为 True
,则重新加载并分割文档:
- 调用 file2docs
加载文档。
- 调用 docs2texts
分割文档。
2) 返回分割后的文档。
五、 方法 file_exist
def file_exist(self):
return os.path.isfile(self.filepath)
1. 功能
检查文件是否存在。
2. 返回
bool
: 文件存在返回True
,否则返回False
。
3. 方法 get_mtime
def get_mtime(self):
return os.path.getmtime(self.filepath)
4. 功能
获取文件的修改时间。
5. 返回
float
: 文件的修改时间(时间戳)。
六、 方法 get_size
def get_size(self):
return os.path.getsize(self.filepath)
1. 功能
获取文件大小。
2. 返回
int
: 文件大小(字节数)。
总结
KnowledgeFile
类提供了对知识库中文件的管理功能,包括文件的加载、文本的分割和处理等。通过该类,可以方便地对知识库中的文件进行操作,并进行进一步的自然语言处理和分析。