Spaces:
Sleeping
Sleeping
| # emotion_core.py | |
| # Lightweight sentiment + arousal + trait inferences (no external deps) | |
| import re | |
| _POS = { | |
| "love","like","enjoy","great","good","amazing","excited","confident","proud","win", | |
| "focus","focused","progress","grow","learning","curious","optimistic","strong","ready", | |
| "grateful","hyped","calm","peace","solid","clear","vision","hungry","ambitious" | |
| } | |
| _NEG = { | |
| "hate","dislike","bad","terrible","awful","sad","angry","upset","lost","stuck", | |
| "tired","worried","anxious","stress","stressed","fail","failure","confused","quit", | |
| "overwhelmed","mad","frustrated" | |
| } | |
| _AROUSAL_UP = { | |
| "hyped","excited","now","today","urgent","fast","go","run","grind","push","shipping", | |
| "launch","win","attack","dominate","scale" | |
| } | |
| _AROUSAL_DOWN = {"calm","slow","reflect","breathe","steady","patient","peace","chill"} | |
| TRAIT_MAP = { | |
| "ambition": {"keywords": {"ambitious","billionaire","build","empire","dominate","scale","win","grind","goal"}, "pos": +2, "neg": -1}, | |
| "optimism": {"keywords": {"optimistic","confident","great","good","amazing","believe","can","possible"}, "pos": +2, "neg": -2}, | |
| "resilience": {"keywords": {"again","retry","keep","persist","bounce","comeback","despite","even if"}, "pos": +2, "neg": 0}, | |
| "focus": {"keywords": {"focus","focused","discipline","plan","system","consistent","daily"}, "pos": +2, "neg": -1}, | |
| "curiosity": {"keywords": {"curious","learn","why","how","explore","research","test"}, "pos": +2, "neg": 0}, | |
| "calm": {"keywords": {"calm","steady","patient","peace","collected"}, "pos": +2, "neg": -2}, | |
| } | |
| def _tokens(text: str): | |
| return set(re.findall(r"[a-zA-Z']+", text.lower())) | |
| class EmotionAnalyzer: | |
| def analyze(self, text: str): | |
| toks = _tokens(text) | |
| pos_hits = len(toks & _POS) | |
| neg_hits = len(toks & _NEG) | |
| raw = pos_hits - neg_hits | |
| # sentiment in [-1,1] | |
| sentiment = 0.0 | |
| if raw != 0: | |
| sentiment = max(-1.0, min(1.0, raw / 5.0)) | |
| # arousal in [0,1] | |
| arousal = 0.5 | |
| up = len(toks & _AROUSAL_UP) | |
| down = len(toks & _AROUSAL_DOWN) | |
| arousal = max(0.0, min(1.0, 0.5 + 0.15 * (up - down))) | |
| # tags | |
| tags = [] | |
| if sentiment > 0.25: tags.append("positive") | |
| if sentiment < -0.25: tags.append("negative") | |
| if arousal >= 0.65: tags.append("high-energy") | |
| if arousal <= 0.35: tags.append("low-energy") | |
| # trait deltas | |
| trait_deltas = {} | |
| for trait, spec in TRAIT_MAP.items(): | |
| found = any(k in toks for k in spec["keywords"]) | |
| if found: | |
| trait_deltas[trait] = spec["pos"] | |
| elif sentiment < -0.4 and trait in ("optimism","calm","focus"): | |
| trait_deltas[trait] = spec["neg"] | |
| return { | |
| "sentiment": sentiment, | |
| "arousal": arousal, | |
| "tags": tags, | |
| "trait_deltas": trait_deltas | |
| } | |