在处理长文本文档时,我们经常需要将其拆分成更小的块,以便进行进一步的处理和分析。Node Parser提供了一种简便的方法来实现这一需求。本文将介绍如何使用Node Parser对文档进行分块处理,并演示其在不同场景中的使用方法。
Node Parser简介
Node Parser是一个简单的抽象,它接受一组文档,将其拆分为Node对象,每个Node对象代表父文档的一个特定块。在文档被拆分为Nodes时,所有的属性都将被继承到子Nodes(如元数据、文本和元数据模板等)。
快速开始
独立使用
Node Parser可以单独使用。以下代码示例展示了如何使用SentenceSplitter将长文本拆分为多个节点:
from llama_index.core import Document
from llama_index.core.node_parser import SentenceSplitter
node_parser = SentenceSplitter(chunk_size=1024, chunk_overlap=20)
nodes = node_parser.get_nodes_from_documents(
[Document(text="long text")], show_progress=False
)
在这个示例中,我们创建了一个SentenceSplitter对象,并使用get_nodes_from_documents
方法将长文本拆分为多个大小为1024字符的块,块之间有20字符的重叠。
转换使用
Node Parser可以包含在任何带有摄取管道的转换集中。以下代码展示了如何将Node Parser与数据加载器和摄取管道结合使用:
from llama_index.core import SimpleDirectoryReader
from llama_index.core.ingestion import IngestionPipeline
from llama_index.core.node_parser import TokenTextSplitter
documents = SimpleDirectoryReader("./data").load_data()
pipeline = IngestionPipeline(transformations=[TokenTextSplitter(), ...])
nodes = pipeline.run(documents=documents)
索引使用
Node Parser还可以设置在一个转换或全局设置中,以在构建索引时自动使用:
from llama_index.core import SimpleDirectoryReader, VectorStoreIndex
from llama_index.core.node_parser import SentenceSplitter
documents = SimpleDirectoryReader("./data").load_data()
# 全局设置
from llama_index.core import Settings
Settings.text_splitter = SentenceSplitter(chunk_size=1024, chunk_overlap=20)
# 为每个索引设置
index = VectorStoreIndex.from_documents(
documents,
transformations=[SentenceSplitter(chunk_size=1024, chunk_overlap=20)],
)
可能遇到的错误
-
AttributeError: module ‘llama_index.core’ has no attribute ‘Document’
- 可能是由于库版本不匹配或者路径错误。确保正确安装并导入所需的库。
-
FileNotFoundError: [Errno 2] No such file or directory: ‘./data’
- 确保给定路径下存在数据目录,并且具有适当的读写权限。
-
TypeError: ‘NoneType’ object is not iterable
- 可能是由于传递给Node Parser的文档列表为空或格式不正确。确保传递有效的文档列表。
如果你觉得这篇文章对你有帮助,请点赞,关注我的博客,谢谢!
参考资料: