File size: 6,605 Bytes
cf957e4
 
 
 
e02eeb5
cf957e4
 
 
cfb0d15
cf957e4
 
 
 
 
cfb0d15
cf957e4
 
cfb0d15
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cf957e4
 
 
 
 
 
cfb0d15
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cf957e4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""
Main application file for the Emoji Mashup app.
This module handles the Gradio interface and application setup.
"""

import gradio as gr
from utils import logger
from emoji_processor import EmojiProcessor
from config import EMBEDDING_MODELS

class EmojiMashupApp:
    def __init__(self):
        """Initialize the Gradio application."""
        logger.info("Initializing Emoji Mashup App")
        self.processor = EmojiProcessor(model_key="mpnet", use_cached_embeddings=True)  # Default to mpnet
        self.processor.load_emoji_dictionaries()
        
    def create_model_dropdown_choices(self):
        """Create formatted choices for the model dropdown.
        
        Returns:
            List of formatted model choices
        """
        return [
            f"{key} ({info['size']}) - {info['notes']}" 
            for key, info in EMBEDDING_MODELS.items()
        ]
        
    def handle_model_change(self, dropdown_value, use_cached_embeddings):
        """Handle model selection change from dropdown.
        
        Args:
            dropdown_value: Selected value from dropdown
            use_cached_embeddings: Whether to use cached embeddings
            
        Returns:
            Status message about model change
        """
        # Extract model key from dropdown value (first word before space)
        model_key = dropdown_value.split()[0] if dropdown_value else "mpnet"
        
        # Update processor cache setting
        self.processor.use_cached_embeddings = use_cached_embeddings
        
        if model_key in EMBEDDING_MODELS:
            success = self.processor.switch_model(model_key)
            if success:
                cache_status = "using cached embeddings" if use_cached_embeddings else "computing fresh embeddings"
                return f"Switched to {model_key} model ({cache_status}): {EMBEDDING_MODELS[model_key]['notes']}"
            else:
                return f"Failed to switch to {model_key} model"
        else:
            return f"Unknown model: {model_key}"
            
    def process_with_model(self, model_selection, text, use_cached_embeddings):
        """Process text with selected model.
        
        Args:
            model_selection: Selected model from dropdown
            text: User input text
            use_cached_embeddings: Whether to use cached embeddings
            
        Returns:
            Tuple of (emotion emoji, event emoji, mashup image)
        """
        # Extract model key from dropdown value (first word before space)
        model_key = model_selection.split()[0] if model_selection else "mpnet"
        
        # Update processor cache setting
        self.processor.use_cached_embeddings = use_cached_embeddings
        
        if model_key in EMBEDDING_MODELS:
            self.processor.switch_model(model_key)
            
        # Process text with current model
        return self.processor.sentence_to_emojis(text)
        
    def create_interface(self):
        """Create and configure the Gradio interface.
        
        Returns:
            Gradio Interface object
        """
        with gr.Blocks(title="Sentence → Emoji Mashup") as interface:
            gr.Markdown("# Sentence → Emoji Mashup")
            gr.Markdown("Get the top emotion and event emoji from your sentence, and view the mashup!")
            
            with gr.Row():
                with gr.Column(scale=3):
                    # Model selection dropdown
                    model_dropdown = gr.Dropdown(
                        choices=self.create_model_dropdown_choices(),
                        value=self.create_model_dropdown_choices()[0],  # Default to first model (mpnet)
                        label="Embedding Model",
                        info="Select the model used for text-emoji matching"
                    )
                    
                    # Cache toggle
                    cache_toggle = gr.Checkbox(
                        label="Use cached embeddings",
                        value=True,
                        info="When enabled, embeddings will be saved to and loaded from disk"
                    )
                    
                    # Text input
                    text_input = gr.Textbox(
                        lines=2, 
                        placeholder="Type a sentence...",
                        label="Your message"
                    )
                    
                    # Process button
                    submit_btn = gr.Button("Generate Emoji Mashup", variant="primary")
                
                with gr.Column(scale=2):
                    # Model info display
                    model_info = gr.Textbox(
                        value=f"Using mpnet model (using cached embeddings): {EMBEDDING_MODELS['mpnet']['notes']}",
                        label="Model Info", 
                        interactive=False
                    )
                    
                    # Output displays
                    emotion_out = gr.Text(label="Top Emotion Emoji")
                    event_out = gr.Text(label="Top Event Emoji")
                    mashup_out = gr.Image(label="Mashup Emoji")
            
            # Set up event handlers
            model_dropdown.change(
                fn=self.handle_model_change,
                inputs=[model_dropdown, cache_toggle],
                outputs=[model_info]
            )
            
            cache_toggle.change(
                fn=self.handle_model_change,
                inputs=[model_dropdown, cache_toggle],
                outputs=[model_info]
            )
            
            submit_btn.click(
                fn=self.process_with_model,
                inputs=[model_dropdown, text_input, cache_toggle],
                outputs=[emotion_out, event_out, mashup_out]
            )
            
            # Examples
            gr.Examples(
                examples=[
                    ["I feel so happy today!"],
                    ["I'm really angry right now"],
                    ["Feeling tired after a long day"]
                ],
                inputs=text_input
            )
            
        return interface
        
    def run(self, share=True):
        """Launch the Gradio application.
        
        Args:
            share: Whether to create a public sharing link
        """
        logger.info("Starting Emoji Mashup App")
        interface = self.create_interface()
        interface.launch(share=share)


# Main entry point
if __name__ == "__main__":
    app = EmojiMashupApp()
    app.run(share=True)