金融中的情感分析是了解市场趋势和投资者行为的有力工具。但是,由于其复杂性和细微差别,一般的情感分析模型通常不足于财务文本。该项目通过微调的轻量级语言模型进行微调GPT-4O Mini提出了解决方案。通过利用TRC2数据集,这是专家模特Finbert标记的路透社财务新闻文章的集合,我们旨在增强GPT-4O MINI捕捉财务情感细微差别的能力。
该项目为财务情感分析提供了一种有效且可扩展的方法,为更细微的基于情感的金融分析打开了大门。到最后,我们证明了GPT-4O Mini用特定于领域的数据进行微调时,可以作为在财务环境中像Finbert这样更复杂模型的可行替代品。
本文作为数据科学博客马拉松的一部分发表。
对于此项目,我们使用TRC2(TREC REUTERS COPUS,第2卷)数据集,该数据集是路透社策划并通过国家标准技术研究所(NIST)提供的财务新闻文章的集合。 TRC2数据集包括路透社财务新闻文章的全面选择,该文章由于其广泛的覆盖范围和与财务事件的相关性而经常用于金融语言模型。
为了获得TRC2数据集,研究人员和组织需要通过NIST要求访问。该数据集可在NIST TREC REUTERS COPUS上获得,该数据集提供了有关许可和使用协议的详细信息。您将需要:
获得数据集后,预处理并将其细分为句子进行情感分析,从而使您可以应用Finbert生成专家标记的情感类别。
通过芬伯特(Finbert)得出的情感标签的微调gpt-4o mini的方法,包括以下主要步骤:
为了创建微型数据集,我们利用了在金融领域预先培训的金融语言模型Finbert。我们将Finbert应用于TRC2数据集中的每个句子,从而在三个类别中生成专家情绪标签:正,负和中性。此过程产生一个标记的数据集,其中TRC2的每个句子都与情感相关联,从而为培训具有可靠标签的GPT-4O Mini提供了基础。
然后将标记的数据进行预处理并格式化为适合OpenAI的微调API的JSONL结构。我们使用以下结构将每个数据点格式化:
标记后,我们执行其他预处理步骤,例如将标签转换为小写以保持一致性并分层数据以确保平衡标签表示。我们还将数据集分为培训和验证集,保留80%的数据进行培训和20%的验证,这有助于评估模型的概括能力。
使用OpenAI的微调API,我们将使用预先标记的数据集微调GPT-4O mini。精细调整设置(例如学习率,批处理大小和时期数量)被优化,以在模型准确性和概括性之间达到平衡。该过程使GPT-4O Mini能够从特定于领域的数据中学习,并提高其在财务情感分析任务上的绩效。
训练后,使用常见的情绪分析指标(如准确性和F1得分)评估了模型的性能,从而可以直接比较Finbert在相同数据上的性能。这种基准测试表明,GPT-4O Mini在金融领域内的情感分类如何概括,并确认它是否能够始终如一地超过Finbert的准确性。
在确认出色的绩效后,GPT-4O Mini准备在现实世界中的财务应用中部署,例如市场分析,投资咨询和自动新闻情感跟踪。这种微调模型为更复杂的财务模型提供了有效的替代方法,提供了适合集成到金融系统的强大,可扩展的情感分析功能。
如果您想学习情感分析的基础知识,请使用Python查看有关情感分析的文章!
遵循这种结构化的逐步方法,无缝浏览过程的每个阶段。无论您是初学者还是经验丰富,本指南都可以确保从头到尾的清晰度和成功实施。
加载所需的库并配置环境。
从变形金刚导入自动驱动器,AutomoDelforSequenceceCecrification 导入火炬 导入大熊猫作为pd 从TQDM导入TQDM tokenizer = autotokenizer.from_pretaining(“ prosusai/finbert”) 型号= automodelforSequencececrification.from_pretrated(“ prosusai/finbert”) 设备= torch.device('cuda'如果torch.cuda.is_available()else'cpu') 型号(设备)
def get_sentiment(文本): 输入= tokenizer(text,return_tensors =“ pt”,truncation = true,max_length = 512).to(device) 使用Torch.no_grad(): 输出=模型(**输入) logits = outputs.logits 情感= torch.argmax(logits,dim = 1).Item() sentiment_label = [“正”,“负”,“中性”] [情感] 返回情感_label
您必须仔细预处理TRC2数据集,以仅保留相关句子进行微调。以下步骤概述了如何从TRC2数据集中读取,清洁,拆分和过滤数据。
考虑到不披露的限制,本节提供了使用Pseudocode的数据预处理工作流的高级概述。
#从文件加载压缩数据集 打开compressed_file作为文件: #将文件的内容读取到内存中 data = read_file(文件) #提取每个文档的相关部分 对于数据中的每个文档: 提取document_id 提取日期 提取main_text_content #定义一个函数以清洁和细分文本内容 函数clean_and_segment_text(text): #删除不需要的字符和空格 cleaned_text = remove_special_characters(文本) cleaned_text = standardize_whitespace(cleaned_text) #将清洁的文本分为句子或文本段 句子= split_into_sentences(cleaned_text) 返回句子 #将清洁和分割功能应用于每个文档的内容 对于数据中的每个文档: 句子= clean_and_segment_text(document ['main_text_content']) 将句子保存到结构化格式 #为单个句子创建结构化数据存储 初始化结构化_data的空列表 对于句子中的每个句子: #将句子附加到结构化数据 structred_data.append(句子) #定义一个函数以根据特定条件过滤不需要的句子 函数filter_sentences(句子): 如果句子太短: 返回false 如果句子包含特定模式(例如,日期或符号过多): 返回false 如果句子与不需要的格式特征相匹配: 返回false 返回true #将过滤器应用于结构化数据 filtered_data = [如果filter_sentences(句子)在structred_data中的句子句子] #进一步根据最小长度或其他条件过滤句子 final_data = [efftered_data中的句子句子,如果MEDS_MINMIM_LENGTH(句子)] #为模型培训保存最终数据结构 将final_data保存为struction_file
df_sampled = df.sample(n = 1000000,Random_State = 42).Reset_index(drop = true)
进口JSON jsonl_data = [] 对于_,在tqdm中行(df_sampled.iterrows(),total = df_sampled.shape [0]): 内容=行['句子'] 情感= get_sentiment(内容) jsonl_entry = { “消息”:[ {“角色”:“系统”,“内容”:“助手是财务专家。”},, {“角色”:“用户”,“ content”:content},, {“角色”:“助手”,“ content”:情感} 这是给出的 } jsonl_data.append(jsonl_entry) 用open('finetuning_data.jsonl','w')作为jsonl_file: 要进入JSONL_DATA: jsonl_file.write(json.dumps(entry)'\ n')
使用open('finetuning_data.jsonl','r')作为jsonl_file: data = [JSON.LOADS(line)在JSONL_FILE中的行] 对于数据输入: 输入[“消息”] [2] [“ content”] = entry [“ message”] [2] [“ content”]。lower() 使用new_jsonl_file: 对于数据输入: new_jsonl_file.write(json.dumps(entry)'\ n')
导入随机 随机种子(42) random.shuffle(数据) split_ratio = 0.8 split_index = int(len(data) * split_ratio) triench_data = data [:split_index] 验证_data = data [split_index:] 用open('triben_data.jsonl','w')作为train_file: 用于进入训练_data: train_file.write(json.dumps(entry)'\ n') 使用open('validation_data.jsonl','w')作为val_file: 要进入验证_data: val_file.write(json.dumps(entry)'\ n')
来自sklearn.model_selection导入train_test_split data_df = pd.dataframe({ 'content':[输入[“消息”] [1] [“ content”]用于数据中的输入], 'label':[输入[“消息”] [2] [“ content”]用于数据输入] })) df_sampled,_ = train_test_split(data_df,stratefify = data_df ['label'],test_size = 0.9,Random_State = 42) train_df,val_df = train_test_split(df_sampled,stratefify = df_sampled ['label'],test_size = 0.2,Random_State = 42) DEF DF_TO_JSONL(DF,文件名): jsonl_data = [] 对于_,在df.iterrows()中行列: jsonl_entry = { “消息”:[ {“角色”:“系统”,“内容”:“助手是财务专家。”},, {“角色”:“用户”,“ content”:row ['content']},, {“角色”:“助手”,“ content”:row ['label']} 这是给出的 } jsonl_data.append(jsonl_entry) 用打开(文件名,'w')为jsonl_file: 要进入JSONL_DATA: jsonl_file.write(json.dumps(entry)'\ n') df_to_jsonl(train_df,'reduced_training_data.jsonl') df_to_jsonl(val_df,'reduced_validation_data.jsonl')
为了评估微调的GPT-4O Mini模型的性能,我们在Kaggle上可用的标有财务情感数据集上对其进行了测试。该数据集在财务环境中包含5,843个标记的句子,这可以在微调模型和Finbert之间进行有意义的比较。
芬伯特的精度为75.81%,而微调的GPT-4O MINI模型获得了76.46%,表明略有改善。
这是用于测试的代码:
导入大熊猫作为pd 导入操作系统 进口Openai 来自dotenv import load_dotenv #加载CSV文件 csv_file_path ='data.csv'#替换为实际的文件路径 df = pd.read_csv(csv_file_path) #将dataframe转换为文本格式 用open('sensences.txt','w',encoding ='utf-8')作为f: 对于索引,请在df.iterrows()中行列: 句子=行['句子']。strip()#干净的句子 情感=行['情感']。strip()。下()#确保情感是小写的 f.write(f“ {句子} @{情感} \ n”) #加载环境变量 load_dotenv() #设置您的OpenAI API密钥 openai.api_key = os.getEnv(“ openai_api_key”)#确保在您的环境变量中设置OpenAi_Api_Key #数据集文本文件的路径 file_path ='sensences.txt'#文本文件包含句子和标签 #从数据集读取句子和真实标签 句子= [] true_labels = [] 使用open(file_path,'r',encoding ='utf-8')作为文件: lines = file.readlines() #提取句子和标签 对于行中的行: line = line.strip() 如果'@'排队: 句子,label = line.rsplit('@',1) sensences.append(stone.strip()) true_labels.append(label.strip()) #功能以从微调模型中获取预测 def get_openai_predictions(句子,model =“ your_finetuned_model_name”):#用模型名称替换 尝试: 响应= openai.chatcompletion.greate( 模型=模型, 消息= [ {“角色”:“系统”,“内容”:“您是财务情感分析专家。”},, {“角色”:“用户”,“ content”:句子} ],, max_tokens = 50, 温度= 0.5 ) 返回响应['choices'] [0] ['消息'] ['content']。strip() 除例外为E: print(f“错误生成句子的预测:'{句子}'。错误:{e}”) 返回“未知” #生成数据集的预测 predicted_labels = [] 对于句子中的句子: 预测= get_openai_predictions(句子) #将“正”,“中性”,“负”的预测标准化 如果预测中的“正则”。lower(): predicted_labels.append('正面') elif'prediction..lower()中的“中性”: predicted_labels.append('中性') elif'panist'pretiction..lower(): predicted_labels.append('否定) 别的: predicted_labels.append('unknown') #计算模型的准确性 recripe_count = sum([[pred == true for pred,true in zip(predicted_labels,true_labels)])))))))) 精度= recript_count / len(句子) 打印(f'Accuracy:{精度:.4f}')#预期输出:0.7646
通过将Finbert的金融领域标签的专业知识与GPT-4O Mini的灵活性相结合,该项目实现了高性能的财务情感模型,超过了Finbert的准确性。本指南和方法论为可复制,可扩展和可解释的情感分析铺平了道路,专门针对金融行业量身定制。
A. GPT-4O MINI提供了一种轻巧,灵活的替代方案,并且可以在通过微调的特定任务上胜过Finbert。通过对特定领域的数据进行微调,GPT-4O Mini可以在财务文本中捕获细微的情感模式,同时更加有效,更易于部署。
Q2。如何请求访问TRC2数据集?答:要访问TRC2数据集,请通过此链接的国家标准与技术研究所(NIST)提交请求。查看网站的说明,以完成研究和商业用途所需的许可和使用协议。
Q3。我可以使用其他数据集进行财务情感分析吗?答:您还可以使用其他数据集,例如财务短语银行或包含标记为财务文本的自定义数据集。 TRC2数据集适合培训情绪模型,因为它包括财务新闻内容,并涵盖了广泛的财务主题。
Q4。芬伯特如何产生情感标签?A. Finbert是一种特定于金融领域的语言模型,它可以预先培训财务数据和微型分析。当应用于TRC2句子时,它会根据财务文本中的语言上下文将每个句子分为正面,负面或中立的情感。
Q5。为什么我们需要将标签转换为JSONL的小写字母?答:将标签转换为小写,确保与OpenAI的微调要求一致,这通常会期望标签对病例敏感。它还有助于防止评估过程中的不匹配,并在JSONL数据集中保持统一的结构。
本文所示的媒体不由Analytics Vidhya拥有,并由作者酌情使用。
以上是微调GPT-4O mini用于财务情感分析的详细内容。更多信息请关注PHP中文网其他相关文章!