06. Pemisahan Teks Header Markdown (MarkdownHeaderTextSplitter)

Memahami dan mengelola struktur file Markdown secara efisien dapat sangat penting dalam pekerjaan dokumen. Secara khusus, proses embedding teks dengan cara yang bermakna, dengan mempertimbangkan konteks dan struktur keseluruhan dokumen, dapat sangat membantu dalam menghasilkan representasi vektor yang komprehensif yang lebih baik dalam menangkap makna dan topik yang luas.

Dalam konteks ini, mungkin ada kalanya Anda ingin membagi konten file Markdown berdasarkan bagian tertentu, seperti header. Misalnya, Anda mungkin ingin membuat bagian informasi terkait, atau 'chunk', berdasarkan konten di bawah setiap header dalam dokumen. Pendekatan ini berupaya memanfaatkan elemen struktural dokumen secara efektif sambil mempertahankan konteks umum dalam teks.

Untuk menyelesaikan tugas seperti itu, Anda dapat menggunakan alat yang disebut MarkdownHeaderTextSplitter. Alat ini membagi dokumen sesuai dengan set header yang ditentukan, memungkinkan Anda untuk mengelola konten di bawah setiap grup header sebagai chunk terpisah. Dengan menggunakan metode ini, Anda dapat menangani konten secara lebih rinci sambil mempertahankan struktur keseluruhan dokumen, yang dapat berguna dalam berbagai proses pengolahan.

pip install -qU langchain-text-splitters

Gunakan MarkdownHeaderTextSplitter untuk membagi teks berformat Markdown berdasarkan header.

  • Fungsi ini membagi teks dalam dokumen Markdown berdasarkan header (#, ##, ###, dll.).

  • Variabel markdown_document dialokasikan untuk dokumen berformat Markdown.

  • Daftar headers_to_split_on mendefinisikan level header Markdown dan nama yang sesuai dalam bentuk tuple.

  • Objek markdown_splitter dibuat menggunakan kelas MarkdownHeaderTextSplitter, dan level header untuk pemisahan diteruskan sebagai parameter headers_to_split_on.

  • Metode split_text dipanggil untuk membagi markdown_document sesuai dengan level header.

from langchain_text_splitters import MarkdownHeaderTextSplitter

# Definisikan dokumen berformat Markdown sebagai string.
markdown_document = "# Title\n\n## 1. SubTitle\n\nHi this is Jim\n\nHi this is Joe\n\n### 1-1. Sub-SubTitle \n\nHi this is Lance \n\n## 2. Baz\n\nHi this is Molly"
print(markdown_document)
# Title

## 1. SubTitle

Hi this is Jim

Hi this is Joe

### 1-1. Sub-SubTitle

Hi this is Lance

## 2. Baz

Hi this is Molly
headers_to_split_on = [  # Definisikan level header dan nama mereka untuk membagi dokumen.
    (
        "#",
        "Header 1",
    ),  # Level header 1 diwakili oleh '#', dan dinamakan 'Header 1'.
    (
        "##",
        "Header 2",
    ),  # Level header 2 diwakili oleh '##', dan dinamakan 'Header 2'.
    (
        "###",
        "Header 3",
    ),  # Level header 3 diwakili oleh '###', dan dinamakan 'Header 3'.
]

# Buat objek MarkdownHeaderTextSplitter untuk membagi teks berdasarkan header Markdown.
markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)
# Bagi markdown_document berdasarkan header dan simpan hasilnya dalam md_header_splits.
md_header_splits = markdown_splitter.split_text(markdown_document)
# Cetak hasil pembagian.
for header in md_header_splits:
    print(f"{header.page_content}")
    print(f"{header.metadata}", end="\n=====================\n")
Hi this is Jim  
Hi this is Joe
{'Header 1': 'Title', 'Header 2': '1. SubTitle'}
=====================
Hi this is Lance
{'Header 1': 'Title', 'Header 2': '1. SubTitle', 'Header 3': '1-1. Sub-SubTitle'}
=====================
Hi this is Molly
{'Header 1': 'Title', 'Header 2': '2. Baz'}
=====================

Secara default, MarkdownHeaderTextSplitter menghapus header yang dipisah dari konten chunk output.

Ini dapat dinonaktifkan dengan mengatur strip_headers = False.

markdown_splitter = MarkdownHeaderTextSplitter(
    # Tentukan header untuk pemisahan.
    headers_to_split_on=headers_to_split_on,
    # Atur agar header tidak dihapus.
    strip_headers=False,
)
# Bagi dokumen Markdown berdasarkan header.
md_header_splits = markdown_splitter.split_text(markdown_document)
# Cetak hasil pemisahan.
for header in md_header_splits:
    print(f"{header.page_content}")
    print(f"{header.metadata}", end="\n=====================\n")
# Title  
## 1. SubTitle  
Hi this is Jim  
Hi this is Joe
{'Header 1': 'Title', 'Header 2': '1. SubTitle'}
=====================
### 1-1. Sub-SubTitle  
Hi this is Lance
{'Header 1': 'Title', 'Header 2': '1. SubTitle', 'Header 3': '1-1. Sub-SubTitle'}
=====================
## 2. Baz  
Hi this is Molly
{'Header 1': 'Title', 'Header 2': '2. Baz'}
=====================

Di dalam setiap grup Markdown, Anda dapat menerapkan text splitter yang diinginkan

from langchain_text_splitters import RecursiveCharacterTextSplitter

markdown_document = "# Intro \n\n## History \n\nMarkdown[9] adalah bahasa markup ringan untuk membuat teks berformat menggunakan editor teks biasa. John Gruber menciptakan Markdown pada tahun 2004 sebagai bahasa markup yang menarik bagi pembaca manusia dalam bentuk kode sumbernya.[9] \n\nMarkdown banyak digunakan dalam blogging, pesan instan, forum online, perangkat lunak kolaboratif, halaman dokumentasi, dan file readme. \n\n## Rise and divergence \n\nSeiring popularitas Markdown tumbuh dengan cepat, banyak implementasi Markdown muncul, sebagian besar didorong oleh kebutuhan untuk \n\nfitur tambahan seperti tabel, catatan kaki, daftar definisi,[catatan 1] dan Markdown di dalam blok HTML. \n\n#### Standardization \n\nMulai tahun 2012, sekelompok orang, termasuk Jeff Atwood dan John MacFarlane, meluncurkan apa yang Atwood karaktersasi sebagai upaya standarisasi. \n\n## Implementations \n\nImplementasi Markdown tersedia untuk lebih dari selusin bahasa pemrograman."
print(markdown_document)
# Intro

## History

Markdown[9] adalah bahasa markup ringan untuk membuat teks berformat menggunakan editor teks biasa. John Gruber menciptakan Markdown pada tahun 2004 sebagai bahasa markup yang menarik bagi pembaca manusia dalam bentuk kode sumbernya.[9]

Markdown banyak digunakan dalam blogging, pesan instan, forum online, perangkat lunak kolaboratif, halaman dokumentasi, dan file readme.

## Rise and divergence

Seiring popularitas Markdown tumbuh dengan cepat, banyak implementasi Markdown muncul, sebagian besar didorong oleh kebutuhan untuk

fitur tambahan seperti tabel, catatan kaki, daftar definisi,[catatan 1] dan Markdown di dalam blok HTML.

#### Standardization

Mulai tahun 2012, sekelompok orang, termasuk Jeff Atwood dan John MacFarlane, meluncurkan apa yang Atwood karaktersasi sebagai upaya standarisasi.

## Implementations

Implementasi Markdown tersedia untuk lebih dari selusin bahasa pemrograman

Pertama, gunakan MarkdownHeaderTextSplitter untuk membagi dokumen Markdown berdasarkan header.

headers_to_split_on = [
    ("#", "Header 1"),  # Tentukan level header dan nama mereka untuk pemisahan.
    ("##", "Header 2"),
]

# Bagi dokumen Markdown berdasarkan level header.
markdown_splitter = MarkdownHeaderTextSplitter(
    headers_to_split_on=headers_to_split_on, strip_headers=False
)
md_header_splits = markdown_splitter.split_text(markdown_document)
# Cetak hasil pemisahan.
for header in md_header_splits:
    print(f"{header.page_content}")
    print(f"{header.metadata}", end="\n=====================\n")
# Intro  
## History  
Markdown[9] adalah bahasa markup ringan untuk membuat teks berformat menggunakan editor teks biasa. John Gruber menciptakan Markdown pada tahun 2004 sebagai bahasa markup yang menarik bagi pembaca manusia dalam bentuk kode sumbernya.[9]  
Markdown banyak digunakan dalam blogging, pesan instan, forum online, perangkat lunak kolaboratif, halaman dokumentasi, dan file readme.
{'Header 1': 'Intro', 'Header 2': 'History'}
=====================
## Rise and divergence  
Seiring popularitas Markdown tumbuh dengan cepat, banyak implementasi Markdown muncul, sebagian besar didorong oleh kebutuhan untuk  
fitur tambahan seperti tabel, catatan kaki, daftar definisi,[catatan 1] dan Markdown di dalam blok HTML.  
#### Standardization  
Mulai tahun 2012, sekelompok orang, termasuk Jeff Atwood dan John MacFarlane, meluncurkan apa yang Atwood karaktersasi sebagai upaya standarisasi.
{'Header 1': 'Intro', 'Header 2': 'Rise and divergence'}
=====================
## Implementations  
Implementasi Markdown tersedia untuk lebih dari selusin bahasa pemrograman.
{'Header 1': 'Intro', 'Header 2': 'Implementations'}
=====================

Bagilah hasil dari MarkdownHeaderTextSplitter sebelumnya menggunakan RecursiveCharacterTextSplitter sekali lagi

chunk_size = 200  # Tentukan ukuran chunk yang dihasilkan.
chunk_overlap = 20  # Tentukan jumlah karakter yang tumpang tindih antar chunk.
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=chunk_size, chunk_overlap=chunk_overlap
)

# Bagi dokumen menjadi chunk berbasis karakter.
splits = text_splitter.split_documents(md_header_splits)
# Cetak hasil pemisahan.
for header in splits:
    print(f"{header.page_content}")
    print(f"{header.metadata}", end="\n=====================\n")
# Intro  
## History  
Markdown[9] adalah bahasa markup ringan untuk membuat teks berformat menggunakan editor teks biasa. John Gruber menciptakan Markdown pada tahun 2004 sebagai bahasa markup yang menarik bagi pembaca manusia dalam bentuk kode sumbernya.[9]  
Markdown banyak digunakan dalam blogging, pesan instan, forum online, perangkat lunak kolaboratif, halaman dokumentasi, dan file readme.
{'Header 1': 'Intro', 'Header 2': 'History'}
=====================
## Rise and divergence  
Seiring popularitas Markdown tumbuh dengan cepat, banyak implementasi Markdown muncul, sebagian besar didorong oleh kebutuhan untuk  
fitur tambahan seperti tabel, catatan kaki, daftar definisi,[catatan 1] dan Markdown di dalam blok HTML.  
#### Standardization  
Mulai tahun 2012, sekelompok orang, termasuk Jeff Atwood dan John MacFarlane, meluncurkan apa yang Atwood karaktersasi sebagai upaya standarisasi.
{'Header 1': 'Intro', 'Header 2': 'Rise and divergence'}
=====================
## Implementations  
Implementasi Markdown tersedia untuk lebih dari selusin bahasa pemrograman.
{'Header 1': 'Intro', 'Header 2': 'Implementations'}
=====================
# Intro  
## History
{'Header 1': 'Intro', 'Header 2': 'History'}
=====================
Markdown[9] adalah bahasa markup ringan untuk membuat teks berformat menggunakan editor teks biasa. John Gruber menciptakan Markdown pada tahun 2004 sebagai bahasa markup yang menarik bagi pembaca
{'Header 1': 'Intro', 'Header 2': 'History'}
=====================
bagi pembaca manusia dalam bentuk kode sumbernya.[9]
{'Header 1': 'Intro', 'Header 2': 'History'}
=====================
Markdown banyak digunakan dalam blogging, pesan instan, forum online, perangkat lunak kolaboratif, halaman dokumentasi, dan file readme.
{'Header 1': 'Intro', 'Header 2': 'History'}
=====================
## Rise and divergence  
Seiring popularitas Markdown tumbuh dengan cepat, banyak implementasi Markdown muncul, sebagian besar didorong oleh kebutuhan untuk
{'Header 1': 'Intro', 'Header 2': 'Rise and divergence'}
=====================
fitur tambahan seperti tabel, catatan kaki, daftar definisi,[catatan 1] dan Markdown di dalam blok HTML.  
#### Standardization
{'Header 1': 'Intro', 'Header 2': 'Rise and divergence'}
=====================
Mulai tahun 2012, sekelompok orang, termasuk Jeff Atwood dan John MacFarlane, meluncurkan apa yang Atwood karaktersasi sebagai upaya standarisasi.
{'Header 1': 'Intro', 'Header 2': 'Rise and divergence'}
=====================
## Implementations  
Implementasi Markdown tersedia untuk lebih dari selusin bahasa pemrograman.
{'Header 1': 'Intro', 'Header 2': 'Implementations'}
=====================

Last updated