File size: 5,520 Bytes
6ea987b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
from transformers import pipeline
import json
import time
from datetime import datetime
import os

class AdaptiveUI:
    def __init__(self):
        self.sentiment_model = pipeline("sentiment-analysis")
        self.preferences_file = "user_preferences.json"
        self.load_preferences()
        
    def load_preferences(self):
        if os.path.exists(self.preferences_file):
            with open(self.preferences_file, 'r') as f:
                self.preferences = json.load(f)
        else:
            self.preferences = {
                'usage_count': 0,
                'avg_text_length': 100,
                'advanced_mode_uses': 0,
                'last_layout': 'simple',
                'common_features': set(),
                'last_used': None
            }
            
    def save_preferences(self):
        # Convert set to list for JSON serialization
        prefs_to_save = self.preferences.copy()
        prefs_to_save['common_features'] = list(self.preferences['common_features'])
        with open(self.preferences_file, 'w') as f:
            json.dump(prefs_to_save, f)

    def should_show_advanced(self):
        return self.preferences['usage_count'] > 5 or self.preferences['advanced_mode_uses'] > 2

    def update_preferences(self, text_length, used_features):
        self.preferences['usage_count'] += 1
        self.preferences['avg_text_length'] = (
            (self.preferences['avg_text_length'] * (self.preferences['usage_count'] - 1) + text_length)
            / self.preferences['usage_count']
        )
        if 'advanced' in used_features:
            self.preferences['advanced_mode_uses'] += 1
        self.preferences['common_features'].update(used_features)
        self.preferences['last_used'] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        self.save_preferences()

    def analyze(self, text, show_advanced):
        # Update usage patterns
        self.update_preferences(len(text), {'advanced'} if show_advanced else {'basic'})
        
        # Get sentiment analysis
        result = self.sentiment_model(text)[0]
        
        # Determine interface adaptations
        adaptations = []
        
        # Adapt based on text length
        if len(text) > self.preferences['avg_text_length'] * 1.5:
            adaptations.append("Expanded text area for longer inputs")
        elif len(text) < self.preferences['avg_text_length'] * 0.5:
            adaptations.append("Compact text area for brief inputs")
            
        # Adapt based on usage frequency
        if self.preferences['usage_count'] > 10:
            adaptations.append("Advanced features unlocked")
        
        # Adapt based on time of day
        current_hour = datetime.now().hour
        if current_hour >= 20 or current_hour <= 6:
            adaptations.append("Night mode activated")
            
        return {
            'sentiment': result['label'],
            'confidence': f"{result['score']:.2%}",
            'adaptations': "\n".join(adaptations),
            'show_advanced': self.should_show_advanced(),
            'input_size': 'large' if self.preferences['avg_text_length'] > 150 else 'normal'
        }

def create_interface():
    ui = AdaptiveUI()
    
    with gr.Blocks(theme=gr.themes.Soft()) as interface:
        gr.Markdown("# Adaptive Sentiment Analysis")
        
        # Input Section
        with gr.Row():
            with gr.Column(scale=2):
                text_input = gr.Textbox(
                    label="Enter Text",
                    placeholder=f"Suggested length: {int(ui.preferences['avg_text_length'])} characters",
                    lines=4 if ui.preferences['avg_text_length'] > 150 else 2
                )
                show_advanced = gr.Checkbox(
                    label="Advanced Mode",
                    value=ui.should_show_advanced(),
                    visible=ui.preferences['usage_count'] > 5
                )
                analyze_btn = gr.Button("Analyze Text")
        
            # Output Section
            with gr.Column(scale=2):
                sentiment_output = gr.Label(label="Sentiment")
                with gr.Group(visible=False) as advanced_group:
                    confidence_output = gr.Label(label="Confidence")
                    adaptations_output = gr.Textbox(
                        label="Interface Adaptations",
                        lines=3
                    )

        def process_text(text, show_adv):
            result = ui.analyze(text, show_adv)
            
            # Update interface based on adaptations
            return {
                sentiment_output: result['sentiment'],
                confidence_output: result['confidence'],
                adaptations_output: result['adaptations'],
                advanced_group: gr.Group(visible=show_adv),
                text_input: gr.Textbox(lines=4 if result['input_size'] == 'large' else 2),
                show_advanced: gr.Checkbox(visible=result['show_advanced'])
            }

        # Event handlers
        analyze_btn.click(
            fn=process_text,
            inputs=[text_input, show_advanced],
            outputs=[
                sentiment_output,
                confidence_output,
                adaptations_output,
                advanced_group,
                text_input,
                show_advanced
            ]
        )

    return interface

# Launch the app
if __name__ == "__main__":
    demo = create_interface()
    demo.launch()