File size: 3,166 Bytes
476eb00
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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

import gradio as gr
import sys
import os

# 将项目根目录加入路径,以便能以包的形式导入 src
current_dir = os.path.dirname(os.path.abspath(__file__))
project_root = os.path.dirname(current_dir)
sys.path.append(project_root)

from src.predict import SentimentPredictor

# 初始化预测器
try:
    predictor = SentimentPredictor()
    print("模型加载成功!")
except Exception as e:
    print(f"模型加载失败 (可能需要先运行训练): {e}")
    # Fallback mock for demo UI preview
    class MockPredictor:
        def predict(self, text):
            return {'sentiment': 'neutral', 'confidence': 0.0}
    predictor = MockPredictor()

def analyze_sentiment(text):
    if not text.strip():
        return "请输入只有效的文本。", "N/A"
        
    result = predictor.predict(text)
    
    # 转换为友好显示
    label_map = {
        'positive': '😊 积极 (Positive)', 
        'neutral': '😐 中性 (Neutral)', 
        'negative': '😡 消极 (Negative)'
    }
    
    friendly_label = label_map.get(result['sentiment'], result['sentiment'])
    confidence_score = float(result['confidence'])
    
    # 返回: 
    # 1. 标签概率字典 (用于 Label 组件)
    # 2. 文本详细结果
    return {
        '积极': confidence_score if result['sentiment'] == 'positive' else 0.0,
        '中性': confidence_score if result['sentiment'] == 'neutral' else 0.0,
        '消极': confidence_score if result['sentiment'] == 'negative' else 0.0
    }, f"预测结果: {friendly_label}\n置信度: {confidence_score:.4f}"

# 构建 Gradio 界面
with gr.Blocks(title="中文情感分析演示") as demo:
    gr.Markdown("# 🎭 中文情感分析 AI")
    gr.Markdown("输入一段中文文本,模型将判断其情感倾向 (积极/消极/中性)。")
    
    with gr.Row():
        with gr.Column():
            input_text = gr.Textbox(
                label="输入文本", 
                placeholder="例如:这家餐厅真的太好吃了,强烈推荐!",
                lines=5
            )
            analyze_btn = gr.Button("开始分析", variant="primary")
            
        with gr.Column():
            res_label = gr.Label(label="情感概率", num_top_classes=3)
            res_text = gr.Textbox(label="详细结果")
            
    # 示例
    gr.Examples(
        examples=[
            ["这就去把差评改了!"],
            ["物流太慢了,而且东西也是坏的,非常失望。"],
            ["如果不看价格的话,确实是不错的产品。"],
            ["今天天气真不错。"]
        ],
        inputs=input_text
    )
    
    analyze_btn.click(
        fn=analyze_sentiment,
        inputs=input_text,
        outputs=[res_label, res_text]
    )

if __name__ == "__main__":
    # Gradio 6.0+ 建议将 theme 放在 launch 中,或者 Blocks 中(警告说 moved to launch? 通常是 Block 构造参数)
    # 但实际 Gradio 版本不同可能有差异。
    # 根据用户报错 "The parameters have been moved ... to the launch() method ...: theme"
    # 我们听从报错建议。
    demo.launch(theme=gr.themes.Soft())