07. Pemisahan Teks Header HTML(HTMLHeaderTextSplitter)
HTMLHeaderTextSplitter
Secara konseptual mirip dengan MarkdownHeaderTextSplitter, HTMLHeaderTextSplitter adalah generator chunk yang "sadar struktur" yang membagi teks pada tingkat elemen dan menambahkan metadata untuk setiap header.
Ini menambahkan metadata "terkait" ke setiap chunk.
HTMLHeaderTextSplitter
dapat mengembalikan chunk berdasarkan elemen atau menggabungkan elemen dengan metadata yang sama, dengan tujuan untuk:
- (a) Mengelompokkan teks terkait secara semantik (kurang lebih) dan
- (b) Mempertahankan informasi kaya konteks yang terkandung dalam struktur dokumen.
1. Saat menggunakan string HTML
%pip install -qU langchain-text-splitters
- Tentukan tag header yang akan menjadi kriteria pemisahan dan nama yang sesuai dalam daftar headers_to_split_on sebagai tuple.
- Buat objek HTMLHeaderTextSplitter dan teruskan daftar tag header ke parameter headers_to_split_on.
from langchain_text_splitters import HTMLHeaderTextSplitter
html_string = """
<!DOCTYPE html>
<html>
<body>
<div>
<h1>Foo</h1>
<p>Beberapa teks pengantar tentang Foo.</p>
<div>
<h2>Seksi utama Bar</h2>
<p>Beberapa teks pengantar tentang Bar.</p>
<h3>Subseksi 1 dari Bar</h3>
<p>Beberapa teks tentang topik pertama dari Bar.</p>
<h3>Subseksi 2 dari Bar</h3>
<p>Beberapa teks tentang topik kedua dari Bar.</p>
</div>
<div>
<h2>Baz</h2>
<p>Beberapa teks tentang Baz</p>
</div>
<br>
<p>Beberapa teks penutup tentang Foo</p>
</div>
</body>
</html>
"""
headers_to_split_on = [
("h1", "Header 1"), # Tentukan tag header dan nama mereka untuk pemisahan.
("h2", "Header 2"),
("h3", "Header 3"),
]
# Buat objek HTMLHeaderTextSplitter untuk membagi teks HTML berdasarkan header yang ditentukan.
html_splitter = HTMLHeaderTextSplitter(headers_to_split_on=headers_to_split_on)
# Bagi string HTML dan simpan hasilnya dalam variabel html_header_splits.
html_header_splits = html_splitter.split_text(html_string)
# Cetak hasil pemisahan.
for header in html_header_splits:
print(f"{header.page_content}")
print(f"{header.metadata}", end="\n=====================\n")
Foo
{}
=====================
Beberapa teks pengantar tentang Foo.
Seksi utama Bar Subseksi 1 dari Bar Subseksi 2 dari Bar
{'Header 1': 'Foo'}
=====================
Beberapa teks pengantar tentang Bar.
{'Header 1': 'Foo', 'Header 2': 'Seksi utama Bar'}
=====================
Beberapa teks tentang topik pertama dari Bar.
{'Header 1': 'Foo', 'Header 2': 'Seksi utama Bar', 'Header 3': 'Subseksi 1 dari Bar'}
=====================
Beberapa teks tentang topik kedua dari Bar.
{'Header 1': 'Foo', 'Header 2': 'Seksi utama Bar', 'Header 3': 'Subseksi 2 dari Bar'}
=====================
Baz
{'Header 1': 'Foo'}
=====================
Beberapa teks tentang Baz
{'Header 1': 'Foo', 'Header 2': 'Baz'}
=====================
Beberapa teks penutup tentang Foo
{'Header 1': 'Foo'}
=====================
2. Ini adalah kasus menghubungkan dengan splitter lain dalam sebuah pipeline dan memuat HTML dari URL web
Dalam contoh ini, prosesnya melibatkan memuat konten HTML dari URL web dan kemudian menghubungkannya dengan splitter lain dalam sebuah pipeline untuk pemrosesan.
from langchain_text_splitters import RecursiveCharacterTextSplitter
url = "https://plato.stanford.edu/entries/goedel/" # Tentukan URL teks yang akan dibagi.
headers_to_split_on = [ # Tentukan tag header HTML dan nama mereka untuk pemisahan.
("h1", "Header 1"),
("h2", "Header 2"),
("h3", "Header 3"),
("h4", "Header 4"),
]
# Buat objek HTMLHeaderTextSplitter untuk membagi teks berdasarkan header HTML.
html_splitter = HTMLHeaderTextSplitter(headers_to_split_on=headers_to_split_on)
# Ambil teks dari URL dan bagi berdasarkan header HTML.
html_header_splits = html_splitter.split_text_from_url(url)
chunk_size = 500 # Tentukan ukuran chunk untuk membagi teks.
chunk_overlap = 30 # Tentukan jumlah karakter yang tumpang tindih antar chunk.
text_splitter = RecursiveCharacterTextSplitter( # Buat objek RecursiveCharacterTextSplitter untuk membagi teks secara rekursif.
chunk_size=chunk_size, chunk_overlap=chunk_overlap
)
# Bagi teks yang dibagi oleh header HTML menjadi chunk sesuai ukuran yang ditentukan.
splits = text_splitter.split_documents(html_header_splits)
# Cetak chunk teks dari 80 hingga 85.
for header in splits[80:85]:
print(f"{header.page_content}")
print(f"{header.metadata}", end="\n=====================\n")
We see that Gödel first tried to reduce the consistency problem for analysis to that of arithmetic. This seemed to require a truth definition for arithmetic, which in turn led to paradoxes, such as the Liar paradox (“This sentence is false”) and Berry’s paradox (“The least number not defined by an expression consisting of just fourteen English words”). Gödel then noticed that such paradoxes would not necessarily arise if truth were replaced by provability. But this means that arithmetic truth
{'Header 1': 'Kurt Gödel', 'Header 2': '2. Gödel’s Mathematical Work', 'Header 3': '2.2 The Incompleteness Theorems', 'Header 4': '2.2.1 The First Incompleteness Theorem'}
=====================
means that arithmetic truth and arithmetic provability are not co-extensive — whence the First Incompleteness Theorem.
{'Header 1': 'Kurt Gödel', 'Header 2': '2. Gödel’s Mathematical Work', 'Header 3': '2.2 The Incompleteness Theorems', 'Header 4': '2.2.1 The First Incompleteness Theorem'}
=====================
This account of Gödel’s discovery was told to Hao Wang very much after the fact; but in Gödel’s contemporary correspondence with Bernays and Zermelo, essentially the same description of his path to the theorems is given. (See Gödel 2003a and Gödel 2003b respectively.) From those accounts we see that the undefinability of truth in arithmetic, a result credited to Tarski, was likely obtained in some form by Gödel by 1931. But he neither publicized nor published the result; the biases logicians
{'Header 1': 'Kurt Gödel', 'Header 2': '2. Gödel’s Mathematical Work', 'Header 3': '2.2 The Incompleteness Theorems', 'Header 4': '2.2.1 The First Incompleteness Theorem'}
=====================
result; the biases logicians had expressed at the time concerning the notion of truth, biases which came vehemently to the fore when Tarski announced his results on the undefinability of truth in formal systems 1935, may have served as a deterrent to Gödel’s publication of that theorem.
{'Header 1': 'Kurt Gödel', 'Header 2': '2. Gödel’s Mathematical Work', 'Header 3': '2.2 The Incompleteness Theorems', 'Header 4': '2.2.1 The First Incompleteness Theorem'}
=====================
We now describe the proof of the two theorems, formulating Gödel’s results in Peano arithmetic. Gödel himself used a system related to that defined in Principia Mathematica, but containing Peano arithmetic. In our presentation of the First and Second Incompleteness Theorems we refer to Peano arithmetic as P, following Gödel’s notation.
{'Header 1': 'Kurt Gödel', 'Header 2': '2. Gödel’s Mathematical Work', 'Header 3': '2.2 The Incompleteness Theorems', 'Header 4': '2.2.2 The proof of the First Incompleteness Theorem'}
Batasan
HTMLHeaderTextSplitter
berupaya menangani perbedaan struktural antara dokumen HTML, tetapi terkadang mungkin melewatkan header tertentu.
Sebagai contoh, algoritma ini mengasumsikan bahwa header selalu berada "di atas" teks yang relevan, artinya mereka terletak di sibling nodes sebelumnya, ancestor nodes, atau kombinasi dari ini.
Dalam artikel berita berikut (pada saat penulisan ini), teks judul utama ditandai sebagai "h1," tetapi dapat dilihat dalam subtree yang terpisah dari elemen teks yang diharapkan.
Akibatnya, elemen "h1" dan teks terkaitnya tidak muncul dalam metadata chunk, tetapi jika ada, elemen "h2" dan teks terkait dapat dilihat.
# Tentukan URL halaman HTML yang akan dibagi.
url = "https://www.cnn.com/2023/09/25/weather/el-nino-winter-us-climate/index.html"
headers_to_split_on = [
("h1", "Header 1"), # Tentukan tag header yang akan dibagi dan nama header tersebut.
("h2", "Header 2"), # Tentukan tag header yang akan dibagi dan nama header tersebut.
]
# Buat objek HTMLHeaderTextSplitter yang akan membagi teks HTML berdasarkan header yang ditentukan.
html_splitter = HTMLHeaderTextSplitter(headers_to_split_on=headers_to_split_on)
# Bagilah halaman HTML dari URL yang ditentukan, dan simpan hasilnya ke dalam variabel html_header_splits.
html_header_splits = html_splitter.split_text_from_url(url)
# Cetak hasil pembagian.
for header in html_header_splits:
print(f"{header.page_content[:100]}")
print(f"{header.metadata}", end="\n=====================\n")
CNN values your feedback
1. How relevant is this ad to you?
2. Did you encounter any technical i
{}
=====================
No two El Niño winters are the same, but many have temperature and precipitation trends in common.
{'Header 2': 'What could this winter look like?'}
=====================
Ad Feedback
Ad Feedback
Ad Feedback
Ad Feedback
Ad Feedback
Ad Feedback
Ad Feedback
Li
{}
=====================