08-Pemecahan JSON Rekursif (RecursiveJsonSplitter)
RecursiveJsonSplitter
JSON pemecah ini menghasilkan potongan-potongan JSON yang lebih kecil dengan menjelajahi data JSON menggunakan penelusuran mendalam (depth-first traversal).
Pemecah ini berusaha untuk mempertahankan objek JSON yang bersarang sebanyak mungkin, tetapi jika diperlukan untuk menjaga ukuran potongan antara min_chunk_size dan max_chunk_size, objek tersebut akan dipisahkan. Jika nilainya adalah string yang sangat besar dan bukan JSON yang bersarang, string tersebut tidak akan dibagi.
Jika ada kebutuhan untuk batasan ketat pada ukuran potongan, Anda dapat mempertimbangkan untuk menggunakan Recursive Text Splitter setelah pemecah ini untuk memproses potongan-potongan tersebut.
Kriteria untuk Memecah
- Cara Pemecahan Teks(Text Splitting Method): Berdasarkan Nilai JSON
- Cara Pengukuran Ukuran Potongan(Chunk Size Measurement Method): Berdasarkan Jumlah Karakter
%pip install -qU langchain-text-splitters
- Gunakan fungsi requests.get() untuk mengambil data JSON dari URL "https://api.smith.langchain.com/openapi.json (opens in a new tab)".
- Data JSON yang diambil kemudian diubah menjadi bentuk dictionary Python menggunakan metode json() dan disimpan dalam variabel json_data.
import requests
# Memuat data JSON.
json_data = requests.get("https://api.smith.langchain.com/openapi.json").json()
Ini adalah contoh penggunaan RecursiveJsonSplitter untuk memecah data JSON.
from langchain_text_splitters import RecursiveJsonSplitter
# Membuat objek RecursiveJsonSplitter yang membagi data JSON menjadi chunk dengan ukuran maksimal 300.
splitter = RecursiveJsonSplitter(max_chunk_size=300)
Menggunakan fungsi splitter.split_json()
untuk membagi data JSON secara rekursif.
# Membagi data JSON secara rekursif. Digunakan saat perlu mengakses atau memanipulasi potongan-potongan kecil JSON.
json_chunks = splitter.split_json(json_data=json_data)
- Gunakan metode
splitter.create_documents()
untuk mengonversi data JSON ke dalam format dokumen. - Gunakan metode
splitter.split_text()
untuk membagi data JSON menjadi daftar string
# Membuat dokumen berdasarkan data JSON.
docs = splitter.create_documents(texts=[json_data])
# Membuat potongan string berdasarkan data JSON.
texts = splitter.split_text(json_data=json_data)
# Mencetak string pertama.
print(docs[0].page_content)
print("===" * 20)
# Mencetak potongan string yang dibagi.
print(texts[0])
{"openapi": "3.1.0", "info": {"title": "LangSmith", "version": "0.1.0"}, "paths": {"/api/v1/sessions/{session_id}": {"get": {"tags": ["tracer-sessions"], "summary": "Read Tracer Session", "description": "Get a specific session."}}}}
============================================================
{"openapi": "3.1.0", "info": {"title": "LangSmith", "version": "0.1.0"}, "paths": {"/api/v1/sessions/{session_id}": {"get": {"tags": ["tracer-sessions"], "summary": "Read Tracer Session", "description": "Get a specific session."}}}}
Dengan memeriksa texts[2]
untuk memeriksa salah satu potongan yang besar, kita dapat memastikan bahwa potongan tersebut berisi objek daftar (list).
- Alasan mengapa ukuran potongan ke-2 melebihi batas (300) adalah karena potongan tersebut berisi objek list.
- Ini karena
RecursiveJsonSplitter
tidak membagi objek daftar.
# Mari kita periksa ukuran setiap chunk.
print([len(text) for text in texts][:10])
# Jika kita meninjau salah satu chunk yang lebih besar, kita dapat melihat bahwa itu berisi objek daftar (list).
print(texts[1])
[232, 197, 469, 210, 213, 237, 271, 191, 232, 215]
{"paths": {"/api/v1/sessions/{session_id}": {"get": {"operationId": "read_tracer_session_api_v1_sessions__session_id__get", "security": [{"API Key": []}, {"Tenant ID": []}, {"Bearer Auth": []}]}}}}
Chunk di indeks 2 dapat diparsing menggunakan modul json seperti berikut.
import json
json_data = json.loads(texts[2])
json_data["paths"]
{'/api/v1/sessions/{session_id}': {'get': {'parameters': [{'name': 'session_id', 'in': 'path', 'required': True, 'schema': {'type': 'string', 'format': 'uuid', 'title': 'Session Id'}}, {'name': 'include_stats', 'in': 'query', 'required': False, 'schema': {'type': 'boolean', 'default': False, 'title': 'Include Stats'}}, {'name': 'accept', 'in': 'header', 'required': False, 'schema': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Accept'}}]}}}
Anda dapat mengonversi daftar dalam JSON menjadi pasangan key dalam bentuk index dengan mengatur parameter convert_lists menjadi True.
# Berikut adalah kode untuk memproses JSON dan mengonversi daftar menjadi kamus di mana pasangan index:item menjadi pasangan key:value.
texts = splitter.split_text(json_data=json_data, convert_lists=True)
# Daftar telah diubah menjadi kamus, dan hasilnya diperiksa.
print(texts[2])
{"paths": {"/api/v1/sessions/{session_id}": {"get": {"parameters": {"2": {"name": "accept", "in": "header", "required": false, "schema": {"anyOf": {"0": {"type": "string"}, "1": {"type": "null"}}, "title": "Accept"}}}}}}}
Anda dapat memeriksa dokumen yang sesuai dengan indeks tertentu dalam daftar docs.
#Periksa dokumen ke-2.
docs[2]
page_content='{"paths": {"/api/v1/sessions/{session_id}": {"get": {"parameters": [{"name": "session_id", "in": "path", "required": true, "schema": {"type": "string", "format": "uuid", "title": "Session Id"}}, {"name": "include_stats", "in": "query", "required": false, "schema": {"type": "boolean", "default": false, "title": "Include Stats"}}, {"name": "accept", "in": "header", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Accept"}}]}}}}'