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'})]