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