DeepPavlov למפתחים: כלי NLP מספר 1 ויצירת צ'אטבוטים

שלום לכולם! אנו פותחים סדרת מאמרים המוקדשת לפתרון בעיות מעשיות הקשורות לעיבוד שפה טבעית (עיבוד שפה טבעית או פשוט NLP) ויצירת סוכני דיאלוג (צ'אטבוטים) באמצעות ספריית קוד פתוח דיפפלוב, אשר פותח על ידי הצוות שלנו במעבדת MIPT למערכות עצביות ולמידה עמוקה. המטרה העיקרית של הסדרה היא להציג את DeepPavlov למגוון רחב של מפתחים ולהראות כיצד ניתן לפתור בעיות NLP יישומיות מבלי שיהיה לך ידע מעמיק בלמידת מכונה ודוקטורט במתמטיקה.

משימות NLP כוללות קביעת הסנטימנט של הטקסט, ניתוח ישויות בשם, קביעה מה בן השיח רוצה מהבוט שלך: להזמין פיצה או לקבל מידע רקע ועוד הרבה יותר. אתה יכול לקרוא עוד על משימות ושיטות NLP כאן.

במאמר זה נראה לך כיצד להפעיל שרת REST עם דגמי NLP מאומנים מראש, מוכנים לשימוש ללא כל תצורה או הדרכה נוספת.

DeepPavlov למפתחים: כלי NLP מספר 1 ויצירת צ'אטבוטים

התקנה של DeepPavlov

כאן ולמטה יינתנו הוראות עבור Linux. עבור Windows לצפות שלנו תיעוד

  • צור והפעל סביבה וירטואלית עם הגרסה הנתמכת הנוכחית של Python:
    virtualelnv env -p python3.7
    source env/bin/activate
  • התקן את DeepPavlov בסביבה וירטואלית:
    pip install deeppavlov
    

השקת שרת REST עם דגם DeepPavlov

לפני שנפעיל שרת עם מודל DeepPavlov בפעם הראשונה, יהיה שימושי לדבר על כמה תכונות של ארכיטקטורת הספרייה.

כל דגם ב-DP מורכב מ:

  • קוד פייתון;
  • רכיבים להורדה - תוצאות אימון מסודרות על נתונים ספציפיים (הטבעות, משקלים של רשתות עצביות וכו');
  • קובץ קונפיגורציה (להלן תצורה), המכיל מידע על המחלקות המשמשות את המודל, כתובות URL של רכיבים שהורדו, תלות ב-Python וכו'.

נספר לכם יותר על מה שנמצא מתחת למכסה המנוע של DeepPavlov במאמרים הבאים, לעת עתה די לנו לדעת זאת:

  • כל דגם ב-DeepPavlov מזוהה לפי שם התצורה שלו;
  • כדי להפעיל את המודל, עליך להוריד את הרכיבים שלו משרתי DeepPavlov;
  • כמו כן, כדי להפעיל את המודל, עליך להתקין את ספריות Python שבהן הוא משתמש.

הדגם הראשון שנשיק יהיה Multilingual Named Entity Recognition (NER). המודל מסווג מילות טקסט לפי סוג הישויות הנקובות אליהן הן שייכות (שמות פרטיים, שמות גיאוגרפיים, שמות מטבעות ועוד). שם תצורה עבור הגרסה העדכנית ביותר של NER:

ner_ontonotes_bert_mult

אנו משיקים את שרת REST עם הדגם:

  1. אנו מתקינים את תלות המודל שצוינו בתצורה שלו בסביבה הווירטואלית הפעילה:
    python -m deeppavlov install ner_ontonotes_bert_mult
    
  2. הורד רכיבי דגם מסודרים משרתי DeepPavlov:
    python -m deeppavlov download ner_ontonotes_bert_mult
    

    הרכיבים המסודרים יורדו לספריית הבית של DeepPavlov, שנמצאת כברירת מחדל

    ~/.deeppavlov

    בעת ההורדה, ה-hash של רכיבים שכבר הורדו נבדק מול ה-hash של רכיבים הנמצאים בשרת. אם יש התאמה, ההורדה מדלגת ונעשה שימוש בקבצים קיימים. הגדלים של רכיבים שהורדו יכולים להשתנות בממוצע בין 0.5 ל-8 ג'יגה-בייט, במקרים מסוימים להגיע ל-20 ג'יגה-בייט לאחר פתיחת הדוכס.

  3. אנו משיקים את שרת REST עם הדגם:
    python -m deeppavlov riseapi ner_ontonotes_bert_mult -p 5005
    

כתוצאה מביצוע פקודה זו, יופעל שרת REST עם דגם ביציאה 5005 של המחשב המארח (יציאת ברירת המחדל היא 5000).

לאחר אתחול המודל, ניתן למצוא את Swagger עם תיעוד API ויכולת בדיקה בכתובת האתר http://127.0.0.1:5005. בואו נבדוק את המודל על ידי שליחתו לנקודת הקצה http://127.0.0.1:5005/model בקשת פוסט עם תוכן ה-JSON הבא:

{
  "x": [
    "В МФТИ можно добраться на электричке с Савёловского Вокзала.",
    "В юго-западной Руси стог жита оценен в 15 гривен"
  ]
}

בתגובה עלינו לקבל את ה-JSON הבא:

[
  [
    ["В", "МФТИ", "можно", "добраться", "на", "электричке", "с", "Савёловского", "Вокзала", "."],
    ["O", "B-FAC", "O", "O", "O", "O", "O", "B-FAC", "I-FAC", "O"]
  ],
  [
    ["В", "юго", "-", "западной", "Руси", "стог", "жита", "оценен", "в", "15", "гривен"],
    ["O", "B-LOC", "I-LOC", "I-LOC", "I-LOC", "O", "O", "O", "O", "B-MONEY", "I-MONEY"]
  ]
]

בעזרת דוגמאות אלו, ננתח את ה- DeepPavlov REST API.

API DeepPavlov

לכל מודל DeepPavlov יש לפחות ארגומנט קלט אחד. ב-REST API, ארגומנטים מקבלים שמות, שמותיהם הם המפתחות של המילון הנכנס. ברוב המקרים, הטיעון הוא הטקסט שצריך לעבד. מידע נוסף על טיעונים וערכים שהוחזרו על ידי מודלים ניתן למצוא בסעיף MODELS של התיעוד דיפפלוב

בדוגמה, רשימה של שתי מחרוזות הועברה לארגומנט x, שכל אחת מהן קיבלה סימון נפרד. ב-DeepPavlov, כל הדגמים מקבלים כקלט רשימה (אצווה) של ערכים המעובדים באופן עצמאי.

המונח "אצווה" מתייחס לתחום למידת מכונה ומתייחס לקבוצה של ערכי קלט עצמאיים המעובדים על ידי אלגוריתם או רשת עצבית בו זמנית. גישה זו מאפשרת לך לצמצם (לעיתים קרובות באופן משמעותי) את הזמן שבו המודל מעבד אלמנט אחד של אצווה בהשוואה לאותו ערך המועבר לקלט בנפרד. אבל תוצאת העיבוד מונפקת רק לאחר עיבוד כל הרכיבים. לכן, בעת יצירת אצווה נכנסת, יהיה צורך לקחת בחשבון את מהירות המודל ואת זמן העיבוד הנדרש עבור כל אחד מהרכיבים הנפרדים שלו.

אם יש כמה טיעונים למודל DeepPavlov, כל אחד מהם מקבל אצווה של ערכים משלו, ובפלט המודל תמיד מייצר אצווה אחת של תשובות. המרכיבים של האצווה היוצאת הם תוצאות של עיבוד הרכיבים של האצווה הנכנסות עם אותו אינדקס.

בדוגמה שלעיל, התוצאה של המודל הייתה פירוק כל מחרוזת לאסימונים (מילים וסימני פיסוק) ולסווג את האסימון ביחס לישות המכונה (שם ארגון, מטבע) שהוא מייצג. כרגע הדגם ner_ontonotes_bert_mult המסוגל לזהות 18 סוגים של ישויות בשם, ניתן למצוא תיאור מפורט כאן.

דגמים נוספים מחוץ לקופסה של DeepPavlov

בנוסף ל-NER, הדגמים הבאים מהקופסה זמינים ב-DeepPavlov בזמן כתיבת שורות אלה:

תשובה לשאלות טקסט

ענה על השאלה לטקסט עם קטע מטקסט זה. תצורת דגם: squad_ru_bert_infer

דוגמה לבקש:

{
  "context_raw": [
    "DeepPavlov разрабатывается лабораторией МФТИ.",
    "В юго-западной Руси стог жита оценен в 15 гривен."
  ],
  "question_raw": [
    "Кем разрабатывается DeepPavlov?",
    "Сколько стоил стог жита на Руси?"
  ]
}

תוצאה:

[
  ["лабораторией МФТИ", 27, 31042.484375],
  ["15 гривен", 39, 1049.598876953125]
]

זיהוי עלבון

איתור נוכחות של עלבון למי שאליו מופנה הטקסט (בזמן כתיבת שורות אלו - רק לאנגלית). תצורת דגם: insults_kaggle_conv_bert

דוגמה לבקש:


{
  "x": [
    "Money talks, bullshit walks.",
    "You are not the brightest one."
  ]
}

תוצאה:

[
  ["Not Insult"],
  ["Insult"]
]

ניתוח הסנטימנט

סיווג של סנטימנט טקסט (חיובי, ניטרלי, שלילי). תצורת דגם: rusentiment_elmo_twitter_cnn

דוגמה לבקש:

{
  "x": [
    "Мне нравится библиотека DeepPavlov.",
    "Я слышал о библиотеке DeepPavlov.",
    "Меня бесят тролли и анонимусы."
  ]
}

תוצאה:

[
  ["positive"],
  ["neutral"],
  ["negative"]
]

זיהוי פרפראזה

קביעה האם לשני טקסטים שונים יש אותה משמעות. תצורת דגם: stand_paraphraser_he

בַּקָשָׁה:

{
  "text_a": [
    "Город погружается в сон, просыпается Мафия.",
    "Президент США пригрозил расторжением договора с Германией."
  ],
  "text_b": [
    "Наступает ночь, все жители города пошли спать, а преступники проснулись.",
    "Германия не собирается поддаваться угрозам со стороны США."
  ]
}

תוצאה:

[
  [1],
  [0]
]

תמיד ניתן למצוא את הרשימה הנוכחית של כל דגמי DeepPavlov שיצאו מהקופסה כאן.

מסקנה

במאמר זה הכרנו את ה-API של DeepPavlov וחלק מיכולות עיבוד הטקסט של הספרייה שסופקו מהקופסה. יש לזכור כי עבור כל משימת NLP, התוצאה הטובה ביותר תושג כאשר אימון המודל על מערך נתונים המתאים לתחום הנושא (התחום) של המשימה. בנוסף, לא ניתן, עקרונית, להכשיר אפילו יותר דגמים לכל המצבים.

במאמרים הבאים נבחן הגדרות נוספות של הספרייה, השקת DeepPavlov מ- Docker, ולאחר מכן נעבור למודלים של אימון. ואל תשכח שיש ל-DeepPavlov форум - שאל את שאלותיך לגבי הספרייה והדגמים. תודה לך על תשומת הלב!

מקור: www.habr.com

קנה אירוח אמין לאתרים עם הגנת DDoS, שרתי VPS VDS 🔥 קנה אחסון אתרים אמין עם הגנת DDoS, שרתי VPS VDS | ProHoster