mirror of
https://github.com/trustgraph-ai/trustgraph.git
synced 2026-04-25 08:26:21 +02:00
420 lines
27 KiB
Markdown
420 lines
27 KiB
Markdown
|
|
---
|
||
|
|
layout: default
|
||
|
|
title: "جهاز فك ترميز المستندات الشامل"
|
||
|
|
parent: "Arabic (Beta)"
|
||
|
|
---
|
||
|
|
|
||
|
|
# جهاز فك ترميز المستندات الشامل
|
||
|
|
|
||
|
|
> **Beta Translation:** This document was translated via Machine Learning and as such may not be 100% accurate. All non-English languages are currently classified as Beta.
|
||
|
|
|
||
|
|
## العنوان
|
||
|
|
|
||
|
|
جهاز فك ترميز المستندات الشامل يعمل بواسطة `unstructured` — استيراد أي تنسيق مستند شائع
|
||
|
|
من خلال خدمة واحدة مع تتبع كامل وتكامل مع أمين المكتبة، وتسجيل مواقع المصدر كبيانات وصفية لـ "رسم بياني للمعرفة" من أجل التتبع التام.
|
||
|
|
|
||
|
|
## المشكلة
|
||
|
|
|
||
|
|
يحتوي "TrustGraph" حاليًا على جهاز فك ترميز خاص بملفات PDF. دعم تنسيقات إضافية (DOCX, XLSX, HTML, Markdown، نص عادي، PPTX، إلخ) يتطلب
|
||
|
|
إما كتابة جهاز فك ترميز جديد لكل تنسيق أو اعتماد مكتبة استخراج عالمية. لكل تنسيق هيكل مختلف — بعضها يعتمد على الصفحات، وبعضها لا — ويجب أن يسجل سلسلة التتبع أين أصل كل جزء من النص المستخرج في المستند الأصلي.
|
||
|
|
|
||
|
|
## الحل المقترح
|
||
|
|
|
||
|
|
### المكتبة: `unstructured`
|
||
|
|
|
||
|
|
استخدم `unstructured.partition.auto.partition()` التي تكتشف تلقائيًا التنسيق من نوع MIME أو امتداد الملف وتستخرج العناصر المنظمة (العنوان، النص السردي، الجدول، عنصر القائمة، إلخ). تحمل كل عنصر بيانات وصفية بما في ذلك:
|
||
|
|
|
||
|
|
- `page_number` (للتنسيقات القائمة على الصفحات مثل PDF، PPTX)
|
||
|
|
- `element_id` (فريد لكل عنصر)
|
||
|
|
- `coordinates` (مربع إحاطة لملفات PDF)
|
||
|
|
- `text` (محتوى النص المستخرج)
|
||
|
|
- `category` (نوع العنصر: العنوان، النص السردي، الجدول، إلخ.)
|
||
|
|
|
||
|
|
### أنواع العناصر
|
||
|
|
|
||
|
|
تستخرج `unstructured` أنواع العناصر من المستندات. كل عنصر لديه فئة و بيانات وصفية مرتبطة:
|
||
|
|
|
||
|
|
**عناصر النص:**
|
||
|
|
- `Title` — عناوين الأقسام
|
||
|
|
- `NarrativeText` — فقرات النص
|
||
|
|
- `ListItem` — عناصر القوائم المرقمة/المسردة
|
||
|
|
- `Header`, `Footer` — رؤوس/تذييلات الصفحات
|
||
|
|
- `FigureCaption` — تسميات للرسومات/الصور
|
||
|
|
- `Formula` — تعبيرات رياضية
|
||
|
|
- `Address`, `EmailAddress` — معلومات الاتصال
|
||
|
|
- `CodeSnippet` — كتل التعليمات البرمجية (من markdown)
|
||
|
|
|
||
|
|
**الجداول:**
|
||
|
|
- `Table` — بيانات جدولية منظمة. توفر `unstructured` كلاً من
|
||
|
|
`element.text` (نص عادي) و `element.metadata.text_as_html`
|
||
|
|
(علامة HTML `<table` كاملة مع الصفوف والأعمدة والعناوين المحفوظة).
|
||
|
|
بالنسبة للتنسيقات ذات الهيكل الجدول المحدد (DOCX, XLSX, HTML)، يكون الاستخراج موثوقًا للغاية. بالنسبة لملفات PDF، يعتمد اكتشاف الجداول على
|
||
|
|
الاستراتيجية `hi_res` مع تحليل التخطيط.
|
||
|
|
|
||
|
|
**الصور:**
|
||
|
|
- `Image` — صور مضمنة يتم اكتشافها من خلال تحليل التخطيط (يتطلب
|
||
|
|
الاستراتيجية `hi_res`). مع `extract_image_block_to_payload=True`،
|
||
|
|
ترجع بيانات الصورة كـ base64 في `element.metadata.image_base64`.
|
||
|
|
النص المستخرج من الصورة متاح في `element.text`.
|
||
|
|
|
||
|
|
### معالجة الجداول
|
||
|
|
|
||
|
|
الجداول هي مخرج أساسي. عندما يواجه جهاز فك الترميز عنصر `Table`، فإنه يحافظ على هيكل HTML بدلاً من تسويته إلى نص عادي. هذا يوفر لمستخرج LLM (نموذج اللغة الكبير) إدخالًا أفضل بكثير لسحب المعرفة المنظمة من البيانات الجدولية.
|
||
|
|
|
||
|
|
يتم تجميع النص الخاص بالصفحة/القسم على النحو التالي:
|
||
|
|
- عناصر النص: نص عادي، مدمج مع سطور جديدة
|
||
|
|
- عناصر الجدول: علامة HTML للجدول من `text_as_html`، ومحاطة بـ `<table>` حتى يتمكن نموذج اللغة الكبيرة من التمييز بين الجداول والنص السردي.
|
||
|
|
|
||
|
|
على سبيل المثال، صفحة تحتوي على عنوان وفقرة وجدول تنتج:
|
||
|
|
|
||
|
|
```
|
||
|
|
نظرة عامة مالية
|
||
|
|
|
||
|
|
ارتفعت الإيرادات بنسبة 15٪ على أساس سنوي مدفوعة باعتماد المؤسسات.
|
||
|
|
|
||
|
|
<table>
|
||
|
|
<tr><th>الربع</th><th>الإيرادات</th><th>النمو</th></tr>
|
||
|
|
<tr><td>Q1</td><td>$12M</td><td>12%</td></tr>
|
||
|
|
<tr><td>Q2</td><td>$14M</td><td>17%</td></tr>
|
||
|
|
</table>
|
||
|
|
```
|
||
|
|
|
||
|
|
هذا يحافظ على هيكل الجدول من خلال التقطيع وإلى مسار الاستخراج، حيث يمكن لنموذج اللغة الكبيرة استخراج العلاقات مباشرة من الخلايا المنظمة بدلاً من تخمين محاذاة الأعمدة من المسافات.
|
||
|
|
|
||
|
|
### معالجة الصور
|
||
|
|
|
||
|
|
تتم استخراج الصور وتخزينها في أمين المكتبة كأوراق فرعية مع `document_type="image"` ومعرف `urn:image:{uuid}`. إنها تحصل على ثلاثيات تتبع من النوع `tg:Image`، مرتبطة بصفحتها/قسمها الأصلية عبر `prov:wasDerivedFrom`. يتم تسجيل البيانات الوصفية للصورة (الإحداثيات والأبعاد و `element_id`) في التتبع.
|
||
|
|
|
||
|
|
**من المهم للغاية، لا يتم إخراج الصور كإخراج `TextDocument`.** يتم تخزينها فقط — ولا يتم إرسالها إلى وحدة تقسيم (chunker) أو أي مسار لمعالجة النصوص. هذا مقصود:
|
||
|
|
|
||
|
|
1. لا يوجد مسار لمعالجة الصور بعد (دمج نموذج الرؤية هو عمل مستقبلي)
|
||
|
|
2. إرسال بيانات صورة base64 أو أجزاء من OCR إلى مسار استخراج النص سينتج عنه ثلاثيات KG (رسم بياني للمعرفة) غير صحيحة.
|
||
|
|
|
||
|
|
كما يتم استبعاد الصور من النص المجمع للصفحة/القسم — أي عناصر `Image` يتم تخطيها بصمت عند ربط عناصر النص لصفحة/قسم. يسجل سلسلة التتبع أن الصور موجودة وأين ظهرت في المستند، بحيث يمكن لنموذج معالجة صور مستقبلي التقاطها دون إعادة استيراد المستند.
|
||
|
|
|
||
|
|
#### عمل مستقبلي
|
||
|
|
|
||
|
|
- توجيه الكيانات `tg:Image` إلى نموذج رؤية للوصف أو تفسير المخططات أو استخراج بيانات الرسم البياني.
|
||
|
|
- تخزين أوصاف الصور كمستندات نصية فرعية يتم إدخالها في مسار التقطيع/الاستخراج القياسي.
|
||
|
|
- ربط المعرفة المستخرجة بالصور المصدر عبر التتبع.
|
||
|
|
|
||
|
|
### استراتيجيات الأقسام
|
||
|
|
|
||
|
|
بالنسبة للتنسيقات القائمة على الصفحات (PDF، PPTX، XLSX)، يتم تجميع العناصر دائمًا حسب الصفحة/الشريحة/الورقة أولاً. بالنسبة للتنسيقات غير القائمة على الصفحات (DOCX، HTML، Markdown، إلخ)، يحتاج جهاز فك الترميز إلى استراتيجية لتقسيم المستند إلى أقسام. هذا قابل للتكوين في وقت التشغيل عبر `--section-strategy`.
|
||
|
|
|
||
|
|
تعتبر كل استراتيجية وظيفة تجميع على قائمة `unstructured` للعناصر. الإخراج هو قائمة بمجموعات العناصر؛ يظل بقية المسار (تجميع النص وتخزين أمين المكتبة والتتبع وإصدار `TextDocument`) متطابقًا بغض النظر عن الاستراتيجية.
|
||
|
|
|
||
|
|
#### `whole-document` (افتراضي)
|
||
|
|
|
||
|
|
إخراج المستند بأكمله كقسم واحد. اسمح لوحدة تقسيم المستند (chunker) بمعالجة جميع عمليات التقسيم.
|
||
|
|
|
||
|
|
- أبسط نهج، خط أساس جيد
|
||
|
|
- قد ينتج عنه `TextDocument` كبير جدًا للملفات الكبيرة، ولكن وحدة التقسيم تتعامل مع ذلك
|
||
|
|
- الأفضل عندما تريد أقصى قدر من السياق لكل قسم
|
||
|
|
|
||
|
|
#### `heading`
|
||
|
|
|
||
|
|
التقسيم عند عناصر العناوين (`Title`). كل قسم هو عنوان وجميع المحتويات حتى العنوان التالي من نفس المستوى أو أعلى. تخلق العناوين المتداخلة أقسامًا متداخلة.
|
||
|
|
|
||
|
|
- ينتج وحدات متماسكة من الناحية الموضوعية
|
||
|
|
- يعمل بشكل جيد مع المستندات المنظمة (التقارير والكتيبات والمواصفات)
|
||
|
|
- يوفر لـ LLM الاستخراج سياق العنوان جنبًا إلى جنب مع المحتوى
|
||
|
|
- يرجع إلى `whole-document` إذا لم يتم العثور على أي عناوين
|
||
|
|
|
||
|
|
#### `element-type`
|
||
|
|
|
||
|
|
التقسيم عند حدوث تغيير كبير في نوع العنصر — على وجه التحديد، ابدأ قسمًا جديدًا في الانتقالات بين النص السردي والجداول. تظل العناصر المتتالية من نفس الفئة العامة (نص، نص، نص أو جدول، جدول) مجمعة.
|
||
|
|
|
||
|
|
- يحافظ على الجداول كأقسام منفصلة
|
||
|
|
- جيد للمستندات ذات المحتوى المختلط (التقارير مع الجداول البيانية)
|
||
|
|
- يتم إعطاء الجداول اهتمام استخراج مخصص
|
||
|
|
|
||
|
|
#### `count`
|
||
|
|
|
||
|
|
تجميع عدد ثابت من العناصر لكل قسم. قابلة للتكوين عبر `--section-element-count` (افتراضي: 20).
|
||
|
|
|
||
|
|
- بسيط وقابل للتنبؤ
|
||
|
|
- لا يحترم هيكل المستند
|
||
|
|
- مفيد كحل احتياطي أو للتجريب
|
||
|
|
|
||
|
|
#### `size`
|
||
|
|
|
||
|
|
تجميع العناصر حتى يتم الوصول إلى حد الأحرف، ثم ابدأ قسمًا جديدًا. يحترم حدود العناصر — لا يقسم في منتصف العنصر. قابلة للتكوين عبر `--section-max-size` (افتراضي: 4000 حرف).
|
||
|
|
|
||
|
|
- ينتج أقسامًا ذات أحجام تقريبًا موحدة
|
||
|
|
- يحترم حدود العناصر (على عكس وحدة التقسيم السفلية)
|
||
|
|
- حل وسط جيد بين التحكم في الهيكل والحجم
|
||
|
|
- إذا تجاوز عنصر واحد الحد، فإنه يصبح قسمه الخاص
|
||
|
|
|
||
|
|
#### تفاعل مع التنسيق القائم على الصفحة
|
||
|
|
|
||
|
|
بالنسبة للتنسيقات القائمة على الصفحات، يكون تجميع الصفحة هو الأولوية دائمًا. يمكن أن تنطبق استراتيجيات القسم بشكل اختياري *داخل* صفحة إذا كانت كبيرة جدًا (على سبيل المثال، صفحة PDF تحتوي على جدول ضخم)، ويتم التحكم في ذلك بواسطة
|
||
|
|
`--section-within-pages` (افتراضي: false). عندما يكون `false`، تكون كل صفحة دائمًا قسمًا واحدًا بغض النظر عن الحجم.
|
||
|
|
|
||
|
|
### اكتشاف التنسيق
|
||
|
|
|
||
|
|
يحتاج جهاز فك الترميز إلى معرفة نوع MIME الخاص بالمستند لتمريره إلى `partition()` الخاصة بـ `unstructured`. هناك مساران:
|
||
|
|
|
||
|
|
- **مسار أمين المكتبة** (`document_id` مضبوط): استرداد بيانات وصفية المستند من أمين المكتبة أولاً — وهذا يعطينا `kind` (نوع MIME)
|
||
|
|
الذي تم تسجيله في وقت الرفع. ثم استرداد محتوى المستند.
|
||
|
|
مكالمتان لأمين المكتبة، ولكن استرداد البيانات الوصفية خفيف الوزن.
|
||
|
|
- **المسار المضمن** (التوافق مع الإصدارات السابقة، `data` مضبوط): لا توجد بيانات وصفية
|
||
|
|
متاحة على الرسالة. استخدم `python-magic` لاكتشاف التنسيق
|
||
|
|
من بايت المحتوى كحل احتياطي.
|
||
|
|
|
||
|
|
لا توجد تغييرات ضرورية في مخطط `Document` — يقوم أمين المكتبة بالفعل بتخزين نوع MIME.
|
||
|
|
|
||
|
|
### الهندسة المعمارية
|
||
|
|
|
||
|
|
خدمة `universal-decoder` واحدة تقوم بما يلي:
|
||
|
|
|
||
|
|
1. تتلقى رسالة `Document` (مضمنة أو عبر مرجع أمين المكتبة)
|
||
|
|
2. إذا كان مسار أمين المكتبة: استرداد بيانات وصفية المستند (الحصول على نوع MIME)، ثم
|
||
|
|
استرداد المحتوى. إذا كان المسار المضمن: اكتشاف التنسيق من بايت المحتوى.
|
||
|
|
3. تستدعي `partition()` لاستخراج العناصر
|
||
|
|
4. تجميع العناصر: حسب الصفحة للتنسيقات القائمة على الصفحات، حسب استراتيجية القسم المحددة للتنسيقات غير القائمة على الصفحات
|
||
|
|
5. لكل صفحة/قسم:
|
||
|
|
- توليد معرف `urn:page:{uuid}` أو `urn:section:{uuid}`
|
||
|
|
- تجميع نص الصفحة: النص العادي، والجداول كـ HTML،
|
||
|
|
الصور يتم تخطيها
|
||
|
|
- حساب إزاحة الأحرف لكل عنصر داخل نص الصفحة
|
||
|
|
- حفظ في أمين المكتبة كوثيقة فرعية
|
||
|
|
- حساب ثلاثيات تتبع مع بيانات وصفية موضعية
|
||
|
|
- إرسال `TextDocument` إلى وحدة تقسيم (chunker)
|
||
|
|
6. لكل عنصر صورة:
|
||
|
|
- توليد معرف `urn:image:{uuid}`
|
||
|
|
- حفظ بيانات الصورة في أمين المكتبة كوثيقة فرعية
|
||
|
|
- حساب ثلاثيات تتبع (مخزنة فقط، ولا يتم إرسالها إلى وحدة تقسيم)
|
||
|
|
|
||
|
|
### معالجة التنسيقات
|
||
|
|
|
||
|
|
| التنسيق | نوع MIME | قائم على الصفحات | ملاحظات |
|
||
|
|
|---|---|---|---|
|
||
|
|
| PDF | application/pdf | نعم | تجميع حسب الصفحة |
|
||
|
|
| DOCX | application/vnd.openxmlformats... | لا | يستخدم استراتيجية القسم |
|
||
|
|
| PPTX | application/vnd.openxmlformats... | نعم | تجميع حسب الشريحة |
|
||
|
|
| XLSX/XLS | application/vnd.openxmlformats... | نعم | تجميع حسب ورقة العمل |
|
||
|
|
| HTML | text/html | لا | يستخدم استراتيجية القسم |
|
||
|
|
| Markdown | text/markdown | لا | يستخدم استراتيجية القسم |
|
||
|
|
| Plain | text/plain | لا | يستخدم استراتيجية القسم |
|
||
|
|
| CSV | text/csv | لا | يستخدم استراتيجية القسم |
|
||
|
|
| RST | text/x-rst | لا | يستخدم استراتيجية القسم |
|
||
|
|
| RTF | application/rtf | لا | يستخدم استراتيجية القسم |
|
||
|
|
| ODT | application/vnd.oasis... | لا | يستخدم استراتيجية القسم |
|
||
|
|
| TSV | text/tab-separated-values | لا | يستخدم استراتيجية القسم |
|
||
|
|
|
||
|
|
### بيانات التتبع
|
||
|
|
|
||
|
|
تسجل كل صفحة/قسم كيان بيانات وصفية موضعية على شكل ثلاثيات تتبع في الرسم البياني المصدر (`GRAPH_SOURCE`)، مما يتيح التتبع التام من ثلاثيات KG (رسم بياني للمعرفة) إلى مواضع المستند المصدر.
|
||
|
|
|
||
|
|
#### الحقول الحالية (موجودة بالفعل في `provenance/triples.py`)
|
||
|
|
|
||
|
|
- `page_number` — رقم الصفحة/الورقة/الشريحة (مرقم 1، فقط للتنسيقات القائمة على الصفحات)
|
||
|
|
- `char_offset` — إزاحة الحرف لهذه الصفحة/القسم داخل نص المستند بالكامل
|
||
|
|
- `char_length` — طول الحرف لنص هذه الصفحة/القسم
|
||
|
|
|
||
|
|
#### حقول جديدة (قم بتوسيع `provenance/triples.py`)
|
||
|
|
|
||
|
|
- `mime_type` — تنسيق المستند الأصلي (على سبيل المثال، `application/pdf`)
|
||
|
|
- `element_types` — قائمة `unstructured` لفئات العناصر الموجودة في هذه الصفحة/القسم (على سبيل المثال، "العنوان،النص السردي،الجدول")
|
||
|
|
- `table_count` — عدد الجداول في هذه الصفحة/القسم
|
||
|
|
- `image_count` — عدد الصور في هذه الصفحة/القسم
|
||
|
|
|
||
|
|
يتطلب هذا بناء جملة جديد لأسماء النطاقات:
|
||
|
|
|
||
|
|
```
|
||
|
|
TG_SECTION_TYPE = "https://trustgraph.ai/ns/Section"
|
||
|
|
TG_IMAGE_TYPE = "https://trustgraph.ai/ns/Image"
|
||
|
|
TG_ELEMENT_TYPES = "https://trustgraph.ai/ns/elementTypes"
|
||
|
|
TG_TABLE_COUNT = "https://trustgraph.ai/ns/tableCount"
|
||
|
|
TG_IMAGE_COUNT = "https://trustgraph.ai/ns/imageCount"
|
||
|
|
```
|
||
|
|
|
||
|
|
مخطط URN للصورة: `urn:image:{uuid}`
|
||
|
|
|
||
|
|
(`TG_MIME_TYPE` موجود بالفعل.)
|
||
|
|
|
||
|
|
#### نوع الكيان الجديد
|
||
|
|
|
||
|
|
بالنسبة للتنسيقات غير القائمة على الصفحات (DOCX، HTML، Markdown، إلخ) حيث يقوم جهاز فك الترميز بإخراج المستند بأكمله كقسم واحد بدلاً من التقسيم حسب الصفحة، يحصل الكيان على نوع جديد:
|
||
|
|
|
||
|
|
```
|
||
|
|
TG_SECTION_TYPE = "https://trustgraph.ai/ns/Section"
|
||
|
|
```
|
||
|
|
|
||
|
|
هذا يميز الأقسام عن الصفحات عند الاستعلام عن التتبع:
|
||
|
|
|
||
|
|
| الكيان | النوع | متى يتم استخدامه |
|
||
|
|
|---|---|---|
|
||
|
|
| Document | `tg:Document` | الملف الذي تم رفعه أصلاً |
|
||
|
|
| Page | `tg:Page` | تنسيقات قائمة على الصفحات (PDF، PPTX، XLSX) |
|
||
|
|
| Section | `tg:Section` | تنسيقات غير قائمة على الصفحات (DOCX، HTML، MD، إلخ) |
|
||
|
|
| Image | `tg:Image` | صور مضمنة (مخزنة، وغير معالجة) |
|
||
|
|
| Chunk | `tg:Chunk` | إخراج وحدة تقسيم المستند |
|
||
|
|
| Subgraph | `tg:Subgraph` | إخراج KG |
|
||
|
|
|
||
|
|
يتم تعيين النوع بواسطة جهاز فك الترميز بناءً على ما إذا كان يقوم بتجميع حسب الصفحة أم أنه يصدر قسمًا كاملاً للمستند. تكتسب `provenance/triples.py` معلمة اختيارية `section` — عندما تكون `true`، يتم تصنيف الكيان على أنه `tg:Section` بدلاً من `tg:Page`.
|
||
|
|
|
||
|
|
#### سلسلة التتبع الكاملة
|
||
|
|
|
||
|
|
```
|
||
|
|
ثلاثية KG
|
||
|
|
→ subgraph (تتبع الاستخراج)
|
||
|
|
→ chunk (char_offset، char_length داخل الصفحة)
|
||
|
|
→ page/section (page_number، char_offset، char_length داخل المستند، mime_type، element_types)
|
||
|
|
→ document (الملف الأصلي في أمين المكتبة)
|
||
|
|
```
|
||
|
|
|
||
|
|
كل رابط هو مجموعة من الثلاثيات في الرسم البياني المسمى `GRAPH_SOURCE`.
|
||
|
|
|
||
|
|
### تكوين الخدمة
|
||
|
|
|
||
|
|
وسيطات سطر الأوامر:
|
||
|
|
|
||
|
|
```
|
||
|
|
--strategy استراتيجية التقسيم: auto, hi_res, fast (افتراضي: auto)
|
||
|
|
--languages قائمة مفصولة بفواصل برموز لغة OCR (افتراضي: eng)
|
||
|
|
--section-strategy استراتيجية تجميع القسم: whole-document, heading, element-type,
|
||
|
|
count, size (افتراضي: whole-document)
|
||
|
|
--section-element-count عدد العناصر لكل قسم (افتراضي: 20)
|
||
|
|
--section-max-size الحد الأقصى لحجم القسم (بالأحرف) (افتراضي: 4000)
|
||
|
|
```
|
||
|
|
|
||
|
|
### التنفيذ
|
||
|
|
|
||
|
|
خدمة `universal-decoder` واحدة تقوم بما يلي:
|
||
|
|
|
||
|
|
1. تتلقى رسالة `Document` (مضمنة أو عبر مرجع أمين المكتبة)
|
||
|
|
2. إذا كان مسار أمين المكتبة: استرداد بيانات وصفية المستند (الحصول على نوع MIME)، ثم
|
||
|
|
استرداد المحتوى. إذا كان المسار المضمن: اكتشاف التنسيق من بايت المحتوى.
|
||
|
|
3. تستدعي `partition()` لاستخراج العناصر
|
||
|
|
4. تجميع العناصر: حسب الصفحة للتنسيقات القائمة على الصفحات، حسب استراتيجية القسم المحددة للتنسيقات غير القائمة على الصفحات
|
||
|
|
5. لكل صفحة/قسم:
|
||
|
|
- توليد معرف `urn:page:{uuid}` أو `urn:section:{uuid}`
|
||
|
|
- تجميع نص الصفحة: النص العادي، والجداول كـ HTML،
|
||
|
|
الصور يتم تخطيها
|
||
|
|
- حساب إزاحة الأحرف لكل عنصر داخل نص الصفحة
|
||
|
|
- حفظ في أمين المكتبة كوثيقة فرعية
|
||
|
|
- حساب ثلاثيات تتبع مع بيانات وصفية موضعية
|
||
|
|
- إرسال `TextDocument` إلى وحدة تقسيم (chunker)
|
||
|
|
6. لكل عنصر صورة:
|
||
|
|
- توليد معرف `urn:image:{uuid}`
|
||
|
|
- حفظ بيانات الصورة في أمين المكتبة كوثيقة فرعية
|
||
|
|
- حساب ثلاثيات تتبع (مخزنة فقط، ولا يتم إرسالها إلى وحدة تقسيم)
|
||
|
|
|
||
|
|
### معالجة التنسيقات
|
||
|
|
|
||
|
|
| التنسيق | نوع MIME | قائم على الصفحات | ملاحظات |
|
||
|
|
|---|---|---|---|
|
||
|
|
| PDF | application/pdf | نعم | تجميع حسب الصفحة |
|
||
|
|
| DOCX | application/vnd.openxmlformats... | لا | يستخدم استراتيجية القسم |
|
||
|
|
| PPTX | application/vnd.openxmlformats... | نعم | تجميع حسب الشريحة |
|
||
|
|
| XLSX/XLS | application/vnd.openxmlformats... | نعم | تجميع حسب ورقة العمل |
|
||
|
|
| HTML | text/html | لا | يستخدم استراتيجية القسم |
|
||
|
|
| Markdown | text/markdown | لا | يستخدم استراتيجية القسم |
|
||
|
|
| Plain | text/plain | لا | يستخدم استراتيجية القسم |
|
||
|
|
| CSV | text/csv | لا | يستخدم استراتيجية القسم |
|
||
|
|
| RST | text/x-rst | لا | يستخدم استراتيجية القسم |
|
||
|
|
| RTF | application/rtf | لا | يستخدم استراتيجية القسم |
|
||
|
|
| ODT | application/vnd.oasis... | لا | يستخدم استراتيجية القسم |
|
||
|
|
| TSV | text/tab-separated-values | لا | يستخدم استراتيجية القسم |
|
||
|
|
|
||
|
|
### بيانات التتبع
|
||
|
|
|
||
|
|
تسجل كل صفحة/قسم كيان بيانات وصفية موضعية على شكل ثلاثيات تتبع في الرسم البياني المصدر (`GRAPH_SOURCE`)، مما يتيح التتبع التام من ثلاثيات KG (رسم بياني للمعرفة) إلى مواضع المستند المصدر.
|
||
|
|
|
||
|
|
#### الحقول الحالية (موجودة بالفعل في `provenance/triples.py`)
|
||
|
|
|
||
|
|
- `page_number` — رقم الصفحة/الورقة/الشريحة (مرقم 1، فقط للتنسيقات القائمة على الصفحات)
|
||
|
|
- `char_offset` — إزاحة الحرف لهذه الصفحة/القسم داخل نص المستند بالكامل
|
||
|
|
- `char_length` — طول الحرف لنص هذه الصفحة/القسم
|
||
|
|
|
||
|
|
#### حقول جديدة (قم بتوسيع `provenance/triples.py`)
|
||
|
|
|
||
|
|
- `mime_type` — تنسيق المستند الأصلي (على سبيل المثال، `application/pdf`)
|
||
|
|
- `element_types` — قائمة `unstructured` لفئات العناصر الموجودة في هذه الصفحة/القسم (على سبيل المثال، "العنوان،النص السردي،الجدول")
|
||
|
|
- `table_count` — عدد الجداول في هذه الصفحة/القسم
|
||
|
|
- `image_count` — عدد الصور في هذه الصفحة/القسم
|
||
|
|
|
||
|
|
يتطلب هذا بناء جملة جديد لأسماء النطاقات:
|
||
|
|
|
||
|
|
```
|
||
|
|
TG_SECTION_TYPE = "https://trustgraph.ai/ns/Section"
|
||
|
|
TG_IMAGE_TYPE = "https://trustgraph.ai/ns/Image"
|
||
|
|
TG_ELEMENT_TYPES = "https://trustgraph.ai/ns/elementTypes"
|
||
|
|
TG_TABLE_COUNT = "https://trustgraph.ai/ns/tableCount"
|
||
|
|
TG_IMAGE_COUNT = "https://trustgraph.ai/ns/imageCount"
|
||
|
|
```
|
||
|
|
|
||
|
|
مخطط URN للصورة: `urn:image:{uuid}`
|
||
|
|
|
||
|
|
(`TG_MIME_TYPE` موجود بالفعل.)
|
||
|
|
|
||
|
|
#### نوع الكيان الجديد
|
||
|
|
|
||
|
|
بالنسبة للتنسيقات غير القائمة على الصفحات (DOCX، HTML، Markdown، إلخ) حيث يقوم جهاز فك الترميز بإخراج المستند بأكمله كقسم واحد بدلاً من التقسيم حسب الصفحة، يحصل الكيان على نوع جديد:
|
||
|
|
|
||
|
|
```
|
||
|
|
TG_SECTION_TYPE = "https://trustgraph.ai/ns/Section"
|
||
|
|
```
|
||
|
|
|
||
|
|
هذا يميز الأقسام عن الصفحات عند الاستعلام عن التتبع:
|
||
|
|
|
||
|
|
| الكيان | النوع | متى يتم استخدامه |
|
||
|
|
|---|---|---|
|
||
|
|
| Document | `tg:Document` | الملف الذي تم رفعه أصلاً |
|
||
|
|
| Page | `tg:Page` | تنسيقات قائمة على الصفحات (PDF، PPTX، XLSX) |
|
||
|
|
| Section | `tg:Section` | تنسيقات غير قائمة على الصفحات (DOCX، HTML، MD، إلخ) |
|
||
|
|
| Image | `tg:Image` | صور مضمنة (مخزنة، وغير معالجة) |
|
||
|
|
| Chunk | `tg:Chunk` | إخراج وحدة تقسيم المستند |
|
||
|
|
| Subgraph | `tg:Subgraph` | إخراج KG |
|
||
|
|
|
||
|
|
يتم تعيين النوع بواسطة جهاز فك الترميز بناءً على ما إذا كان يقوم بتجميع حسب الصفحة أم أنه يصدر قسمًا كاملاً للمستند. تكتسب `provenance/triples.py` معلمة اختيارية `section` — عندما تكون `true`، يتم تصنيف الكيان على أنه `tg:Section` بدلاً من `tg:Page`.
|
||
|
|
|
||
|
|
#### سلسلة التتبع الكاملة
|
||
|
|
|
||
|
|
```
|
||
|
|
ثلاثية KG
|
||
|
|
→ subgraph (تتبع الاستخراج)
|
||
|
|
→ chunk (char_offset، char_length داخل الصفحة)
|
||
|
|
→ page/section (page_number، char_offset، char_length داخل المستند، mime_type، element_types)
|
||
|
|
→ document (الملف الأصلي في أمين المكتبة)
|
||
|
|
```
|
||
|
|
|
||
|
|
كل رابط هو مجموعة من الثلاثيات في الرسم البياني المسمى `GRAPH_SOURCE`.
|
||
|
|
|
||
|
|
### التثبيت
|
||
|
|
|
||
|
|
تأكد من أن لديك Python 3.6+ مثبتًا.
|
||
|
|
|
||
|
|
```bash
|
||
|
|
pip install unstructured
|
||
|
|
```
|
||
|
|
|
||
|
|
### الاستخدام
|
||
|
|
|
||
|
|
```python
|
||
|
|
from unstructured.partition.auto import partition
|
||
|
|
|
||
|
|
# مثال على ملف PDF
|
||
|
|
pdf = partition(filename="path/to/your/document.pdf")
|
||
|
|
|
||
|
|
# مثال على ملف HTML
|
||
|
|
html = partition(filename="path/to/your/document.html")
|
||
|
|
```
|
||
|
|
|
||
|
|
سيقوم هذا بتقسيم المستند إلى عناصر مثل العناوين والنصوص والجداول والصور. يمكنك بعد ذلك معالجة هذه العناصر بشكل منفصل.
|
||
|
|
|
||
|
|
### الاعتبارات
|
||
|
|
|
||
|
|
- **الأداء:** قد يكون تقسيم المستندات الكبيرة أمرًا مكلفًا من الناحية الحسابية. ضع في اعتبارك استخدام التخزين المؤقت أو المعالجة المتوازية للمستندات الكبيرة جدًا.
|
||
|
|
- **الدقة:** دقة التقسيم تعتمد على تنسيق المستند. قد تتطلب بعض المستندات معالجة خاصة للحصول على أفضل النتائج.
|
||
|
|
|
||
|
|
### المساهمة
|
||
|
|
|
||
|
|
إذا كنت ترغب في المساهمة في `unstructured`، فيرجى إرسال طلب سحب. نحن نقبل المساهمات من جميع أنواع.
|
||
|
|
|
||
|
|
### الترخيص
|
||
|
|
|
||
|
|
`unstructured` مرخصة بموجب رخصة Apache 2.0.
|