Spaces:
Sleeping
Sleeping
| import re | |
| import pickle | |
| import numpy as np | |
| import pandas as pd | |
| svc = pickle.load(open('models/svc_model.sav', 'rb')) | |
| tfidf = pickle.load(open('models/tfidf.sav', 'rb')) | |
| svc_sentiment = pickle.load(open('models/sentiment_model.sav', 'rb')) | |
| tfidf_sentiment = pickle.load(open('models/tfidf_sentiment.sav', 'rb')) | |
| svc_touchpoint = pickle.load(open('models/touchpoint_model.sav', 'rb')) | |
| tfidf_touchpoint = pickle.load(open('models/tfidf_touchpoint.sav', 'rb')) | |
| labels = [ | |
| 'Product quality', 'Knowledge', | |
| 'Appointment', 'Service etiquette', 'Waiting time', | |
| 'Repair speed', 'Repair cost', 'Repair quality', 'Warranty', | |
| 'Product replacement', 'Loan sets'] | |
| sample_file = pd.read_csv('sample.csv').to_csv(index=False).encode('utf-8') | |
| print('utils imported!') | |
| def get_single_prediction(text): | |
| # manipulate data into a format that we pass to our model | |
| text = text.lower().strip() #lower case | |
| # Make topic predictions | |
| text_vectors = tfidf.transform([text]) | |
| results = svc.predict_proba(text_vectors).squeeze().round(2) | |
| pred_prob = pd.DataFrame({'topic': labels, 'probability': results}).sort_values('probability', ascending=True) | |
| # Make sentiment predictions | |
| text_vectors_sentiment = tfidf_sentiment.transform([text]) | |
| results_sentiment = svc_sentiment.predict_proba(text_vectors_sentiment).squeeze().round(2) | |
| pred_prob_sentiment = pd.DataFrame({'sentiment': ['Negative', 'Positive'], 'probability': results_sentiment}).sort_values('probability', ascending=True) | |
| # Make touchpoint predictions | |
| text_vectors_touchpoint = tfidf_touchpoint.transform([text]) | |
| results_touchpoint = svc_touchpoint.predict_proba(text_vectors_touchpoint).squeeze().round(2) | |
| pred_prob_touchpoint = pd.DataFrame({'touchpoint': ['ASC', 'CC', 'No touchpoint', 'Technician'], 'probability': results_touchpoint}).sort_values('probability', ascending=True) | |
| return (pred_prob, pred_prob_sentiment, pred_prob_touchpoint) | |
| def get_multiple_predictions(csv): | |
| df = pd.read_csv(csv, encoding='latin') | |
| df.columns = ['sequence'] | |
| df['sequence_clean'] = df['sequence'].str.lower().str.strip() | |
| # Remove rows with blank string | |
| invalid = df[(pd.isna(df['sequence_clean'])) | (df['sequence_clean'] == '')] | |
| invalid.drop(columns=['sequence_clean'], inplace=True) | |
| # Drop rows with blank string | |
| df.dropna(inplace=True) | |
| df = df[df['sequence_clean'] != ''].reset_index(drop=True) | |
| # Vectorise text and get topic predictions | |
| text_vectors = tfidf.transform(df['sequence_clean']) | |
| pred_results = pd.DataFrame(svc.predict(text_vectors), columns = labels) | |
| pred_results['others'] = pred_results[labels].max(axis=1) | |
| pred_results['others'] = pred_results['others'].apply(lambda x: 1 if x == 0 else 0) | |
| # Vectorise text and get sentiment predictions | |
| text_vectors_sentiment = tfidf_sentiment.transform(df['sequence_clean']) | |
| pred_results_sentiment = pd.DataFrame(svc_sentiment.predict(text_vectors_sentiment), columns = ['sentiment']) | |
| # Vectorise text and get touchpoint predictions | |
| text_vectors_touchpoint = tfidf_touchpoint.transform(df['sequence_clean']) | |
| pred_results_touchpoint = pd.DataFrame(svc_touchpoint.predict(text_vectors_touchpoint), columns = ['touchpoint']) | |
| # Join back to original sequence | |
| final_results = df.join(pred_results).join(pred_results_sentiment).join(pred_results_touchpoint) | |
| final_results.drop(columns=['sequence_clean'], inplace=True) | |
| # Append invalid rows | |
| if len(invalid) == 0: | |
| return final_results.to_csv(index=False).encode('utf-8') | |
| else: | |
| return pd.concat([final_results, invalid]).reset_index(drop=True).to_csv(index=False).encode('utf-8') |