File size: 8,450 Bytes
03112f5
 
 
ebef676
03112f5
 
 
 
 
fdc710b
03112f5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ebef676
 
03112f5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ebef676
 
03112f5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
# This cell will generate a unified Gradio app.py content based on all 5 apps provided

import os
import gradio as gr
import pandas as pd
import numpy as np
import joblib
import spacy
from transformers import pipeline
from langchain_core.pydantic import BaseModel, Field
from langchain.prompts import HumanMessagePromptTemplate, ChatPromptTemplate
from langchain.output_parsers import PydanticOutputParser
from langchain_openai import ChatOpenAI

# ---------------- Text Translator ---------------- #

chat = ChatOpenAI()

class TextTranslator(BaseModel):
    output: str = Field(description="Translated output text")

output_parser = PydanticOutputParser(pydantic_object=TextTranslator)
format_instructions = output_parser.get_format_instructions()

def text_translator(input_text: str, language: str) -> str:
    human_template = f"Enter the text that you want to translate: {{input_text}}, and enter the language that you want it to translate to {{language}}. {format_instructions}"
    human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
    chat_prompt = ChatPromptTemplate.from_messages([human_message_prompt])
    prompt = chat_prompt.format_prompt(input_text=input_text, language=language, format_instructions=format_instructions)
    messages = prompt.to_messages()
    response = chat(messages=messages)
    output = output_parser.parse(response.content)
    return output.output

# ---------------- Sentiment Analysis ---------------- #

sentiment_classifier = pipeline("sentiment-analysis", model="cardiffnlp/twitter-xlm-roberta-base-sentiment")

def sentiment_analysis(message, history):
    result = sentiment_classifier(message)
    return f"Sentiment: {result[0]['label']} (Probability: {result[0]['score']:.2f})"

# ---------------- Financial Analyst ---------------- #

nlp = spacy.load('en_core_web_sm')
nlp.add_pipe('sentencizer')

def split_in_sentences(text):
    doc = nlp(text)
    return [str(sent).strip() for sent in doc.sents]

def make_spans(text, results):
    results_list = [res['label'] for res in results]
    return list(zip(split_in_sentences(text), results_list))

auth_token = os.environ.get("HF_Token")

asr = pipeline("automatic-speech-recognition", "facebook/wav2vec2-base-960h")
def speech_to_text(speech):
    return asr(speech)["text"]

summarizer = pipeline("summarization", model="knkarthick/MEETING_SUMMARY")
def summarize_text(text):
    return summarizer(text)[0]['summary_text']

fin_model = pipeline("sentiment-analysis", model='yiyanghkust/finbert-tone', tokenizer='yiyanghkust/finbert-tone')
def text_to_sentiment(text):
    return fin_model(text)[0]["label"]

def fin_ner(text):
    api = gr.Interface.load("dslim/bert-base-NER", src='models', use_auth_token=auth_token)
    return api(text)

def fin_ext(text):
    results = fin_model(split_in_sentences(text))
    return make_spans(text, results)

def fls(text):
    fls_model = pipeline("text-classification", model="demo-org/finbert_fls", tokenizer="demo-org/finbert_fls", use_auth_token=auth_token)
    results = fls_model(split_in_sentences(text))
    return make_spans(text, results)

# ---------------- Personal Information Identifier ---------------- #

def detect_personal_info(text):
    pii_model = gr.Interface.load("models/iiiorg/piiranha-v1-detect-personal-information")
    return pii_model(text)

# ---------------- Customer Churn ---------------- #

script_dir = os.path.dirname(os.path.abspath(__file__))
pipeline_path = os.path.join(script_dir, 'toolkit', 'pipeline.joblib')
model_path = os.path.join(script_dir, 'toolkit', 'Random Forest Classifier.joblib')

pipeline_churn = joblib.load(pipeline_path)
model_churn = joblib.load(model_path)

def calculate_total_charges(tenure, monthly_charges):
    return tenure * monthly_charges

def predict_churn(SeniorCitizen, Partner, Dependents, tenure,
    InternetService, OnlineSecurity, OnlineBackup, DeviceProtection, TechSupport,
    StreamingTV, StreamingMovies, Contract, PaperlessBilling, PaymentMethod,
    MonthlyCharges):

    TotalCharges = calculate_total_charges(tenure, MonthlyCharges)
    input_df = pd.DataFrame({
        'SeniorCitizen': [SeniorCitizen],
        'Partner': [Partner],
        'Dependents': [Dependents],
        'tenure': [tenure],
        'InternetService': [InternetService],
        'OnlineSecurity': [OnlineSecurity],
        'OnlineBackup': [OnlineBackup],
        'DeviceProtection': [DeviceProtection],
        'TechSupport': [TechSupport],
        'StreamingTV': [StreamingTV],
        'StreamingMovies': [StreamingMovies],
        'Contract': [Contract],
        'PaperlessBilling': [PaperlessBilling],
        'PaymentMethod': [PaymentMethod],
        'MonthlyCharges': [MonthlyCharges],
        'TotalCharges': [TotalCharges]
    })

    cat_cols = [col for col in input_df.columns if input_df[col].dtype == 'object']
    num_cols = [col for col in input_df.columns if input_df[col].dtype != 'object']

    X_processed = pipeline_churn.transform(input_df)

    cat_encoder = pipeline_churn.named_steps['preprocessor'].named_transformers_['cat'].named_steps['onehot']
    cat_feature_names = cat_encoder.get_feature_names_out(cat_cols)
    feature_names = num_cols + list(cat_feature_names)
    final_df = pd.DataFrame(X_processed, columns=feature_names)

    first_three_columns = final_df.iloc[:, :3]
    remaining_columns = final_df.iloc[:, 3:]
    final_df = pd.concat([remaining_columns, first_three_columns], axis=1)

    prediction_probs = model_churn.predict_proba(final_df)[0]
    return {
        "Prediction: CHURN 🔴": prediction_probs[1],
        "Prediction: STAY ✅": prediction_probs[0]
    }

# ---------------- Interface ---------------- #

with gr.Blocks() as app:
    with gr.Tab("Text Translator"):
        input_text = gr.Textbox(label="Enter text to translate")
        lang = gr.Textbox(label="Target language (e.g., Hindi, French)")
        output_text = gr.Textbox(label="Translated text")
        gr.Button("Translate").click(fn=text_translator, inputs=[input_text, lang], outputs=output_text)

    with gr.Tab("Sentiment Analysis"):
        gr.ChatInterface(sentiment_analysis)

    with gr.Tab("Financial Analyst"):
        audio_input = gr.Audio(source="microphone", type="filepath")
        text = gr.Textbox(label="Transcribed Text")
        gr.Button("Transcribe").click(fn=speech_to_text, inputs=audio_input, outputs=text)
        stext = gr.Textbox(label="Summary")
        gr.Button("Summarize").click(fn=summarize_text, inputs=text, outputs=stext)
        gr.Button("Financial Tone").click(fn=text_to_sentiment, inputs=stext, outputs=gr.Label())
        gr.Button("NER").click(fn=fin_ner, inputs=text, outputs=gr.HighlightedText())
        gr.Button("Tone per sentence").click(fn=fin_ext, inputs=text, outputs=gr.HighlightedText())
        gr.Button("Forward-looking").click(fn=fls, inputs=text, outputs=gr.HighlightedText())

    with gr.Tab("Personal Information Identifier"):
        pii_input = gr.Textbox(label="Enter text to analyze")
        pii_output = gr.Textbox(label="Detected Personal Info")
        gr.Button("Detect").click(fn=detect_personal_info, inputs=pii_input, outputs=pii_output)

    with gr.Tab("Customer Churn"):
        churn_inputs = [
            gr.Radio(['Yes', 'No'], label="SeniorCitizen"),
            gr.Radio(['Yes', 'No'], label="Partner"),
            gr.Radio(['No', 'Yes'], label="Dependents"),
            gr.Slider(1, 73, step=1, label="Tenure (Months)"),
            gr.Radio(['DSL', 'Fiber optic', 'No Internet'], label="InternetService"),
            gr.Radio(['No', 'Yes'], label="OnlineSecurity"),
            gr.Radio(['No', 'Yes'], label="OnlineBackup"),
            gr.Radio(['No', 'Yes'], label="DeviceProtection"),
            gr.Radio(['No', 'Yes'], label="TechSupport"),
            gr.Radio(['No', 'Yes'], label="StreamingTV"),
            gr.Radio(['No', 'Yes'], label="StreamingMovies"),
            gr.Radio(['Month-to-month', 'One year', 'Two year'], label="Contract"),
            gr.Radio(['Yes', 'No'], label="PaperlessBilling"),
            gr.Radio(['Electronic check', 'Mailed check', 'Bank transfer (automatic)', 'Credit card (automatic)'], label="PaymentMethod"),
            gr.Slider(18.40, 118.65, label="MonthlyCharges")
        ]
        churn_output = gr.Label(label="Churn Prediction")
        gr.Button("Predict").click(fn=predict_churn, inputs=churn_inputs, outputs=churn_output)

app.launch()