MarkdownHeaderTextSplitter

Motivação

Muitos aplicativos de bate-papo ou de perguntas e respostas envolvem quebrar os documentos de entrada antes de incorporá-los e vetorizá-los. Após a quebra do texto, muitas vezes é desejável agrupar fragmentos de texto com tópicos semelhantes.

Por exemplo, um arquivo Markdown é organizado por cabeçalhos de vários níveis, como h1, h2 e h3. Podemos organizar fragmentos de texto com o mesmo cabeçalho com base nos cabeçalhos do Markdown.

Este capítulo apresenta como o LangChain divide o conteúdo do texto com base nos cabeçalhos do Markdown, usando o separador de texto MarkdownHeaderTextSplitter.

Por exemplo, se quisermos dividir este Markdown:

md = '# Foo\\n\\n ## Bar\\n\\nHi this is Jim  \\nHi this is Joe\\n\\n ## Baz\\n\\n Hi this is Molly'

Definir as regras de cabeçalho para divisão, com base nos cabeçalhos de nível 1 e nível 2:

[("#", "Cabeçalho 1"),("##", "Cabeçalho 2")]

Aqui está um exemplo da divisão de conteúdo com base nos cabeçalhos, onde o campo de metadados registra a qual cabeçalho o fragmento de conteúdo atual pertence:

{'content': 'Hi this is Jim  \nHi this is Joe', 'metadata': {'Cabeçalho 1': 'Foo', 'Cabeçalho 2': 'Bar'}}
{'content': 'Hi this is Molly', 'metadata': {'Cabeçalho 1': 'Foo', 'Cabeçalho 2': 'Baz'}}

Agora vamos ver como escrever o código.

Instale as dependências:

%pip install -qU langchain-text-splitters
from langchain_text_splitters import MarkdownHeaderTextSplitter

Referência da API:

  • Crie um divisor de texto usando MarkdownHeaderTextSplitter
markdown_document = "# Foo\n\n    ## Bar\n\nOlá, isso é Jim\n\nOlá, isso é Joe\n\n ### Boo \n\n Olá, isso é Lance \n\n ## Baz\n\n Olá, isso é Molly"

headers_to_split_on = [
    ("#", "Cabeçalho 1"),
    ("##", "Cabeçalho 2"),
    ("###", "Cabeçalho 3"),
]

markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)
md_header_splits = markdown_splitter.split_text(markdown_document)
md_header_splits
[Documento(page_content='Olá, isso é Jim  \nOlá, isso é Joe', metadata={'Cabeçalho 1': 'Foo', 'Cabeçalho 2': 'Bar'}),
     Documento(page_content='Olá, isso é Lance', metadata={'Cabeçalho 1': 'Foo', 'Cabeçalho 2': 'Bar', 'Cabeçalho 3': 'Boo'}),
     Documento(page_content='Olá, isso é Molly', metadata={'Cabeçalho 1': 'Foo', 'Cabeçalho 2': 'Baz'})]
type(md_header_splits[0])
langchain.schema.Document

Dentro de cada grupo Markdown, podemos aplicar qualquer divisor de texto.

markdown_document = "# Intro \n\n    ## History \n\n O Markdown[9] é uma linguagem de marcação leve para criar texto formatado usando um editor de texto simples. John Gruber criou o Markdown em 2004 como uma linguagem de marcação que é atraente para os leitores humanos em sua forma de código-fonte.[9] \n\n O Markdown é amplamente utilizado em blogs, mensagens instantâneas, fóruns online, software colaborativo, páginas de documentação e arquivos readme. \n\n ## Ascensão e divergência \n\n À medida que a popularidade do Markdown crescia rapidamente, muitas implementações do Markdown surgiram, impulsionadas principalmente pela necessidade de \n\n recursos adicionais como tabelas, notas de rodapé, listas de definição,[nota 1] e Markdown dentro de blocos HTML. \n\n #### Padronização \n\n A partir de 2012, um grupo de pessoas, incluindo Jeff Atwood e John MacFarlane, lançou o que Atwood caracterizou como um esforço de padronização. \n\n ## Implementações \n\n Implementações do Markdown estão disponíveis para mais de uma dúzia de linguagens de programação."

headers_to_split_on = [
    ("#", "Cabeçalho 1"),
    ("##", "Cabeçalho 2"),
]

markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)
md_header_splits = markdown_splitter.split_text(markdown_document)

from langchain.text_splitter import RecursiveCharacterTextSplitter

tamanho_do_bloco = 250
sobreposição_do_bloco = 30
divisor_de_texto = RecursiveCharacterTextSplitter(
    tamanho_do_bloco=tamanho_do_bloco, sobreposição_do_bloco=sobreposição_do_bloco
)

spliters = text_splitter.split_documents(md_header_splits)
spliters

Resultados:

[Documento(conteúdo_da_página='O Markdown[9] é uma linguagem de marcação leve para criar texto formatado usando um editor de texto simples. John Gruber criou o Markdown em 2004 como uma linguagem de marcação que é atraente para os leitores humanos em sua forma de código-fonte.[9]', metadados={'Cabeçalho 1': 'Intro', 'Cabeçalho 2': 'History'}),
     Documento(conteúdo_da_página='O Markdown é amplamente utilizado em blogs, mensagens instantâneas, fóruns online, software colaborativo, páginas de documentação e arquivos readme.', metadados={'Cabeçalho 1': 'Intro', 'Cabeçalho 2': 'History'}),
     Documento(conteúdo_da_página='À medida que a popularidade do Markdown crescia rapidamente, muitas implementações do Markdown surgiram, impulsionadas principalmente pela necessidade de  \nrecursos adicionais como tabelas, notas de rodapé, listas de definição,[nota 1] e Markdown dentro de blocos HTML.  \n#### Padronização', metadados={'Cabeçalho 1': 'Intro', 'Cabeçalho 2': 'Rise and divergence'}),
     Documento(conteúdo_da_página='#### Padronização  \nA partir de 2012, um grupo de pessoas, incluindo Jeff Atwood e John MacFarlane, lançou o que Atwood caracterizou como um esforço de padronização.', metadados={'Cabeçalho 1': 'Intro', 'Cabeçalho 2': 'Rise and divergence'}),
     Documento(conteúdo_da_página='Implementações do Markdown estão disponíveis para mais de uma dúzia de linguagens de programação.', metadados={'Cabeçalho 1': 'Intro', 'Cabeçalho 2': 'Implementações'})]