MarkdownHeaderTextSplitter

Motywacja

Wiele aplikacji do czatowania lub pytania i odpowiedzi wymaga podziału dokumentów wejściowych przed osadzeniem ich oraz wektorowaniem. Po podziale tekstu często pożądane jest grupowanie fragmentów tekstu o podobnych tematach.

Na przykład plik Markdown jest zorganizowany z wielopoziomowymi nagłówkami, takimi jak h1, h2 i h3. Możemy zorganizować fragmenty tekstu o tych samych nagłówkach na podstawie nagłówków Markdown.

Ten rozdział przedstawia, jak LangChain dzieli zawartość tekstu na podstawie nagłówków Markdown, przy użyciu dzielnika tekstu MarkdownHeaderTextSplitter.

Na przykład, jeśli chcemy podzielić ten Markdown:

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

Ustaw reguły nagłówków do podziału, na podstawie nagłówków poziomu 1 i poziomu 2:

[("#", "Nagłówek 1"),("##", "Nagłówek 2")]

Oto przykład zawartości podzielonej na podstawie nagłówków, gdzie pole metadanych określa, do którego nagłówka należy bieżący fragment zawartości:

{'content': 'Hi this is Jim  \nHi this is Joe', 'metadata': {'Nagłówek 1': 'Foo', 'Nagłówek 2': 'Bar'}}
{'content': 'Hi this is Molly', 'metadata': {'Nagłówek 1': 'Foo', 'Nagłówek 2': 'Baz'}}

Teraz zobaczmy, jak napisać kod.

Zainstaluj zależności:

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

Dokumentacja interfejsu API:

  • Utwórz podział tekstu za pomocą MarkdownHeaderTextSplitter
markdown_document = "# Foo\n\n    ## Bar\n\nCześć, tu jest Jim\n\nCześć, tu jest Joe\n\n ### Boo \n\n Cześć, tu jest Lance \n\n ## Baz\n\n Cześć, tu jest Molly"

headers_to_split_on = [
    ("#", "Nagłówek 1"),
    ("##", "Nagłówek 2"),
    ("###", "Nagłówek 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='Cześć, tu jest Jim  \nCześć, tu jest Joe', metadata={'Nagłówek 1': 'Foo', 'Nagłówek 2': 'Bar'}),
     Document(page_content='Cześć, tu jest Lance', metadata={'Nagłówek 1': 'Foo', 'Nagłówek 2': 'Bar', 'Nagłówek 3': 'Boo'}),
     Document(page_content='Cześć, tu jest Molly', metadata={'Nagłówek 1': 'Foo', 'Nagłówek 2': 'Baz'})]
type(md_header_splits[0])
langchain.schema.Document

W ramach każdej grupy w Markdown możemy zastosować jakikolwiek podział tekstu.

markdown_document = "# Wstęp \n\n    ## Historia \n\n Markdown[9] to lekki język znaczników do tworzenia sformatowanego tekstu za pomocą edytora tekstu. John Gruber stworzył Markdown w 2004 roku jako język znaczników przystępny dla ludzkich czytelników w formie kodu źródłowego.[9] \n\n Markdown jest szeroko stosowany w blogowaniu, komunikatorach internetowych, forach online, oprogramowaniu do współpracy, stronach dokumentacji i plikach readme. \n\n ## Wzrost i różnicowanie \n\n W miarę wzrostu popularności Markdown, pojawiło się wiele implementacji Markdown, głównie ze względu na potrzebę dodatkowych funkcji, takich jak tabele, przypisy dolne, listy definicji,[notatka 1] i Markdown w blokach HTML. \n\n #### Standaryzacja \n\n Od 2012 roku grupa ludzi, w tym Jeff Atwood i John MacFarlane, rozpoczęła to, co Atwood określił jako wysiłek standaryzacyjny. \n\n ## Implementacje \n\n Implementacje Markdown są dostępne dla ponad dwunastu języków programowania."

headers_to_split_on = [
    ("#", "Nagłówek 1"),
    ("##", "Nagłówek 2"),
]

markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_split_on)
md_header_splits = markdown_splitter.split_text(markdown_document)

from langchain.text_splitter import RecursiveCharacterTextSplitter

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

podzialy = text_splitter.split_documents(md_header_splits)
podzialy

Wyniki:

[Document(page_content='Markdown[9] to lekki język znaczników do tworzenia sformatowanego tekstu za pomocą edytora tekstu. John Gruber stworzył Markdown w 2004 roku jako język znaczników przystępny dla ludzkich czytelników w formie kodu źródłowego.[9]', metadata={'Nagłówek 1': 'Wstęp', 'Nagłówek 2': 'Historia'}),
     Document(page_content='Markdown jest szeroko stosowany w blogowaniu, komunikatorach internetowych, forach online, oprogramowaniu do współpracy, stronach dokumentacji i plikach readme.', metadata={'Nagłówek 1': 'Wstęp', 'Nagłówek 2': 'Historia'}),
     Document(page_content='W miarę wzrostu popularności Markdown, pojawiło się wiele implementacji Markdown, głównie ze względu na potrzebę dodatkowych funkcji, jak tabele, przypisy dolne, listy definicji,[notatka 1] i Markdown w blokach HTML. \n#### Standaryzacja', metadata={'Nagłówek 1': 'Wstęp', 'Nagłówek 2': 'Wzrost i różnicowanie'}),
     Document(page_content='#### Standaryzacja  \nOd 2012 roku grupa ludzi, w tym Jeff Atwood i John MacFarlane, rozpoczęła to, co Atwood określił jako wysiłek standaryzacyjny.', metadata={'Nagłówek 1': 'Wstęp', 'Nagłówek 2': 'Wzrost i różnicowanie'}),
     Document(page_content='Implementacje Markdown są dostępne dla ponad dwunastu języków programowania.', metadata={'Nagłówek 1': 'Wstęp', 'Nagłówek 2': 'Implementacje'})]