Skip to content
دروس تعليميةمدة القراءة 5 دقيقة

بناء أول مهمة توسيم للتعرف على الكيانات المسماة

دليل خطوة بخطوة لبناء مهمة للتعرف على الكيانات المسماة في Potato، يشمل تكوين توسيم النطاقات وألوان التسميات والنطاقات المتداخلة واختصارات لوحة المفاتيح والتصدير إلى CoNLL.

Potato Team

يبني هذا الدليل التعليمي مهمة للتعرف على الكيانات المسماة (NER) في Potato بخمسة أنواع من الكيانات، واختصارات بمفاتيح الأرقام، وتعليمات للمُوسِّمين، وتصدير بصيغة CoNLL-2003 لتدريب النماذج. للاطلاع على خيارات تكوين النطاقات التي تقوم عليها المهمة، راجع وثائق توسيم النطاق.

ما يحصل عليه المُوسِّم

تعرض المهمة المكتملة على المُوسِّم جملة وفوقها صف من الأزرار المسماة. يسحب المُوسِّم المؤشر فوق عبارة لتحديدها، ثم يضغط مفتاح رقم أو ينقر زراً لتسميتها، وينقر نطاقاً مسمّى مرة أخرى لتغييره أو حذفه. يُخزَّن كل نطاق مع مواضع أحرفه، فيغذي ملف التوسيم نفسه تصديراً بصيغة CoNLL-2003 وحساباً للاتفاق على مستوى النطاقات معاً.

المتطلبات المسبقة

تحتاج إلى تثبيت Potato، وملف بيانات نصية، ومعرفة بصيغة YAML تكفي لتعديل ملف تكوين:

bash
pip install potato-annotation

الخطوة 1: مخطط النطاقات

توسيم النطاقات هو النوع span في Potato. تحتاج كل تسمية إلى اسم، والحقول الاختيارية المفيدة هي color الذي يميّز أنواع الكيانات بصرياً في النصوص الكثيفة، وkey_value الذي يربط اختصاراً من لوحة المفاتيح بالتسمية، وtooltip الذي يعرض تعريف التسمية عند تمرير المؤشر حتى لا يضطر المُوسِّمون إلى مغادرة الصفحة لمراجعة دليل الترميز.

خمسة أنواع تجعل المهمة قابلة للتعلم في جلسة واحدة. وبعد نحو ثمانية أنواع يبدأ المُوسِّمون بمراجعة الإرشادات عند كل عنصر، وهنا تنخفض الإنتاجية. يفعّل sequential_key_binding مفاتيح الأرقام، ويحدد key_value أي رقم يقابل أي تسمية بدلاً من ترك ذلك لترتيب القائمة. أنشئ الملف config.yaml:

yaml
annotation_task_name: "Named Entity Recognition"
task_dir: "."
 
data_files:
  - data/sentences.json
 
item_properties:
  id_key: id
  text_key: text
 
output_annotation_dir: "annotation_output/"
export_annotation_format: "jsonl"
 
annotation_schemes:
  - annotation_type: span
    name: entities
    description: "Highlight and label named entities in the text"
    sequential_key_binding: true
    labels:
      - name: PER
        tooltip: "Person names, including fictional characters"
        color: "#FF6B6B"
        key_value: "1"
      - name: ORG
        tooltip: "Companies, institutions, agencies"
        color: "#4ECDC4"
        key_value: "2"
      - name: LOC
        tooltip: "Places, including countries, cities, landmarks"
        color: "#45B7D1"
        key_value: "3"
      - name: DATE
        tooltip: "Dates, times, and temporal expressions"
        color: "#96CEB4"
        key_value: "4"
      - name: MISC
        tooltip: "Named entities that fit none of the above"
        color: "#FFEAA7"
        key_value: "5"
 
user_config:
  allow_all_users: true

الخطوة 2: ملف البيانات

يقرأ Potato كائن JSON واحداً في كل سطر، ويأخذ الحقول المسماة في item_properties. أنشئ الملف data/sentences.json:

json
{"id": "1", "text": "Apple Inc. announced that CEO Tim Cook will visit Paris next Tuesday."}
{"id": "2", "text": "The United Nations headquarters in New York hosted delegates from Japan."}
{"id": "3", "text": "Dr. Sarah Johnson published her research at Stanford University in March 2024."}

ثلاث جمل تكفي للتحقق من أن الواجهة تعمل. حمّل المدوّنة الفعلية بعد أن تصمد مجموعة التسميات في تجربة أولية.

الخطوة 3: تعليمات في متناول المُوسِّم

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

yaml
annotation_instructions: |
  ## Entity types
 
  - **PER** covers people, including fictional characters ("John Smith", "Dr. Johnson", "Batman")
  - **ORG** covers companies, institutions, and agencies ("Apple Inc.", "United Nations", "Stanford University")
  - **LOC** covers places, including countries, cities, and landmarks ("Paris", "New York", "Mount Everest")
  - **DATE** covers dates, times, and temporal expressions ("Tuesday", "March 2024", "next week")
  - **MISC** covers named entities that fit none of the above ("Nobel Prize", "iPhone", "COVID-19")
 
  ## Boundary rules
 
  1. Include titles (Dr., Mr.) with person names.
  2. For nested entities, annotate the largest meaningful span.
  3. Leave articles (the, a) outside the span.

تُعرض صيغة Markdown هنا، فيمكن نقل النص نفسه من دليل الترميز دون إعادة كتابته بصيغة HTML. اقصر هذه اللوحة على القواعد التي تحسم معظم العناصر، وضع دليل الترميز الكامل خلف annotation_codebook_url الذي يُفتح في علامة تبويب مستقلة.

تعرض واجهة النطاقات عندئذ التسميات على هيئة أزرار فوق النص:

واجهة توسيم نطاقات الكيانات المسماة مع أنواع كيانات مميزة بالألوانيميّز المُوسِّمون نطاقات النص ويعيّنون تسميات كيانات مثل PER وORG وLOC وDATE

الخطوة 4: تشغيل المهمة

شغّل الخادم باستخدام ملف التكوين من الخطوة 1:

bash
potato start config.yaml

افتح العنوان الذي يطبعه الخادم وسجّل الدخول. يؤدي المُوسِّم بعد ذلك أربع حركات لكل كيان:

  1. تحديد النص. انقر واسحب فوق العبارة.
  2. تعيين النوع. اضغط مفتاح الرقم أو انقر زر التسمية.
  3. تصحيح الخطأ. انقر نطاقاً موجوداً لتغيير تسميته أو حذفه.
  4. الإرسال. انتقل إلى العنصر التالي عند الانتهاء من الجملة.

الخطوة 5: محتوى ملف الإخراج

يُكتب كل عنصر مُوسَّم في annotation_output/ على هيئة كائن JSON واحد، يكون فيه اسم المخطط هو المفتاح مع إدخال واحد لكل نطاق:

json
{
  "id": "1",
  "text": "Apple Inc. announced that CEO Tim Cook will visit Paris next Tuesday.",
  "entities": [
    {"start": 0, "end": 10, "label": "ORG", "text": "Apple Inc."},
    {"start": 30, "end": 38, "label": "PER", "text": "Tim Cook"},
    {"start": 50, "end": 55, "label": "LOC", "text": "Paris"},
    {"start": 61, "end": 73, "label": "DATE", "text": "next Tuesday"}
  ]
}

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

الخطوة 6: التصدير إلى CoNLL-2003

تقرأ نماذج توسيم التسلسلات رموزاً مُعلَّمة لا مواضع أحرف، لذا يحوّل Potato النطاقات عند التصدير:

bash
python -m potato.export -c config.yaml -f conll_2003 -o ./conll_export/

الناتج رمز واحد في كل سطر مع وسمه، وأسطر فارغة بين الجمل. يكتب الخيار tag_scheme بصيغة BIO أو BIOES أو IOB، والقيمة الافتراضية BIO، لذا طابقه مع ما يتوقعه كود التدريب لديك قبل تشغيل التصدير.

إحكام الإرشادات

القواعد الغامضة تنتج قرارات متباينة على النطاق نفسه، لذا تستحق القواعد المراجعة ما دامت التجربة الأولية صغيرة. راجع الحالات الصعبة مع المُوسِّمين قبل أن يبدؤوا لا بعد ذلك، واحتفظ بقائمة مشتركة للحالات الحدية المحسومة كلما ظهرت. انخفاض الاتفاق بين المُوسِّمين هو الإشارة إلى أن قاعدة ما تحتاج إلى إحكام، واكتشاف ذلك على 50 عنصراً أقل كلفة من اكتشافه على 5,000.

الخطوات التالية