MarkdownHeaderTextSplitter

Motivazione

Molte applicazioni di chat o Q&A richiedono la suddivisione di documenti in input prima di incorporarli e vettorizzarli. Dopo la suddivisione del testo, è spesso auspicabile raggruppare frammenti di testo con argomenti simili.

Ad esempio, un file Markdown è organizzato da intestazioni a più livelli come h1, h2 e h3. Possiamo organizzare i frammenti di testo con lo stesso livello di intestazione in base alle intestazioni Markdown.

In questo capitolo viene presentato come LangChain suddivide il contenuto del testo in base alle intestazioni Markdown, utilizzando il divisore di testo MarkdownHeaderTextSplitter.

Ad esempio, se vogliamo suddividere questo Markdown:

md = '# Foo\\n\\n ## Bar\\n\\nCiao, questo è Jim \\nCiao, questo è Joe\\n\\n ## Baz\\n\\n Ciao, questo è Molly'

Impostare le regole di intestazione per la suddivisione, basate sulle intestazioni di livello 1 e 2:

[("#", "Intestazione 1"),("##", "Intestazione 2")]

Ecco un esempio della suddivisione del contenuto in base alle intestazioni, in cui il campo dei metadati registra a quale intestazione appartiene il frammento di contenuto attuale:

{'content': 'Ciao, questo è Jim  \nCiao, questo è Joe', 'metadata': {'Intestazione 1': 'Foo', 'Intestazione 2': 'Bar'}}
{'content': 'Ciao, questo è Molly', 'metadata': {'Intestazione 1': 'Foo', 'Intestazione 2': 'Baz'}}

Adesso vediamo come scrivere il codice.

Installare le dipendenze:

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

Riferimento API:

  • Creare uno splitter di testo utilizzando MarkdownHeaderTextSplitter
markdown_document = "# Foo\n\n    ## Bar\n\nCiao, questo è Jim\n\nCiao, questo è Joe\n\n ### Boo \n\n Ciao, questo è Lance \n\n ## Baz\n\n Ciao, questo è Molly"

headers_to_split_on = [
    ("#", "Intestazione 1"),
    ("##", "Intestazione 2"),
    ("###", "Intestazione 3"),
]

markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)
md_header_splits = markdown_splitter.split_text(markdown_document)
md_header_splits
[Document(page_content='Ciao, questo è Jim  \nCiao, questo è Joe', metadata={'Intestazione 1': 'Foo', 'Intestazione 2': 'Bar'}),
     Document(page_content='Ciao, questo è Lance', metadata={'Intestazione 1': 'Foo', 'Intestazione 2': 'Bar', 'Intestazione 3': 'Boo'}),
     Document(page_content='Ciao, questo è Molly', metadata={'Intestazione 1': 'Foo', 'Intestazione 2': 'Baz'})]
type(md_header_splits[0])
langchain.schema.Document

All'interno di ciascun gruppo Markdown, possiamo applicare qualsiasi splitter di testo.

markdown_document = "# Introduzione \n\n    ## Storia \n\n Markdown[9] è un linguaggio di markup leggero per la creazione di testo formattato utilizzando un editor di testo semplice. John Gruber ha creato Markdown nel 2004 come linguaggio di markup che è attraente per i lettori umani nella sua forma di codice sorgente.[9] \n\n Markdown è ampiamente utilizzato nei blog, nelle chat istantanee, nei forum online, nel software collaborativo, nelle pagine di documentazione e nei file readme. \n\n ## Ascesa e divergenza \n\n Con la rapida crescita della popolarità di Markdown, sono apparse molte implementazioni di Markdown, motivate principalmente dalla necessità di \n\n funzionalità aggiuntive come tabelle, note a piè di pagina, elenchi di definizioni,[nota 1] e Markdown all'interno di blocchi HTML. \n\n #### Standardizzazione \n\n Dal 2012, un gruppo di persone, tra cui Jeff Atwood e John MacFarlane, ha lanciato quello che Atwood ha definito un'opera di standardizzazione. \n\n ## Implementazioni \n\n Sono disponibili implementazioni di Markdown per oltre una dozzina di linguaggi di programmazione."

headers_to_split_on = [
    ("#", "Intestazione 1"),
    ("##", "Intestazione 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

chunk_size = 250
chunk_overlap = 30
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=chunk_size, chunk_overlap=chunk_overlap
)

splits = text_splitter.split_documents(md_header_splits)
splits

Risultati:

[Document(page_content='Markdown[9] è un linguaggio di markup leggero per la creazione di testi formattati utilizzando un editor di testo semplice. John Gruber ha creato Markdown nel 2004 come linguaggio di markup che è attraente per i lettori umani nella sua forma di codice sorgente.[9]', metadata={'Intestazione 1': 'Introduzione', 'Intestazione 2': 'Storia'}),
     Document(page_content='Markdown è ampiamente utilizzato nei blog, nelle chat istantanee, nei forum online, nel software collaborativo, nelle pagine di documentazione e nei file readme.', metadata={'Intestazione 1': 'Introduzione', 'Intestazione 2': 'Storia'}),
     Document(page_content='Con la rapida crescita della popolarità di Markdown, sono apparse molte implementazioni di Markdown, motivate principalmente dalla necessità di  \nfunzionalità aggiuntive come tabelle, note a piè di pagina, elenchi di definizioni,[nota 1] e Markdown all\'interno di blocchi HTML.  \n#### Standardizzazione', metadata={'Intestazione 1': 'Introduzione', 'Intestazione 2': 'Ascesa e divergenza'}),
     Document(page_content='#### Standardizzazione  \nDal 2012, un gruppo di persone, tra cui Jeff Atwood e John MacFarlane, ha lanciato quello che Atwood ha definito un\'opera di standardizzazione.', metadata={'Intestazione 1': 'Introduzione', 'Intestazione 2': 'Ascesa e divergenza'}),
     Document(page_content='Sono disponibili implementazioni di Markdown per oltre una dozzina di linguaggi di programmazione.', metadata={'Intestazione 1': 'Introduzione', 'Intestazione 2': 'Implementazioni'})]