Smart-inbox / app.py
imenayadi's picture
Fix Spacy
05d67e3
raw
history blame
9.47 kB
import gradio as gr
import pandas as pd
from key_info import extract_entities
from summarization_with_bart import summarize_email_conditional
from llama2_response_mail_generator import generate_email_response
from transformers import pipeline, AutoTokenizer, AutoModelForSequenceClassification
import torch
import spacy
from huggingface_hub import hf_hub_download
from llama_cpp import Llama
import subprocess
"""**Original code**
**CSS for Interface**
"""
custom_css = ''' @import url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/css/all.min.css');
body {
background-color: #eef1f5; /* Light grey-blue background for a neutral, clean look */
}
label {
color: #34495e; /* Dark blue-grey for a professional appearance */
font-weight: bold;
}
textarea, input, select, button {
background-color: #ffffff; /* Crisp white background for input fields and buttons */
border: 1px solid #bdc3c7; /* Soft grey border for a subtle, refined look */
color: #2c3e50; /* Darker shade of blue-grey for text, enhancing readability */
}
button {
background-color: #3498db; /* Bright blue for buttons to stand out */
color: black ; /* White text on buttons for clarity */
border-radius: 4px; /* Slightly rounded corners for a modern touch */
font-weight: bold; /* Bold text for emphasis */
font-size: 16px; /* Sizable text for easy interaction */
}
button[type="submit"], button[type="reset"], button[type="button"] {
font-weight: bold; /* Ensures all actionable buttons are prominent */
font-size: 18px; /* Larger text size for better visibility and impact */
}
.result-box {
background-color: #ecf0f1; /* Very light grey for result boxes, ensuring focus */
color: #2c3e50; /* Consistent dark blue-grey text for uniformity */
border: 1px solid #bdc3c7; /* Matching the input field borders for design coherence */
}
.gradio-toolbar {
background-color: #ffffff; /* Maintains a clean, unobtrusive toolbar appearance */
border-top: 2px solid #3498db; /* A pop of bright blue to delineate the toolbar */
}
'''
"""**Seperate** **Interface**"""
summarizer = pipeline("summarization", model="facebook/bart-large-cnn")
nlp = spacy.load("en_core_web_sm")
ner_pipeline = pipeline("ner", model="dbmdz/bert-large-cased-finetuned-conll03-english", tokenizer="dbmdz/bert-large-cased-finetuned-conll03-english")
model_path = './fine_tuned_roberta_for_category_model_'
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForSequenceClassification.from_pretrained(model_path)
model.eval()
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
# Load model and tokenizer from the drive
model_sentiment_path = './fine_tuned_roberta_for_sentiment_analysis_2000_'
tokenizer_sentiment = AutoTokenizer.from_pretrained(model_sentiment_path)
model_sentiment = AutoModelForSequenceClassification.from_pretrained(model_sentiment_path)
model_sentiment.eval()
model_sentiment.to(device)
model_name_or_path = "TheBloke/Llama-2-13B-chat-GGML"
model_basename = "llama-2-13b-chat.ggmlv3.q5_1.bin" # The model is in bin format
# Download the model file
model_path_llama = hf_hub_download(repo_id=model_name_or_path, filename=model_basename)
# Initialize the Llama model with appropriate settings for GPU
lcpp_llm = Llama(
model_path=model_path_llama,
n_threads=2, # CPU cores to use
n_batch=512, # Batch size for processing; adjust as per your VRAM capacity
n_gpu_layers=32 # Number of layers to run on GPU, dependent on your GPU's VRAM
)
def generate_email_response(email_prompt):
# Check input received by the function
print("Received prompt:", email_prompt)
# Determine if the input is a shorthand command or an actual email
if 'email to' in email_prompt.lower():
# Assume it's a shorthand command, format appropriately
formatted_prompt = f'''
Email received: "{email_prompt}"
Respond to this email, ensuring a professional tone, providing a concise update, and addressing any potential concerns the sender might have.
Response:
'''
else:
# Assume it's direct email content
formatted_prompt = f'''
Email received: "{email_prompt}"
Respond to this email, ensuring a professional tone, providing a concise update, and addressing any potential concerns the sender might have.
Response:
'''
# Generate response using Llama-2 model
try:
response = lcpp_llm(
prompt=formatted_prompt,
max_tokens=256,
temperature=0.5,
top_p=0.95,
repeat_penalty=1.2,
top_k=150,
echo=True
)
generated_response = response["choices"][0]["text"]
# Remove the input part from the output if it is included
if formatted_prompt in generated_response:
generated_response = generated_response.replace(formatted_prompt, '').strip()
print("Generated response:", generated_response)
return generated_response
except Exception as e:
print("Error in response generation:", str(e))
return "Failed to generate response, please check the console for errors."
def classify_sentiment(text):
# Encode the text using the tokenizer
inputs = tokenizer_sentiment(text, return_tensors="pt", truncation=True, max_length=512, padding=True)
input_ids = inputs['input_ids'].to(device)
attention_mask = inputs['attention_mask'].to(device)
# Get model predictions
with torch.no_grad():
outputs = model_sentiment(input_ids=input_ids, attention_mask=attention_mask)
predictions = torch.nn.functional.softmax(outputs.logits, dim=1)
# Convert predictions to probabilities and sentiment category
probabilities = predictions.cpu().numpy()[0]
categories = ["Positive", "Neutral", "Negative"]
predicted_sentiment = categories[probabilities.argmax()]
# Return the predicted sentiment and the confidence
confidence = max(probabilities)
return f"Sentiment: {predicted_sentiment}, Confidence: {confidence:.2f}"
def generate_summary(email_text):
return summarize_email_conditional(email_text, summarizer)
def display_entities(email_text):
try:
results = extract_entities(email_text, nlp, ner_pipeline)
# Convert to DataFrames
data_spacy = pd.DataFrame(results['spaCy Entities'])
data_transformer = pd.DataFrame(results['Transformer Entities'])
return data_spacy, data_transformer, ", ".join(results['Dates'])
except Exception as e:
print(f"Error: {e}")
# Return empty outputs in case of error
return pd.DataFrame(), pd.DataFrame(), ""
def classify_email(email):
# Encode the email text using the tokenizer
inputs = tokenizer(email, return_tensors="pt", truncation=True, max_length=512, padding=True)
input_ids = inputs['input_ids'].to(device)
attention_mask = inputs['attention_mask'].to(device)
# Get model predictions
with torch.no_grad():
outputs = model(input_ids=input_ids, attention_mask=attention_mask)
predictions = torch.nn.functional.softmax(outputs.logits, dim=1)
# Convert predictions to probabilities and category
probabilities = predictions.cpu().numpy()[0]
categories = ["Urgent Requests", "Project Updates", "Client Communications", "Meeting Coordination", "Internal Announcements"]
predicted_category = categories[probabilities.argmax()]
# Return the predicted category and the confidence
confidence = max(probabilities)
return f"Category: {predicted_category}, Confidence: {confidence:.2f}"
iface_category = gr.Interface(
fn=classify_email,
inputs=gr.Textbox(lines=10, placeholder="Enter Email Content Here..."),
outputs="text",
title="Email Category Classifier",
description="This model classifies email text into one of five categories: Urgent Requests, Project Updates, Client Communications, Meeting Coordination, Internal Announcements."
)
iface_sentiment = gr.Interface(
fn=classify_sentiment,
inputs=gr.Textbox(lines=5, placeholder="Enter Email Text Here..."),
outputs=gr.Textbox(label="Sentiment Analysis"),
title="Sentiment Analysis"
)
iface_summary = gr.Interface(
fn=generate_summary,
inputs=[gr.Textbox(lines=5, placeholder="Enter Email Text Here...")],
outputs=gr.Textbox(label="Generated Summary"),
title="Summary Generation"
)
iface_ner = gr.Interface(
fn=display_entities,
inputs=gr.Textbox(lines=5, placeholder="Enter Email Text Here..."),
outputs=[
gr.Dataframe(label="spaCy Entity Recognition"),
gr.Dataframe(label="Transformer Entity Recognition"),
gr.Textbox(label="Extracted Dates")
],
title="NER Analysis",
description="Performs Named Entity Recognition using spaCy and Transformer models."
)
iface_response = gr.Interface(
fn=generate_email_response,
inputs=gr.Textbox(lines=10, placeholder="Enter the email prompt..."),
outputs=gr.Textbox(label="Generated Email Response"),
title="Email Response Generator",
description="Generate email responses using Llama-2 model."
)
# Using tabs to organize the interfaces
tabs = gr.TabbedInterface([iface_category, iface_sentiment,iface_summary,iface_ner,iface_response], ["Category", "Sentiment"," Summary","NER","Response Generator"], css=custom_css)
tabs.launch(share=True)