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 -> ".[]"