DeepPavlov για προγραμματιστές: #1 Εργαλεία NLP και δημιουργία chatbot

Γεια σε όλους! Ανοίγουμε μια σειρά άρθρων που είναι αφιερωμένα στην επίλυση πρακτικών προβλημάτων που σχετίζονται με την επεξεργασία φυσικής γλώσσας (Natural Language Processing ή απλά NLP) και δημιουργούμε πράκτορες διαλόγου (chatbots) χρησιμοποιώντας μια βιβλιοθήκη ανοιχτού κώδικα DeepPavlov, το οποίο αναπτύσσεται από την ομάδα μας στο MIPT Laboratory of Neural Systems and Deep Learning. Ο κύριος στόχος της σειράς είναι να εισαγάγει τον DeepPavlov σε ένα ευρύ φάσμα προγραμματιστών και να δείξει πώς μπορείτε να λύσετε εφαρμοσμένα προβλήματα NLP χωρίς να έχετε βαθιά γνώση στη Μηχανική Μάθηση και διδακτορικό στα Μαθηματικά.

Οι εργασίες NLP περιλαμβάνουν τον προσδιορισμό του συναισθήματος του κειμένου, την ανάλυση επώνυμων οντοτήτων, τον προσδιορισμό του τι θέλει ο συνομιλητής από το bot σας: να παραγγείλετε πίτσα ή να λάβετε πληροφορίες για το ιστορικό, και πολλά άλλα. Μπορείτε να διαβάσετε περισσότερα σχετικά με τις εργασίες και τις μεθόδους NLP εδώ.

Σε αυτό το άρθρο, θα σας δείξουμε πώς να εκτελείτε έναν διακομιστή REST με προεκπαιδευμένα μοντέλα NLP, έτοιμα για χρήση χωρίς καμία πρόσθετη διαμόρφωση ή εκπαίδευση.

DeepPavlov για προγραμματιστές: #1 Εργαλεία NLP και δημιουργία chatbot

Εγκατάσταση του DeepPavlov

Εδώ και παρακάτω θα δοθούν οδηγίες για Linux. Για Windows, ανατρέξτε στο δικό μας τεκμηρίωση

  • Δημιουργήστε και ενεργοποιήστε ένα εικονικό περιβάλλον με την τρέχουσα υποστηριζόμενη έκδοση της Python:
    virtualelnv env -p python3.7
    source env/bin/activate
  • Εγκαταστήστε το DeepPavlov σε εικονικό περιβάλλον:
    pip install deeppavlov
    

Εκκίνηση διακομιστή REST με το μοντέλο DeepPavlov

Πριν ξεκινήσουμε για πρώτη φορά έναν διακομιστή με το μοντέλο DeepPavlov, θα είναι χρήσιμο να μιλήσουμε για ορισμένα χαρακτηριστικά της αρχιτεκτονικής της βιβλιοθήκης.

Οποιοδήποτε μοντέλο στο DP αποτελείται από:

  • Κώδικας Python;
  • Στοιχεία με δυνατότητα λήψης - σειριακά αποτελέσματα εκπαίδευσης σε συγκεκριμένα δεδομένα (ενσωματώσεις, βάρη νευρωνικών δικτύων κ.λπ.).
  • Ένα αρχείο διαμόρφωσης (εφεξής καλούμενο config), το οποίο περιέχει πληροφορίες σχετικά με τις κλάσεις που χρησιμοποιούνται από το μοντέλο, διευθύνσεις URL των ληφθέντων στοιχείων, εξαρτήσεις Python κ.λπ.

Θα σας πούμε περισσότερα για το τι βρίσκεται κάτω από την κουκούλα του DeepPavlov στα ακόλουθα άρθρα, προς το παρόν αρκεί να γνωρίζουμε ότι:

  • Οποιοδήποτε μοντέλο στο DeepPavlov προσδιορίζεται από το όνομα της διαμόρφωσής του.
  • Για να εκτελέσετε το μοντέλο, πρέπει να κάνετε λήψη των στοιχείων του από τους διακομιστές DeepPavlov.
  • Επίσης, για να εκτελέσετε το μοντέλο, πρέπει να εγκαταστήσετε τις βιβλιοθήκες Python που χρησιμοποιεί.

Το πρώτο μοντέλο που θα λανσάρουμε θα είναι το πολύγλωσσο 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

    Κατά τη λήψη, ο κατακερματισμός των στοιχείων που έχουν ήδη ληφθεί ελέγχεται έναντι των κατακερματισμών των στοιχείων που βρίσκονται στο διακομιστή. Εάν υπάρχει αντιστοιχία, η λήψη παραλείπεται και χρησιμοποιούνται υπάρχοντα αρχεία. Τα μεγέθη των στοιχείων που έχουν ληφθεί μπορεί να ποικίλλουν κατά μέσο όρο από 0.5 έως 8 Gb, σε ορισμένες περιπτώσεις φτάνοντας τα 20 Gb μετά την αποσυμπίεση.

  3. Εκκινούμε τον διακομιστή REST με το μοντέλο:
    python -m deeppavlov riseapi ner_ontonotes_bert_mult -p 5005
    

Ως αποτέλεσμα της εκτέλεσης αυτής της εντολής, ένας διακομιστής REST με ένα μοντέλο θα εκκινηθεί στη θύρα 5005 του υπολογιστή κεντρικού υπολογιστή (η προεπιλεγμένη θύρα είναι 5000).

Μετά την προετοιμασία του μοντέλου, μπορείτε να βρείτε το Swagger με τεκμηρίωση API και τη δυνατότητα δοκιμής στη διεύθυνση URL http://127.0.0.1:5005. Ας δοκιμάσουμε το μοντέλο στέλνοντάς το στο τελικό σημείο http://127.0.0.1:5005/model Αίτημα POST με το ακόλουθο περιεχόμενο 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, τα ορίσματα ονομάζονται, τα ονόματά τους είναι τα κλειδιά του εισερχόμενου λεξικού. Στις περισσότερες περιπτώσεις, το επιχείρημα είναι το κείμενο που πρέπει να επεξεργαστεί. Περισσότερες πληροφορίες σχετικά με ορίσματα και τιμές που επιστρέφονται από μοντέλα μπορείτε να βρείτε στην ενότητα ΜΟΝΤΕΛΑ της τεκμηρίωσης DeepPavlov

Στο παράδειγμα, μια λίστα με δύο συμβολοσειρές μεταβιβάστηκε στο όρισμα x, σε καθεμία από τις οποίες δόθηκε ξεχωριστή σήμανση. Στο DeepPavlov, όλα τα μοντέλα λαμβάνουν ως είσοδο μια λίστα (παρτίδα) τιμών που επεξεργάζονται ανεξάρτητα.

Ο όρος «παρτίδα» αναφέρεται στο πεδίο της μηχανικής μάθησης και αναφέρεται σε μια παρτίδα ανεξάρτητων τιμών εισόδου που υποβάλλονται σε επεξεργασία από έναν αλγόριθμο ή ένα νευρωνικό δίκτυο ταυτόχρονα. Αυτή η προσέγγιση σάς επιτρέπει να μειώσετε (συχνά σημαντικά) τον χρόνο που το μοντέλο επεξεργάζεται ένα στοιχείο μιας παρτίδας σε σύγκριση με την ίδια τιμή που μεταβιβάζεται στην είσοδο ξεχωριστά. Αλλά το αποτέλεσμα επεξεργασίας εκδίδεται μόνο αφού έχουν υποστεί επεξεργασία όλα τα στοιχεία. Επομένως, κατά τη δημιουργία μιας εισερχόμενης παρτίδας, θα είναι απαραίτητο να ληφθεί υπόψη η ταχύτητα του μοντέλου και ο απαιτούμενος χρόνος επεξεργασίας για κάθε ένα από τα επιμέρους στοιχεία του.

Εάν υπάρχουν πολλά ορίσματα στο μοντέλο DeepPavlov, καθένα από αυτά λαμβάνει τη δική του παρτίδα τιμών και στην έξοδο το μοντέλο παράγει πάντα μία παρτίδα απαντήσεων. Τα στοιχεία της εξερχόμενης παρτίδας είναι τα αποτελέσματα της επεξεργασίας των στοιχείων των εισερχόμενων παρτίδων με τον ίδιο δείκτη.

Στο παραπάνω παράδειγμα, το αποτέλεσμα του μοντέλου ήταν να χωρίσει κάθε συμβολοσειρά σε διακριτικά (λέξεις και σημεία στίξης) και να ταξινομήσει το διακριτικό σε σχέση με την ονομαζόμενη οντότητα (όνομα οργανισμού, νόμισμα) που αντιπροσωπεύει. Αυτή τη στιγμή το μοντέλο ner_ontonotes_bert_mult με δυνατότητα αναγνώρισης 18 τύπων ονομασμένων οντοτήτων, μπορείτε να βρείτε μια λεπτομερή περιγραφή εδώ.

Άλλα out-of-the-box μοντέλα από τον DeepPavlov

Εκτός από το NER, τα ακόλουθα out-of-the-box μοντέλα είναι διαθέσιμα στο 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_en

Αίτημα:

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

Το αποτέλεσμα:

[
  [1],
  [0]
]

Μπορείτε πάντα να βρείτε την τρέχουσα λίστα με όλα τα διαθέσιμα μοντέλα DeepPavlov εδώ.

Συμπέρασμα

Σε αυτό το άρθρο, εξοικειωθήκαμε με το DeepPavlov API και ορισμένες από τις δυνατότητες επεξεργασίας κειμένου της βιβλιοθήκης που παρέχονται εκτός συσκευασίας. Θα πρέπει να ληφθεί υπόψη ότι για οποιαδήποτε εργασία NLP, το καλύτερο αποτέλεσμα θα επιτευχθεί κατά την εκπαίδευση του μοντέλου σε ένα σύνολο δεδομένων που αντιστοιχεί στην θεματική περιοχή (τομέα) της εργασίας. Επιπλέον, ακόμη περισσότερα μοντέλα δεν μπορούν, καταρχήν, να εκπαιδευτούν για όλες τις καταστάσεις.

Στα επόμενα άρθρα θα δούμε πρόσθετες ρυθμίσεις της βιβλιοθήκης, εκκινώντας το DeepPavlov από το Docker και μετά θα προχωρήσουμε σε μοντέλα εκπαίδευσης. Και μην ξεχνάτε ότι ο DeepPavlov έχει форум – κάντε τις ερωτήσεις σας σχετικά με τη βιβλιοθήκη και τα μοντέλα. Σας ευχαριστώ για την προσοχή σας!

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο