知识库的创建(1) - KnowledgeFile文件加载和分割


前言

前几篇讲了向量库的创建和索引的创建,我们可以去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. 初始化步骤

  1. 设置知识库名称 (kb_name)。
  2. 将文件名转换为 POSIX 路径格式 (filename)。
  3. 获取文件扩展名并转换为小写 (ext)。
  4. 检查文件扩展名是否受支持,不支持则抛出异常。
  5. 设置加载器的额外参数 (loader_kwargs)。
  6. 生成文件路径 (filepath)。
  7. 初始化文档内容 (docs) 和分割后的文档 (splited_docs) 为 None
  8. 根据文件扩展名获取相应的加载器类名 (document_loader_name)。
  9. 设置文本分割器名称 (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) 如果 docsNonerefreshTrue,则重新加载文档。
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_docsNonerefreshTrue,则重新加载并分割文档:
- 调用 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 类提供了对知识库中文件的管理功能,包括文件的加载、文本的分割和处理等。通过该类,可以方便地对知识库中的文件进行操作,并进行进一步的自然语言处理和分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值