MarkdownHeaderTextSplitter
Motivation
De nombreuses applications de chat ou de questions-réponses impliquent la découpe de documents d'entrée avant de les intégrer et de les vectoriser. Après la découpe du texte, il est souvent souhaitable de regrouper les fragments de texte ayant des sujets similaires.
Par exemple, un fichier Markdown est organisé par des en-têtes de plusieurs niveaux tels que h1, h2 et h3. Nous pouvons organiser les fragments de texte ayant le même en-tête en fonction des en-têtes Markdown.
Ce chapitre présente comment LangChain découpe le contenu du texte en fonction des en-têtes Markdown, en utilisant le découpeur de texte MarkdownHeaderTextSplitter
.
Par exemple, si nous voulons découper ce Markdown :
md = '# Foo\\n\\n ## Bar\\n\\nHi this is Jim \\nHi this is Joe\\n\\n ## Baz\\n\\n Hi this is Molly'
Définissez les règles d'en-tête pour la découpe, basées sur les en-têtes de niveau 1 et de niveau 2 :
[("#", "En-tête 1"),("##", "En-tête 2")]
Voici un exemple de découpe du contenu en fonction des en-têtes, où le champ de métadonnées enregistre à quel en-tête le fragment de contenu actuel appartient :
{'content': 'Hi this is Jim \nHi this is Joe', 'metadata': {'En-tête 1': 'Foo', 'En-tête 2': 'Bar'}}
{'content': 'Hi this is Molly', 'metadata': {'En-tête 1': 'Foo', 'En-tête 2': 'Baz'}}
Voyons maintenant comment écrire le code.
Installez les dépendances :
%pip install -qU langchain-text-splitters
from langchain_text_splitters import MarkdownHeaderTextSplitter
Référence de l'API :
- Créer un séparateur de texte en utilisant MarkdownHeaderTextSplitter
markdown_document = "# Foo\n\n ## Bar\n\nSalut c'est Jim\n\nSalut c'est Joe\n\n ### Boo \n\n Salut c'est Lance \n\n ## Baz\n\n Salut c'est Molly"
headers_to_split_on = [
("#", "En-tête 1"),
("##", "En-tête 2"),
("###", "En-tête 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='Salut c'est Jim \nSalut c'est Joe', metadata={'En-tête 1': 'Foo', 'En-tête 2': 'Bar'}),
Document(page_content='Salut c'est Lance', metadata={'En-tête 1': 'Foo', 'En-tête 2': 'Bar', 'En-tête 3': 'Boo'}),
Document(page_content='Salut c'est Molly', metadata={'En-tête 1': 'Foo', 'En-tête 2': 'Baz'})]
type(md_header_splits[0])
langchain.schema.Document
À l'intérieur de chaque groupe Markdown, nous pouvons appliquer n'importe quel séparateur de texte.
markdown_document = "# Intro \n\n ## History \n\n Markdown[9] est un langage de balisage léger pour créer du texte formaté en utilisant un éditeur de texte brut. John Gruber a créé Markdown en 2004 en tant que langage de balisage attrayant pour les lecteurs en sa forme de code source.[9] \n\n Markdown est largement utilisé dans les blogs, la messagerie instantanée, les forums en ligne, les logiciels collaboratifs, les pages de documentation et les fichiers readme. \n\n ## Émergence et divergence \n\n Avec la rapide croissance de la popularité de Markdown, de nombreuses implémentations de Markdown sont apparues, principalement motivées par le besoin de \n\n fonctionnalités supplémentaires telles que les tableaux, les notes de bas de page, les listes de définitions,[note 1] et le Markdown à l'intérieur de blocs HTML. \n\n #### Normalisation \n\n À partir de 2012, un groupe de personnes, dont Jeff Atwood et John MacFarlane, a lancé ce qu'Atwood a qualifié d'effort de normalisation. \n\n ## Implémentations \n\n Des implémentations de Markdown sont disponibles pour plus d'une douzaine de langages de programmation."
headers_to_split_on = [
("#", "En-tête 1"),
("##", "En-tête 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
Résultats:
[Document(page_content='Markdown[9] est un langage de balisage léger pour créer du texte formaté en utilisant un éditeur de texte brut. John Gruber a créé Markdown en 2004 en tant que langage de balisage attrayant pour les lecteurs en sa forme de code source.[9]', metadata={'En-tête 1': 'Intro', 'En-tête 2': 'History'}),
Document(page_content='Markdown est largement utilisé dans les blogs, la messagerie instantanée, les forums en ligne, les logiciels collaboratifs, les pages de documentation et les fichiers readme.', metadata={'En-tête 1': 'Intro', 'En-tête 2': 'History'}),
Document(page_content="Avec la rapide croissance de la popularité de Markdown, de nombreuses implémentations de Markdown sont apparues, principalement motivées par le besoin de \nfonctionnalités supplémentaires telles que les tableaux, les notes de bas de page, les listes de définitions,[note 1] et le Markdown à l'intérieur de blocs HTML. \n#### Normalisation", metadata={'En-tête 1': 'Intro', 'En-tête 2': 'Émergence et divergence'}),
Document(page_content="#### Normalisation \nÀ partir de 2012, un groupe de personnes, dont Jeff Atwood et John MacFarlane, a lancé ce qu'Atwood a qualifié d'effort de normalisation.", metadata={'En-tête 1': 'Intro', 'En-tête 2': 'Émergence et divergence'}),
Document(page_content='Des implémentations de Markdown sont disponibles pour plus d\'une douzaine de langages de programmation.', metadata={'En-tête 1': 'Intro', 'En-tête 2': 'Implémentations'})]