MarkdownHeaderTextSplitter
Motivación
Muchas aplicaciones de chat o preguntas y respuestas implican dividir documentos de entrada antes de incrustarlos y vectorizarlos. Después de dividir el texto, a menudo es deseable agrupar fragmentos de texto con temas similares.
Por ejemplo, un archivo Markdown está organizado por encabezados de varios niveles como h1, h2 y h3. Podemos organizar fragmentos de texto con el mismo encabezado basándonos en los encabezados de Markdown.
Este capítulo presenta cómo LangChain divide el contenido del texto basado en encabezados de Markdown, utilizando el separador de texto MarkdownHeaderTextSplitter
.
Por ejemplo, si queremos dividir este Markdown:
md = '# Foo\\n\\n ## Bar\\n\\nHola, esto es Jim\\nHola, esto es Joe\\n\\n ## Baz\\n\\nHola, esto es Molly'
Establecemos las reglas de encabezamiento para dividir, según los encabezados de nivel 1 y nivel 2:
[("#", "Encabezado 1"),("##", "Encabezado 2")]
Aquí hay un ejemplo de la división de contenido basada en encabezados, donde el campo de metadatos registra a qué encabezado pertenece el fragmento de contenido actual:
{'content': 'Hola, esto es Jim\\nHola, esto es Joe', 'metadata': {'Encabezado 1': 'Foo', 'Encabezado 2': 'Bar'}}
{'content': 'Hola, esto es Molly', 'metadata': {'Encabezado 1': 'Foo', 'Encabezado 2': 'Baz'}}
Ahora veamos cómo escribir el código.
Instala las dependencias:
%pip install -qU langchain-text-splitters
from langchain_text_splitters import MarkdownHeaderTextSplitter
Referencia de API:
- Crea un separador de texto usando MarkdownHeaderTextSplitter
documento_de_md = "# Foo\n\n ## Bar\n\nHola, esto es Jim\n\nHola, esto es Joe\n\n ### Boo \n\n Hola, esto es Lance \n\n ## Baz\n\n Hola, esto es Molly"
encabezados_para_separar = [
("#", "Encabezado 1"),
("##", "Encabezado 2"),
("###", "Encabezado 3"),
]
separador_md = MarkdownHeaderTextSplitter(headers_to_split_on=encabezados_para_separar)
separaciones_de_encabezado_md = separador_md.split_text(documento_de_md)
separaciones_de_encabezado_md
[Document(page_content='Hola, esto es Jim \nHola, esto es Joe', metadata={'Encabezado 1': 'Foo', 'Encabezado 2': 'Bar'}),
Document(page_content='Hola, esto es Lance', metadata={'Encabezado 1': 'Foo', 'Encabezado 2': 'Bar', 'Encabezado 3': 'Boo'}),
Document(page_content='Hola, esto es Molly', metadata={'Encabezado 1': 'Foo', 'Encabezado 2': 'Baz'})]
type(separaciones_de_encabezado_md[0])
langchain.schema.Document
Dentro de cada grupo de Markdown, podemos aplicar cualquier separador de texto.
documento_de_md = "# Introducción \n\n ## Historia \n\n Markdown[9] es un lenguaje de marcado ligero para crear texto con formato usando un editor de texto plano. John Gruber creó Markdown en 2004 como un lenguaje de marcado que resulta atractivo para los lectores en su forma de código fuente.[9] \n\n Markdown se utiliza ampliamente en blogs, mensajería instantánea, foros en línea, software colaborativo, páginas de documentación y archivos readme. \n\n ## Auge y divergencia \n\n A medida que la popularidad de Markdown crecía rápidamente, surgieron muchas implementaciones de Markdown, impulsadas principalmente por la necesidad de \n\n características adicionales como tablas, notas al pie, listas de definición,[nota 1] y Markdown dentro de bloques HTML. \n\n #### Estandarización \n\n A partir de 2012, un grupo de personas, incluyendo a Jeff Atwood y John MacFarlane, lanzaron lo que Atwood caracterizó como un esfuerzo de estandarización. \n\n ## Implementaciones \n\n Las implementaciones de Markdown están disponibles para más de una docena de lenguajes de programación."
encabezados_para_separar = [
("#", "Encabezado 1"),
("##", "Encabezado 2"),
]
separador_md = MarkdownHeaderTextSplitter(headers_to_split_on=encabezados_para_separar)
separaciones_de_encabezado_md = separador_md.split_text(documento_de_md)
from langchain.text_splitter import RecursiveCharacterTextSplitter
tamaño_del_fragmento = 250
superposición_del_fragmento = 30
separador_de_texto = RecursiveCharacterTextSplitter(
chunk_size=tamaño_del_fragmento, chunk_overlap=superposición_del_fragmento
)
fragmentos = separador_de_texto.split_documents(separaciones_de_encabezado_md)
fragmentos
Resultados:
[Document(page_content='Markdown[9] es un lenguaje de marcado ligero para crear texto con formato usando un editor de texto plano. John Gruber creó Markdown en 2004 como un lenguaje de marcado que resulta atractivo para los lectores en su forma de código fuente.[9]', metadata={'Encabezado 1': 'Introducción', 'Encabezado 2': 'Historia'}),
Document(page_content='Markdown se utiliza ampliamente en blogs, mensajería instantánea, foros en línea, software colaborativo, páginas de documentación y archivos readme.', metadata={'Encabezado 1': 'Introducción', 'Encabezado 2': 'Historia'}),
Document(page_content='A medida que la popularidad de Markdown crecía rápidamente, surgieron muchas implementaciones de Markdown, impulsadas principalmente por la necesidad de \ncaracterísticas adicionales como tablas, notas al pie, listas de definición,[nota 1] y Markdown dentro de bloques HTML. \n#### Estandarización', metadata={'Encabezado 1': 'Introducción', 'Encabezado 2': 'Auge y divergencia'}),
Document(page_content='#### Estandarización \nA partir de 2012, un grupo de personas, incluyendo a Jeff Atwood y John MacFarlane, lanzaron lo que Atwood caracterizó como un esfuerzo de estandarización.', metadata={'Encabezado 1': 'Introducción', 'Encabezado 2': 'Auge y divergencia'}),
Document(page_content='Las implementaciones de Markdown están disponibles para más de una docena de lenguajes de programación.', metadata={'Encabezado 1': 'Introducción', 'Encabezado 2': 'Implementaciones'})]