मार्कडाउन हेडर पाठ विभाजक

प्रेरणा

कई चैट या प्रश्नोत्तरी एप्लिकेशन में अनुलेखित दस्तावेज़ों को एम्बेड और वेक्टराइज़ करने से पहले इन्हें चंक्स में विभाजित करना आम होता है। टेक्स्ट चंकिंग के बाद, समान विषयों वाले टेक्स्ट टुकड़ों को एक साथ ग्रुप करना अक्सर इच्छनीय होता है।

उदाहरण के लिए, एक मार्कडाउन फ़ाइल में h1, h2, और h3 जैसे मल्टी-लेवल हेडिंग्स द्वारा आयोजित होती है। हम मार्कडाउन हेडिंग्स पर आधारित, समान हेडिंग्स वाले टेक्स्ट फ्रेगमेंट्स को आकारित कर सकते हैं।

इस अध्याय में, यह बताया गया है कि LangChain कैसे मार्कडाउन हेडिंग्स के आधार पर पाठ सामग्री को विभाजित करता है, MarkdownHeaderTextSplitter टेक्स्ट स्प्लिटर का उपयोग करके।

उदाहरण के लिए, अगर हम इस मार्कडाउन को विभाजित करना चाहते हैं:

md = '# Foo\\n\\n ## Bar\\n\\nHi this is Jim  \\nHi this is Joe\\n\\n ## Baz\\n\\n Hi this is Molly'

विभाजन के लिए हेडिंग नियम सेट करें, अध्याय 1 और अध्याय 2 हेडिंग्स के आधार पर:

[("#", "Header 1"),("##", "Header 2")]

यहां एक उदाहारण है सामग्री को हेडिंग्स के आधार पर विभाजित करने का, जहां मेटाडेटा फील्ड दर्ज करता है कि वर्तमान सामग्री फ्रेगमेंट किस हेडिंग का हिस्सा है:

{'content': 'Hi this is Jim  \nHi this is Joe', 'metadata': {'Header 1': 'Foo', 'Header 2': 'Bar'}}
{'content': 'Hi this is Molly', 'metadata': {'Header 1': 'Foo', 'Header 2': 'Baz'}}

अब चलिए देखते हैं कि कोड कैसे लिखते हैं।

डिपेंडेंसीज़ को इंस्टॉल करें:

%pip install -qU langchain-text-splitters
from langchain_text_splitters import MarkdownHeaderTextSplitter

API संदर्भ:

  • MarkdownHeaderTextSplitter का उपयोग करके टेक्स्ट स्प्लिटर बनाएं
markdown_document = "# फू\n\n    ## बार\n\nहाय, यह जिम है\n\nहाय, यह जो है\n\n ### बू \n\n हाय, यह लैंस है \n\n ## बैज\n\n हाय, यह मॉली है"

headers_to_split_on = [
    ("#", "हेडर 1"),
    ("##", "हेडर 2"),
    ("###", "हेडर 3"),
]

markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)
md_header_splits = markdown_splitter.split_text(markdown_document)
md_header_splits
[Document(page_content='हाय, यह जिम है  \nहाय, यह जो है', metadata={'हेडर 1': 'फू', 'हेडर 2': 'बार'}),
     Document(page_content='हाय, यह लैंस है', metadata={'हेडर 1': 'फू', 'हेडर 2': 'बार', 'हेडर 3': 'बू'}),
     Document(page_content='हाय, यह मॉली है', metadata={'हेडर 1': 'फू', 'हेडर 2': 'बैज'})]
type(md_header_splits[0])
langchain.schema.Document

हर Markdown समूह के अंदर, हम किसी भी टेक्स्ट स्प्लिटर का उपयोग कर सकते हैं।

markdown_document = "# प्रस्तावना \n\n    ## इतिहास \n\n मार्कडाउन[9] एक हल्की स्मृति भाषा है जो सादा-लेखिका संपादक का उपयोग करके स्वरूपित पाठ बनाने के लिए बनाई गई है। जॉन ग्रूबर ने 2004 में मार्कडाउन को लोगों के पाठ स्रोत में आकर्षक बनाने वाली एक स्मृति भाषा के रूप में बनाया था।[9] \n\n मार्कडाउन ब्लॉगिंग, तुरंत संदेश, ऑनलाइन मंच, सहयोगी सॉफ़्टवेयर, प्रलेखन पेज और readme फ़ाइलों में व्यापक रूप से प्रयोग की जाती है। \n\n ## उभरना और विचलन \n\n मार्कडाउन की लोकप्रियता तेजी से बढ़ती गई, इसके परे कई मार्कडाउन के क्रियान्वयन आ गए, जिन्हें अक्सर ज़रूरत थी \n\n जैसे कि तालिकाएँ, फ़ुटनोट्स, परिभाषण सूचियाँ,[नोट 1] और HTML ब्लॉक के भीतर मार्कडाउन। \n\n #### मानकीकरण \n\n 2012 से, जेफ एटवूड और जॉन मैकफार्लेन सहित कई लोगों का एक समूह ने उद्योग के रूप में चार्लीवाद्ध करके प्रस्तावना की। \n\n ## अमलावाद \n\n मार्कडाउन के अमलावाद कई प्रोग्रामिंग भाषाओं के लिए उपलब्ध हैं।"

headers_to_split_on = [
    ("#", "हेडर 1"),
    ("##", "हेडर 2"),
]

markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)
md_header_splits = markdown_splitter.split_text(markdown_document)

from langchain.text_splitter import RecursiveCharacterTextSplitter

chunk_size = 250
chunk_overlap = 30
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=chunk_size, chunk_overlap=chunk_overlap
)

splits = text_splitter.split_documents(md_header_splits)
splits

परिणाम:

[Document(page_content='मार्कडाउन[9] एक हल्की स्मृति भाषा है जो सादा-लेखिका संपादक का उपयोग करके स्वरूपित पाठ बनाने के लिए बनाई गई है। जॉन ग्रूबर ने 2004 में मार्कडाउन को लोगों के पाठ स्रोत में आकर्षक बनाने वाली एक स्मृति भाषा के रूप में बनाया था।[9]', metadata={'हेडर 1': 'प्रस्तावना', 'हेडर 2': 'इतिहास'}),
     Document(page_content='मार्कडाउन ब्लॉगिंग, तुरंत संदेश, ऑनलाइन मंच, सहयोगी सॉफ़्टवेयर, प्रलेखन पेज और readme फ़ाइलों में व्यापक रूप से प्रयोग की जाती है।', metadata={'हेडर 1': 'प्रस्तावना', 'हेडर 2': 'इतिहास'}),
     Document(page_content='मार्कडाउन की लोकप्रियता तेजी से बढ़ती गई, इसके परे कई मार्कडाउन के क्रियान्वयन आ गए, जिन्हें अक्सर ज़रूरत थी  \nजैसे कि तालिकाएँ, फ़ुटनोट्स, परिभाषण सूचियाँ,[नोट 1] और HTML ब्लॉक के भीतर मार्कडाउन।  \n#### मानकीकरण', metadata={'हेडर 1': 'प्रस्तावना', 'हेडर 2': 'उभरना और विचलन'}),
     Document(page_content='#### मानकीकरण  \n2012 से, जेफ एटवूड और जॉन मैकफार्लेन सहित कई लोगों का एक समूह ने उद्योग के रूप में चार्लीवाद्ध करके प्रस्तावना की।', metadata={'हेडर 1': 'प्रस्तावना', 'हेडर 2': 'उभरना और विचलन'}),
     Document(page_content='मार्कडाउन के अमलावाद कई प्रोग्रामिंग भाषाओं के लिए उपलब्ध हैं।', metadata={'हेडर 1': 'प्रस्तावना', 'हेडर 2': 'अमलावाद'})]