জেসন লোডার
- জেসন (JavaScript Object Notation) হল একটি খোলা মান ফাইল ফরম্যাট এবং ডেটা ইন্টারচেঞ্জ ফরম্যাট, যা পঠনীয় টেক্সট ব্যবহার করে ডেটা অবজেক্ট এবং অ্যারে (বা অন্যান্য সিরিয়ালাইজয়েবল মান) থাকা অ্যাট্রিবিউট-ভ্যালু জোড়াগুলি সংরক্ষণ এবং ডেটা পাঠানো করার জন্য ব্যবহার করা হয়।
জেসন লাইনস হল একটি ফাইল ফরম্যাট যেখানে প্রতিটি লাইন একটি বৈধ জেসন ভ্যালু।
JSONLoader ব্যবহার করে নির্দিষ্ট jq প্যাটার্ন ব্যবহার করে JSON ফাইল পার্স করে এবং এটি জেকিউ পাইথন প্যাকেজ ব্যবহার করে। jq সিনট্যাক্স সম্পর্কে বিস্তারিত নথিপন্ন দেখতে, অনুগ্রহ করে সম্পর্কিত পাইথন ডকুমেন্টেশনে দেখুন।
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': 'Bye!',
'sender_name': 'User 2',
'timestamp_ms': 1675597571851},
{'content': 'Oh no worries! Bye',
'sender_name': 'User 1',
'timestamp_ms': 1675597435669},
{'content': 'No Im sorry it was my mistake, the blue one is not '
'for sale',
'sender_name': 'User 2',
'timestamp_ms': 1675596277579},
{'content': 'I thought you were selling the blue one!',
'sender_name': 'User 1',
'timestamp_ms': 1675595140251},
{'content': 'Im not interested in this bag. Im interested in the '
'blue one!',
'sender_name': 'User 1',
'timestamp_ms': 1675595109305},
{'content': 'Here is $129',
'sender_name': 'User 2',
'timestamp_ms': 1675595068468},
{'photos': [{'creation_timestamp': 1675595059,
'uri': 'url_of_some_picture.jpg'}],
'sender_name': 'User 2',
'timestamp_ms': 1675595060730},
{'content': 'Online is at least $100',
'sender_name': 'User 2',
'timestamp_ms': 1675595045152},
{'content': 'How much do you want?',
'sender_name': 'User 1',
'timestamp_ms': 1675594799696},
{'content': 'Good morning! $50 is too low.',
'sender_name': 'User 2',
'timestamp_ms': 1675577876645},
{'content': 'Hi! Im interested in your bag. Im offering $50. Let '
'me know if you are interested. Thanks!',
'sender_name': 'User 1',
'timestamp_ms': 1675549022673}],
'participants': [{'name': 'User 1'}, {'name': 'User 2'}],
'thread_path': 'inbox/User 1 and User 2 chat',
'title': 'User 1 and User 2 chat'}
JSONLoader
ব্যবহার
মনে করুন আমাদের চাচ্ছে যে JSON ডেটাতে 'messages' কী এর অধীনের 'content' ফিল্ড থেকে মান আঁকতে। JSONLoader
ব্যবহার করে এই কাজটি সহজেই সাধ্য।
loader = JSONLoader(
file_path='./example_data/facebook_chat.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 লাইনস ফাইল
আপনি যদি JSON লাইনস ফাইল থেকে ডকুমেন্ট লোড করতে চান, তবে আপনাকে json_lines=True
পাস করতে হবে এবং একটি সিঙ্গেল JSON অবজেক্ট থেকে page_content
এক্সট্র্যাক্ট করার জন্য jq_schema
স্পেসিফাই করতে হবে।
file_path = './example_data/facebook_chat_messages.jsonl'
pprint(Path(file_path).read_text())
('{"sender_name": "User 2", "timestamp_ms": 1675597571851, "content": "বাই!"}\n'
'{"sender_name": "User 1", "timestamp_ms": 1675597435669, "content": "ওহ না '
'চিন্তা নাই! বাই"}\n'
'{"sender_name": "User 2", "timestamp_ms": 1675596277579, "content": "না আমি '
'দুঃখিত, এটা আমার ভুল, নীল একটা বিক্রির জন্য নয়"}\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='বাই!', metadata={'source': 'langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat_messages.jsonl', 'seq_num': 1}),
Document(page_content='ওহ না চিন্তা নাই! বাই', metadata={'source': 'langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat_messages.jsonl', 'seq_num': 2}),
Document(page_content='না আমি দুঃখিত, এটা আমার ভুল, নীল একটা বিক্রির জন্য নয়', 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
বর্তমান উদাহরণে, আমাদের প্রয়োজন আছে loader
কে বোঝাতে যে 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='./example_data/facebook_chat.json',
jq_schema='.messages[]',
content_key="content",
metadata_func=metadata_func
)
data = loader.load()
pprint(data)
[ডকুমেন্ট(পৃষ্ঠা_বিষয়='বিদায়!', মেটাডেটা={'উৎস': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'অনুক্রমাংক': 1, 'প্রেরক_নাম': 'ব্যবহারকারী 2', 'সময়চিহ্ন_ms': 1675597571851}),
ডকুমেন্ট(পৃষ্ঠা_বিষয়='ওহ না চিন্তা না! বিদায়', মেটাডেটা={'উৎস': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'অনুক্রমাংক': 2, 'প্রেরক_নাম': 'ব্যবহারকারী 1', 'সময়চিহ্ন_ms': 1675597435669}),
ডকুমেন্ট(পৃষ্ঠা_বিষয়='না, দুঃখিত এটা আমার ভুল। নীল এটা বিক্রয়ের জন্য নয়', মেটাডেটা={'উৎস': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'অনুক্রমাংক': 3, 'প্রেরক_নাম': 'ব্যবহারকারী 2', 'সময়চিহ্ন_ms': 1675596277579}),
ডকুমেন্ট(পৃষ্ঠা_বিষয়='আমি ভাবলাম আপনি নীলটা বিক্রয় করছেন!', মেটাডেটা={'উৎস': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'অনুক্রমাংক': 4, 'প্রেরক_নাম': 'ব্যবহারকারী 1', 'সময়চিহ্ন_ms': 1675595140251}),
ডকুমেন্ট(পৃষ্ঠা_বিষয়='আমি এই ব্যাগে আগ্রহী নই। আমি নীলটায় আগ্রহী!', মেটাডেটা={'উৎস': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'অনুক্রমাংক': 5, 'প্রেরক_নাম': 'ব্যবহারকারী 1', 'সময়চিহ্ন_ms': 1675595109305}),
ডকুমেন্ট(পৃষ্ঠা_বিষয়='এখানে $129', মেটাডেটা={'উৎস': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'অনুক্রমাংক': 6, 'প্রেরক_নাম': 'ব্যবহারকারী 2', 'সময়চিহ্ন_ms': 1675595068468}),
ডকুমেন্ট(পৃষ্ঠা_বিষয়='', মেটাডেটা={'উৎস': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'অনুক্রমাংক': 7, 'প্রেরক_নাম': 'ব্যবহারকারী 2', 'সময়চিহ্ন_ms': 1675595060730}),
ডকুমেন্ট(পৃষ্ঠা_বিষয়='অনলাইনে এটা অন্তত হলো $100', মেটাডেটা={'উৎস': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'অনুক্রমাংক': 8, 'প্রেরক_নাম': 'ব্যবহারকারী 2', 'সময়চিহ্ন_ms': 1675595045152}),
ডকুমেন্ট(পৃষ্ঠা_বিষয়='আপনি কত চান?', মেটাডেটা={'উৎস': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'অনুক্রমাংক': 9, 'প্রেরক_নাম': 'ব্যবহারকারী 1', 'সময়চিহ্ন_ms': 1675594799696}),
ডকুমেন্ট(পৃষ্ঠা_বিষয়='সুপ্রভাত! $50 খুব কম।', মেটাডেটা={'উৎস': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'অনুক্রমাংক': 10, 'প্রেরক_নাম': 'ব্যবহারকারী 2', 'সময়চিহ্ন_ms': 1675577876645}),
ডকুমেন্ট(পৃষ্ঠা_বিষয়='হাই! আমি আপনার ব্যাগে আগ্রহী। আমি $50 প্রস্তাব করছি। যদি আপনি আগ্রহী হন তাহলে জানান। ধন্যবাদ!', মেটাডেটা={'উৎস': '/Users/avsolatorio/WBG/langchain/docs/modules/indexes/document_loaders/examples/example_data/facebook_chat.json', 'অনুক্রমাংক': 11, 'প্রেরক_নাম': 'ব্যবহারকারী 1', 'সময়চিহ্ন_ms': 1675549022673})]
এখানে আমরা দেখতে পাচ্ছি যে এই ফাইলগুলিতে ইতিমধ্যে আমরা প্রাপ্ত কন্টেন্টের সংবন্ধে মেটাডেটা রয়েছে।
metadata_func
ফাংশন
উপরে দেখানো হয়েছে, metadata_func
ডিফল্ট মেটাডেটা পেতে যা হয় JSONLoader
দ্বারা তৈরি করা হয়। এটা ব্যবহারকারীদের মেটাডেটা ফরম্যাটের পূর্ণ নিয়ন্ত্রণ দেয়।
উদাহরণস্বরূপ, ডিফল্ট মেটাডেটা অক্ষর source
এবং seq_num
কী ধারণ করে। তবে, জেসন ডেটা আমান আমান কূলন করেতে পারে। ব্যবহারকারীরা metadata_func
ব্যবহার করে ডিফল্ট কী নাম পরিবর্তন করতে পারে এবং জেসন ডেটা থেকে কী ব্যবহার করতে পারে।
নীচের উদাহরণে দেখানো হয় যেভাবে 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 প্যাটার্ন ব্যবহারের জনয় সাধারণ জেসন কাঠামো
নীচের তালিকা টি ব্যবহারকারীদের জন্য সম্ভাব্য jq_schema
প্যাটা দিয়ে জেসন ডেটা থেকে কন্টেন্ট উত্তোলনের উদাহরণ দেয়।
JSON -> [{"text": ...}, {"text": ...}, {"text": ...}]
jq_schema -> ".[].text"
JSON -> {"key": [{"text": ...}, {"text": ...}, {"text": ...}]}
jq_schema -> ".key[].text"
JSON -> ["...", "...", "..."]
jq_schema -> ".[]"