У меня есть данные, которые хранятся в виде пар ключ-значение в базе данных leveldb . Значения: лазер векторное вложение предложений, а ключи - это намерения этих предложений. Когда вводится новое предложение, я сравниваю векторное вложение этого предложения со значениями в базе данных leveldb, чтобы определить намерение. Здесь я использовал , вложенный в l oop, и для его выполнения требуется более 5 секунд. Может кто-нибудь предложить способ оптимизации этого цикла цикла / кода?
expose.py
import plyvel
from flask import Flask
from flask_restful import Api
from laserembeddings import Laser
from getters.getIntents import *
from getters.getEntities import *
app = Flask(__name__)
api = Api(app)
si_data_vec = plyvel.DB('levelDB/si_data_vec', create_if_missing=False)
path_to_bpe_codes = 'data/laser_models/93langs.fcodes'
path_to_bpe_vocab = 'data/laser_models/93langs.fvocab'
path_to_encoder = 'data/laser_models/bilstm.93langs.2018-12-26.pt'
laser = Laser(path_to_bpe_codes, path_to_bpe_vocab, path_to_encoder)
@app.route('/lang/si/<keylist>', methods=['GET'])
def get_si(keylist):
intent = get_intents(keylist, si_data_vec, laser)
return intent
# Initialize and start the web application
if __name__ == "__main__":
app.run()
getIntents.py
Содержит l oop для быть оптимизирован
import io
from itertools import combinations
import numpy as np
def get_intents(key_list, si_data_vec, laser):
avg = laser.embed_sentences([key_list], lang='si')[0]
minimum_dist = 1
intent = ''
### LOOP TO BE OPTIMIZED
for key, value in si_data_vec:
bio = io.BytesIO(value)
vec = np.load(bio)
for pair in combinations([avg, vec], 2):
dist = distance(list(pair[0]), list(pair[1]))
if dist < minimum_dist:
minimum_dist = dist
intent = key.decode()
return intent
def distance(list1, list2):
"""Distance between two vectors."""
squares = [(p-q) ** 2 for p, q in zip(list1, list2)]
return sum(squares) ** .5
Обновлен getIntents.py согласно комментарию
import io
import numpy as np
def get_intents(key_list, si_data_vec, laser):
avg = laser.embed_sentences([key_list], lang='si')[0]
minimum_dist = 1
intent = ''
for key, value in si_data_vec:
bio = io.BytesIO(value)
vec = np.load(bio)
dist = distance(avg, vec)
if dist < minimum_dist:
minimum_dist = dist
intent = key.decode()
return intent
def distance(list1, list2):
"""Distance between two vectors."""
squares = [(p-q) ** 2 for p, q in zip(list1, list2)]
return sum(squares) ** .5