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') |