JSON لوڈر

  • JSON (JavaScript Object Notation) ایک کھولا معیار فائل فارمیٹ اور ڈیٹا انٹرچینج فارمیٹ ہے جو پڑھنے کے قابل متن کا استعمال کرتا ہے تاکہ ڈیٹا اشیاء، ویلیو کی جوڑیوں اور ایرے (یا دیگر سیریلائزیبل ویلیوز) کو ذخیرہ اور منتقل کرنے کے لئے استعمال ہوسکے۔

JSON Lines ایک فائل فارمیٹ ہے جہاں ہر لائن ایک درست JSON ویلیو ہوتا ہے۔

JSONLoader مخصوص jq پیٹرن استعمال کرکے JSON فائلوں کو تجزیہ کرتا ہے اور یہ jq Python پیکیج کا استعمال کرتا ہے۔ jq ہمیشہ ایسی پائیتھن میں refer کی جاتی ہے جو مربوطہ پائیتھن ڈاکیومنٹیشن میں تفصیل سے بیان کی گئی ہو۔

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

file_path = './example_data/facebook_chat.json'
data = json.loads(Path(file_path).read_text())
pprint(data)
{'image': {'creation_timestamp': 1675549016, 'uri': 'image_of_the_chat.jpg'},
     'is_still_participant': True,
     'joinable_mode': {'link': '',  'mode': 1},
     'magic_words': [],
     'messages': [{'content': 'خدا حافظ!',
                   'sender_name': 'صارف 2',
                   'timestamp_ms': 1675597571851},
                  {'content': 'اوہ کوئی بات نہیں! خدا حافظ',
                   'sender_name': 'صارف 1',
                   'timestamp_ms': 1675597435669},
                  {'content': 'نہیں میں معذرت خواہ ہوں، یہ میری غلطی تھی، نیلا والا کوئی فروخت کے لئے نہیں ہے',
                   'sender_name': 'صارف 2',
                   'timestamp_ms': 1675596277579},
                  {'content': 'میرا خیال تھا کہ آپ نیلے والے کو فروخت کر رہے ہیں!',
                   'sender_name': 'صارف 1',
                   'timestamp_ms': 1675595140251},
                  {'content': 'مجھے اس بیگ سے دلچسپ نہیں۔ مجھے نیلا والا پسند ہے!',
                   'sender_name': 'صارف 1',
                   'timestamp_ms': 1675595109305},
                  {'content': 'یہاں $129 ہے',
                   'sender_name': 'صارف 2',
                   'timestamp_ms': 1675595068468},
                  {'photos': [{'creation_timestamp': 1675595059,
                               'uri': 'url_of_some_picture.jpg'}],
                   'sender_name': 'صارف 2',
                   'timestamp_ms': 1675595060730},
                  {'content': 'آن لائن کم سے کم $100 ہے',
                   'sender_name': 'صارف 2',
                   'timestamp_ms': 1675595045152},
                  {'content': 'آپ کتنا چاہتے ہیں؟',
                   'sender_name': 'صارف 1',
                   'timestamp_ms': 1675594799696},
                  {'content': 'صبح بخیر! $50 بہت کم ہے۔',
                   'sender_name': 'صارف 2',
                   'timestamp_ms': 1675577876645},
                  {'content': 'ہائے! مجھے آپکی بیگ میں دلچسپی ہے۔ میں $50 کی پیشکش کر رہا ہوں۔ مجھے بتائیں اگر آپ دلچسپ ہیں تو۔ شکریہ!',
                   'sender_name': 'صارف 1',
                   'timestamp_ms': 1675549022673}],
     'participants': [{'name': 'صارف 1'}, {'name': 'صارف 2'}],
     'thread_path': 'inbox/صارف 1 and صارف 2 chat',
     'title': 'صارف 1 and صارف 2 chat'}

JSONLoader استعمال کرنا

فرض کریں ہمیں JSON ڈیٹا میں messages کی کی چھوٹی میں content فیلڈ سے قیمتیں حاصل کرنی ہیں۔ JSONLoader کا استعمال اس کام کو آسانی سے مکمل کر سکتا ہے۔

loader = JSONLoader(
    file_path='./مثال_ڈیٹا/فیس_بک_چیٹ.json',
    jq_schema='.messages[].content')

data = loader.load()
pprint(data)
[Document(page_content='خدا حافظ!', metadata={'source': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 1}),
     Document(page_content='اوہ کوئی بات نہیں! خدا حافظ', metadata={'source': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 2}),
     Document(page_content='نہیں میں معذرت خواہ ہوں، یہ میرا غلطی تھا، نیلا نہیں فروخت کے لئے ہے', metadata={'source': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 3}),
     Document(page_content='میں نے سوچا آپ نے نیلا فروخت کرنی تھی!', metadata={'source': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 4}),
     Document(page_content='مجھے اس بیگ سے دلچسپی نہیں ہے۔ مجھے نیلا بیگ سے دلچسپی ہے!', metadata={'source': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 5}),
     Document(page_content='یہاں $129 ہے', metadata={'source': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 6}),
     Document(page_content='', metadata={'source': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 7}),
     Document(page_content='آن لائن کم سے کم $100 ہے', metadata={'source': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 8}),
     Document(page_content='آپ کتنا چاہتے ہیں؟', metadata={'source': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 9}),
     Document(page_content='صبح بخیر! $50 بہت کم ہے۔', metadata={'source': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 10}),
     Document(page_content='ہائی! مجھے آپ کے بیگ میں دلچسپی ہے۔ میں $50 کی پیشکش کر رہا ہوں۔ بتائیں اگر آپ کو دلچسپی ہے تو۔ شکریہ!', metadata={'source': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 11})]

JSON Lines فائل

اگر آپ JSON Lines فائل سے دستاویزات لوڈ کرنا چاہتے ہیں، تو آپ کوjson_lines=True پاس کرنا ہوگا اور jq_schema کو مخصوص کرنا ہوگا تاکہ ایک واحد JSON شے سے page_content کو نکالا جا سکے۔

file_path = './example_data/facebook_chat_messages.jsonl'
pprint(Path(file_path).read_text())\n
('{"sender_name": "User 2", "timestamp_ms": 1675597571851, "content": "Bye!"}\n'
     '{"sender_name": "User 1", "timestamp_ms": 1675597435669, "content": "Oh no '
     'worries! Bye"}\n'
     '{"sender_name": "User 2", "timestamp_ms": 1675596277579, "content": "No Im '
     'sorry it was my mistake, the blue one is not for sale"}\n')
loader = JSONLoader(
    file_path='./example_data/facebook_chat_messages.jsonl',
    jq_schema='.content',
    json_lines=True)

data = loader.load()
pprint(data)
[Document(page_content='Bye!', metadata={'source': 'langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat_messages.jsonl', 'seq_num': 1}),
     Document(page_content='Oh no worries! Bye', metadata={'source': 'langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat_messages.jsonl', 'seq_num': 2}),
     Document(page_content='No Im sorry it was my mistake, the blue one is not for sale', metadata={'source': 'langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat_messages.jsonl', 'seq_num': 3})]

ایک دوسرا آپشن یہ ہے کہ jq_schema='.' سیٹ کیا جائے اور content_key فراہم کیا جائے:

loader = JSONLoader(
    file_path='./example_data/facebook_chat_messages.jsonl',
    jq_schema='.',
    content_key='sender_name',
    json_lines=True)

data = loader.load()
pprint(data)
[Document(page_content='User 2', metadata={'source': 'langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat_messages.jsonl', 'seq_num': 1}),
     Document(page_content='User 1', metadata={'source': 'langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat_messages.jsonl', 'seq_num': 2}),
     Document(page_content='User 2', metadata={'source': 'langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat_messages.jsonl', 'seq_num': 3})]

میٹا ڈیٹا کا نکالنا

عام طور پر ہمیں دستاویز سے بنائی گئی فائل سے میٹا ڈیٹا شامل کرنا چاہئے۔

زیر میں دکھایا گیا ہے کہ کیسے JSONLoader کو استعمال کیا جاتا ہے تاکہ میٹا ڈیٹا کو نکالا جا سکے۔

پچھلے مثال میں ہم نے میٹا ڈیٹا کو نہیں جمع کیا تھا، لیکن ہم نے اسکیما میں یہ بتا دیا تھا کہ page_content کی قیمت کو سیدھا نکالا جا سکتا ہے۔

.messages[].content

اس مثال میں، ہمیں لوڈر کو بتانا ہوتا ہے کہ وہ messages فیلڈ میں ریکارڈز پر چلے۔ پھر، jq_schema یہ ہو گا:

.messages[]

یہ ہمیں اس کو ممکن بناتا ہے کہ ہم ریکارڈز (ڈکشنری) کو "metadata_func" کو منتقل کر سکیں۔ "metadata_func" کی ذمہ داری ہے کہ معلومات کے بتائنے کا انتخاب کرے کہ کون سے ریکارڈ کی معلومات کو نصاب میں ذخیرہ کرنا ہو گا۔

اس کے علاوہ، ہمیں اب لوڈر میں واضح طور پر content_key پیرامیٹر کو بتانا ہوتا ہے تاکہ ریکارڈ سے "page_content" قیمت نکالی جا سکے۔

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='./مثال_ڈیٹا/فیس_بک_چیٹ.json',
    jq_schema='.messages[]',
    content_key="content",
    metadata_func=metadata_func
)

data = loader.load()
pprint(data)
[Document(page_content='خدا حافظ!', metadata={'source': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 1, 'sender_name': 'صارف 2', 'timestamp_ms': 1675597571851}),
     Document(page_content='اوہ نہیں فکر نہ کریں! خدا حافظ', metadata={'source': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 2, 'sender_name': 'صارف 1', 'timestamp_ms': 1675597435669}),
     Document(page_content='نہیں، معذرت ہے یہ میری غلطی تھی۔ نیلا والا فی الحال فروخت کے لئے نہیں ہے', metadata={'source': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 3, 'sender_name': 'صارف 2', 'timestamp_ms': 1675596277579}),
     Document(page_content='مجھے لگا کہ آپ نیلا والا فروخت کر رہے ہیں!', metadata={'source': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 4, 'sender_name': 'صارف 1', 'timestamp_ms': 1675595140251}),
     Document(page_content='میں اس بیگ سے دلچسپی نہیں رکھتا۔ مجھے نیلا والا پسند ہے!', metadata={'source': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 5, 'sender_name': 'صارف 1', 'timestamp_ms': 1675595109305}),
     Document(page_content='یہاں $129 ہے', metadata={'source': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 6, 'sender_name': 'صارف 2', 'timestamp_ms': 1675595068468}),
     Document(page_content='', metadata={'source': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 7, 'sender_name': 'صارف 2', 'timestamp_ms': 1675595060730}),
     Document(page_content='آن لائن کم سے کم $100 ہے', metadata={'source': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 8, 'sender_name': 'صارف 2', 'timestamp_ms': 1675595045152}),
     Document(page_content='آپ کتنا چاہتے ہیں؟', metadata={'source': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 9, 'sender_name': 'صارف 1', 'timestamp_ms': 1675594799696}),
     Document(page_content='صبح بخیر! $50 بہت کم ہے۔', metadata={'source': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 10, 'sender_name': 'صارف 2', 'timestamp_ms': 1675577876645}),
     Document(page_content='ہیلو! مجھے آپ کی بیگ میں دلچسپی ہے۔ میں $50 پیش کر رہا ہوں۔ بتائیں آپ کو دلچسپی ہے تو۔ شکریہ!', metadata={'source': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'seq_num': 11, 'sender_name': 'صارف 1', 'timestamp_ms': 1675549022673})]

یہاں ہم دیکھ سکتے ہیں کہ یہ فائلز پہلے ہی اس مواد سے متعلق میٹا ڈیٹا شامل ہے جو ہم نکال چکے ہیں۔

metadata_func فنکشن

جیسا کہ اوپر دکھایا گیا ہے، metadata_func کو JSONLoader کے ذریعے تشکیل شدہ ڈیفالٹ میٹا ڈیٹا سے طاقت حاصل ہوتی ہے۔ یہ صارف کو میٹا ڈیٹا کے فارمیٹ پر مکمل کنٹرول فراہم کرتا ہے۔

مثال کے طور پر، ڈیفالٹ میٹا ڈیٹا میں source اور seq_num کی کلیدیں ہوتی ہیں۔ البتہ، JSON ڈیٹا میں بھی یہی کلیدیں موجود ہوسکتی ہیں۔ صارف metadata_func کا استعمال کرکے ڈیفالٹ کلیدوں کو نیا نام دینے اور JSON ڈیٹا سے کلیدیں استعمال کرنے کی اجازت ہوتی ہے۔

نیچے دی ہوئی مثال میں دکھایا گیا ہے کہ کیسے source کو میں صرف langchain ڈائریکٹری سے متعلق فائل سورس کی معلومات شامل کرنے کے لئے تبدیل کیا جاتا ہے۔

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}),
     ...
     ...
     ... (رکاوٹوں کی صورت میں باقی مواد کو مختصر کرنے کے لئے برقرار رہنے کے لئے برقرار رہنے کے لئے) ...
     ...
     ...
]

jq پیٹرن استعمال کرتے ہوئے عام JSON ساخت

مندرجہ ذیل فہرست ایسے ممکنہ jq_schema فراہم کرتی ہے جنھیں صارفین استعمال کرکے JSON ڈیٹا سے مواد نکالنے کے لئے حوالہ مانگتے ہیں۔

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

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

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