File size: 3,527 Bytes
3e90f7a
 
 
 
0c5d74c
3e90f7a
 
7949a24
93a06de
0c5d74c
 
 
93a06de
 
 
f43468a
 
 
93a06de
f43468a
0c5d74c
93a06de
03aee50
 
7949a24
13e78d2
0c5d74c
f43468a
 
 
93a06de
0c5d74c
3e90f7a
 
 
93a06de
3e90f7a
93a06de
3e90f7a
b1d5984
93a06de
f43468a
 
93a06de
 
 
 
f43468a
 
93a06de
 
 
 
 
 
 
f43468a
 
 
93a06de
 
 
f43468a
 
 
 
93a06de
 
 
 
 
 
 
 
 
f43468a
93a06de
f43468a
 
93a06de
3e90f7a
0c5d74c
93a06de
3e90f7a
 
 
93a06de
3e90f7a
93a06de
3e90f7a
93a06de
3e90f7a
 
0c5d74c
3e90f7a
93a06de
 
 
 
 
 
 
0c5d74c
93a06de
 
 
 
 
0c5d74c
3e90f7a
 
7949a24
3e90f7a
93a06de
7949a24
3e90f7a
0c5d74c
3e90f7a
93a06de
 
 
 
3e90f7a
93a06de
 
 
 
 
3e90f7a
 
 
 
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
import gradio as gr
import spaces
import torch
from peft import PeftModel
import os


from transformers import AutoModel, AutoTokenizer
from transformers.generation.utils import GenerationConfig
# 获取HF token(Spaces会自动提供)
hf_token = os.environ.get("HF_TOKEN") or os.environ.get("HUGGING_FACE_HUB_TOKEN")

print("=" * 50)
print("开始加载FinGPT情感分析模型...")
print("=" * 50)

model = None
tokenizer = None
device = None

try:

    # Load model directly
    model = AutoModel.from_pretrained("Go4miii/DISC-FinLLM", trust_remote_code=True, dtype="auto")
    tokenizer = AutoTokenizer.from_pretrained("Go4miii/DISC-FinLLM", use_fast=False, trust_remote_code=True)

except Exception as e:
    print("\n" + "=" * 50)
    print("❌ 模型加载失败!")
    print(f"错误信息: {e}")
    print("=" * 50)
    raise


@spaces.GPU
def analyze_sentiment(news_text):
    """
    分析金融新闻的情感倾向
    """
    if model is None or tokenizer is None:
        return "❌ 模型未正确加载,请检查Spaces日志。"

    try:
        # 构建prompt(按照FinGPT的格式)
        prompt = f'''Instruction: What is the sentiment of this news? Please choose an answer from {{negative/neutral/positive}}
Input: {news_text}
Answer: '''

        # 编码输入
        tokens = tokenizer(
            prompt,
            return_tensors='pt',
            padding=True,
            max_length=512,
            truncation=True
        ).to(device)

        # 生成响应
        with torch.no_grad():
            res = model.generate(
                **tokens,
                max_length=512,
                pad_token_id=tokenizer.eos_token_id
            )

        # 解码输出
        res_sentence = tokenizer.decode(res[0], skip_special_tokens=True)

        # 提取答案
        if "Answer: " in res_sentence:
            sentiment = res_sentence.split("Answer: ")[1].strip()
            # 清理多余的换行和空格
            sentiment = sentiment.split('\n')[0].strip()
        else:
            sentiment = res_sentence

        return sentiment

    except Exception as e:
        return f"❌ 分析出错: {str(e)}"


# 创建Gradio界面
with gr.Blocks(theme=gr.themes.Soft()) as demo:
    gr.Markdown(
        """
        # 📊 FinGPT 金融新闻情感分析
        
        基于 **FinGPT/fingpt-mt_llama3-8b_lora** 模型的金融新闻情感分析工具。
        
        输入金融新闻文本,AI将分析其情感倾向:**positive(积极)** / **neutral(中性)** / **negative(消极)**
        """
    )

    with gr.Row():
        with gr.Column():
            news_input = gr.Textbox(
                label="📰 输入金融新闻",
                placeholder="粘贴或输入金融新闻内容...",
                lines=6
            )
            analyze_btn = gr.Button("🔍 分析情感", variant="primary", size="lg")

        with gr.Column():
            sentiment_output = gr.Textbox(
                label="😊 情感分析结果",
                lines=2
            )

    gr.Examples(
        examples=[
            "什么是不良资产",
        ],
        inputs=news_input,
        label="📋 示例"
    )

    # 事件处理
    analyze_btn.click(
        fn=analyze_sentiment,
        inputs=news_input,
        outputs=sentiment_output
    )

    news_input.submit(
        fn=analyze_sentiment,
        inputs=news_input,
        outputs=sentiment_output
    )

if __name__ == "__main__":
    demo.launch()