from transformers import BertTokenizer, BertForSequenceClassification
import torch
def analyze_financial_news(text, model_name='yiyanghkust/finbert-tone', num_labels=3):
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name, num_labels=num_labels)
inputs = tokenizer(text, return_tensors='pt', max_length=512, truncation=True, padding=True)
outputs = model(**inputs)
probs = torch.nn.functional.softmax(outputs.logits, dim=-1)
label = torch.argmax(probs, dim=-1).item()
return label
from transformers import BertTokenizer, BertForSequenceClassification
import torch
def classify_financial_text(text, model_name='bert-base-uncased', num_labels=3):
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name, num_labels=num_labels)
inputs = tokenizer(text, return_tensors='pt', max_length=512, truncation=True, padding=True)
outputs = model(**inputs)
probs = torch.nn.functional.softmax(outputs.logits, dim=-1)
label = torch.argmax(probs, dim=-1).item()
return label
import tkinter as tk
from tkinter import scrolledtext, messagebox
from transformers import BertTokenizer, BertForSequenceClassification
import torch
class FinancialNewsApp:
def __init__(self, root):
self.root = root
self.root.title("金融新闻情感分析助手")
self.model_name = 'yiyanghkust/finbert-tone'
self.tokenizer = BertTokenizer.from_pretrained(self.model_name)
self.model = BertForSequenceClassification.from_pretrained(self.model_name, num_labels=3)
self.create_widgets()
def create_widgets(self):
input_frame = tk.Frame(self.root, padx=10, pady=10)
input_frame.pack(fill="both", expand=True)
self.input_text = scrolledtext.ScrolledText(input_frame, width=60, height=10)
self.input_text.pack(pady=5, fill="both", expand=True)
btn_frame = tk.Frame(input_frame)
btn_frame.pack(pady=5)
tk.Button(btn_frame, text="开始分析", command=self.process_text).pack(side="left", padx=5)
tk.Button(btn_frame, text="清空", command=self.clear_text).pack(side="left", padx=5)
result_frame = tk.LabelFrame(self.root, text="分析结果", padx=10, pady=10)
result_frame.pack(fill="both", expand=False, padx=10, pady=5)
self.result_text = scrolledtext.ScrolledText(result_frame, width=60, height=5, state='disabled')
self.result_text.pack(pady=5, fill="both", expand=True)
def process_text(self):
text = self.input_text.get("1.0", tk.END).strip()
if not text:
messagebox.showwarning("提示", "请输入新闻文本")
return
try:
inputs = self.tokenizer(text, return_tensors='pt', max_length=512, truncation=True, padding=True)
with torch.no_grad():
outputs = self.model(**inputs)
probs = torch.nn.functional.softmax(outputs.logits, dim=-1)
label = torch.argmax(probs, dim=-1).item()
sentiment_map = {0: "负面", 1: "中性", 2: "正面"}
result = sentiment_map.get(label, "未知")
self.display_result(f"情感倾向:{result}\n置信度:{probs[0][label].item():.4f}")
except Exception as e:
messagebox.showerror("错误", f"处理失败:{str(e)}")
def display_result(self, content):
self.result_text.config(state='normal')
self.result_text.delete("1.0", tk.END)
self.result_text.insert(tk.END, content)
self.result_text.config(state='disabled')
def clear_text(self):
self.input_text.delete("1.0", tk.END)
self.result_text.config(state='normal')
self.result_text.delete("1.0", tk.END)
self.result_text.config(state='disabled')
if __name__ == "__main__":
root = tk.Tk()
app = FinancialNewsApp(root)
root.mainloop()