جولة سريعة في نظام Apache NlpCraft

في هذا المقال ، أود أن أطلع القراء على أحد مشاريع مجتمع Apache Software Foundation - NlpCraft . NlpCraft هي مكتبة مفتوحة المصدر مصممة لدمج واجهة اللغة في التطبيقات المخصصة.



الهدف من المشروع هو تبسيط الوصول إلى إمكانات NLP (معالجة اللغة الطبيعية) لمطوري التطبيقات. الفكرة الرئيسية للنظام هي تحقيق التوازن بين سهولة الدخول في مشاكل البرمجة اللغوية العصبية ودعم مجموعة واسعة من قدرات المكتبات الصناعية. الهدف من المشروع لا هوادة فيه - البساطة دون تبسيط.



في وقت الإصدار 0.7.1 ، كان المشروع في مرحلة الحضانة لمجتمع Apache وهو متاح على https://nlpcraft.apache.org .



ميزات النظام الرئيسية



  • النمذجة الدلالية. آلية مضمنة بسيطة للتعرف على عناصر النموذج في نص الاستعلام ، والتي لا تتطلب التعلم الآلي.
  • Java API التي تتيح لك تطوير النماذج بأي لغة متوافقة مع Java - Java و Scala و Kotlin و Groovy وما إلى ذلك.
  • أسلوب Model-as-a-Code الذي يسمح لك بإنشاء النماذج وتحريرها باستخدام الأدوات التي يعرفها المطورون.
  • القدرة على التفاعل مع جميع أنواع الأجهزة التي تحتوي على واجهات برمجة تطبيقات - روبوتات الدردشة ، والمساعدات الصوتية ، والأجهزة المنزلية الذكية ، وما إلى ذلك ، بالإضافة إلى استخدام أي مصادر بيانات مخصصة ، من قواعد البيانات إلى أنظمة SaaS ، المغلقة أو المفتوحة.
  • مجموعة متقدمة من أدوات البرمجة اللغوية العصبية ، بما في ذلك نظام للعمل مع الذاكرة قصيرة المدى وقوالب الحوار وما إلى ذلك.
  • التكامل مع العديد من موفري مكونات NER ( Apache OpenNlp و Stanford NLP و Google Natural Language API و Spacy )


القيود - الإصدار الحالي 0.7.1 يدعم اللغة الإنجليزية فقط.



دعونا نتفق على بعض المصطلحات والمفاهيم المستخدمة في العرض الإضافي.



المصطلح



  • الكيان المحدد هو كيان مسمى. بكلمات بسيطة ، إنه كائن أو مفهوم معترف به في النص. التعريف الكامل هنا . يمكن أن تكون الكيانات عامة مثل التواريخ والبلدان والمدن أو نموذجًا محددًا.
  • مكونات NER (التعرف على الكيان المحدد) - مكونات البرامج المسؤولة عن التعرف على الكيانات في النص.
  • Intent, . — , . — , .




  • Data model

    NER , .. Json Yaml .

  • Data probe

    . , , .. Data Probe, Data Probe .



  • يوفر خادم REST واجهة برمجة تطبيقات REST للتطبيقات المخصصة



صورة



مثال باستخدام NlpCraft



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



ينبغي لنا:



  • حدد الكيانات المسماة التي نحتاجها في عملنا وكيف يمكننا العثور على نصوصها.
  • أنشئ أهدافًا لمجموعات مختلفة من الكيانات ، أي أنواع مختلفة من الأوامر.


لتطوير مثال ، نحتاج إلى ثلاث كيانات - علامتي عمل ، "تشغيل" و "إيقاف" ، ومكان للعمل.



الآن يجب علينا تصميم النموذج ، أي تحديد آلية العثور على هذه العناصر في النص. بشكل افتراضي ، يستخدم NlpCraft محرك بحث قائمة المرادفات للكيانات غير القياسية. لجعل مهمة تجميع قائمة المرادفات بسيطة ومريحة قدر الإمكان ، توفر NlpCraft مجموعة من الأدوات ، بما في ذلك وحدات الماكرو و Synonym DSL.



يوجد أدناه تكوين lightwitch_model.yaml الثابت ، والذي يتضمن تعريف كياناتنا الثلاثة ونية واحدة.



id: "nlpcraft.lightswitch.ex"
name: "Light Switch Example Model"
version: "1.0"
description: "NLI-powered light switch example model."
macros:
  - name: "<ACTION>"
    macro: "{turn|switch|dial|control|let|set|get|put}"
  - name: "<ENTIRE_OPT>"
    macro: "{entire|full|whole|total|*}"
  - name: "<LIGHT>"
    macro: "{all|*} {it|them|light|illumination|lamp|lamplight}"
enabledBuiltInTokens: [] # This example doesn't use any built-in tokens.
elements:
  - id: "ls:loc"
    description: "Location of lights."
    synonyms:
      - "<ENTIRE_OPT> {upstairs|downstairs|*} {kitchen|library|closet|garage|office|playroom|{dinning|laundry|play} room}"
      - "<ENTIRE_OPT> {upstairs|downstairs|*} {master|kid|children|child|guest|*} {bedroom|bathroom|washroom|storage} {closet|*}"
      - "<ENTIRE_OPT> {house|home|building|{1st|first} floor|{2nd|second} floor}"

  - id: "ls:on"
    groups:
      - "act"
    description: "Light switch ON action."
    synonyms:
      - "<ACTION> {on|up|*} <LIGHT> {on|up|*}"
      - "<LIGHT> {on|up}"

  - id: "ls:off"
    groups:
      - "act"
    description: "Light switch OFF action."
    synonyms:
      - "<ACTION> <LIGHT> {off|out}"
      - "{<ACTION>|shut|kill|stop|eliminate} {off|out} <LIGHT>"
      - "no <LIGHT>"
intents:
  - "intent=ls term(act)={groups @@ 'act'} term(loc)={id == 'ls:loc'}*"


باختصار عن المحتوى:



  • , “ls:loc”, : “ls:on” “ls:off”, “act” .
  • Synonym DSL . , , “ls:on” “turn”, “turn it”, “turn all it” .., “ls:loc” — “light”, “entire light”, “entire light upstairs” .. 7700 .
  • يتم إجراء البحث عن طريق المرادفات في النص مع الأخذ في الاعتبار الأشكال الأولية للكلمات ( lemma و stemma ) ، ووجود كلمات التوقف ، والتباديل المحتمل للكلمات في مجموعات الكلمات ، إلخ.
  • يحدد النموذج نية واحدة تسمى " ls ". شرط بدء النية - يجب أن يحتوي الطلب على كيان واحد من مجموعة " الفعل " وقد يحتوي على كيانات متعددة من النوع " ls: loc ". يمكن العثور على بنية Intents DSL الكاملة هنا .


على الرغم من بساطته ، فإن هذا النوع من النمذجة قوي ومرن.



  • , . .
  • , .
  • NER . — , .
  • – , , NER , .


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



كيف تعمل المباراة:



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


تمت كتابة دالة intent في المثال التالي " ls " بلغة Java ، ولكن يمكن أن تكون أي لغة برمجة أخرى متوافقة مع Java.



public class LightSwitchModel extends NCModelFileAdapter {
  public LightSwitchModel() throws NCException {
    super("lightswitch_model.yaml");
  }

  @NCIntentRef("ls")
  NCResult onMatch(
    @NCIntentTerm("act") NCToken actTok,
    @NCIntentTerm("loc") List<NCToken> locToks
  ) {
    String status = actTok.getId().equals("ls:on") ? "on" : "off";
    String locations =
      locToks.isEmpty() ?
        "entire house" :
        locToks.stream().
          map(p -> p.meta("nlpcraft:nlp:origtext").toString()).
          collect(Collectors.joining(", "));
 
 
    // Add HomeKit, Arduino or other integration here.
 
    // By default - just return a descriptive action string.
    return NCResult.text(
      String.format("Lights are [%s] in [%s].", status, locations)
    );
  }
}


ماذا يحدث في جسم الوظيفة:



  • تكوين ثابت حددنا أعلاه باستخدام lightswitch_model.yaml ملف للقراءة باستخدام NCModelFileAdapter.
  • كوسيطات إدخال ، تستقبل الدالة مجموعة من البيانات من الكيانات التي تطابق قالب الهدف الخاص بها.
  • يحدد عنصر المجموعة " الفعل " الإجراء المحدد الذي يتعين القيام به.
  • من قائمة " ls: loc " ، يتم استرداد المعلومات حول المكان أو الأماكن المحددة التي يجب تنفيذ الإجراء فيها.


البيانات المستلمة كافية للوصول إلى واجهة برمجة التطبيقات للنظام الذي نديره.



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



أنظمة مماثلة



أقرب وأشهر "النظير" Amazon Alexa و Google DialogFlow لديهما عدد من الاختلافات المهمة عن هذا النظام. من ناحية أخرى ، فهي أسهل إلى حد ما في الاستخدام ، لأنها لا تتطلب حتى IDE لأمثلةهم الأولية. من ناحية أخرى ، فإن قدراتهم محدودة للغاية وهي أقل مرونة من نواح كثيرة.



خاتمة



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



آمل أنه بفضل هذا المنشور ، تمكنت من الحصول على فهم أول ، وإن كان سطحيًا ، لنظام Apache NlpCraft.



All Articles