-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.py
101 lines (81 loc) · 3.24 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
from flask import Flask, request, jsonify
import json
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
import os
from waitress import serve
app = Flask(__name__)
# Function to check if embeddings file exists
def embeddings_file_exists(file_path):
return os.path.exists(file_path)
# Function to save embeddings
def save_embeddings(file_path, embeddings):
np.save(file_path, embeddings)
# Function to load embeddings
def load_embeddings(file_path):
return np.load(file_path, allow_pickle=True)
# Load the JSON data
with open('intents_questions_responses_renamed.json', 'r', encoding='utf-8') as file:
data = json.load(file)
# File paths
embeddings_file = 'embeddings.npy'
# Extract sentences and intents
sentences = []
intents = []
# Iterate over the data to extract sentences and intents
for parent_intent, content in data.items():
for question in content['Questions']:
sentences.append(question)
intents.append(parent_intent)
# Load or compute embeddings
if embeddings_file_exists(embeddings_file):
print("Loading embeddings from file...")
embeddings = load_embeddings(embeddings_file)
print("Embeddings loaded successfully.")
else:
print("Loading the model...")
model = SentenceTransformer("OrdalieTech/Solon-embeddings-large-0.1")
print("Model loaded successfully.")
# Encode the sentences and save the embeddings
print("Encoding sentences...")
embeddings = model.encode(sentences)
print("Sentences encoded successfully.")
save_embeddings(embeddings_file, embeddings)
def find_most_similar_intents(input_sentence, num_intents=3):
input_sentence = "query: " + input_sentence
# Encode the new sentence
new_embedding = model.encode([input_sentence])
# Flatten the embedding if necessary
if len(new_embedding.shape) == 3:
new_embedding = new_embedding.squeeze()
# Calculate similarity scores
similarity_scores = cosine_similarity(new_embedding.reshape(1, -1), embeddings)
# Get the indices of the most similar sentences and their confidence scores
sorted_indices = np.argsort(similarity_scores[0])[::-1]
top_intents = []
unique_intents = set()
for i in sorted_indices:
intent = intents[i]
confidence = float(similarity_scores[0][i])
if intent not in unique_intents:
top_intents.append({"intent": intent, "confidence": confidence})
unique_intents.add(intent)
if len(top_intents) >= num_intents:
break
return top_intents
@app.route('/get_intent', methods=['GET'])
def get_intent():
input_sentence = request.args.get('sentence')
if not input_sentence:
return jsonify({"error": "No sentence provided"}), 400
top_intents = find_most_similar_intents(input_sentence)
return jsonify({"intents": top_intents})
if __name__ == '__main__':
# Load the model once during startup if not already loaded
if 'model' not in globals():
print("Loading the model for the first time...")
model = SentenceTransformer("OrdalieTech/Solon-embeddings-large-0.1")
print("Model loaded successfully.")
# Start the application with Waitress
serve(app, host='0.0.0.0', port=5000)