import gradio as gr from transformers import pipeline # 创建分类器 classifier = pipeline("text-classification", model="WJL110/emotion-classifier") # 标签映射 label_map = { "LABEL_0": "快乐", "LABEL_1": "愤怒", "LABEL_2": "悲伤" } def analyze_emotion(text): """ 对输入文本进行情感分析 """ if not text.strip(): return "请输入要分析的文本", None, None result = classifier(text)[0] # 获取第一个(也是唯一的)结果 emotion = label_map[result['label']] confidence = result['score'] # 根据情感类型返回不同的颜色 if emotion == "快乐": color = "#4CAF50" # 绿色 elif emotion == "愤怒": color = "#F44336" # 红色 else: # 悲伤 color = "#2196F3" # 蓝色 return f"预测情感: {emotion}", f"置信度: {confidence:.2%}", color def analyze_emotion_with_history(text, history): """ 带有历史记录的情感分析函数 """ result_text, confidence_text, color = analyze_emotion(text) # 更新历史记录 history.append((text, f"{result_text}\n{confidence_text}")) return history, history # 创建Gradio界面 with gr.Blocks(title="情感分析应用", theme=gr.themes.Soft()) as demo: gr.Markdown("# 🎭 情感分析应用") gr.Markdown("输入文本,AI将分析其情感倾向(快乐、愤怒或悲伤)") with gr.Row(): with gr.Column(scale=2): # 输入区域 text_input = gr.Textbox( label="输入要分析的文本", placeholder="请输入您想要分析情感的文本...", lines=4, max_lines=10 ) # 按钮 with gr.Row(): analyze_btn = gr.Button("🔍 分析情感", variant="primary") clear_btn = gr.Button("🗑️ 清空", variant="secondary") with gr.Column(scale=2): # 输出区域 result_text = gr.Textbox( label="分析结果", lines=2, interactive=False ) # 情感标签显示 sentiment_label = gr.Label( label="情感分类", value=[{"label": "请输入文本并点击分析按钮", "confidence": 0}] ) # 历史记录 gr.Markdown("### 📜 历史记录") chatbot = gr.Chatbot( label="分析历史", height=300 ) # 示例文本 gr.Markdown("### 📝 示例文本") # 创建示例分类标签页 with gr.Tabs(): # 基础示例 with gr.TabItem("基础示例"): basic_examples = gr.Examples( examples=( "今天真是太开心了!", "这件事让我很生气。", "听到这个消息很难过。", "我收到了一份意外的礼物,感到非常惊喜和快乐!", "排队排了这么久,服务还这么差,真是令人愤怒!", "我的宠物离开了我,我感到非常悲伤和孤独。" ), inputs=text_input, cache_examples=False ) # 复杂示例 - 快乐 with gr.TabItem("复杂示例 - 快乐"): happy_examples = gr.Examples( examples=( "当我看到女儿在毕业典礼上作为优秀毕业生代表发言时,她的声音虽然有些颤抖但坚定有力,我的眼眶不由自主地湿润了。十八年的养育,从蹒跚学步到如今亭亭玉立,所有的辛苦在这一刻都化作了无法言喻的欣慰与自豪。", "当我收到大学录取通知书时,激动得跳了起来,但随即又感到一丝不安。我知道这意味着我将离开家人,独自面对陌生的环境和挑战。这种既期待又恐惧的心情让我彻夜难眠。", "刚开始看到他忘记了我们的纪念日,我感到有些失落。但当他晚上给我一个惊喜的烛光晚餐,并拿出准备已久的礼物时,那份失落感瞬间被巨大的幸福感所取代,我甚至感动得流下了眼泪。", "经过三年的努力,我们终于还清了所有债务。今天,当我把最后一张支票寄出去时,看着窗外明媚的阳光,我深深地吸了一口气,感觉肩上的重担终于卸了下来。" ), inputs=text_input, cache_examples=False ) # 复杂示例 - 愤怒 with gr.TabItem("复杂示例 - 愤怒"): angry_examples = gr.Examples( examples=( "当我发现自己精心准备了三个月的项目方案被同事占为己有,并且在领导面前装作是他自己的创意时,一股难以遏制的怒火从心底喷涌而出。这种背叛比项目失败本身更让我感到愤怒和失望。", "公司宣布裁员名单时,我既感到愤怒又有些庆幸。愤怒的是公司如此无情地对待为其效力多年的员工,庆幸的是自己不在裁员名单中。这种矛盾的心情让我感到既内疚又不安。", "会议开始时,我还能保持冷静地听取不同意见。但当有人开始质疑我的专业能力,并歪曲我的观点时,我感到血液逐渐涌上头顶,从最初的不悦逐渐升级为无法控制的愤怒。", "真是太好了!我的笔记本电脑在我准备提交重要项目的前一天突然崩溃了,所有的数据都没有备份。看来我这个月的努力又要白费了,这真是太棒了!" ), inputs=text_input, cache_examples=False ) # 复杂示例 - 悲伤 with gr.TabItem("复杂示例 - 悲伤"): sad_examples = gr.Examples( examples=( "整理母亲遗物时,我发现了一本她的日记,里面记录着她对我们子女的牵挂和担忧,即使在她病重的最后日子里,字里行间依然充满了对生活的热爱。看着那些熟悉的字迹,我仿佛又听到了她温柔的叮嘱,泪水无声地滑落。", "得知多年未见的好友突然去世的消息,我愣住了。我们曾经一起度过了人生中最美好的青春岁月,那些欢声笑语仿佛还在耳边回响。虽然知道人终有一死,但当这一刻真的来临时,心中还是充满了无法言说的悲伤和遗憾。", "接到医院电话时,我只是有些担心。但当医生告诉我检查结果,说情况比预想的要严重得多时,我的心一下子沉了下去,从担忧变成了深深的恐惧和绝望。", "今天路过那家我们曾经经常光顾的咖啡馆,看到熟悉的靠窗座位空着,我不由自主地停下了脚步。物是人非,那些曾经的美好时光如今只剩下回忆,心中涌起一股难以言喻的酸楚。" ), inputs=text_input, cache_examples=False ) # 极高复杂度示例 with gr.TabItem("极高复杂度示例"): extreme_examples = gr.Examples( examples=( "在父亲的葬礼上,我看到他生前最爱的向日葵开得正盛,那是他亲手种下的。阳光透过教堂的彩色玻璃窗洒进来,照亮了他微笑的遗像。我感到一阵难以言喻的悲伤,却又在这悲伤中感受到一丝温暖和力量。", "当我得知自己获得了梦寐以求的职位时,激动得几乎要哭出来。但想到要离开现在的团队和熟悉的环境,心中又涌起一股莫名的伤感。这种既兴奋又不舍的心情让我百感交集。", "看到他对我撒谎的证据,我感到一阵眩晕。愤怒、失望、背叛感、还有一丝难以置信,这些情绪在我心中交织,让我几乎无法呼吸。我想大声质问他,却又感到一种深深的无力感。", "她只是淡淡地说了一句'祝你幸福',然后转身离开。我看着她渐行渐远的背影,心里空落落的,好像失去了什么重要的东西,却又说不清楚具体是什么。" ), inputs=text_input, cache_examples=False ) # 绑定事件 analyze_btn.click( fn=analyze_emotion, inputs=text_input, outputs=[result_text, sentiment_label] ) # 清空按钮事件 clear_btn.click( fn=lambda: ("", [{"label": "请输入文本并点击分析按钮", "confidence": 0}], []), outputs=[text_input, sentiment_label, chatbot] ) # 回车键触发分析 text_input.submit( fn=analyze_emotion, inputs=text_input, outputs=[result_text, sentiment_label] ) # 历史记录更新 analyze_btn.click( fn=analyze_emotion_with_history, inputs=[text_input, chatbot], outputs=[chatbot, chatbot] ) text_input.submit( fn=analyze_emotion_with_history, inputs=[text_input, chatbot], outputs=[chatbot, chatbot] ) if __name__ == "__main__": demo.launch()