MarkdownHeaderTextSplitter
Motivasyon
Birçok sohbet veya soru-cevap uygulaması, gömülme ve vektörize etmeden önce giriş belgelerini parçalama içermektedir. Metin parçalama sonrasında benzer konuları içeren metin parçalarını bir araya getirmek sıklıkla istenir.
Örneğin, bir Markdown dosyası h1, h2 ve h3 gibi çoklu seviyeli başlıklarla organize edilir. Markdown başlıklarına dayalı olarak aynı başlığa sahip metin parçalarını düzenleyebiliriz.
Bu bölüm, metin içeriğini Markdown başlıklarına dayalı olarak bölen LangChain'in MarkdownHeaderTextSplitter
metin parçalayıcısını tanıtır.
Örneğin, bu Markdown’ı bölmek istiyorsak:
md = '# Foo\\n\\n ## Bar\\n\\nMerhaba, ben Jim \\nMerhaba, ben Joe\\n\\n ## Baz\\n\\n Merhaba, ben Molly'
Bölme için başlık kurallarını, 1. seviye ve 2. seviye başlıklara göre ayarlayabiliriz:
[("#", "Başlık 1"),("##", "Başlık 2")]
İşte başlıklara dayalı olarak içerik bölünmüş örnek, metadata alanı mevcut içerik parçasının hangi başlığa ait olduğunu kaydeder:
{'content': 'Merhaba, ben Jim \nMerhaba, ben Joe', 'metadata': {'Başlık 1': 'Foo', 'Başlık 2': 'Bar'}}
{'content': 'Merhaba, ben Molly', 'metadata': {'Başlık 1': 'Foo', 'Başlık 2': 'Baz'}}
Şimdi nasıl kod yazılacağını görelim.
Bağımlılıkları yükleyin:
%pip install -qU langchain-text-splitters
from langchain_text_splitters import MarkdownHeaderTextSplitter
API Referansı:
- MarkdownHeaderTextSplitter kullanarak bir metin bölücü oluşturun
markdown_document = "# Foo\n\n ## Bar\n\nMerhaba, ben Jim\n\nMerhaba, ben Joe\n\n ### Boo \n\n Merhaba, ben Lance \n\n ## Baz\n\n Merhaba, ben Molly"
headers_to_split_on = [
("#", "Başlık 1"),
("##", "Başlık 2"),
("###", "Başlık 3"),
]
markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)
md_header_splits = markdown_splitter.split_text(markdown_document)
md_header_splits
[Döküman(sayfa_içeriği='Merhaba, ben Jim \nMerhaba, ben Joe', meta_veri={'Başlık 1': 'Foo', 'Başlık 2': 'Bar'}),
Döküman(sayfa_içeriği='Merhaba, ben Lance', meta_veri={'Başlık 1': 'Foo', 'Başlık 2': 'Bar', 'Başlık 3': 'Boo'}),
Döküman(sayfa_içeriği='Merhaba, ben Molly', meta_veri={'Başlık 1': 'Foo', 'Başlık 2': 'Baz'})]
type(md_header_splits[0])
langchain.schema.Döküman
Her Markdown grubu içinde herhangi bir metin bölücüsü uygulayabiliriz.
markdown_document = "# Giriş \n\n ## Tarih \n\n Markdown[9] basit metin düzenleyicisi kullanarak biçimlendirilmiş metin oluşturmak için hafif bir işaretleme dilidir. John Gruber, Markdown'i 2004 yılında insan okuyucuların kaynak kod formunda ilgi çekici bir işaretleme dili olarak oluşturdu.[9] \n\n Markdown blog yazma, anlık iletişim, çevrimiçi forumlar, işbirlikçi yazılım, dokümantasyon sayfaları ve readme dosyaları gibi birçok alanda yaygın olarak kullanılmaktadır. \n\n ## Yükseliş ve ayrışma \n\n Markdown'ın popülaritesi hızla artarken, çoğunlukla tablolar, dipnotlar, tanım listeleri,[not 1] ve HTML blokları içindeki Markdown gibi ek özelliklere olan ihtiyacın getirdiği, birçok Markdown uygulaması ortaya çıktı. \n\n #### Standartlaşma \n\n 2012'den itibaren, Jeff Atwood ve John MacFarlane da dahil olmak üzere bir grup insan, Atwood'un standartlaşma çabası olarak nitelendirdiği bir standardizasyon çabası başlattı. \n\n ## Uygulamalar \n\n Markdown'ın uygulamaları onlarca programlama dilinde mevcuttur."
headers_to_split_on = [
("#", "Başlık 1"),
("##", "Başlık 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
Sonuçlar:
[Döküman(sayfa_içeriği='Markdown[9] basit metin düzenleyicisi kullanarak biçimlendirilmiş metin oluşturmak için hafif bir işaretleme dilidir. John Gruber, Markdown'i 2004 yılında insan okuyucuların kaynak kod formunda ilgi çekici bir işaretleme dili olarak oluşturdu.[9]', meta_veri={'Başlık 1': 'Giriş', 'Başlık 2': 'Tarih'}),
Döküman(sayfa_içeriği='Markdown blog yazma, anlık iletişim, çevrimiçi forumlar, işbirlikçi yazılım, dokümantasyon sayfaları ve readme dosyaları gibi birçok alanda yaygın olarak kullanılmaktadır.', meta_veri={'Başlık 1': 'Giriş', 'Başlık 2': 'Tarih'}),
Döküman(sayfa_içeriği='Markdown\'ın popülaritesi hızla artarken, çoğunlukla tablolar, dipnotlar, tanım listeleri,[not 1] ve HTML blokları içindeki Markdown gibi ek özelliklere olan ihtiyacın getirdiği, birçok Markdown uygulaması ortaya çıktı. \n#### Standartlaşma', meta_veri={'Başlık 1': 'Giriş', 'Başlık 2': 'Yükseliş ve ayrışma'}),
Döküman(sayfa_içeriği='#### Standartlaşma \n2012\'den itibaren, Jeff Atwood ve John MacFarlane da dahil olmak üzere bir grup insan, Atwood\'un standartlaşma çabası olarak nitelendirdiği bir standardizasyon çabası başlattı.', meta_veri={'Başlık 1': 'Giriş', 'Başlık 2': 'Yükseliş ve ayrışma'}),
Döküman(sayfa_içeriği='Markdown\'ın uygulamaları onlarca programlama dilinde mevcuttur.', meta_veri={'Başlık 1': 'Giriş', 'Başlık 2': 'Uygulamalar'})]