ChineseDocumentSplitter
ChineseDocumentSplitter 使用先进的中文语言处理能力将中文文本文档分割成更小的块。它利用 HanLP 进行准确的中文分词和句子分词,非常适合处理需要语言意识的中文文本。
| pipeline 中的最常见位置 | 在 转换器 和 DocumentCleaner 之后, 分类器 之前的索引管道中。 |
| 强制运行变量 | "documents": 包含中文文本内容的文档列表。 |
| 输出变量 | "documents": 文档列表,每个文档包含原始中文文本的一个片段。 |
| API 参考 | PreProcessors (预处理器) |
| GitHub 链接 | https://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/hanlp |
概述
ChineseDocumentSplitter 是一个专门为中文文本处理设计的文档分割器。与英文文本不同,英文文本中的单词由空格分隔,而中文文本连续书写,单词之间没有空格。
此组件利用 HanLP(Han Language Processing)提供准确的中文分词和句子分词。它支持两种粒度级别:
- 粗粒度:提供适合大多数通用场景的更宽泛的分词。使用
COARSE_ELECTRA_SMALL_ZH模型进行通用分词。 - 细粒度:为特定应用提供更详细的分词。使用
FINE_ELECTRA_SMALL_ZH模型进行详细分词。
分割器可以按各种单位分割文档:
word:按中文词语(多字符标记)分割。sentence:使用 HanLP 句子分词器按句子分割。passage:按双换行符(“\n\n”)分割。page:按换页符(“\f”)分割。line:按单换行符(“\n”)分割。period:按句号(“.”)分割。function:使用自定义分割函数。
每个提取的块都保留了原始文档的元数据,并包含其他字段:
source_id:原始文档的 ID。page_number:块所属的页码。split_id:文档中分割的序列 ID。split_idx_start:块在原始文档中的起始索引。
当respect_sentence_boundary=True 设置时,该组件使用 HanLP 的句子分词器(UD_CTB_EOS_MUL),以确保分割仅发生在完整的句子之间,从而保持文本的语义完整性。
用法
单独使用
您可以使用在管道外直接处理中文文档的 ChineseDocumentSplitter。
from haystack import Document
from haystack_integrations.components.preprocessors.hanlp import ChineseDocumentSplitter
# Initialize the splitter with word-based splitting
splitter = ChineseDocumentSplitter(
split_by="word",
split_length=10,
split_overlap=3,
granularity="coarse"
)
# Create a Chinese document
doc = Document(content="这是第一句话,这是第二句话,这是第三句话。这是第四句话,这是第五句话,这是第六句话!")
# Warm up the component (loads the necessary models)
splitter.warm_up()
# Split the document
result = splitter.run(documents=[doc])
print(result["documents"]) # List of split documents
尊重句子边界
按词语分割时,可以确保尊重句子边界。
from haystack import Document
from haystack_integrations.components.preprocessors.hanlp import ChineseDocumentSplitter
doc = Document(content=
"这是第一句话,这是第二句话,这是第三句话。"
"这是第四句话,这是第五句话,这是第六句话!"
"这是第七句话,这是第八句话,这是第九句话?"
)
splitter = ChineseDocumentSplitter(
split_by="word",
split_length=10,
split_overlap=3,
respect_sentence_boundary=True,
granularity="coarse"
)
splitter.warm_up()
result = splitter.run(documents=[doc])
# Each chunk will end with a complete sentence
for doc in result["documents"]:
print(f"Chunk: {doc.content}")
print(f"Ends with sentence: {doc.content.endswith(('。', '!', '?'))}")
使用细粒度
用于更详细的分词。
from haystack import Document
from haystack_integrations.components.preprocessors.hanlp import ChineseDocumentSplitter
doc = Document(content="人工智能技术正在快速发展,改变着我们的生活方式。")
splitter = ChineseDocumentSplitter(
split_by="word",
split_length=5,
split_overlap=0,
granularity="fine" # More detailed segmentation
)
splitter.warm_up()
result = splitter.run(documents=[doc])
print(result["documents"])
使用自定义分割函数
您也可以使用自定义函数进行分割。
from haystack import Document
from haystack_integrations.components.preprocessors.hanlp import ChineseDocumentSplitter
def custom_split(text: str) -> list[str]:
"""Custom splitting function that splits by commas"""
return text.split(",")
doc = Document(content="第一段,第二段,第三段,第四段")
splitter = ChineseDocumentSplitter(
split_by="function",
splitting_function=custom_split
)
splitter.warm_up()
result = splitter.run(documents=[doc])
print(result["documents"])
在 pipeline 中
以下是如何集成ChineseDocumentSplitter 到 Haystack 索引管道中。
from haystack import Pipeline, Document
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.components.converters.txt import TextFileToDocument
from haystack_integrations.components.preprocessors.hanlp import ChineseDocumentSplitter
from haystack.components.preprocessors import DocumentCleaner
from haystack.components.writers import DocumentWriter
# Initialize components
document_store = InMemoryDocumentStore()
p = Pipeline()
p.add_component(instance=TextFileToDocument(), name="text_file_converter")
p.add_component(instance=DocumentCleaner(), name="cleaner")
p.add_component(instance=ChineseDocumentSplitter(
split_by="word",
split_length=100,
split_overlap=20,
respect_sentence_boundary=True,
granularity="coarse"
), name="chinese_splitter")
p.add_component(instance=DocumentWriter(document_store=document_store), name="writer")
# Connect components
p.connect("text_file_converter.documents", "cleaner.documents")
p.connect("cleaner.documents", "chinese_splitter.documents")
p.connect("chinese_splitter.documents", "writer.documents")
# Run pipeline with Chinese text files
p.run({"text_file_converter": {"sources": ["path/to/your/chinese/files.txt"]}})
此管道通过将中文文本文件转换为文档、清理文本、使用符合语言学规律的中文分词将其分割成块,并将结果存储在 Document Store 中以供进一步检索和处理,来处理中文文本文件。
更新于 3 个月前
