金融中的情感分析是了解市場趨勢和投資者行為的有力工具。但是,由於其複雜性和細微差別,一般的情感分析模型通常不足於財務文本。該項目通過微調的輕量級語言模型進行微調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中文網其他相關文章!