DeepPavlov dành cho nhà phát triển: Công cụ NLP số 1 và tạo chatbot

Chào mọi người! Chúng tôi đang mở loạt bài viết chuyên giải quyết các vấn đề thực tế liên quan đến xử lý ngôn ngữ tự nhiên (Xử lý ngôn ngữ tự nhiên hay đơn giản là NLP) và tạo tác nhân hội thoại (chatbot) bằng thư viện nguồn mở sâuPavlov, đang được phát triển bởi nhóm của chúng tôi tại Phòng thí nghiệm Hệ thống thần kinh và học tập sâu MIPT. Mục tiêu chính của loạt bài này là giới thiệu DeepPavlov cho nhiều nhà phát triển và chỉ ra cách bạn có thể giải quyết các vấn đề NLP ứng dụng mà không cần có kiến ​​thức sâu về Machine Learning và Tiến sĩ Toán học.

Các nhiệm vụ NLP bao gồm xác định cảm xúc của văn bản, phân tích cú pháp các thực thể được đặt tên, xác định xem người đối thoại muốn gì từ bot của bạn: đặt pizza hoặc nhận thông tin cơ bản, v.v. Bạn có thể đọc thêm về các nhiệm vụ và phương pháp NLP đây.

Trong bài viết này, chúng tôi sẽ hướng dẫn bạn cách chạy máy chủ REST với các mô hình NLP được đào tạo trước, sẵn sàng sử dụng mà không cần bất kỳ cấu hình hoặc đào tạo bổ sung nào.

DeepPavlov dành cho nhà phát triển: Công cụ NLP số 1 và tạo chatbot

Cài đặt DeepPavlov

Ở đây và bên dưới sẽ có hướng dẫn về Linux. Đối với Windows, hãy xem tài liệu

  • Tạo và kích hoạt môi trường ảo với phiên bản Python được hỗ trợ hiện tại:
    virtualelnv env -p python3.7
    source env/bin/activate
  • Cài đặt DeepPavlov trong môi trường ảo:
    pip install deeppavlov
    

Khởi chạy máy chủ REST với mô hình DeepPavlov

Trước khi chúng ta khởi chạy một máy chủ với mô hình DeepPavlov lần đầu tiên, sẽ rất hữu ích khi nói về một số tính năng của kiến ​​trúc thư viện.

Bất kỳ mô hình nào trong DP đều bao gồm:

  • Mã Python;
  • Các thành phần có thể tải xuống - kết quả đào tạo được tuần tự hóa trên dữ liệu cụ thể (phần nhúng, trọng số của mạng thần kinh, v.v.);
  • Tệp cấu hình (sau đây gọi là config), chứa thông tin về các lớp được mô hình sử dụng, URL của các thành phần đã tải xuống, phần phụ thuộc Python, v.v.

Chúng tôi sẽ cho bạn biết thêm về những gì ẩn giấu trong DeepPavlov trong các bài viết sau, bây giờ chỉ cần chúng tôi biết rằng:

  • Bất kỳ mô hình nào trong DeepPavlov đều được xác định bằng tên cấu hình của nó;
  • Để chạy mô hình, bạn cần tải xuống các thành phần của nó từ máy chủ DeepPavlov;
  • Ngoài ra, để chạy mô hình, bạn cần cài đặt các thư viện Python mà nó sử dụng.

Mô hình đầu tiên chúng tôi sẽ ra mắt sẽ là Nhận dạng thực thể được đặt tên (NER) đa ngôn ngữ. Mô hình này phân loại các từ văn bản theo loại thực thể được đặt tên mà chúng thuộc về (tên riêng, tên địa lý, tên tiền tệ và các loại khác). Tên cấu hình cho phiên bản NER mới nhất hiện tại:

ner_ontonotes_bert_mult

Chúng tôi khởi chạy máy chủ REST với mô hình:

  1. Chúng tôi cài đặt các phần phụ thuộc của mô hình được chỉ định trong cấu hình của nó vào môi trường ảo đang hoạt động:
    python -m deeppavlov install ner_ontonotes_bert_mult
    
  2. Tải xuống các thành phần mô hình được tuần tự hóa từ máy chủ DeepPavlov:
    python -m deeppavlov download ner_ontonotes_bert_mult
    

    Các thành phần được tuần tự hóa sẽ được tải xuống thư mục chính DeepPavlov, được đặt theo mặc định

    ~/.deeppavlov

    Khi tải xuống, hàm băm của các thành phần đã tải xuống sẽ được kiểm tra dựa trên hàm băm của các thành phần nằm trên máy chủ. Nếu trùng khớp, quá trình tải xuống sẽ bị bỏ qua và các tệp hiện có sẽ được sử dụng. Kích thước của các thành phần được tải xuống có thể thay đổi trung bình từ 0.5 đến 8 Gb, trong một số trường hợp đạt tới 20 Gb sau khi giải nén.

  3. Chúng tôi khởi chạy máy chủ REST với mô hình:
    python -m deeppavlov riseapi ner_ontonotes_bert_mult -p 5005
    

Kết quả của việc thực thi lệnh này là một máy chủ REST có model sẽ được khởi chạy trên cổng 5005 của máy chủ (cổng mặc định là 5000).

Sau khi khởi tạo mô hình, bạn có thể tìm thấy Swagger với tài liệu API và khả năng kiểm tra tại URL http://127.0.0.1:5005. Hãy kiểm tra mô hình bằng cách gửi nó đến điểm cuối http://127.0.0.1:5005/model Yêu cầu POST có nội dung JSON sau:

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

Để đáp lại, chúng ta sẽ nhận được JSON sau:

[
  [
    ["В", "МФТИ", "можно", "добраться", "на", "электричке", "с", "Савёловского", "Вокзала", "."],
    ["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"]
  ]
]

Sử dụng những ví dụ này, chúng tôi sẽ phân tích API DeepPavlov REST.

API DeepPavlov

Mỗi mô hình DeepPavlov có ít nhất một đối số đầu vào. Trong REST API, các đối số được đặt tên, tên của chúng là khóa của từ điển đến. Trong hầu hết các trường hợp, đối số là văn bản cần được xử lý. Bạn có thể tìm thêm thông tin về các đối số và giá trị được mô hình trả về trong phần MÔ HÌNH của tài liệu sâuPavlov

Trong ví dụ này, một danh sách gồm hai chuỗi được chuyển tới đối số x, mỗi chuỗi được đánh dấu riêng biệt. Trong DeepPavlov, tất cả các mô hình đều lấy đầu vào là danh sách (lô) giá trị được xử lý độc lập.

Thuật ngữ “lô” dùng để chỉ lĩnh vực học máy và dùng để chỉ một loạt giá trị đầu vào độc lập được xử lý đồng thời bằng thuật toán hoặc mạng thần kinh. Cách tiếp cận này cho phép bạn giảm (thường là đáng kể) thời gian mô hình xử lý một phần tử của lô so với cùng một giá trị được chuyển đến đầu vào riêng biệt. Nhưng kết quả xử lý chỉ được đưa ra sau khi tất cả các phần tử đã được xử lý. Do đó, khi tạo một lô đến, cần phải tính đến tốc độ của mô hình và thời gian xử lý cần thiết cho từng phần tử riêng lẻ của nó.

Nếu có một số đối số cho mô hình DeepPavlov thì mỗi đối số sẽ nhận được một loạt giá trị riêng và ở đầu ra, mô hình luôn tạo ra một loạt câu trả lời. Các phần tử của lô đi là kết quả xử lý các phần tử của lô đến có cùng chỉ số.

Trong ví dụ trên, kết quả của mô hình là chia nhỏ từng chuỗi thành các mã thông báo (từ và dấu chấm câu) và phân loại mã thông báo liên quan đến thực thể được đặt tên (tên tổ chức, đơn vị tiền tệ) mà nó đại diện. Hiện nay mô hình ner_ontonotes_bert_mult có khả năng nhận biết 18 loại thực thể được đặt tên, có thể tìm thấy mô tả chi tiết đây.

Các mẫu có sẵn khác của DeepPavlov

Ngoài NER, các mô hình sẵn dùng sau đây có sẵn trong DeepPavlov tại thời điểm viết bài:

Trả lời câu hỏi văn bản

Trả lời câu hỏi cho văn bản bằng một đoạn văn bản này. Cấu hình mô hình: đội_ru_bert_infer

Yêu cầu ví dụ:

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

Kết quả:

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

Phát hiện xúc phạm

Phát hiện sự hiện diện của sự xúc phạm đối với người mà văn bản được gửi đến (tại thời điểm viết - chỉ dành cho tiếng Anh). Cấu hình mô hình: lăng mạ_kaggle_conv_bert

Yêu cầu ví dụ:


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

Kết quả:

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

Phân tích tình cảm

Phân loại tình cảm văn bản (tích cực, trung tính, tiêu cực). Cấu hình mô hình: rusentiment_elmo_twitter_cnn

Yêu cầu ví dụ:

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

Kết quả:

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

Phát hiện diễn giải

Xác định xem hai văn bản khác nhau có cùng một ý nghĩa hay không. Cấu hình mô hình: đứng_paraphraser_en

Lời yêu cầu:

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

Kết quả:

[
  [1],
  [0]
]

Luôn có thể tìm thấy danh sách hiện tại của tất cả các mẫu DeepPavlov có sẵn đây.

Kết luận

Trong bài viết này, chúng ta đã làm quen với API DeepPavlov và một số khả năng xử lý văn bản của thư viện được cung cấp sẵn. Cần lưu ý rằng đối với bất kỳ nhiệm vụ NLP nào, sẽ đạt được kết quả tốt nhất khi đào tạo mô hình trên tập dữ liệu tương ứng với lĩnh vực chủ đề (miền) của nhiệm vụ. Ngoài ra, về nguyên tắc, thậm chí nhiều mô hình hơn cũng không thể được đào tạo cho mọi tình huống.

Trong các bài viết sau, chúng ta sẽ xem xét các cài đặt bổ sung của thư viện, khởi chạy DeepPavlov từ Docker và sau đó chúng ta sẽ chuyển sang các mô hình đào tạo. Và đừng quên rằng DeepPavlov có форум – đặt câu hỏi của bạn về thư viện và các mô hình. Cám ơn vì sự quan tâm của bạn!

Nguồn: www.habr.com

Thêm một lời nhận xét