from flask import Flask, render_template, request, redirect, url_for from joblib import load import pandas as pd import re from customFunctions import * import json import datetime pd.set_option('display.max_colwidth', 1000) PIPELINES = [ { 'id': 1, 'name': 'Baseline', 'pipeline': load("pipeline_ex1_s1.joblib") }, { 'id': 2, 'name': 'Trained on a FeedForward NN', 'pipeline': load("pipeline_ex1_s2.joblib") }, { 'id': 3, 'name': 'Trained on a CRF', 'pipeline': load("pipeline_ex1_s3.joblib") }, #{ # 'id': 4, # 'name': 'Trained on a small dataset', # 'pipeline': load("pipeline_ex2_s1.joblib") #}, #{ # 'id': 5, # 'name': 'Trained on a large dataset', # 'pipeline': load("pipeline_ex2_s2.joblib") #}, #{ # 'id': 6, # 'name': 'Embedded using TFIDF', # 'pipeline': load("pipeline_ex3_s1.joblib") #}, #{ # 'id': 7, # 'name': 'Embedded using ?', # 'pipeline': load("pipeline_ex3_s2.joblib") #}, ] pipeline_metadata = [{'id': p['id'], 'name': p['name']} for p in PIPELINES] def get_pipeline_by_id(pipelines, pipeline_id): return next((p['pipeline'] for p in pipelines if p['id'] == pipeline_id), None) def get_name_by_id(pipelines, pipeline_id): return next((p['name'] for p in pipelines if p['id'] == pipeline_id), None) def requestResults(text, pipeline): labels = pipeline.predict(text) print(labels.ndim) if labels.ndim != 1: flattened_predictions = [] for sentence in labels: for tag in sentence: flattened_predictions.append(tag) labels = flattened_predictions print(labels) labels = [int(label) for label in labels] tag_encoder = LabelEncoder() tag_encoder.fit(['B-AC', 'O', 'B-LF', 'I-LF']) decoded_labels = tag_encoder.inverse_transform(labels) return decoded_labels LOG_FILE = "usage_log.jsonl" # Each line is a JSON object def log_interaction(user_input, model_name, predictions): log_entry = { "timestamp": datetime.datetime.utcnow().isoformat(), "user_input": user_input, "model": model_name, "predictions": predictions } with open(LOG_FILE, "a") as f: f.write(json.dumps(log_entry) + "\n") app = Flask(__name__) @app.route('/') def index(): return render_template('index.html', pipelines= pipeline_metadata) @app.route('/', methods=['POST']) def get_data(): if request.method == 'POST': text = request.form['search'] tokens = re.findall(r"\w+|[^\w\s]", text) tokens_fomatted = pd.Series([pd.Series(tokens)]) pipeline_id = int(request.form['pipeline_select']) pipeline = get_pipeline_by_id(PIPELINES, pipeline_id) name = get_name_by_id(PIPELINES, pipeline_id) labels = requestResults(tokens_fomatted, pipeline) results = dict(zip(tokens, labels)) log_interaction(text, name, results) return render_template('index.html', results=results, name=name, pipelines= pipeline_metadata) if __name__ == '__main__': app.run(host="0.0.0.0", port=7860) #if __name__ == '__main__': #app.run(host="0.0.0.0", port=7860)