| from flask import Flask, render_template, request, jsonify
|
| from flask_cors import CORS
|
| import tensorflow as tf
|
| from tensorflow.keras.preprocessing.sequence import pad_sequences
|
| import pickle
|
| import numpy as np
|
| import os
|
|
|
| app = Flask(__name__)
|
| CORS(app)
|
|
|
|
|
| model = None
|
| tokenizer = None
|
| MAX_LEN = 300
|
|
|
|
|
| def load_resources():
|
| global model, tokenizer
|
| model_path = 'chatbot_performance_advanced.h5'
|
| tokenizer_path = 'tokenizer_advanced.pickle'
|
|
|
|
|
| class Attention(tf.keras.layers.Layer):
|
| def __init__(self, **kwargs):
|
| super(Attention, self).__init__(**kwargs)
|
| def build(self, input_shape):
|
| self.W = self.add_weight(name='attention_weight', shape=(input_shape[-1], 1), initializer='random_normal', trainable=True)
|
| self.b = self.add_weight(name='attention_bias', shape=(input_shape[1], 1), initializer='zeros', trainable=True)
|
| super(Attention, self).build(input_shape)
|
| def call(self, x):
|
| e = tf.keras.backend.tanh(tf.keras.backend.dot(x, self.W) + self.b)
|
| a = tf.keras.backend.softmax(e, axis=1)
|
| output = x * a
|
| return tf.keras.backend.sum(output, axis=1)
|
|
|
| if os.path.exists(model_path) and os.path.exists(tokenizer_path):
|
| model = tf.keras.models.load_model(model_path, custom_objects={'Attention': Attention})
|
| with open(tokenizer_path, 'rb') as handle:
|
| tokenizer = pickle.load(handle)
|
| print("Advanced Model and Tokenizer loaded successfully.")
|
| return True
|
| return False
|
|
|
| @app.route('/')
|
| def index():
|
| return render_template('index.html')
|
|
|
| @app.route('/predict', methods=['POST'])
|
| def predict():
|
| global model, tokenizer
|
| if model is None or tokenizer is None:
|
| if not load_resources():
|
| return jsonify({
|
| 'error': 'Model is still training. Please wait a few minutes.',
|
| 'status': 'training'
|
| }), 503
|
|
|
| data = request.json
|
| if data.get('ping'):
|
| return jsonify({'status': 'ready'})
|
|
|
| facts = data.get('facts', 'No context provided.')
|
|
|
| question = data.get('question', '')
|
| response = data.get('response', '')
|
|
|
| try:
|
|
|
| text = f"[FACTS] {facts} [QUERY] {question} [RES] {response}".lower()
|
| seq = tokenizer.texts_to_sequences([text])
|
| pad = pad_sequences(seq, maxlen=MAX_LEN)
|
|
|
|
|
| prediction = model.predict(pad)[0][0]
|
| is_best = bool(prediction > 0.5)
|
|
|
| return jsonify({
|
| 'probability': float(prediction),
|
| 'is_best': is_best
|
| })
|
| except Exception as e:
|
| return jsonify({'error': str(e)}), 500
|
|
|
|
|
|
|
| if __name__ == '__main__':
|
| load_resources()
|
| app.run(debug=True, port=5000)
|
|
|