Специалистам по обработке данных НЕОБХОДИМО научиться упаковывать и развертывать свои собственные модели.

Я здесь не привратник, я даю вам факты. Я беру интервью, нанимаю и возглавляю специалистов по данным, будь то специалисты по данным, аналитики данных, инженеры по машинному обучению или инженеры по данным. Модели упаковки и развертывания - это постоянный пробел для людей, не имеющих опыта разработки программного обеспечения.

Вот почему в этой статье и видео я покажу вам быстрое развертывание приложения Обработка естественного языка (NLP) от начала до конца. Я не беспокоюсь о разработке модели, потому что моделирование - это не тот пробел, который я вижу на рынке.

Хорошо, приступим.

Настройка среды проекта

Я использовал PyCharm в качестве своей IDE, как вы можете видеть на видео выше, но вам должно быть хорошо с любой IDE на Python.

Для начала мы собираемся открыть наш терминал и выполнить следующую команду, чтобы создать каталог приложения:

mkdir ner-service

Теперь "cd" в каталог

cd ner-service

Создайте поэтический проект, запустив:

poetry init

Примечание. В качестве альтернативы вы можете запустить новую службу поэзии , которая запустит проект структурированной поэзии. для вас.

После того, как вы запустите команду «поэзия инициализации», вы пройдете через настройку проекта, которая выглядит примерно так:

Теперь, когда у нас есть настройка поэтического проекта, давайте запустим поэтическую оболочку.

poetry shell

Если до этого момента вы все сделали правильно, вы должны увидеть в своем терминале что-то вроде этого:

Настройка файловой структуры проекта

Хорошо, теперь, когда наша среда настроена и работает, давайте настроим структуру нашего проекта.

Первое, что нам нужно сделать, это создать наш каталог «src». Для этого мы запустим:

mkdir src; cd src

Затем нам нужно создать файлы __init__.py и main.py.

touch __init__.py main.py

На этом этапе структура вашего проекта должна выглядеть так:

Признание именованных сущностей Spacy (NER)

В этой статье и видео-руководстве я не уделял много времени объяснениям NER или Spacy, но, основываясь на ответах первых зрителей видео, это было ошибкой. Итак, давайте быстро поговорим о SpaCy.

Справочная информация: SpaCy & NER

SpaCy - это программная библиотека с открытым исходным кодом для расширенной обработки естественного языка, написанная на языках программирования Python и Cython

Википедия

SpaCy - фантастическая библиотека, используемая для упрощения создания и разработки решений НЛП. В этом проекте для простоты мы используем функцию Встроенное распознавание именованных сущностей (NER) SpaCy.

Если вы хотите узнать больше о NER, вы можете посмотреть снимок экрана ниже или просмотреть ссылку в описании изображения.

Внедрение системы NER SpaCy

Чтобы продвигать проект и поддерживать повторяемость, мы будем использовать пример кода из SpaCy’s Named Entity Recognition 101 в качестве шаблона.

#~/ner-service/src/main.py
import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("Apple is looking at buying U.K. startup for $1 billion")
for ent in doc.ents:
    print(ent.text, ent.start_char, ent.end_char, ent.label_)

Теперь, чтобы использовать spaCy, нам нужно добавить его в нашу среду. Вы можете сделать это, запустив следующий код:

poetry add spacy

Ваш терминал будет выглядеть примерно так после:

Тогда вы захотите добавить языковую модель.

poetry add https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.3.1/en_core_web_sm-2.3.1.tar.gz

Затем, чтобы убедиться, что все правильно установлено, запустите:

poetry update

На этом этапе ваш файл pyproject.toml должен выглядеть примерно так:

Теперь давайте быстро проверим, работает ли код в нашей среде. Выполните следующую команду:

python main.py

Если в вашей среде все работает, как ожидалось, вы должны получить следующий результат:

Настройте API с помощью FastAPI

Теперь, когда у нас есть настройка Poetry и SpaCy, работающие в нашей среде, давайте настроим наш API.

Прежде чем мы начнем, я собираюсь представить FastAPI. Не стесняйтесь переходить к разделу Внедрение FastAPI.

Что такое FastAPI?

По данным сайта FastAPI:

FastAPI - это современная, быстрая (высокопроизводительная) веб-платформа для создания API-интерфейсов с Python 3.6+ на основе стандартных подсказок типа Python.

https://fastapi.tiangolo.com/

Я не хочу лениться по этому поводу, но эта цитата в значительной степени подводит итог. FastAPI быстр, прост, понятен и расширяем.

Зачем использовать FastAPI?

Есть масса причин использовать FastAPI, но я перечислю несколько причин, по которым моя команда и я в Aptive Resources перешли с Flask на FastAPI для большинства наших сервисов Python.

  • FastAPI поставляется со встроенной документацией Swagger. Это замечательно для быстрого создания прототипов и тестирования вашего API.
  • Понятная, лаконичная документация и примеры.
  • Расширяемость.
  • Скорость, скорость, скорость производства.

Реализация FastAPI

Итак, теперь, когда мы в целом знаем, что такое FastAPI и зачем его использовать, давайте добавим его в наш проект с помощью следующих команд:

poetry add fastapi uvicorn

Эта команда установит FastAPI и Uvicorn. Согласно документации, Uvicorn - это молниеносная реализация сервера ASGI, использующая« uvloop и httptools . В нашем случае Uvicorn помогает нам предоставлять наше приложение всему миру.

Теперь, когда FastAPI и Uvicorn установлены, давайте вернемся к main.py и реализуем FastAPI.

#~/ner-service/src/main.py
from fastapi import FastAPI
from typing import List
import spacy
from .models import Payload, Entities
app = FastAPI()
nlp = spacy.load("en_core_web_sm")

@app.post('/ner-service') 
async def get_ner(payload: Payload): 
    tokenize_content: List[spacy.tokens.doc.Doc] = [
        nlp(content.content) for content in payload.data
    ]
    document_enities = []
    for doc in tokenize_content:
        document_enities.append([ {'text': ent.text, 'entity_type': ent.label_} for ent in doc.ents ])
    return [
        Entities(post_url=post.post_url, entities=ents)
        for post, ents in zip(payload.data, document_enities)
    ]

В файл добавлено много нового кода, поэтому давайте рассмотрим его по частям.

app = FastAPI()

Эта часть просто создает экземпляр приложения FastAPI.

@app.post('/ner-service')

Это устанавливает наш маршрут или путь. Например, www.mktr.ai/ner-service имел бы указанный выше путь, если бы это была услуга, которую мы запускали с веб-сайта MKTR.AI.

@app.post('/ner-service') 
async def get_ner(payload: Payload): 
    ...

Функции async для операций с путями очень полезны, и я предлагаю вам взглянуть на документацию FastAPI, чтобы узнать больше.

Обратите внимание, что элемент payload: Payload сообщает приложению, какой тип данных следует ожидать. Мы вернемся к этому через минуту, когда создадим файл models.py. А пока подумайте об этом как о способе форматирования данных, которые мы будем принимать в запросе к нашему API.

tokenize_content: List[spacy.tokens.doc.Doc] = [
        nlp(content.content) for content in payload.data
    ]

Здесь мы используем анализ списка для токенизации текстовых данных, которые передаются в наш API. Часть List[spacy.tokens.doc.Doc] объявляет тип / формат данных, которые мы назначаем переменной tokenize_content. Это может быть немного избыточным, но становится более важным, когда вы пытаетесь учесть крайние случаи и потенциальные проблемы в производственной среде.

document_enities = []
for doc in tokenize_content:
        document_enities.append([ {'text': ent.text, 'entity_type': ent.label_} for ent in doc.ents ]) 

Здесь мы создаем список document_entities и используем понимание списка для создания словаря с текстом и типом объекта для каждого фрагмента текста, переданного в API. Список document_entities - это список словарей.

return [
        Entities(post_url=post.post_url, entities=ents)
        for post, ents in zip(payload.data, document_enities)
    ]

Наконец, мы форматируем наш объект ответа. Основываясь на предыдущих фрагментах, вы, вероятно, сможете понять, что здесь происходит. По сути, часть Entities () гидратирует объекты Entities для каждой переданной текстовой строки.

Хорошо, теперь, когда файл main.py готов к работе, мы собираемся создать еще один файл python с именем models.py следующим образом:

touch models.py

Затем давайте добавим в models.py следующий код:

#~/ner-service/src/models.py
from typing import List
from pydantic import BaseModel

class Content(BaseModel):
    post_url: str
    content: str

class Payload(BaseModel): 
    data: List[Content] # this makes list of Content objects

class SingleEntity(BaseModel):
    text: str
    entity_type: str

class Entities(BaseModel):
    post_url: str
    entities: List[SingleEntity] # this makes a list of SingleEntity objects

По сути, Content () - это отдельный объект со строкой post_url и строкой содержимого. Объект Payload () - это список объектов Content.

То же самое и с Entities и SingleEntity.

Протестируйте свой FastAPI локально

Теперь, когда у вас есть базовый код, давайте протестируем его, запустив следующий код:

uvicorn main:app --reload

После запуска приведенного выше кода ваш терминал должен выглядеть примерно так:

Если все идет по плану, вы сможете посетить http://127.0.0.1:8000/docs и проверить свое приложение FastAPI и документ swagger.

В заключение…

Хорошо, хорошо, хорошо! У вас есть приложение FastAPI, работающее локально. Поздравляю!

В следующем посте мы поместим наше приложение в контейнер с помощью Docker, отправим образ докера в DockerHub, настроим виртуальную машину GCP и запустим наше приложение, чтобы мир мог его использовать.

Если вы находитесь в стационаре, вы всегда можете перейти к делу и посмотреть исходное видео YouTube для этого проекта и репозиторий GitHub.

Я надеюсь, что это было полезно! Если у вас возникнут проблемы или возникнут какие-либо вопросы, оставьте комментарий, напишите мне по электронной почте или свяжитесь со мной в LinkedIn, и я вам отвечу.

Эта статья изначально была размещена на MKTR.AI.