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