تم تقسيم نفس السطر من النص إلى أكثر من عشرة امتدادات بواسطة PyMuPDF؟ وهذا يحدد ما إذا كان ينبغي دمجها
يقوم PyMuPDF بتقسيم نفس السطر من الكلمات إلى أكثر من عشرة امتدادات. في معظم الأحيان، يتغير الخط أو حجم الخط أو النمط، وليس بالضرورة التجزئة. تشرح هذه المقالة كيفية التمييز بين تغييرات النمط وحدود الفقرة، وتقدم أمثلة على منطق الدمج ونموذج القبول لتجنب تقطيع الجملة أثناء الترجمة.
عند استخدام extractDICT() الخاص بـ PyMuPDF لاستخراج نص PDF، قد تجد أن الجملة المتماسكة مقطوعة إلى سبعة أو ثمانية أو أكثر من span في النتيجة التي يتم إرجاعها. لا يعد هذا عادةً خطأً في التحليل، ولكنه انعكاس حقيقي للبنية الأساسية لملف PDF: يمكن أن يؤدي تبديل الخط أو تغييرات اللون أو تعديلات النمط المحلي إلى تعطيل تدفق النص عند العرض.
إذا تم الخلط بين "تشريح النمط" هذا و"تجزئة الفقرة"، فإن التنظيف أو الترجمة أو الاسترداد اللاحق سيؤدي بسهولة إلى حدوث أخطاء في تجزئة الجملة. تشرح هذه المقالة كيفية التمييز بين تغييرات النمط وحدود الفقرة، وتقدم مثالًا مدمجًا لمنطق الدمج، وتوفر نموذج قبول لمساعدتك على تجنب تقطيع الجملة.
يتم تقسيم سطر النص في ملف PDF إلى عدة مسافات. هل ينبغي دمجهما؟ استنتاج جملة واحدة
عندما يكون هناك عدة span في نفس line وتكون إحداثيات y هي نفسها، يكون ذلك في الغالب الخط أو حجم الخط أو تبديل الألوان، والذي يمكن ربطه بأمان؛ يجب أن يستند حد الفقرة إلى بنية block وline، وليس عدد span.
| حالتك | الممارسات الموصى بها | سبب |
|---|---|---|
| الامتدادات المتعددة داخل نفس السطر لها نفس إحداثيات y | الربط الآمن | في الغالب تبديل الخط أو اللون |
| هناك فجوة أفقية واضحة بين الامتدادات | تحقق من تباعد bbox وأدخل مسافات أو علامات تبويب إذا لزم الأمر | قد يكون هناك حرف جدولة أو بقايا فاصل أعمدة، ويحتاج إلى قواعد |
| يتجاوز الاختلاف في إحداثيات y للامتدادات داخل نفس السطر 10% من حجم الخط | احتفظ ببنية الامتداد الأصلية دون دمجها | قد تكون صيغًا مضمنة أو اشتراكات |
| نطاق الكلمة المفردة وbbox غير مرتبة | وضع علامة على أنها ذات جودة منخفضة، وتحويلها إلى دليل أو التعرف الضوئي على الحروف | عدم وجود أساس موثوق للفرز والتجميع |
| نص مستمر دلاليًا عبر الكتل | الحكم السياقي مطلوب ولا يتم تنفيذ الدمج التلقائي. | قد يكون جزءًا من الترحيل |
قم أولاً بتوضيح العلاقة الهرمية بين الكتلة والخط والامتداد
هيكل قاموس PyMuPDF
يتبع إخراج قاموس PyMuPDF بشكل صارم بنية تدفق محتوى PDF، ويكون التسلسل الهرمي من الخارج إلى الداخل كما يلي:
block: منطقة تنضيد مستقلة في الصفحة، مثل فقرة من النص أو خلية جدول أو وسيلة إيضاح.line: سطر واحد مرئي من النص داخلblock.span:lineعبارة عن تسلسل داخلي لأحرف متتالية بنفس الخط والحجم واللون والنمط.
لمزيد من الأوصاف للحقول في كل طبقة، يرجى الرجوع إلى الوثائق الرسمية لـ PyMuPDF TextPage.
لماذا يؤدي تبديل النمط إلى إنشاء نطاق جديد؟
طالما أن هناك خطًا غامقًا أو مائلًا أو تغييرًا في اللون أو خطًا احتياطيًا في منتصف سطر النص (على سبيل المثال، يتم خلط الأحرف الصينية مع الإنجليزية والأرقام)، فسيتم إنشاء span جديد. تنتمي span إلى نفس line وتشترك في نفس خط الأساس والموضع الرأسي.
ما يجب النظر إليه عند حدود الفقرة
يتم وضع علامة على النهاية الحقيقية للفقرة بنهاية قائمة line وبداية block الجديدة، وليس رقم span. قد يؤدي الخلط بين الاثنين إلى مشاكل عملية: على سبيل المثال، يتم التعرف عن طريق الخطأ على "نصيحة مهمة" على أنها جملتين منفصلتين، مما يتسبب في عدم قدرة ذاكرة الترجمة على مطابقة المصطلح بالكامل.
مثال تركيبي: الإخراج الصحيح وحالات الحافة
الإخراج الصحيح
لتوضيح المشكلة، قمنا ببناء سيناريو اصطناعي. لنفترض أن هناك سطرًا من النص في ملف PDF المُدخل: "يرجى ملاحظة: ستتم إعادة تشغيل النظام خلال 5 دقائق." من بينها، "يرجى ملاحظة:" يستخدم خطًا عريضًا، و"سيتم إعادة تشغيل النظام خلال 5 دقائق" يعود إلى خط الأغنية.
يجب أن يحتوي إخراج extractDICT() الصحيح على أربعة span ضمن كائن line واحد. تتداخل bbox لكل span بشكل كبير في الاتجاه الرأسي، كما أن إحداثيات y لـ origin متسقة بشكل أساسي. يتم ربط هذه الأجزاء الأربعة معًا لتشكل وحدة دلالية كاملة.
مدخلات منخفضة الجودة
أحد مواقف الأخطاء النموذجية هو أن ملف PDF الممسوح ضوئيًا لم يتم التعرف عليه ضوئيًا، أو أن منشئ PDF يكتب كل حرف صيني ككائن نصي منفصل. في هذه الحالة، قد تقوم extractDICT() بإرجاع عشرات من كلمات span المكونة من كلمة واحدة، وقد تكون هناك فجوات صغيرة أو تداخلات غير منتظمة بين bbox الخاصة بها.
لا يمكن إصلاح هذا الموقف ببساطة عن طريق تسلسل السلسلة لأنه لا يوجد أساس موثوق للفرز والتجميع. من الأفضل وضع علامة على الصفحة على أنها "بيانات منظمة منخفضة الجودة" وإرسالها إلى التدقيق اللغوي اليدوي أو عملية التعرف الضوئي على الحروف المخصصة بدلاً من فرض الدمج.
منطق الدمج الممتد بناءً على الميزات الهندسية
نموذج التعليمات البرمجية
يوضح مثال Python التالي كيفية محاكاة بنية إخراج extractDICT() في الذاكرة وتنفيذ وظيفة دمج نطاق النظير الآمنة. ملاحظة: يقوم هذا المثال بإنشاء بيانات تركيبية من الذاكرة فقط ولا يقرأ أي ملفات PDF حقيقية. يتم استخدامه فقط للتحقق من منطق خوارزمية الدمج.
للاستخدام الفعلي، يرجى التأكد من أن إصدار 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)}"
احتياطات قبل الاستخدام
- القيمة 2.0 لـ
y_toleranceهي إعداد مثال تركيبي فقط وليست معيارًا صناعيًا. - في المشاريع الفعلية، يمكن حساب هذه القيمة ديناميكيًا استنادًا إلى متوسط حجم الخط في المستند؛ إذا تم تقسيم
lineبشكل صحيح، فلن تكون هناك حاجة عادةً للتحقق الإضافي من إحداثيات y. - تمثل الأمثلة الواردة في هذه المقالة فقط عروض توضيحية على مستوى التعليمات البرمجية ولا تمثل ضمانًا لجميع الملفات الحقيقية أو تأثيرات المنتج.
📊 المقارنة الأساسية
يقارن الجدول التالي بين العديد من طرق المعالجة وما إذا كانت مناسبة للدمج التلقائي بناءً على الموقف الملحوظ، بناءً على قواعد القبول أعلاه.
| الوضع الملاحظ | طريقة المعالجة | هل هو مناسب للدمج التلقائي؟ |
|---|---|---|
| إحداثيات y للامتدادات داخل نفس الخط متسقة | الربط الآمن | نعم |
| هناك فجوة أفقية واضحة بين الامتدادات | أدخل مسافات أو علامات تبويب بعد التحقق من التباعد | كن حذرا وتحتاج إلى القواعد |
| تؤدي الصيغ المضمنة والأحرف المرتفعة والمنخفضة إلى اختلافات كبيرة في إحداثيات y | حافظ على هيكل الامتداد الأصلي | لا |
| نطاق الكلمة المفردة وbbox غير مرتبة | ضع علامة على الجودة المنخفضة، وقم بالتحويل إلى دليل أو التعرف الضوئي على الحروف | لا |
| نص مستمر دلاليًا عبر الكتل | الحكم على أساس السياق | لا، مطلوب مساعدة البرمجة اللغوية العصبية |
معايير القبول وحدود المراجعة اليدوية
| مراقبة الظواهر | الأسباب المحتملة | قرار المعالجة | ما إذا كان سيتم تطبيق الدمج التلقائي |
|---|---|---|---|
| الامتدادات المتعددة داخل نفس السطر لها نفس إحداثيات y | تبديل الخط/اللون | الربط الآمن | نعم |
| توجد فجوة أفقية واضحة بين الامتدادات (>عرض المساحة) | أحرف الجدولة وبقايا الأعمدة | تحقق من تباعد مربعات b، وأدخل مسافات أو علامات تبويب | كن حذرا وتحتاج إلى القواعد |
| الفرق في إحداثيات الامتداد y داخل نفس السطر > حجم الخط 10% | الصيغ المضمنة، والمرتفعات والمنخفضات | احتفظ ببنية الامتداد الأصلية دون دمجها | لا |
| نطاق الكلمة المفردة وbbox غير مرتبة | ملف PDF ممسوح ضوئيًا أو تالفًا | وضع علامة على أنها ذات جودة منخفضة، وتحويلها إلى دليل أو التعرف الضوئي على الحروف | لا |
| الاستمرارية الدلالية للنص بين الكتل | فاصل الصفحة | يتطلب دمج الكتل المتقاطعة حكمًا سياقيًا | لا، مطلوب مساعدة البرمجة اللغوية العصبية |
يغطي هذا الجدول فقط التحقق الهيكلي على مستوى العرض التوضيحي للكود، ويجب دمج التأثير الشامل مع نماذج اللغة أو أخذ العينات اليدوية. لا ينبغي استخدام الدمج التلقائي للمستندات الحساسة للتنسيق مثل العقود القانونية والسجلات الطبية وما إلى ذلك، ما لم يتم التحقق منها بواسطة خبير في المجال.
قبل الاستخدام، يرجى إعداد ملف PDF الخاص باختبار إزالة التحسس بنفسك، وتشغيل page.get_text("dict", sort=True) لتصدير JSON، ثم التحقق من كل عنصر.
يستخدم للتحقق قبل ترجمة المستندات
تحقق أولاً من ترتيب الصفحة وموقع المصدر وسلامة النص، ثم أرسل نفس العينة غير الحساسة إلى عملية الترجمة. بعد الترجمة، لا تزال بحاجة إلى التحقق مما إذا كان العنوان والنص والرسوم التوضيحية متطابقين بشكل صحيح، وليس فقط ما إذا كان النص سلسًا.
يوفر موقع OmniDoc (بوابة المنتج) بوابة لترجمة المستندات متعددة التنسيقات، ويقدم الموقع الرسمي وظائف التعرف الضوئي على الحروف (OCR) والمسرد ووظائف المقارنة ثنائية اللغة. بالنسبة للفرق التي ترغب في العمل مباشرة من الملفات، فهذا مسار يستحق التقييم باستخدام عينات من الحياة الواقعية. الرجاء استخدام الملفات غير الحساسة التي لديك إذن بتحميلها، واستخدام عناصر الاختيار في هذه المقالة لمراجعة النتائج. لا يوجد ادعاء هنا بأن OmniDoc يستخدم المكتبات مفتوحة المصدر أو الخوارزميات الداخلية في هذه المقالة، ولا يحل المثال محل اختبار أداء المنتج.
🎯 ما هي الطريقة المناسبة لك؟
إذا كنت تريد فقط تنظيم النص على نفس السطر
- التجميع حسب
line، وربطspan.textبأمان عندما تكون إحداثيات y متسقة.
إذا واجهت صيغًا أو نصوصًا مرتفعة مضمنة
- احتفظ بهيكل
spanالأصلي بدون دمج.
إذا كنت تتعامل مع عمليات المسح الضوئي أو ملفات PDF التي تحتوي على عدد كبير من الكلمات المفردة
- ضع علامة على الجودة المنخفضة أولاً، ثم انتقل إلى التدقيق اللغوي اليدوي أو عملية التعرف الضوئي على الحروف المخصصة.
إذا كنت تريد إجراء ترجمة عبر الكتل أو عبر الصفحات
- بناءً على الحكم السياقي، ليس من المناسب الدمج بشكل مباشر تلقائيًا.
❓ الأسئلة الشائعة (الأسئلة الشائعة)
1. يتم تقسيم سطر النص إلى عدة مسافات. هل يجب أن يكون التجزئة؟
ليس بالضرورة، فغالبًا ما يكون السبب هو التغييرات في الخط أو حجم الخط أو اللون. span داخل نفس line يشترك في نفس خط الأساس والموضع الرأسي.
2. ماذا يجب أن أقرأ في نهاية الفقرة؟
معرفة ما إذا كانت قائمة line تنتهي وتبدأ block جديدة، وليس رقم span.
3. هل يمكن استخدام تسلسل السلسلة لإصلاح مشكلة امتداد الكلمة المفردة؟
غير مستحسن. تفتقر مثل هذه الحالات إلى أساس موثوق للفرز والتجميع، ومن الأفضل الإشارة إليها على أنها ذات جودة منخفضة وتمريرها إلى عملية يدوية أو عملية التعرف الضوئي على الحروف.
4. ما هو مقدار y_tolerance الذي يجب ضبطه عند الدمج؟
إن الإصدار 2.0 الموجود في المثال هو إعداد مثال اصطناعي فقط وليس معيارًا صناعيًا. يمكن حساب العناصر الفعلية ديناميكيًا استنادًا إلى متوسط حجم الخط، أو الوثوق مباشرة في تجميع line.
5. هل يمكن استخدام الاندماج التلقائي في العقود القانونية؟
غير مناسب إلا إذا تم التحقق منه بواسطة خبراء المجال.
📝 ملخص
إن مفتاح الحكم على إمكانية دمج span هو النظر أولاً إلى بنية line وblock، ثم النظر إلى الموضع الهندسي. عند مواجهة صيغ أو مستندات ممسوحة ضوئيًا أو دلالات عبر الكتل، فمن الأفضل الاحتفاظ بها كما هي أو تحويلها يدويًا بدلاً من ربطها معًا بالقوة.
جربه الآن: قم بتحميل المستند لبدء الترجمة، مع الاحتفاظ بالتخطيط الأصلي


