LangChain之CharacterTextSplitter的split_text和split_documents

2023-11-01 02:44

本文主要是介绍LangChain之CharacterTextSplitter的split_text和split_documents,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言
今天第一次尝试深挖LangChain的RAG效果,结果就卡到数据的分割了。
我本来是用一个csv文件来做demo的,那么就参考别人的代码,开始了照虎画猫的拙劣表演。

根据需要,我写出了下面的代码:

def load_file(filepath):if filepath.endswith('csv'):loader = CSVLoader(file_path=filepath)else:loader = UnstructuredFileLoader(file_path=filepath, mode='elements')text_splitter = ChineseTextSplitter()# 这个splitter是我继承CharacterTextSplitter定义的类docs = loader.load_and_split(text_splitter=text_splitter)return docs

但是在使用的时候,我看到CharacterTextSplitter的API文档,里面有几个方法,大体上感觉问题不大,这把稳了。
但是……,我注意到有split_textsplit_documents两个方法。从说法上,我实在是看不出来有什么关系,然后我就没当回事,就按照字面意思就开整了(OS:当时我就想着,这两个方法应该我用一个就好,处理的是文本,那么就梭哈写出了下面的ChineseTextSplitter类)

class ChineseTextSplitter(CharacterTextSplitter):def __init__(self, pdf: bool = False, **kwargs):super().__init__(**kwargs)def split_text(self, text: str) -> List[str]:print(text)return textdef split_documents(self, documents: Iterable[object]):return

结果loader.load_and_split(text_splitter=text_splitter)的结果死活出不来,而且控制台终端上也没有输出。当时我就开始了长达数小时的百度、Bing、Google……。
最后只能说,瞎猫碰上了死耗子。我心想为啥有两个方法,我就无意中点开了CharacterTextSplitter的源码,然后就看到了下面的内容:

[docs]class CharacterTextSplitter(TextSplitter):"""Splitting text that looks at characters."""[docs]    def __init__(self, separator: str = "\n\n", is_separator_regex: bool = False, **kwargs: Any) -> None:"""Create a new TextSplitter."""super().__init__(**kwargs)self._separator = separatorself._is_separator_regex = is_separator_regex[docs]    def split_text(self, text: str) -> List[str]:"""Split incoming text and return chunks."""# First we naively split the large input into a bunch of smaller ones.separator = (self._separator if self._is_separator_regex else re.escape(self._separator))splits = _split_text_with_regex(text, separator, self._keep_separator)_separator = "" if self._keep_separator else self._separatorreturn self._merge_splits(splits, _separator)

我发现,没有实现split_documents,那我自己却给实现了,这不是直接将父类TextSplitter给重写了吗!!!!

然后我又看了看TextSplitter类实现:

[docs]    @abstractmethoddef split_text(self, text: str) -> List[str]:"""Split text into multiple components."""[docs]    def create_documents(self, texts: List[str], metadatas: Optional[List[dict]] = None) -> List[Document]:"""Create documents from a list of texts."""_metadatas = metadatas or [{}] * len(texts)documents = []for i, text in enumerate(texts):index = -1for chunk in self.split_text(text):metadata = copy.deepcopy(_metadatas[i])if self._add_start_index:index = text.find(chunk, index + 1)metadata["start_index"] = indexnew_doc = Document(page_content=chunk, metadata=metadata)documents.append(new_doc)return documents[docs]    def split_documents(self, documents: Iterable[Document]) -> List[Document]:"""Split documents."""texts, metadatas = [], []for doc in documents:texts.append(doc.page_content)metadatas.append(doc.metadata)return self.create_documents(texts, metadatas=metadatas)

最后终于看到了他们之间的关系,原来是先调用split_documents方法(因为LangChain的处理对象都是以Document为单位);
然后获取数据,调用create_documents;同时在该方法中还调用了split_text的方法对文本继续分词,完成Document对象的封装。

至此初步了解了两个方法之间的关系,以及类之间的继承。
总结一句话就是,能力不足,基础不牢,只懂梭哈,傻乐吃瓜。

这篇关于LangChain之CharacterTextSplitter的split_text和split_documents的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/319914

相关文章

bytes.split的用法和注意事项

当然,我很乐意详细介绍 bytes.Split 的用法和注意事项。这个函数是 Go 标准库中 bytes 包的一个重要组成部分,用于分割字节切片。 基本用法 bytes.Split 的函数签名如下: func Split(s, sep []byte) [][]byte s 是要分割的字节切片sep 是用作分隔符的字节切片返回值是一个二维字节切片,包含分割后的结果 基本使用示例: pa

【Python报错已解决】AttributeError: ‘list‘ object has no attribute ‘text‘

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查属性名2.2 步骤二:访问列表元素的属性 三、其他解决方法四、总结 前言 在Python编程中,属性错误(At

【ReactJS】困惑于text/babel与browser.js还是babel.js?

使用JSX   使用JSX,可以极大的简化React元素的创建,JSX抽象化了React.createElement()函数的使用,其语法风格类似于HTML语法风格。对比如下代码可以让你更好的理解这一点。 // 使用React.createElement()return React.createElement('div',null,'Hello',this.props.name);//使用J

Android:EditText在hint字体大小和text字体大小不一致时的设置方法

今天碰到一个需求,有一个输入框EditText,要求输入某项金额,要求在未输入文字之前,hint提示,输入文字之后显示输入的文字,要求是未输入内容时hint字体大小为14sp,输入金额之后字体大小要变成30sp。,可是EditText本身没有这个属性可以设置,怎么办呢,只有在代码中添加监听事件了: /*** 添加监听,在hint时和text时切换字体大小*/cetMoney.addTextCha

LLM大模型教程:langchain 教程

软件安装 pip install pymupdfpip install langchainpip install langchain-cliconda install -c pytorch -c nvidia faiss-gpu=1.7.4 mkl=2021 blas=1.0=mkl 由于langchain不支持qwen模型,我们需要自定义模型 from typing import A

基于LangChain+LLM的相关技术研究及初步实践

01 概述 大模型概述 大模型是指具有大规模参数和复杂计算结构的机器学习模型。这些模型通常由深度神经网络构建而成,拥有数十亿甚至数千亿个参数。大模型的设计目的是为了提高模型的表达能力和预测性能,能够处理更加复杂的任务和数据。大模型在各种领域都有广泛的应用,包括自然语言处理、计算机视觉、语音识别和推荐系统等。大模型通过训练海量数据来学习复杂的模式和特征,具有更强大的泛化能力,可以对未见过的数据

Sublime Text 3搭建PHP开发环境说明

1、设置环境变量 Windows系统环境变量path增加php.exe所在目录路径 2、创建PHP编译系统 添加 PHP 的 build system,如图所示, Tools->Build System-> New Build System : 新建一个,默认的内容是:{ "shell_cmd": "make"}修改为:{ "cmd": ["php", "$file"], "file_re

多字节、宽字节、兼容字节(TEXT) 相关操作汇总

常用函数对照 ANSIUNICODE通用说明数据类型(char.h)(wchar.h)(tchar.h) charwchar_tTCHAR char *wchar_t *TCHAR* LPSTRLPWSTRLPTSTR LPCSTRLPCWSTRLPCTSTR     字符串转换atoi_wtoi_ttoi把字符串转换成整数(int)atol_wtol_ttol把字符串转换成长整型数(long)

Sublime Text 3常用快键键总结

通用(General) ↑↓←→:上下左右移动光标,注意不是不是 KJHL !Alt:调出菜单Ctrl + Shift + P:调出命令板(Command Palette)Ctrl + ` :调出控制台 编辑(Editing) Ctrl + Enter:在当前行下面新增一行然后跳至该行Ctrl + Shift + Enter:在当前行上面增加一行并跳至该行Ctrl + ←/→:进行逐词移动