bert-finance-sentiment / utils /data_loader.py
nuomifan666
Deploy BERT financial sentiment analysis
7430940
Raw
History Blame Contribute Delete
3.96 kB
"""
数据加载工具 - 加载和处理金融新闻数据
"""
import os
import json
import random
import pandas as pd
import numpy as np
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
def load_local_data():
"""加载本地数据集"""
filepath = os.path.join(BASE_DIR, 'train_test_data.xlsx')
if not os.path.exists(filepath):
return None, None
io = pd.io.excel.ExcelFile(filepath)
train_raw = pd.read_excel(io, sheet_name='train')
test_raw = pd.read_excel(io, sheet_name='test')
io.close()
df = pd.concat([train_raw, test_raw], ignore_index=True)
# 只保留需要的列
if 'comment' in df.columns and 'sentiment' in df.columns:
df = df[['comment', 'sentiment']]
return df, df['comment'].tolist()
def get_data_statistics():
"""获取数据集统计信息"""
df, _ = load_local_data()
if df is None:
return {}
total = len(df)
positive = int(df['sentiment'].sum())
negative = total - positive
# 文本长度分布
lengths = df['comment'].str.len()
length_bins = [0, 20, 40, 60, 80, 100, 150, 200, 500]
length_labels = ['0-20', '21-40', '41-60', '61-80', '81-100', '101-150', '151-200', '200+']
length_dist = pd.cut(lengths, bins=length_bins, labels=length_labels).value_counts().sort_index()
return {
'total': total,
'positive': positive,
'negative': negative,
'positive_ratio': round(positive / total * 100, 1),
'negative_ratio': round(negative / total * 100, 1),
'avg_length': round(float(lengths.mean()), 1),
'max_length': int(lengths.max()),
'min_length': int(lengths.min()),
'length_distribution': {
'labels': length_dist.index.tolist(),
'values': length_dist.values.tolist(),
},
}
def get_sample_data(n=20):
"""获取随机样本数据用于展示"""
df, _ = load_local_data()
if df is None:
return []
samples = df.sample(min(n, len(df))).to_dict('records')
return samples
def get_model_metadata():
"""获取模型训练元数据"""
metadata_path = os.path.join(BASE_DIR, 'model', 'results', 'metadata.json')
if not os.path.exists(metadata_path):
return {}
with open(metadata_path, 'r', encoding='utf-8') as f:
return json.load(f)
def get_training_history():
"""获取训练历史数据"""
result_path = os.path.join(BASE_DIR, 'result.txt')
if not os.path.exists(result_path):
return []
with open(result_path, 'r') as f:
data = f.readlines()
accuracy, macro_f1, weighted_f1 = [], [], []
macro_precision, macro_recall = [], []
weighted_precision, weighted_recall = [], []
for line in data:
if 'accuracy' in line:
accuracy.append(float(line.split()[1]))
elif 'macro avg' in line:
parts = line.split()
macro_precision.append(float(parts[2]))
macro_recall.append(float(parts[3]))
macro_f1.append(float(parts[4]))
elif 'weighted avg' in line:
parts = line.split()
weighted_precision.append(float(parts[2]))
weighted_recall.append(float(parts[3]))
weighted_f1.append(float(parts[4]))
history = []
for i in range(len(accuracy)):
history.append({
'iteration': i + 1,
'accuracy': accuracy[i],
'macro_precision': macro_precision[i] if i < len(macro_precision) else 0,
'macro_recall': macro_recall[i] if i < len(macro_recall) else 0,
'macro_f1': macro_f1[i] if i < len(macro_f1) else 0,
'weighted_precision': weighted_precision[i] if i < len(weighted_precision) else 0,
'weighted_recall': weighted_recall[i] if i < len(weighted_recall) else 0,
'weighted_f1': weighted_f1[i] if i < len(weighted_f1) else 0,
})
return history