পাঠ্যের একই লাইন PyMuPDF দ্বারা দশটির বেশি স্প্যানে বিভক্ত? এটি মার্জ করা উচিত কিনা তা নির্ধারণ করে৷
PyMuPDF শব্দের একই লাইনকে এক ডজনেরও বেশি স্প্যানে বিভক্ত করে। বেশিরভাগ সময়, ফন্ট, ফন্টের আকার বা শৈলী পরিবর্তিত হয়েছে, অগত্যা বিভাজন নয়। এই নিবন্ধটি ব্যাখ্যা করে যে কীভাবে শৈলীর পরিবর্তন এবং অনুচ্ছেদের সীমানাগুলিকে আলাদা করা যায় এবং অনুবাদের সময় একটি বাক্য কাটা এড়াতে যুক্তিবিদ্যা এবং একটি গ্রহণযোগ্যতার ফর্ম একত্রিত করার উদাহরণ দেয়।
আপনি যখন পিডিএফ টেক্সট এক্সট্র্যাক্ট করতে PyMuPDF এর extractDICT() ব্যবহার করেন, তখন আপনি দেখতে পাবেন যে প্রত্যাবর্তিত ফলাফলে একটি সুসংগত বাক্য সাত, আট বা তার বেশি span-এ কাটা হয়েছে। এটি সাধারণত পার্সিং ত্রুটি নয়, তবে PDF এর অন্তর্নিহিত কাঠামোর একটি সত্যিকারের প্রতিফলন: ফন্ট স্যুইচিং, রঙ পরিবর্তন, বা স্থানীয় শৈলী সমন্বয় রেন্ডার করার সময় পাঠ্য প্রবাহকে ভেঙে দিতে পারে।
যদি এই "স্টাইল স্লাইসিং"টিকে "অনুচ্ছেদ বিভাজন" এর জন্য ভুল করা হয়, তাহলে পরবর্তী পরিস্কার, অনুবাদ বা পুনরুদ্ধার সহজেই বাক্যের বিভাজন ত্রুটির কারণ হবে। এই নিবন্ধটি ব্যাখ্যা করে যে কীভাবে অনুচ্ছেদের সীমানা থেকে শৈলীর পরিবর্তনগুলিকে আলাদা করা যায়, মার্জিং লজিকের একটি মার্জড উদাহরণ দেয় এবং একটি বাক্য কাটা এড়াতে আপনাকে সাহায্য করার জন্য একটি স্বীকৃতি ফর্ম প্রদান করে৷
PDF এ লেখার একটি লাইন অনেক স্প্যানে বিভক্ত। তাদের একত্রিত করা উচিত? এক বাক্যে উপসংহার
যখন একই line-এ একাধিক span থাকে এবং y স্থানাঙ্কগুলি একই থাকে, তখন এটি বেশিরভাগ ফন্ট, ফন্টের আকার বা রঙ পরিবর্তন করা হয়, যা নিরাপদে বিভক্ত করা যায়; অনুচ্ছেদের সীমানা block এবং line এর কাঠামোর উপর ভিত্তি করে হওয়া উচিত, span সংখ্যার উপর নয়।
| আপনার অবস্থা | প্রস্তাবিত অভ্যাস | কারণ |
|---|---|---|
| একই লাইনের মধ্যে একাধিক স্প্যানের একই y স্থানাঙ্ক রয়েছে | নিরাপদ স্প্লিসিং span.text | বেশির ভাগই ফন্ট বা কালার সুইচিং |
| স্প্যানগুলির মধ্যে একটি সুস্পষ্ট অনুভূমিক ব্যবধান রয়েছে | bbox ব্যবধান চেক করুন এবং প্রয়োজনে স্পেস বা ট্যাব সন্নিবেশ করুন | ট্যাব অক্ষর বা কলাম বিরতি অবশিষ্টাংশ হতে পারে, নিয়ম প্রয়োজন |
| একই লাইনের মধ্যে স্প্যানগুলির y স্থানাঙ্কের পার্থক্য ফন্টের আকারের 10% ছাড়িয়ে গেছে | একত্রিত না করে মূল স্প্যান কাঠামো রাখুন | ইনলাইন সূত্র বা সাবস্ক্রিপ্ট হতে পারে |
| একক শব্দের স্প্যান এবং bbox ক্রমহীন | নিম্ন মানের হিসাবে চিহ্নিত করুন, ম্যানুয়াল বা OCR তে রূপান্তর করুন | বাছাই এবং গোষ্ঠীকরণের জন্য নির্ভরযোগ্য ভিত্তির অভাব |
| ব্লক জুড়ে শব্দার্থগতভাবে অবিচ্ছিন্ন পাঠ্য | প্রাসঙ্গিক বিচার প্রয়োজন এবং স্বয়ংক্রিয় মার্জ করা হয় না। | এটি একটি পেজিং খণ্ড হতে পারে |
প্রথমে ব্লক, লাইন এবং স্প্যানের মধ্যে শ্রেণীবদ্ধ সম্পর্ক স্পষ্ট করুন
PyMuPDF এর অভিধান গঠন
PyMuPDF-এর অভিধান আউটপুট PDF-এর বিষয়বস্তু প্রবাহের কাঠামোকে কঠোরভাবে অনুসরণ করে এবং বাইরে থেকে ভিতরের শ্রেণিবিন্যাস নিম্নরূপ:
block: পৃষ্ঠায় একটি স্বাধীন টাইপসেটিং এলাকা, যেমন পাঠ্যের একটি অনুচ্ছেদ, একটি টেবিল সেল বা একটি কিংবদন্তি।line:blockএর ভিতরে পাঠ্যের ভিজ্যুয়াল একক লাইন।span:lineহল একই হরফ, আকার, রঙ এবং শৈলী সহ পরপর অক্ষরের একটি অভ্যন্তরীণ ক্রম।
প্রতিটি স্তরে ক্ষেত্রগুলির আরও বর্ণনার জন্য, অনুগ্রহ করে PyMuPDF টেক্সটপেজের জন্য অফিসিয়াল ডকুমেন্টেশন দেখুন।
কেন স্টাইল স্যুইচিং একটি নতুন স্প্যান তৈরি করে?
যতক্ষণ টেক্সটের একটি লাইনের মাঝখানে বোল্ডিং, তির্যক, রঙ পরিবর্তন বা ফন্ট ফলব্যাক থাকে (উদাহরণস্বরূপ, চীনা অক্ষরগুলি ইংরেজি এবং সংখ্যার সাথে মিশ্রিত হয়), একটি নতুন span তৈরি করা হবে। এই spanগুলি একই line-এর অন্তর্গত এবং একই বেসলাইন এবং উল্লম্ব অবস্থান ভাগ করে।
অনুচ্ছেদের সীমানা কি দেখতে হবে
একটি অনুচ্ছেদের প্রকৃত সমাপ্তি line তালিকার শেষ এবং একটি নতুন block এর শুরুতে চিহ্নিত করা হয়েছে, span সংখ্যা নয়। দুটিকে বিভ্রান্ত করা ব্যবহারিক সমস্যা সৃষ্টি করতে পারে: উদাহরণস্বরূপ, "গুরুত্বপূর্ণ টিপ" ভুলভাবে দুটি পৃথক বাক্য হিসাবে স্বীকৃত হয়, যার ফলে অনুবাদ মেমরি সম্পূর্ণ শব্দের সাথে মেলে না।
সংশ্লেষণ উদাহরণ: সঠিক আউটপুট এবং প্রান্ত কেস
সঠিক আউটপুট
সমস্যাটি ব্যাখ্যা করার জন্য, আমরা একটি সিন্থেটিক দৃশ্যকল্প তৈরি করি। ধরুন ইনপুট পিডিএফ-এ পাঠ্যের একটি লাইন আছে: "দয়া করে নোট করুন: সিস্টেমটি 5 মিনিটের মধ্যে পুনরায় চালু হবে।" তাদের মধ্যে, "দয়া করে নোট করুন:" বোল্ড ফন্ট ব্যবহার করে, "5 মিনিটের মধ্যে সিস্টেম পুনরায় চালু হবে" গান ফন্টে ফিরে আসে।
সঠিক extractDICT() আউটপুটে একটি line অবজেক্টের অধীনে চারটি span থাকা উচিত। প্রতিটি span-এর bbox উল্লম্ব দিক দিয়ে অত্যন্ত ওভারল্যাপ করা হয় এবং origin-এর y-স্থানাঙ্কগুলি মূলত সামঞ্জস্যপূর্ণ। এই চারটি খণ্ডকে একত্রে বিভক্ত করে একটি সম্পূর্ণ শব্দার্থিক একক তৈরি করা হয়।
নিম্ন মানের ইনপুট
একটি সাধারণ ত্রুটি পরিস্থিতি হল যে স্ক্যান করা পিডিএফটি ওসিআর করা হয়নি, বা পিডিএফ জেনারেটর প্রতিটি চীনা অক্ষরকে একটি পৃথক পাঠ্য বস্তু হিসাবে লেখে। এই ক্ষেত্রে extractDICT() কয়েক ডজন একক-শব্দ span ফেরত দিতে পারে এবং তাদের bbox-এর মধ্যে ছোট ফাঁক বা অনিয়মিত ওভারল্যাপ থাকতে পারে।
এই পরিস্থিতিটি কেবল স্ট্রিং সংযোজন দ্বারা ঠিক করা যায় না কারণ বাছাই এবং গোষ্ঠীকরণের জন্য কোনও নির্ভরযোগ্য ভিত্তি নেই। পৃষ্ঠাটিকে "নিম্ন-মানের স্ট্রাকচার্ড ডেটা" হিসাবে চিহ্নিত করা এবং একত্রিত করার জন্য বাধ্য করার পরিবর্তে এটিকে ম্যানুয়াল প্রুফরিডিং বা একটি উত্সর্গীকৃত OCR প্রক্রিয়াতে প্রেরণ করা নিরাপদ।
জ্যামিতিক বৈশিষ্ট্যের উপর ভিত্তি করে স্প্যান মার্জ লজিক
উদাহরণ কোড
নিম্নলিখিত পাইথন উদাহরণটি প্রদর্শন করে যে কীভাবে মেমরিতে extractDICT() এর আউটপুট কাঠামো অনুকরণ করা যায় এবং একটি নিরাপদ পিয়ার স্প্যান মার্জ ফাংশন প্রয়োগ করা যায়। দ্রষ্টব্য: এই উদাহরণটি সম্পূর্ণরূপে মেমরিতে সিন্থেটিক ডেটা তৈরি করে এবং কোনও আসল পিডিএফ ফাইল পড়ে না; এটি কেবল মার্জিং অ্যালগরিদম লজিক যাচাই করতে ব্যবহৃত হয়।
অনুশীলনে এটি ব্যবহার করার সময়, দয়া করে নিশ্চিত করুন যে PyMuPDF সংস্করণটি extractDICT পদ্ধতি (প্রস্তাবিত 1.23.x বা তার উপরে) সমর্থন করে এবং এটি আপনার নিজের লক করা নির্ভরতা পরিবেশে চালায়।
# 合成示例:演示同行span合并逻辑,非真实PDF解析结果
# 依赖: PyMuPDF (pymupdf) >= 1.23.0,仅用于类型参考,本例纯内存构造
def merge_spans_in_line(line_dict, y_tolerance=2.0):
"""合并同一line内y坐标相近的span,保留原始顺序"""
if not line_dict.get("spans"):
return ""
spans = sorted(line_dict["spans"], key=lambda s: s["bbox"][0]) # 按x排序
merged_text = []
current_y = spans[0]["origin"][1]
buffer = [spans[0]["text"]]
for span in spans[1:]:
y = span["origin"][1]
if abs(y - current_y) <= y_tolerance:
buffer.append(span["text"])
else:
merged_text.append("".join(buffer))
buffer = [span["text"]]
current_y = y
merged_text.append("".join(buffer))
return "\n".join(merged_text)
# 构造合成line数据,模拟四种字体混排(正常情况)
synthetic_line = {
"spans": [
{"text": "请注意:", "bbox": (100, 200, 160, 220), "origin": (100, 215)},
{"text": "系统将在", "bbox": (160, 200, 220, 220), "origin": (160, 215)},
{"text": "5", "bbox": (220, 200, 230, 220), "origin": (220, 215)},
{"text": "分钟后重启。", "bbox": (230, 200, 310, 220), "origin": (230, 215)}
]
}
result = merge_spans_in_line(synthetic_line)
assert result == "请注意:系统将在5分钟后重启。", f"合并失败: {result}"
# 边界测试:y坐标差异超过容差,应视为不同行片段(即使在同一line dict中也应分隔)
bad_line = {
"spans": [
{"text": "上行", "bbox": (100, 200, 140, 220), "origin": (100, 215)},
{"text": "下行", "bbox": (100, 230, 140, 250), "origin": (100, 245)}
]
}
bad_result = merge_spans_in_line(bad_line, y_tolerance=2.0)
# y差值30 > 2.0,应被分隔为两行
assert bad_result == "上行\n下行", f"异常行未正确分隔: {repr(bad_result)}"
ব্যবহারের আগে সতর্কতা অবলম্বন করুন
y_toleranceএর মান 2.0 শুধুমাত্র সংশ্লেষণ উদাহরণের জন্য সেট করা হয়েছে এবং এটি কোনও শিল্প মান নয়।- প্রকৃত প্রকল্পগুলিতে, এই মানটি গড় নথির আকারের উপর ভিত্তি করে গতিশীলভাবে গণনা করা যেতে পারে; যদি
lineনিজেই সঠিকভাবে বিভক্ত হয়, তবে সাধারণত কোনও অতিরিক্ত y-স্থানাঙ্ক যাচাইকরণের প্রয়োজন হয় না। - এই নিবন্ধের উদাহরণগুলি কেবল কোড-স্তরের প্রদর্শনের প্রতিনিধিত্ব করে এবং কোনও ফাইল বা পণ্যের প্রকৃত পারফরম্যান্সের গ্যারান্টি দেয় না।
📊 মূল তুলনা
নীচের সারণীটি উপরে উল্লিখিত গ্রহণযোগ্যতার নিয়মের উপর ভিত্তি করে বেশ কয়েকটি হ্যান্ডলিং পদ্ধতি এবং স্বয়ংক্রিয় মার্জিং উপযুক্ত কিনা তার তুলনা করে।
| পর্যবেক্ষণ করা পরিস্থিতি | হ্যান্ডলিং পদ্ধতি | স্বয়ংক্রিয় সংযুক্তি উপযুক্ত কিনা |
|---|---|---|
| একই রেখার মধ্যে, স্প্যানের y-স্থানাঙ্কগুলি সামঞ্জস্যপূর্ণ | নিরাপদ স্প্লাইসিং | হ্যাঁ |
| স্প্যানগুলির মধ্যে একটি স্বতন্ত্র অনুভূমিক ব্যবধান রয়েছে | ব্যবধান পরীক্ষা করার পরে, একটি স্পেস বা ট্যাব স্টপ সন্নিবেশ করুন | সাবধান থাকুন এবং আপনার নিয়ম দরকার |
| ইনলাইন সূত্র এবং সাবস্ক্রিপ্টগুলি ওয়াই স্থানাঙ্কগুলিতে উল্লেখযোগ্য পার্থক্য সৃষ্টি করে | মূল স্প্যান কাঠামো ধরে রাখে | না |
| একক শব্দের স্প্যান এবং বিবক্স ক্রমহীন | নিম্ন গুণমান চিহ্নিত করুন, ম্যানুয়াল বা ওসিআর-এ স্যুইচ করুন | না |
| ব্লক জুড়ে শব্দার্থিক অবিচ্ছিন্ন পাঠ্য | প্রেক্ষাপটের উপর ভিত্তি করে বিচারক | না, এনএলপি সহায়তা প্রয়োজন |
গ্রহণযোগ্যতার মানদণ্ড এবং ম্যানুয়াল পর্যালোচনা সীমানা
| ঘটনাটি পর্যবেক্ষণ করুন | সম্ভাব্য কারণ | বিষয়টি পরিচালনা করার সিদ্ধান্ত | স্বয়ংক্রিয় মার্জার প্রযোজ্য কিনা |
|---|---|---|---|
| একই লাইনের মধ্যে একাধিক স্প্যান এবং y স্থানাঙ্ক সামঞ্জস্যপূর্ণ | ফন্ট/রঙ স্যুইচ | নিরাপদ স্প্লিসিং span.text | হ্যাঁ |
| স্প্যানগুলির মধ্যে একটি লক্ষণীয় অনুভূমিক ব্যবধান রয়েছে (> স্পেস প্রস্থ) | অবশিষ্ট সারণী এবং কলাম চিহ্নগুলি | বিবক্স ব্যবধান পরীক্ষা করুন এবং স্পেস বা ট্যাব স্টপগুলি সন্নিবেশ করুন | সাবধান থাকুন এবং আপনার নিয়ম দরকার |
| একই লাইনের মধ্যে স্প্যান ওয়াই স্থানাঙ্কের পার্থক্য: > ফন্টের আকার: 10% | লাইনের মধ্যে সূত্র এবং সাবস্ক্রিপ্ট | মার্জ না করে মূল স্প্যান কাঠামো ধরে রাখুন | না |
| একক শব্দের স্প্যান এবং বিবক্স ক্রমহীন | স্ক্যান করা বা ক্ষতিগ্রস্থ পিডিএফ | নিম্ন গুণমান হিসাবে চিহ্নিত করা হয়েছে, ম্যানুয়াল বা ওসিআর-এ স্যুইচ করা হচ্ছে | না |
| ব্লকগুলির মধ্যে পাঠ্য শব্দার্থ | পৃষ্ঠা এবং বিভাজন | ক্রস-ব্লক মার্জিংয়ের জন্য প্রাসঙ্গিক বিচার প্রয়োজন | না, এনএলপি সহায়তা প্রয়োজন |
এই টেবিলটি কেবল কোড প্রদর্শন স্তরে কাঠামোগত বৈধতা কভার করে; এন্ড-টু-এন্ড প্রভাবগুলির জন্য ভাষা মডেল বা ম্যানুয়াল স্পট চেকের সাথে সংহতকরণ প্রয়োজন। ডোমেন বিশেষজ্ঞদের দ্বারা যাচাই না করা পর্যন্ত আইনি চুক্তি বা মেডিকেল রেকর্ডের মতো ফর্ম্যাট-সংবেদনশীল নথিতে স্বয়ংক্রিয় মার্জিং প্রয়োগ করা উচিত নয়।
ব্যবহারের আগে, দয়া করে ডিসেনসিটাইজেশন টেস্ট পিডিএফ নিজেই প্রস্তুত করুন, JSON রফতানি করতে page.get_text("dict", sort=True) চালান এবং তারপরে প্রতিটি আইটেম একে একে যাচাই করুন।
ডকুমেন্টে প্রাক-অনুবাদ চেকের জন্য ব্যবহৃত হয়
প্রথমে, পৃষ্ঠার ক্রম, উত্স অবস্থান এবং পাঠ্য অখণ্ডতা পুঙ্খানুপুঙ্খভাবে পরীক্ষা করুন, তারপরে একই বেনামী নমুনাটি অনুবাদ প্রক্রিয়ায় হস্তান্তর করুন। অনুবাদের পরে, শিরোনাম, মূল পাঠ্য এবং শিরোনামগুলি সঠিকভাবে মিলে যায় কিনা তা পরীক্ষা করা প্রয়োজন; পাঠ্যটি সাবলীল কিনা তা বিচার করা যথেষ্ট নয়।
OmniDoc (প্রোডাক্ট এন্ট্রি) মাল্টি-ফর্ম্যাট ডকুমেন্ট অনুবাদ পোর্টাল সরবরাহ করে এবং এর অফিসিয়াল ওয়েবসাইট ওসিআর, শব্দকোষ এবং দ্বিভাষিক রেফারেন্স বৈশিষ্ট্যগুলি প্রবর্তন করে। ফাইলগুলি থেকে সরাসরি শুরু করতে চায় এমন দলগুলির জন্য, এটি প্রকৃত নমুনাগুলির সাথে মূল্যায়ন করার মতো একটি পথ। অনুগ্রহ করে আপনি যে বেনামী ফাইলটি আপলোড করার জন্য অনুমোদিত করেছেন তা ব্যবহার করুন এবং এই নিবন্ধের চেকলিস্টের সাথে ফলাফলগুলি যাচাই করুন। এটি দাবি করে না যে ওমনিডক এই নিবন্ধ থেকে ওপেন সোর্স লাইব্রেরি বা অভ্যন্তরীণ অ্যালগরিদম ব্যবহার করে, বা এটি উদাহরণ দিয়ে পণ্য পারফরম্যান্স পরীক্ষাকে প্রতিস্থাপন করে না।
🎯 কোন পদ্ধতিটি আপনার জন্য উপযুক্ত?
আপনি যদি একই লাইনে পাঠ্য সংগঠিত করতে চান
lineদ্বারা গ্রুপ; যখন y স্থানাঙ্ক মিলে যায়, নিরাপদেspan.textসংযুক্ত করুন।
আপনি যদি ইন-লাইন সূত্র বা সাবস্ক্রিপ্টের মুখোমুখি হন
- মূল
spanকাঠামো ধরে রাখুন এবং একীভূত করবেন না।
আপনি যদি অনেক সিঙ্গেল স্প্যান সহ স্ক্যান বা পিডিএফ নিয়ে কাজ করেন,
- প্রাথমিকভাবে নিম্ন মানের হিসাবে চিহ্নিত করা হয়েছে, তারপরে ম্যানুয়াল ক্যালিব্রেশন বা ডেডিকেটেড ওসিআর প্রক্রিয়াগুলিতে স্থানান্তরিত হয়েছে।
আপনি যদি ব্লক বা পৃষ্ঠাগুলিতে অনুবাদ করতে চান
- প্রাসঙ্গিক রায়ের উপর ভিত্তি করে, সরাসরি স্বয়ংক্রিয়ভাবে একীভূত হওয়ার পরামর্শ দেওয়া হয় না।
❓ প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী (FAQ)
1. যদি পাঠ্যের একটি লাইন অনেক স্প্যানে বিভক্ত হয়, তবে এটি কি বিভক্ত করতে হবে?
অগত্যা নয়; প্রায়শই এটি ফন্ট, ফন্টের আকার বা রঙের পরিবর্তনের কারণে ঘটে। একই line এর মধ্যে, span একই বেসলাইন এবং উল্লম্ব অবস্থান ভাগ করে।
2. একটি অনুচ্ছেদের শেষে আপনার কী সন্ধান করা উচিত?
line তালিকাটি শেষ হয়েছে কিনা এবং নতুন block শুরু হয় কিনা তা দেখুন, span এর সংখ্যার পরিবর্তে।
3. আপনি কি স্ট্রিং কনক্যাটেনেশনের সাথে একক-অক্ষরের স্প্যান সমস্যাটি সমাধান করতে পারেন?
সুপারিশ করা হয় না। এই ধরনের পরিস্থিতিতে নির্ভরযোগ্য সিকোয়েন্সিং এবং গ্রুপিং মানদণ্ডের অভাব রয়েছে; একটি নিরাপদ পদ্ধতি হ'ল এগুলিকে নিম্ন মানের হিসাবে চিহ্নিত করা এবং তাদের ম্যানুয়াল বা ওসিআর প্রক্রিয়ায় স্থানান্তরিত করা।
4. মার্জের সময় y_tolerance কতটুকু সেট করা উচিত?
উদাহরণের 2.0 শুধুমাত্র সংশ্লেষণের উদ্দেশ্যে সেট করা হয়েছে এবং এটি কোনও শিল্প মান নয়। প্রকৃত প্রকল্পগুলিতে, আপনি গড় ফন্ট আকারের উপর ভিত্তি করে গতিশীলভাবে গণনা করতে পারেন বা সরাসরি line গ্রুপিংকে বিশ্বাস করতে পারেন।
5. স্বয়ংক্রিয় সংযুক্তিগুলি কি আইনি চুক্তিতে ব্যবহার করা যেতে পারে?
ডোমেন বিশেষজ্ঞদের দ্বারা যাচাই না করা পর্যন্ত উপযুক্ত নয়।
📝 সারসংক্ষেপ
span একীভূত হতে পারে কিনা তা নির্ধারণ করার জন্য, মূল বিষয়টি হ'ল প্রথমে line এবং block এর কাঠামোটি দেখুন, তারপরে তাদের জ্যামিতিক অবস্থানগুলি দেখুন। সূত্র, স্ক্যান বা ক্রস-ব্লক শব্দার্থের মুখোমুখি হওয়ার সময়, মূল ফর্মটি রাখা বা জোর করে সেলাই করার চেয়ে ম্যানুয়াল শব্দার্থে স্যুইচ করা ভাল।
এখনই অভিজ্ঞতা: অনুবাদ শুরু করতে আপনার নথি আপলোড করুন, মূল ফর্ম্যাটিং সংরক্ষণ করুন


