Pemisah Teks Header Markdown

Motivasi

Banyak aplikasi obrolan atau tanya jawab melibatkan mengelompokkan dokumen masukan sebelum menyematkannya dan memvektorisasinya. Setelah pengelompokan teks, seringkali diinginkan untuk mengelompokkan fragmen teks dengan topik yang serupa.

Sebagai contoh, file Markdown diatur oleh heading multi-level seperti h1, h2, dan h3. Kita dapat mengorganisir fragmen teks dengan heading yang sama berdasarkan heading Markdown.

Chapter ini memperkenalkan bagaimana LangChain membagi konten teks berdasarkan heading Markdown, menggunakan pemisah teks MarkdownHeaderTextSplitter.

Sebagai contoh, jika kita ingin membagi Markdown ini:

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

Mengatur aturan heading untuk pemisahan, berdasarkan heading level 1 dan level 2:

[("#", "Header 1"),("##", "Header 2")]

Berikut contoh dari konten yang dibagi berdasarkan heading, di mana bidang metadata mencatat ke heading mana fragmen konten saat ini dimiliki:

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

Sekarang mari kita lihat bagaimana menulis kode.

Instal dependensi:

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

Referensi API:

  • Buat pemisah teks menggunakan MarkdownHeaderTextSplitter
markdown_document = "# Foo\n\n    ## Bar\n\nHalo ini Jim\n\nHalo ini Joe\n\n ### Boo \n\n Halo ini Lance \n\n ## Baz\n\n Halo ini Molly"

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

markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)
md_header_splits = markdown_splitter.split_text(markdown_document)
md_header_splits
[Dokumen(page_content='Halo ini Jim\nHalo ini Joe', metadata={'Header 1': 'Foo', 'Header 2': 'Bar'}),
     Dokumen(page_content='Halo ini Lance', metadata={'Header 1': 'Foo', 'Header 2': 'Bar', 'Header 3': 'Boo'}),
     Dokumen(page_content='Halo ini Molly', metadata={'Header 1': 'Foo', 'Header 2': 'Baz'})]
type(md_header_splits[0])
langchain.schema.Document

Dalam setiap kelompok Markdown, kita dapat menerapkan pemisah teks apa pun.

markdown_document = "# Intro \n\n    ## History \n\n Markdown[9] adalah bahasa markup ringan untuk membuat teks yang diformat menggunakan editor teks biasa. John Gruber membuat Markdown pada tahun 2004 sebagai bahasa markup yang menarik bagi pembaca manusia dalam bentuk kode sumbernya.[9] \n\n Markdown banyak digunakan dalam blogging, pesan instan, forum online, perangkat lunak kolaboratif, halaman dokumentasi, dan file readme. \n\n ## Pertumbuhan dan perbedaan \n\n Ketika popularitas Markdown tumbuh dengan cepat, banyak implementasi Markdown muncul, didorong terutama oleh kebutuhan akan fitur tambahan seperti tabel, catatan kaki, daftar definisi,[catatan 1] dan Markdown di dalam blok HTML. \n\n #### Standarisasi \n\n Sejak 2012, sekelompok orang, termasuk Jeff Atwood dan John MacFarlane, meluncurkan apa yang dijelaskan Atwood sebagai upaya standarisasi. \n\n ## Implementasi \n\n Implementasi Markdown tersedia untuk lebih dari selusin bahasa pemrograman."

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

ukuran_chunk = 250
tumpang_tindih_chunk = 30
pemisah_teks = RecursiveCharacterTextSplitter(
    chunk_size=ukuran_chunk, chunk_overlap=tumpang_tindih_chunk
)

pemisahan = pemisah_teks.split_documents(md_header_splits)
pemisahan

Hasil:

[Dokumen(page_content='Markdown[9] adalah bahasa markup ringan untuk membuat teks yang diformat menggunakan editor teks biasa. John Gruber membuat Markdown pada tahun 2004 sebagai bahasa markup yang menarik bagi pembaca manusia dalam bentuk kode sumbernya.[9]', metadata={'Header 1': 'Intro', 'Header 2': 'History'}),
     Dokumen(page_content='Markdown banyak digunakan dalam blogging, pesan instan, forum online, perangkat lunak kolaboratif, halaman dokumentasi, dan file readme.', metadata={'Header 1': 'Intro', 'Header 2': 'History'}),
     Dokumen(page_content='Ketika popularitas Markdown tumbuh dengan cepat, banyak implementasi Markdown muncul, didorong terutama oleh kebutuhan akan fitur tambahan seperti tabel, catatan kaki, daftar definisi,[catatan 1] dan Markdown di dalam blok HTML.  \n#### Standarisasi', metadata={'Header 1': 'Intro', 'Header 2': 'Pertumbuhan dan perbedaan'}),
     Dokumen(page_content='#### Standarisasi  \nSejak 2012, sekelompok orang, termasuk Jeff Atwood dan John MacFarlane, meluncurkan apa yang dijelaskan Atwood sebagai upaya standarisasi.', metadata={'Header 1': 'Intro', 'Header 2': 'Pertumbuhan dan perbedaan'}),
     Dokumen(page_content='Implementasi Markdown tersedia untuk lebih dari selusin bahasa pemrograman.', metadata={'Header 1': 'Intro', 'Header 2': 'Implementasi'})]