Вызов функций с разными входными параметрами api, каждый раз возвращающий один и тот же вывод, Flask api - PullRequest
1 голос
/ 06 августа 2020

У меня есть функция, которая возвращает мне вектор.

def class_vector(*categories):
    all_categories = categories
    model = Word2Vec.load(r"C:\Users\vector.model")
    my_dict = dict({})
    for idx, key in enumerate(model.wv.vocab):
        my_dict[key] = model.wv[key]
                   
    categories_vectors = dict({})
        
    for i in all_categories:
        if i.lower() in my_dict.keys():
            categories_vectors[i] = my_dict[i]
                  
    average_vector = np.mean(list(categories_vectors.values()), axis =0)
    average_vector =  average_vector.reshape(1, -1)

    return average_vector

Теперь я вызываю эту функцию и тестирую векторы, сгенерированные для двух различных входных комбинаций:

test 1 = class_vector("apple", "banana")
test 2 = class_vector("grapes", "papaya", "lemon")

Это отлично работает и возвращает мне новый вектор для каждой новой комбинации фруктов. Вышеупомянутая функция находится в файле .py с именем vectors_list.py

Теперь я хочу создать api, который принимает имена фруктов в качестве входных данных от пользователя и использует функцию class_vector для возврата вычисленных векторов.

Код API:

from flask import Flask, request
from vector_list import class_vector

app = Flask(__name__)

@app.route('/')
def status():
    fruits = request.args.getlist("param")
    str_fruits = ",".join(fruits)
    returned_vec = class_vector(*str_fruits )
    return str(returned_vec)

Теперь я делаю flask run из cmd и запускаю несколько тестов

Test 1: `curl "http://localhost:5000?param=apple&param=banana"`
Test 2: `curl "http://localhost:5000?param=grapes&param=papaya&param=lemon"`

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

1 Ответ

2 голосов
/ 06 августа 2020

Вам не нужно присоединяться к вашему списку строк, возвращаемому из request.args.getlist. Удалите str_fruits = ",".join(fruits) и используйте class_vector(*fruits):

@app.route('/')
def status():
    fruits = request.args.getlist('param')
    returned_vec = class_vector(*fruits)
    return str(returned_vec)

Обратите внимание, что ваша функция class_vector принимает переменные аргументы def class_vector(*categories): и ожидает получить набор параметров. Теперь, когда вы присоединяетесь, вы в конечном итоге набираете class_vector следующим образом: class_vector('a', 'p', 'p', 'l', 'e', ',', 'b', 'a', 'n', 'a', 'n', 'a') вместо class_vector('apple', 'banana'). Это происходит потому, что с помощью *str_fruits вы распаковываете строку в набор символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...