MarkdownHeaderTextSplitter

انگیزه

بسیاری از برنامه‌های چت یا پرسش و پاسخ نیازمند بخش‌بندی اسناد ورودی قبل از جاسازی و بردارسازی آن‌ها هستند. بعد از بخش‌بندی متن، اغلب مطلوب است که قطعات متنی با موضوعات مشابه را با یکدیگر گروه‌بندی کنیم.

به عنوان مثال، یک فایل Markdown به وسیله‌ی سرفصل‌های چندگانه مانند h1، h2 و h3 سازماندهی می‌شود. ما می‌توانیم قطعات متنی با هدینگ‌های مشابه را براساس سرفصل‌های Markdown مرتب کنیم.

در این فصل، نحوه‌ی بخش‌بندی محتوای متن بر اساس سرفصل‌های Markdown با استفاده از MarkdownHeaderTextSplitter معرفی شده است.

به عنوان مثال، اگر ما بخواهیم این Markdown را بخش‌بندی کنیم:

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

قوانین هدینگ را برای بخش‌بندی بر اساس سرفصل‌های سطح ۱ و سطح ۲ مشخص کنیم:

[("#", "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 Markdown [9] زبان نشانه‌گذاری سبکی برای ایجاد متن قالب‌بندی‌شده با استفاده از ویرایشگر متن ساده است. جان گروبر Markdown را در سال 2004 به عنوان یک زبان نشانه‌گذاری ایجاد کرد که در قالب کد منبع خود جذاب به خوانندگان انسانی است. [9] \n\n Markdown به طور گسترده در وبلاگ‌نویسی، پیام‌رسانی فوری، انجمن‌های آنلاین، نرم‌افزارهای همکاری، صفحه‌های مستندات و فایل‌های readme استفاده می‌شود. \n\n ## رشد و اختلاف\n\n همانطور که شهرت Markdown به سرعت رشد، بسیاری از پیاده‌سازی‌های Markdown ظاهر شدند، بیشتر بر اساس نیاز به ویژگی‌های اضافی مانند جداول، پانوشت‌ها، فهرست‌های تعریفی، [یادداشت 1] و Markdown در داخل بلوک‌های HTML است. \n\n #### استانداردسازی \n\n از سال 2012، یک گروه از افراد، از جمله جف اتوود و جان مک‌فارلین، چیزی راه انداخته که اتوود آن را یک تلاش استانداردسازی معرفی کرد. \n\n ## پیاده‌سازی‌ها \n\n پیاده‌سازی‌های Markdown برای بیش از دوازده زبان برنامه‌نویسی موجود است."

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

اندازه_قطعه = 250
تکرار_قطعه = 30
تقسیم_کننده = RecursiveCharacterTextSplitter(
    chunk_size=chunk_size, chunk_overlap=chunk_overlap
)

قطعات = text_splitter.split_documents(md_header_splits)
قطعات

نتایج:

[Document(page_content='Markdown [9] زبان نشانه‌گذاری سبکی برای ایجاد متن قالب‌بندی‌شده با استفاده از ویرایشگر متن ساده است. جان گروبر Markdown را در سال 2004 به عنوان یک زبان نشانه‌گذاری ایجاد کرد که در قالب کد منبع خود جذاب به خوانندگان انسانی است. [9]', metadata={'سربرگ 1': 'مقدمه', 'سربرگ 2': 'تاریخ'}),
     Document(page_content='Markdown به طور گسترده در وبلاگ‌نویسی، پیام‌رسانی فوری، انجمن‌های آنلاین، نرم‌افزارهای همکاری، صفحه‌های مستندات و فایل‌های readme استفاده می‌شود.', metadata={'سربرگ 1': 'مقدمه', 'سربرگ 2': 'تاریخ'}),
     Document(page_content='همانطور که شهرت Markdown به سرعت رشد، بسیاری از پیاده‌سازی‌های Markdown ظاهر شدند، بیشتر بر اساس نیاز به ویژگی‌های اضافی مانند جداول، پانوشت‌ها، فهرست‌های تعریفی، [یادداشت 1] و Markdown در داخل بلوک‌های HTML است.  \n#### استانداردسازی', metadata={'سربرگ 1': 'مقدمه', 'سربرگ 2': 'رشد و اختلاف'}),
     Document(page_content='#### استانداردسازی  \nاز سال 2012، یک گروه از افراد، از جمله جف اتوود و جان مک‌فارلین، چیزی راه انداخته که اتوود آن را یک تلاش استانداردسازی معرفی کرد.', metadata={'سربرگ 1': 'مقدمه', 'سربرگ 2': 'رشد و اختلاف'}),
     Document(page_content='پیاده‌سازی‌های Markdown برای بیش از دوازده زبان برنامه‌نویسی موجود است.', metadata={'سربرگ 1': 'مقدمه', 'سربرگ 2': 'پیاده‌سازی‌ها'})]