JSON Yükleyici

  • JSON (JavaScript Object Notation), okunabilir metin kullanarak, öznitelik-değer çiftleri ve dizilerden (veya diğer seri hale getirilebilir değerlerden) oluşan veri nesnelerini depolamak ve iletmek için kullanılan açık bir standart dosya formatı ve veri değişim formatıdır.

JSON Lines, her birinin geçerli bir JSON değeri olduğu bir dosya formatıdır.

JSONLoader belirli bir jq deseni kullanarak JSON dosyalarını parçalar ve jq Python paketini kullanır. jq sözdizimi hakkında detaylı belgelere erişmek için ilgili Python belgelerine bakınız.

from langchain_community.document_loaders import JSONLoader
import json
from pathlib import Path
from pprint import pprint

dosya_yolu = './ornek_veri/facebook_mesajlar.json'
veri = json.loads(Path(dosya_yolu).read_text())
pprint(veri)
{'image': {'creation_timestamp': 1675549016, 'uri': 'sohbet_resmi.jpg'},
 'is_still_participant': True,
 'joinable_mode': {'link': '', 'mode': 1},
 'magic_words': [],
 'messages': [{'content': 'Hoşça kal!',
               'sender_name': 'Kullanıcı 2',
               'timestamp_ms': 1675597571851},
              {'content': 'Oh endişelenme! Hoşça kal',
               'sender_name': 'Kullanıcı 1',
               'timestamp_ms': 1675597435669},
              {'content': 'Hayır, özür dilerim, bu benim hatam, mavi olan satılık '
                          'değil',
               'sender_name': 'Kullanıcı 2',
               'timestamp_ms': 1675596277579},
              {'content': 'Mavi olanı satıyormuş gibi düşündüm!',
               'sender_name': 'Kullanıcı 1',
               'timestamp_ms': 1675595140251},
              {'content': 'Bu çantaya değil, mavi olanına ilgim var!',
               'sender_name': 'Kullanıcı 1',
               'timestamp_ms': 1675595109305},
              {'content': 'İşte 129 dolar',
               'sender_name': 'Kullanıcı 2',
               'timestamp_ms': 1675595068468},
              {'photos': [{'creation_timestamp': 1675595059,
                           'uri': 'bazı_resmin_urlsi.jpg'}],
               'sender_name': 'Kullanıcı 2',
               'timestamp_ms': 1675595060730},
              {'content': 'Çevrimiçi en az 100 dolar',
               'sender_name': 'Kullanıcı 2',
               'timestamp_ms': 1675595045152},
              {'content': 'Ne kadar istiyorsun?',
               'sender_name': 'Kullanıcı 1',
               'timestamp_ms': 1675594799696},
              {'content': 'Günaydın! 50 dolar çok düşük.',
               'sender_name': 'Kullanıcı 2',
               'timestamp_ms': 1675577876645},
              {'content': 'Merhaba! Çantanıza ilgileniyorum. 50 dolar teklif ediyorum. '
                          'İlgilenirseniz haber verin. Teşekkürler!',
               'sender_name': 'Kullanıcı 1',
               'timestamp_ms': 1675549022673}],
 'participants': [{'name': 'Kullanıcı 1'}, {'name': 'Kullanıcı 2'}],
 'thread_path': 'inbox/Kullanıcı 1 ve Kullanıcı 2 sohbeti',
 'title': 'Kullanıcı 1 ve Kullanıcı 2 sohbeti'}

JSONLoader Kullanımı

Varsayalım ki JSON verilerindeki messages anahtarı altındaki content alanından değerler almak istiyoruz. Bu görevi kolayca başarmak için JSONLoader'ı kullanabiliriz.

loader = JSONLoader(
    file_path='./ornek_veri/facebook_sohbet.json',
    jq_schema='.messages[].content')

veri = loader.load()
pprint(veri)
[Dokuman(sayfa_icerigi='Görüşürüz!', metadata={'kaynak': '/Kullanıcılar/avsolatorio/WBG/langchain/docs/modüller/indexler/belge_yükleyicileri/örnekler/ornek_veri/facebook_sohbet.json', 'sıra_numarası': 1}),
     Dokuman(sayfa_icerigi='Oh endişe etmeyin! Görüşürüz', metadata={'kaynak': '/Kullanıcılar/avsolatorio/WBG/langchain/docs/modüller/indexler/belge_yükleyicileri/örnekler/ornek_veri/facebook_sohbet.json', 'sıra_numarası': 2}),
     Dokuman(sayfa_icerigi='Hayır üzgünüm, bu benim hatamdı, mavi olan satılık değil', metadata={'kaynak': '/Kullanıcılar/avsolatorio/WBG/langchain/docs/modüller/indexler/belge_yükleyicileri/örnekler/ornek_veri/facebook_sohbet.json', 'sıra_numarası': 3}),
     Dokuman(sayfa_icerigi='Mavi olanı satıyordun sanmıştım!', metadata={'kaynak': '/Kullanıcılar/avsolatorio/WBG/langchain/docs/modüller/indexler/belge_yükleyicileri/örnekler/ornek_veri/facebook_sohbet.json', 'sıra_numarası': 4}),
     Dokuman(sayfa_icerigi='Ben bu çantaya ilgi duymuyorum. Ben mavi olanla ilgileniyorum!', metadata={'kaynak': '/Kullanıcılar/avsolatorio/WBG/langchain/docs/modüller/indexler/belge_yükleyicileri/örnekler/ornek_veri/facebook_sohbet.json', 'sıra_numarası': 5}),
     Dokuman(sayfa_icerigi='İşte $129', metadata={'kaynak': '/Kullanıcılar/avsolatorio/WBG/langchain/docs/modüller/indexler/belge_yükleyicileri/örnekler/ornek_veri/facebook_sohbet.json', 'sıra_numarası': 6}),
     Dokuman(sayfa_icerigi='', metadata={'kaynak': '/Kullanıcılar/avsolatorio/WBG/langchain/docs/modüller/indexler/belge_yükleyicileri/örnekler/ornek_veri/facebook_sohbet.json', 'sıra_numarası': 7}),
     Dokuman(sayfa_icerigi='Online en az $100', metadata={'kaynak': '/Kullanıcılar/avsolatorio/WBG/langchain/docs/modüller/indexler/belge_yükleyicileri/örnekler/ornek_veri/facebook_sohbet.json', 'sıra_numarası': 8}),
     Dokuman(sayfa_icerigi='Ne kadar istiyorsun?', metadata={'kaynak': '/Kullanıcılar/avsolatorio/WBG/langchain/docs/modüller/indexler/belge_yükleyicileri/örnekler/ornek_veri/facebook_sohbet.json', 'sıra_numarası': 9}),
     Dokuman(sayfa_icerigi='Günaydın! $50 çok düşük.', metadata={'kaynak': '/Kullanıcılar/avsolatorio/WBG/langchain/docs/modüller/indexler/belge_yükleyicileri/örnekler/ornek_veri/facebook_sohbet.json', 'sıra_numarası': 10}),
     Dokuman(sayfa_icerigi='Merhaba! Çantanıza ilgileniyorum. $50 teklif ediyorum. İlgileniyorsanız bana haber verin. Teşekkürler!', metadata={'kaynak': '/Kullanıcılar/avsolatorio/WBG/langchain/docs/modüller/indexler/belge_yükleyicileri/örnekler/ornek_veri/facebook_sohbet.json', 'sıra_numarası': 11})]

JSON Satırları Dosyası

JSON Satırları dosyasından belgeler yüklemek istiyorsanız, json_lines=True geçmeniz ve tek bir JSON nesnesinden page_content'i çıkarmak için jq_schema'yı belirtmeniz gerekir.

dosya_yolu = './ornek_veri/facebook_mesajlari.jsonl'
pprint(Path(dosya_yolu).read_text())
('{"sender_name": "Kullanıcı 2", "timestamp_ms": 1675597571851, "content": "Hoşçakal!"}\n'
     '{"sender_name": "Kullanıcı 1", "timestamp_ms": 1675597435669, "content": "Oh, endişelenmeyin! Hoşça kal"}\n'
     '{"sender_name": "Kullanıcı 2", "timestamp_ms": 1675596277579, "content": "Hayır, üzgünüm, benim hatam, mavi olan satılık değil"}\n')
yukleyici = JSONLoader(
    file_path='./ornek_veri/facebook_mesajlari.jsonl',
    jq_schema='.content',
    json_lines=True)

veri = yukleyici.load()
pprint(veri)
[Belge(page_content='Hoşçakal!', metadata={'source': 'langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat_messages.jsonl', 'seq_num': 1}),
     Belge(page_content='Oh, endişelenmeyin! Hoşça kal', metadata={'source': 'langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat_messages.jsonl', 'seq_num': 2}),
     Belge(page_content='Hayır, üzgünüm, benim hatam, mavi olan satılık değil', metadata={'source': 'langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat_messages.jsonl', 'seq_num': 3})]

Başka bir seçenek ise jq_schema='.' olarak ayarlamak ve content_key sağlamak:

yukleyici = JSONLoader(
    file_path='./ornek_veri/facebook_mesajlari.jsonl',
    jq_schema='.',
    content_key='sender_name',
    json_lines=True)

veri = yukleyici.load()
pprint(veri)
[Document(page_content='Kullanıcı 2', metadata={'source': 'langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat_messages.jsonl', 'seq_num': 1}),
     Document(page_content='Kullanıcı 1', metadata={'source': 'langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat_messages.jsonl', 'seq_num': 2}),
     Document(page_content='Kullanıcı 2', metadata={'source': 'langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat_messages.jsonl', 'seq_num': 3})]

Metadata Verilerini Çıkarma

Genellikle, içerikten oluşturduğumuz belgede bir JSON dosyasından metadata'yı dahil etmek isteriz.

Aşağıdaki, JSONLoader'ı metadata'yı çıkarmak için nasıl kullandığımızı gösterir.

Önceki örnekte metadata toplamadık, fakat şemada page_content değerinin doğrudan çıkarılabileceği konumu belirtmeyi başardık.

.messages[].content

Şuanki örnekte, loader'ın messages alanındaki kayıtları üzerinde döngü sağlamasını söylememiz gerekiyor. Ardından, jq_schema şöyle olmalı:

.messages[]

Bu, kayıtları ("dictionary") "metadata_func" adlı uygulanması gereken bir fonksiyona iletmemizi sağlar. "metadata_func", nihai "Document" nesnesinde depolanacak metadata içinde hangi kayıt bilgilerinin dahil edilmesinden sorumludur.

Ek olarak, şimdi loader'da "content_key" parametresini açıkça belirtmemiz gerekiyor ki kayıttaki hangi anahtardan "page_content" değerini çıkaracağını bilelim.

def metadata_func(record: dict, metadata: dict) -> dict:

    metadata["sender_name"] = record.get("sender_name")
    metadata["timestamp_ms"] = record.get("timestamp_ms")

    return metadata

loader = JSONLoader(
    file_path='./example_data/facebook_chat.json',
    jq_schema='.messages[]',
    content_key="content",
    metadata_func=metadata_func
)

data = loader.load()
pprint(data)
[Belge(sayfa_içeriği='Hoşçakal!', meta={'kaynak': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 1, 'gönderen_adı': 'Kullanıcı 2', 'zaman_damgası_ms': 1675597571851}),
     Belge(sayfa_içeriği='Oh endişelenme! Hoşça kal', meta={'kaynak': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 2, 'gönderen_adı': 'Kullanıcı 1', 'zaman_damgası_ms': 1675597435669}),
     Belge(sayfa_içeriği='Hayır, özür dilerim benim hatamdı. Mavi olan satılık değil', meta={'kaynak': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 3, 'gönderen_adı': 'Kullanıcı 2', 'zaman_damgası_ms': 1675596277579}),
     Belge(sayfa_içeriği='Sanıyordum mavi olanı satıyordun!', meta={'kaynak': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 4, 'gönderen_adı': 'Kullanıcı 1', 'zaman_damgası_ms': 1675595140251}),
     Belge(sayfa_içeriği='Bu çantaya ilgilenmiyorum. Ben mavi olanla ilgileniyorum!', meta={'kaynak': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 5, 'gönderen_adı': 'Kullanıcı 1', 'zaman_damgası_ms': 1675595109305}),
     Belge(sayfa_içeriği='İşte 129 dolar', meta={'kaynak': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 6, 'gönderen_adı': 'Kullanıcı 2', 'zaman_damgası_ms': 1675595068468}),
     Belge(sayfa_içeriği='', meta={'kaynak': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 7, 'gönderen_adı': 'Kullanıcı 2', 'zaman_damgası_ms': 1675595060730}),
     Belge(sayfa_içeriği='Online'da en az 100 dolara satılıyor', meta={'kaynak': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 8, 'gönderen_adı': 'Kullanıcı 2', 'zaman_damgası_ms': 1675595045152}),
     Belge(sayfa_içeriği='Ne kadar istiyorsun?', meta={'kaynak': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 9, 'gönderen_adı': 'Kullanıcı 1', 'zaman_damgası_ms': 1675594799696}),
     Belge(sayfa_içeriği='Günaydın! 50 dolar çok düşük.', meta={'kaynak': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 10, 'gönderen_adı': 'Kullanıcı 2', 'zaman_damgası_ms': 1675577876645}),
     Belge(sayfa_içeriği='Merhaba! Çantanıza ilgileniyorum. 50 dolar teklif ediyorum. İlgileniyorsan haber ver. Teşekkürler!', meta={'kaynak': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 11, 'gönderen_adı': 'Kullanıcı 1', 'zaman_damgası_ms': 1675549022673})]

Burada görebiliyoruz ki bu dosyalar zaten çıkardığımız içerikle ilgili meta verileri içeriyor.

metadata_func fonksiyonu

Yukarıda görüldüğü gibi, metadata_func, JSONLoader tarafından oluşturulan varsayılan metadatayı alır. Bu, kullanıcıların metadata formatı üzerinde tam kontrol sahibi olmalarını sağlar.

Örneğin, varsayılan metadata, source ve seq_num anahtarlarını içerir. Ancak, JSON verileri aynı anahtarları içerebilir. Kullanıcılar, varsayılan anahtarları yeniden adlandırmak ve JSON verilerinden anahtarları kullanmak için metadata_func'i kullanabilir.

Aşağıdaki örnek, source'u sadece langchain dizinine ilişkin dosya kaynağı bilgilerini içerecek şekilde nasıl değiştireceğinizi göstermektedir.

def metadata_func(record: dict, metadata: dict) -> dict:

    metadata["sender_name"] = record.get("sender_name")
    metadata["timestamp_ms"] = record.get("timestamp_ms")

    if "source" in metadata:
        source = metadata["source"].split("/")
        source = source[source.index("langchain"):]
        metadata["source"] = "/".join(source)

    return metadata

loader = JSONLoader(
    file_path='./example_data/facebook_chat.json',
    jq_schema='.messages[]',
    content_key="content",
    metadata_func=metadata_func
)

data = loader.load()
pprint(data)
[Document(page_content='Bye!', metadata={'source': 'langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 1, 'sender_name': 'User 2', 'timestamp_ms': 1675597571851}),
     Document(page_content='Oh no worries! Bye', metadata={'source': 'langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 2, 'sender_name': 'User 1', 'timestamp_ms': 1675597435669}),
     ...
     ...
     ... (kısaltma amacıyla geri kalan içerik değişmemiştir) ...
     ...
     ...
]

jq kalıplarını kullanarak JSON için yaygın yapılar

Aşağıdaki liste, yapıya dayalı olarak JSON verilerinden içerik çıkarmak için referans olarak kullanabileceğiniz olası jq_schema'ları sağlar.

JSON        -> [{"text": ...}, {"text": ...}, {"text": ...}]
jq_schema   -> ".[].text"

JSON        -> {"key": [{"text": ...}, {"text": ...}, {"text": ...}]}
jq_schema   -> ".key[].text"

JSON        -> ["...", "...", "..."]
jq_schema   -> ".[]"