تحويل دفتر Jupyter إلى نص — مجانًا وبخصوصية

حوّل دفتر .ipynb إلى نصّ عادي في متصفّحك. يزيل غلاف JSON والصور المضمّنة وبيانات الخلايا الوصفية، فلا يبقى سوى الشيفرة والنص.

تحويل دفتر Jupyter إلى نص عادي: استخراج بلا سقالات

النص العادي هو الهدف الصحيح حين لا يكون للوجهة رأي في التنسيق. أنبوب من أوامر grep، أو مقارنة فروق، أو فهرس بحث، أو فحص انتحال، أو رسالة بريد نصية إلى زميل لا يريد مرفقات — لا شيء من هذه يستفيد من العلامات الخلفية وإشارات التجزئة، وبعضها يزداد سوءًا بترقيم يعني شيئًا لمحرّك عرض ولا يعني شيئًا للقارئ.

يأخذ هذا المحوّل ملف .ipynb ويعيد الكلمات والكود بلا أي ترميز مضاف. تُفصل الخلايا بأسطر فارغة. ويظهر الكود كودًا بلا أسيجة. وتظهر النتائج المطبوعة أسفل الخلية التي أنتجتها تحت وسم Output: بسيط. وكل ما تلفّه صيغة JSON حول ذلك المحتوى يُطرح جانبًا. والعمل كلّه يجري في تبويب المتصفح هذا.

حجّة الـ tokens

أكثر أسباب تسطيح الدفتر شيوعًا أن شيئًا في نهاية السلسلة يحاسبك بالـ token، وأن ملف .ipynb الخام طريقة باهظة لقول القليل جدًا. والنسبة تستحقّ أن تُذكر بالأرقام.

دفتر من ثلاثين خلية، نصفها ينتج رسمًا، يبلغ عادة ميغابايتين أو ثلاثة على القرص. أما النثر والكود داخله فقد يكونان ثمانية كيلوبايت. والباقي كلّه بيانات صور بترميز base64، ونسخ HTML مكرّرة لنتائج موجودة أصلًا نصًّا، ومحاسبة على مستوى الخلية. وإطعام النموذج الملفَّ الخام لا يكلّفك مئة ضعف ما ينبغي فحسب — بل يفشل عادة فشلًا تامًّا، لأن نافذة السياق تمتلئ بمحارف لا تحمل معلومة.

والأسوأ أن base64 يُقطَّع تقطيعًا رديئًا. النص الإنجليزي العادي يبلغ في المتوسط نحو أربعة محارف لكل token. أما سلسلة base64 العشوائية فلا تحوي متتاليات مكرّرة تضغطها مفردات المُقطِّع، فتهبط إلى ما يقارب token لكل محرفين. وأعدم أجزاء الملف نفعًا هو أيضًا أسوأها في نسبة الـ token إلى المحرف. والعدّاد أعلاه يعرض عدد tokens الناتج كي ترى ما ترسله فعلًا.

ما الذي ينجو من التسطيح

إزالة البنية ليست إزالة المعنى، وعلى هذا الحدّ بالضبط تنجح أدوات كهذه أو تفشل. وما يُحتفظ به:

  • محتوى خلايا markdown كما كُتب. تبقى محارف # و**، لأنها في خلية markdown إشارة المؤلف الوحيدة إلى التوكيد والتراتب. ونزعها يسطّح مستندًا كان نثرًا أصلًا إلى نص بلا تمييز.
  • الكود كما كُتب تمامًا. المسافات البادئة محفوظة والتعليقات سليمة. ومعنى Python يتوقف على المسافة البادئة، فهذا ليس اختيارًا جماليًا.
  • النتائج النصية. المخرجات المطبوعة والقيم المعادة ومعاينات إطارات البيانات في صورتها النصية.
  • أسماء الأخطاء ورسائلها وآثارها، بعد نزع رموز ألوان الطرفية.
  • الخلايا الخام، التي تحوي عادة LaTeX أو reStructuredText أراد المؤلف تركه على حاله.

وما يذهب: حمولات الصور والفيديو، ومرفقات PDF، وتوأم HTML لأي نتيجة موجودة نصًّا أيضًا، وعدّادات التنفيذ، ومعرّفات الخلايا، وكائنات البيانات الوصفية الفارغة، والخلايا الفارغة. فالخلية التي لا تحوي إلا مسافات بلا مخرجات ليست خلية يحتاج أحد إلى قراءتها.

مسألة النائب مكان الشكل

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

والافتراضي أن يبقى سطر قصير واحد يسمّي نوع الوسيط، والمفتاح أعلاه يوقفه. وهناك دقّة ذات صلة تستحقّ المعرفة: matplotlib يُخرج تمثيلًا نصيًّا بجوار الصورة، وهو دائمًا شيء مثل <Figure size 640x480 with 1 Axes>. وإن أُبقي بسذاجة حصلت على ذلك السطر ثم النائب، اثنان يقولان الشيء نفسه. فحين يُسقَط الشكل، يُكتم ذلك النص تحديدًا.

القطع من الوسط

بعض المخرجات طويل لأنه غنيّ بالمعلومة، وبعضه طويل لأن حلقة طبعت داخله. ولا تستطيع الأداة التمييز، فتضع سقفًا لكل مخرج وتقطع من الوسط، مبقيةً البداية والنهاية ومعلِّمةً عدد المحارف التي ذهبت.

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

استعمالات عملية لدفتر مسطَّح

تسهُل أشياء عدّة بمجرد زوال JSON. فمقارنة نسختين من دفتر نصًّا عاديًا تُظهر ما تغيّر في التحليل بدل أيّ عدّادات تنفيذ ازدادت — والسبب في وجود nbdime أصلًا أن git diff العادي على .ipynb غير مقروء. والبحث في مجلد من الدفاتر عن الدالة التي بنت رسمًا يصير grep عاديًا. وعدّ الكلمات لتقرير، أو إطعام دفتر لأداة تحويل نص إلى كلام، أو لصق المنهجية في مستند لا يعرض Markdown — كلها تعمل بلا تنظيف إضافي.

الخصوصية، ولماذا هي بنيوية هنا

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

المحلّل هنا JavaScript يعمل في هذا التبويب. يقرأ المتصفح ملفك ويحوّله في الذاكرة ويعرضه. لا رفع، فلا سياسة احتفاظ تثق بها ولا حذف تطلبه. وإن كنت تفضّل كتل كود مسيّجة وعناوين Markdown، فإن محوّل الدفاتر إلى Markdown يفعل ذلك بالضمانة نفسها.