FastAPI возвращает результат и показатели модели BERT

#python #nlp #sentiment-analysis #fastapi #bert-language-model

#python #nlp #анализ настроений #fastapi #bert-language-model

Вопрос:

У меня есть модель анализа настроений с использованием BERT, и я хочу получить результат от прогнозирования текста с помощью FastAPI, но он всегда дает отрицательный ответ (я думаю, это потому, что прогноз не дал результата прогнозирования).

Это мой код:

 import uvicorn
from fastapi import FastAPI
import joblib

# models
sentiment_model = open("sentiment-analysis-model.pkl", "rb")
sentiment_clf = joblib.load(sentiment_model)

# init app
app = FastAPI()

# Routes
@app.get('/')
async def index():
    return {"text": "Hello World! huehue"}

@app.get('/predict/{text}')
async def predict(text):
    prediction, raw_outputs = sentiment_clf.predict(text)
    if prediction == 0:
        result = "neutral"
    elif prediction == 1:
        result = "positive"
    else:
        result = "negative"
    return{"text": text, "prediction":result}

if __name__ == '__main__':
    uvicorn.run(app, host="127.0.0.1", port=8000)
 

Также я хочу напечатать точность, оценку F1 и т. Д.

Я использую эту модель

 from simpletransformers.classification import ClassificationModel

model = ClassificationModel('bert', 'bert-base-multilingual-uncased', num_labels=3, use_cuda=False, 
                            args={'reprocess_input_data': True, 'overwrite_output_dir': True, 'num_train_epochs': 1},
                            weight=[3, 0.5, 1])
 

Комментарии:

1. Вы пытались дебютировать с этим? Либо с некоторой печатью / протоколированием, либо с точкой останова? Правильно ли вы называете модель? Работает ли он так, как ожидалось, прежде чем подключать его сюда? И как вы вызываете API?

Ответ №1:

Вы используете конструкцию параметра пути. Это означает, что для вызова конечной точки вашего API вам нужно выполнить такой вызов: http://localhost:8000/predict/some_text . Проблема в том, что some_text в вашем случае содержит пробелы. Если не использовать явный HTML-код, например (я не уверен, что это вообще сработает), не удастся зарегистрировать пробел, и у вас будет только первое слово.

Вместо этого вам было бы лучше использовать конструкцию тела запроса. Итак, POST вместо GET . Что-то вроде этого:

 from pydantic import BaseModel


class Text(BaseModel):
    text: str


app = FastAPI()


@app.post("/predict/")
async def predict(text: Text):
    text = text.text
    ...