MarkdownHeaderTextSplitter

Motivation

Viele Chat- oder Q&A-Anwendungen erfordern das Segmentieren von Eingabedokumenten vor dem Einbetten und Vektorisieren. Nach dem Textsegmentieren ist es oft wünschenswert, Textfragmente mit ähnlichen Themen zusammenzufassen.

Beispielsweise ist eine Markdown-Datei nach mehreren Hierarchieebenen wie h1, h2 und h3 organisiert. Wir können Textfragmente mit derselben Überschrift basierend auf Markdown-Überschriften organisieren.

Dieses Kapitel stellt vor, wie LangChain Textinhalte basierend auf Markdown-Überschriften mit dem Text-Splitter MarkdownHeaderTextSplitter aufteilt.

Wenn wir beispielsweise dieses Markdown aufteilen möchten:

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

Legen Sie die Überschriftenregeln für die Aufteilung fest, basierend auf Überschriften der Stufe 1 und Stufe 2:

[("#", "Überschrift 1"),("##", "Überschrift 2")]

Hier ist ein Beispiel für die Aufteilung des Inhalts basierend auf Überschriften, wobei das Metadatenfeld angibt, zu welcher Überschrift der aktuelle Inhaltsfragment gehört:

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

Nun schauen wir uns an, wie der Code geschrieben wird.

Installieren Sie die Abhängigkeiten:

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

API-Referenz:

  • Erstellen Sie einen Text-Splitter mit MarkdownHeaderTextSplitter
markdown_document = "# Foo\n\n    ## Bar\n\nHallo, das ist Jim\n\nHallo, das ist Joe\n\n ### Boo \n\n Hallo, das ist Lance \n\n ## Baz\n\n Hallo, das ist Molly"

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

markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)
md_header_splits = markdown_splitter.split_text(markdown_document)
md_header_splits
[Dokument(seiteninhalt='Hallo, das ist Jim  \nHallo, das ist Joe', metadaten={'Überschrift 1': 'Foo', 'Überschrift 2': 'Bar'}),
     Dokument(seiteninhalt='Hallo, das ist Lance', metadaten={'Überschrift 1': 'Foo', 'Überschrift 2': 'Bar', 'Überschrift 3': 'Boo'}),
     Dokument(seiteninhalt='Hallo, das ist Molly', metadaten={'Überschrift 1': 'Foo', 'Überschrift 2': 'Baz'})]
type(md_header_splits[0])
langchain.schema.Document

Innerhalb jeder Markdown-Gruppe können wir jeden Text-Splitter anwenden.

markdown_document = "# Intro \n\n    ## Geschichte \n\n Markdown[9] ist eine leichtgewichtige Auszeichnungssprache zur Erstellung formatierten Textes mit einem einfachen Texteditor. John Gruber erstellte Markdown im Jahr 2004 als Auszeichnungssprache, die in ihrer Quellcodeform für menschliche Leser ansprechend ist.[9] \n\n Markdown wird weit verbreitet in Blogs, Instant Messaging, Online-Foren, kollaborativer Software, Dokumentationsseiten und README-Dateien eingesetzt. \n\n ## Aufstieg und Divergenz \n\n Mit dem rapiden Anstieg der Popularität von Markdown entstanden viele Markdown-Implementierungen, die hauptsächlich durch die Notwendigkeit zusätzlicher Funktionen wie Tabellen, Fußnoten, Definitionenlisten,[note 1] und Markdown innerhalb von HTML-Blöcken vorangetrieben wurden. \n\n #### Standardisierung \n\n Ab 2012 startete eine Gruppe von Personen, darunter Jeff Atwood und John MacFarlane, was Atwood als Standardisierungsbemühungen bezeichnete. \n\n ## Implementierungen \n\n Implementierungen von Markdown sind für über ein Dutzend Programmiersprachen verfügbar."

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

Ergebnisse:

[Dokument(seiteninhalt='Markdown[9] ist eine leichtgewichtige Auszeichnungssprache zur Erstellung formatierten Textes mit einem einfachen Texteditor. John Gruber erstellte Markdown im Jahr 2004 als Auszeichnungssprache, die in ihrer Quellcodeform für menschliche Leser ansprechend ist.[9]', metadaten={'Überschrift 1': 'Intro', 'Überschrift 2': 'Geschichte'}),
     Dokument(seiteninhalt='Markdown wird weit verbreitet in Blogs, Instant Messaging, Online-Foren, kollaborativer Software, Dokumentationsseiten und README-Dateien eingesetzt.', metadaten={'Überschrift 1': 'Intro', 'Überschrift 2': 'Geschichte'}),
     Dokument(seiteninhalt='Mit dem rapiden Anstieg der Popularität von Markdown entstanden viele Markdown-Implementierungen, die hauptsächlich durch die Notwendigkeit zusätzlicher Funktionen wie Tabellen, Fußnoten, Definitionenlisten,[note 1] und Markdown innerhalb von HTML-Blöcken vorangetrieben wurden.  \n#### Standardisierung', metadaten={'Überschrift 1': 'Intro', 'Überschrift 2': 'Aufstieg und Divergenz'}),
     Dokument(seiteninhalt='#### Standardisierung  \nAb 2012 startete eine Gruppe von Personen, darunter Jeff Atwood und John MacFarlane, was Atwood als Standardisierungsbemühungen bezeichnete.', metadaten={'Überschrift 1': 'Intro', 'Überschrift 2': 'Aufstieg und Divergenz'}),
     Dokument(seiteninhalt='Implementierungen von Markdown sind für über ein Dutzend Programmiersprachen verfügbar.', metadaten={'Überschrift 1': 'Intro', 'Überschrift 2': 'Implementierungen'})]