تخطَّ إلى المحتوى
kazma.
البحث في كاظمه والتوثيق
EN

كيف تتعامل كاظمه مع العربية

كيف تتعامل كاظمه مع العربية

Section titled “كيف تتعامل كاظمه مع العربية”

يستطيع نموذج اللغة أن يقرأ العربية ويكتبها. لكن ذلك لا يجعل التطبيق يعمل بالعربية. يجب أن يجري النص في الاتجاه الصحيح، وأن تتصل الحروف، وأن يطابق البحث الكلمات المكتوبة بالحركات ودونها، وأن تعود الصفحة الممسوحة بأرقامها مرتبة. تقوم كاظمه بهذا العمل في شيفرتها الخاصة، ومعظمه في وحدة واحدة، kazma_core/documents/arabic.py، فيتبع كل جزء من المنتج القواعد نفسها. تمرّ هذه الصفحة عليه جزءًا جزءًا، مع الملف والاختبار لكل منها. ولما يراه المستخدم (الواجهة العربية، وتحية المجلس، وملاحظات اللهجة)، راجع الميزات العربية والثقافية.

1. في أي اتجاه تجري الفقرة

Section titled “1. في أي اتجاه تجري الفقرة”

المشكلة. الصفحة ذات الاتجاه الواحد سهلة. أما النص الحقيقي فيخلط اللغات: رد عربي يقتبس رسالة خطأ إنجليزية، وتقرير إنجليزي فيه اسم عربي، ومستند ثلثه عربي. قرّرت المحاولة الأولى الاتجاه مرة واحدة لكل مستند بعدّ الحروف. فخرج أرشيف ثنائي اللغة نسبة العربية فيه 35% من اليسار إلى اليمين كله، وكل منشور عربي فيه محاذى في الاتجاه الخاطئ.

ما تفعله كاظمه. يُقرَّر الاتجاه لكل فقرة، من فئة bidi في يونيكود لحروفها (R وAL من اليمين إلى اليسار). ولا يستخدم أبدًا نطاقًا مكتوبًا باليد لـ«الحروف العربية»، لأن تلك النطاقات تفوّت العبرية والسريانية والعربية الموسعة-ب، وتعدّ الحركات والأرقام العربية الهندية حروفًا. والفقرة التي لا حروف فيها أصلًا، كتاريخ أو فاصل، تأخذ اتجاه المستند من حولها. وتستخدم واجهة الويب القاعدة نفسها: في أي من الواجهتين، تجري الفقرات الإنجليزية من اليسار إلى اليمين والعربية من اليمين إلى اليسار، ويأتي اتجاه الجدول من لغة الجدول نفسه.

أين. kazma_core/documents/arabic.py (direction_of، is_rtl_dominant)، وkazma_ui/static/js/bidi.js (blockDir، للمحادثة).

الإثبات. tests/test_arabic_single_home.py (لا يجوز لوحدة أخرى أن تشكّل الحروف أو تحكم على الاتجاه)، وtests/js/test_block_direction.js، وtests/test_text_follows_its_language.py (أدوار حقيقية في الواجهتين، مقارنة سطرًا سطرًا).

2. رسم العربية رسمًا صحيحًا في المستندات

Section titled “2. رسم العربية رسمًا صحيحًا في المستندات”

المشكلة. تتغير أشكال الحروف العربية بحسب موضعها وتتصل بجاراتها، ويجب وضع السطر الذي يجري من اليمين إلى اليسار في ترتيبه المرئي قبل أن يرسمه محرك PDF. فعلت كاظمه ذلك أولًا لكل قطعة من التنسيق (كلمة عريضة، أو رابط). فخرجت كل قطعة معكوسة وحدها وبالترتيب الخاطئ، فظهرت الجملة مقلوبة من الداخل وضاعت مسافاتها.

ما تفعله كاظمه.

  • التشكيل مرة واحدة لكل فقرة. يحلّ shape_spans مستويات bidi على الفقرة كلها، ويقسم القطع المنسّقة عند حدود المستويات، ويعيد ترتيبها، ثم يصل الحروف بعد ذلك فقط.
  • اختيار الخطوط بما تغطيه. لا يُستخدم خط للعربية إلا إن كان يحتوي أشكال الحروف فعلًا. وإلا عرض ملف PDF مربعات فارغة دون أي خطأ. تشحن كاظمه خط IBM Plex Sans Arabic (خط الواجهة نفسه، برخصته المفتوحة) للغتين معًا، مع Amiri احتياطيًا. وتضمّن Plex في ملفات Word، فيعرض الحاسوب الذي لا يملكه المستند كما أُريد له.
  • للخط العريض العربي إعداده الخاص في Word. يرسم Word العريض والمائل العربيين من علامتين منفصلتين (w:bCs وw:iCs). تضبط كاظمه الاثنتين كلما ضبطت اللاتينيتين، وإلا بقي العنوان العربي عاديًا بجانب عنوان إنجليزي عريض.
  • تعليم المقاطع اللاتينية داخل الأسطر العربية. في فقرة تجري من اليمين إلى اليسار، تُحاط قطعة من النص اللاتيني مثل “50 °C” أو “15:15 UTC” بعلامات اتجاه، وإلا رُسمت “C° 50”. ويُترك مقطع الأرقام وحده كما هو، لأن التاريخ المكتوب بعد العربية يُقرأ من اليمين إلى اليسار وفق العُرف العربي، وقارئا PDF والتعرف الضوئي يتوقعانه كذلك.

أين. kazma_core/documents/arabic.py (shape_spans، isolate_ltr_runs)، وkazma_core/documents/fonts.py. وفي عرض المستندات التصميم الكامل.

الإثبات. tests/test_document_layout.py، الذي يقيس ملف PDF معروضًا بدل قراءة الشيفرة المصدرية. وtests/test_document_archive_layout.py الذي يفحص النص المقروء من ملف PDF الصادر عن LibreOffice، مع إزالة العلامات ضابطًا سلبيًا.

المشكلة. يمكن كتابة الكلمة العربية نفسها بحركاتها أو دونها، وبأشكال مختلفة للألف، أو بتاء مربوطة في آخرها مكتوبة هاءً. ويعامل البحث النصي الكامل في SQLite الحركات فواصل بين الكلمات، فكانت الكلمة المشكولة تُفهرس صفًّا من الحروف المنفردة، ولا تطابق أبدًا.

ما تفعله كاظمه. يزيل fold_for_search الحركات ويوحّد أشكال الحروف. ويعمل على الجانبين، حين يُفهرس النص وحين يُبحث عن السؤال. والطيّ على جانب واحد فقط أسوأ من عدمه. وللذاكرة، يختار query_terms الكلمات ذات المحتوى من السؤال. ويعرف كلمات التوقف الإنجليزية والخليجية والفصحى، ويعالج أداة التعريف مع السوابق التي تتصل بها (و، ف، ب، ك، ل)، ويعالج الجموع الخفيفة، ولا يطابق إلا الكلمات الكاملة.

أين. kazma_core/documents/arabic.py (fold_for_search)، وkazma_core/memory/query_terms.py، وفهرس البحث في مكتبة المعرفة.

الإثبات. tests/test_arabic_text.py، وtests/test_memory_relevance.py، وأسئلة معيار الذاكرة العربية والمختلطة اللغة.

4. ذاكرة تفهم الطلبات العربية

Section titled “4. ذاكرة تفهم الطلبات العربية”

المشكلة. كانت مرحلة قراءة الحقائق السريعة في كاظمه تبحث عن أنماط إنجليزية فقط. فعلى معيار الاستخراج لم تجد أيًّا من الحقائق في الرسائل العربية (الاستدعاء 0.00). ولم تكن «تذكّر هذا» تعمل إلا بالإنجليزية. ولأن الرسالة كلها تحت حد معيّن للطول كانت تُعامل حديثًا عابرًا، كانت «تذكر هذا» تُرمى لأنها أقصر من اللازم.

ما تفعله كاظمه.

  • طلبات التذكّر باللغتين. تتعرف على الصيغ العربية (تذكر، لا تنسى، احفظ، سجل عندك، خلك فاكر) كلماتٍ كاملة، مع و أو ف اختيارية في أولها. و«تذكرة» (البطاقة) ليست «تذكر». ويعلّم الطلب الدور على أنه جدير بالحفظ.
  • حقائق عربية من القواعد النحوية. تقرأ المرحلة السريعة الجمل العربية بقواعد. فالنفي، والأمر («استخدم البحث»)، والسؤال، والقول عن شخص آخر («أخوي ساكن في دبي») لا يحفظ أي منها شيئًا عن المستخدم. ويجب أن ينتهي اسم المكان حيث يُقرأ.
  • الحديث العابر بالكلمات لا بالطول. التحية أو الشكر أو «تمام» حديث عابر فقط حين تكون الرسالة كلها كذلك، ومع رد قصير فقط. والسؤال القصير عن شيء ما يبقى ذكرى.

أين. kazma_core/memory/remember_request.py، وkazma_core/memory/arabic_facts.py، وkazma_core/memory/episode_text.py (is_small_talk).

الإثبات. tests/test_memory_arabic_facts.py (جمل ليست في المعيار، في الاتجاهين، مع تعطيل المرحلة ضابطًا سلبيًا)، وtests/test_memory_remember_and_small_talk.py.

5. قراءة المستندات والصفحات الممسوحة العربية

Section titled “5. قراءة المستندات والصفحات الممسوحة العربية”

المشكلة. تعيد أدوات PDF الأسطر العربية معكوسة حرفًا حرفًا. وهذا يقلب رقمًا مرسومًا من اليسار إلى اليمين داخل سطر عربي («١٢٣٤٥٦٧» تُقرأ «٧٦٥٤٣٢١»)، ويبدّل حروف الرموز المتصلة («في» تُقرأ «يف»). وفي الصفحات الممسوحة، لا يستطيع Tesseract قراءة الأرقام العربية الهندية أصلًا: نموذجه العربي يحتوي واحدًا من العشرة.

ما تفعله كاظمه.

  • يُعاد قراءة نص PDF رمزًا رمزًا. لا تُعكس إلا المقاطع التي تجري من اليمين إلى اليسار، رموزًا كاملة. ويحتفظ الرقم بالقراءة التي سترسمها خوارزمية bidi نفسها. وتُطوى أشكال العرض إلى الحروف الأساسية، فيُقرأ ملف PDF قديم خزّن الأشكال المرسومة نصًّا عاديًا.
  • محرك تعرّف ضوئي عصبي للعربية. تعمل نماذج الكشف والتعرّف على ONNX Runtime داخل عامل المستندات. وحيث تختلف، يُصوَّت على قراءات عدة أدوات تعرّف كلمةً كلمة. وتُستعاد الفواصل العشرية وفواصل الآلاف (٫ و٬) بقواعد كتابة الأرقام، إذ لا يكتبها أي قارئ بنفسه. وتُقرأ الجداول المسطّرة في الصفحة الممسوحة خلية خلية.
  • مَقيس لا مفترض. مجموعة مُرقَّمة الإصدارات من مستندات إنجليزية وعربية وثنائية اللغة، منها صفحات ممسوحة، تُحلَّل بالمحركات الحقيقية. ولدرجات الكلمات والأرقام والترتيب والجداول وعلامات الترقيم حدود دنيا لكل محرك لا تنخفض. وكل حالات التعرف الضوئي في المجموعة مؤهَّلة مع المحرك العصبي. وهي معلّمة جزئية لأنه لم يُقَس حتى الآن إلا مسح حقيقي واحد.

أين. kazma_core/documents/parsers/pdf_rtl.py، وkazma_core/documents/arabic.py (to_logical، وnumber_in_logical_order، وarabic_number_separators)، وkazma_core/documents/ocr/neural.py، وkazma_core/documents/fidelity.py.

الإثبات. tests/test_document_pdf_rtl.py (رحلات ذهاب وإياب تخطّطها python-bidi نفسها)، وtests/test_document_number_order.py، وtests/test_document_ocr_reading_rules.py، وtests/test_document_fidelity.py.

6. واجهة عربية، لا إنجليزية مترجمة

Section titled “6. واجهة عربية، لا إنجليزية مترجمة”

ما تفعله كاظمه. تأتي كل كلمة في الواجهة من فهرس واحد له مدخل إنجليزي وآخر عربي، ويُفشل اختبار البناء إن بقيت كلمة إنجليزية في قالب أو نص برمجي. وتستخدم الأعداد صيغ جمع حقيقية: للعربية ست (الصفر، والمفرد، والمثنى، والقلة، والكثرة، وغيرها)، فلا تعرض الواجهة أبدًا «1 أدوات». وتُكتب الأرقام والتواريخ بالأرقام اللاتينية في الواجهة العربية، كما في سائر المنتج. وما ليس نصًّا للواجهة (رسائلك، وردود النموذج، والأسماء، ومحتويات الملفات) يُعلَّم فلا يترجمه المتصفح أبدًا، ويحتفظ باتجاهه الخاص.

أين. kazma_ui/i18n/ (t_plural)، وkazma_ui/static/js/locale_format.js، وkazma_ui/static/js/bidi.js.

الإثبات. tests/test_kazma_count.py (لكل مفتاح عدّ كل صيغه)، وtests/test_count_labels.py، وtests/test_templates_have_no_english.py، وtests/test_scripts_have_no_english.py، وtests/e2e/test_pages_read_in_arabic.py (كل صفحة معروضة بالعربية).

تأتي أجوبة كاظمه من النموذج الذي تختاره. ولا تضيف نموذجًا للهجات، وجودة الرد العربي هي جودة ذلك النموذج. تُبقي كاظمه الرد بلغتك (قفل لغة، لا يمنع أبدًا اقتباس مسودة بلغة أخرى) وتتولى كل ما حول الرد. وتحية المجلس رد سريع على تحية أو وداع، وليست محرك لهجات (الميزات العربية والثقافية).