ファイナンスにおける感情分析は、市場動向と投資家の行動を理解するための強力なツールです。ただし、一般的なセンチメント分析モデルは、その複雑さと微妙な性質のために金融テキストに適用されると、しばしば不足しています。このプロジェクトは、軽量言語モデルであるGPT-4O Miniを微調整することにより、ソリューションを提案しています。 Expert Model Finbertによるセンチメントクラスでラベル付けされたロイターの金融ニュース記事のコレクションであるTRC2データセットを利用することにより、GPT-4o Miniの財政的感情のニュアンスを獲得する能力を強化することを目指しています。
このプロジェクトは、金融センチメント分析に対する効率的でスケーラブルなアプローチを提供し、財務におけるより微妙な感情に基づく分析のための扉を開きます。最後に、GPT-4o Miniは、ドメイン固有のデータを微調整した場合、金融コンテキストではFinbertのようなより複雑なモデルの実行可能な代替品として機能することを実証します。
この記事は、データサイエンスブログソンの一部として公開されました。
このプロジェクトでは、ロイターがキュレーションし、国立標準技術研究所(NIST)を通じて利用できるようになった金融ニュース記事のコレクションであるTRC2(TREC Reuters Corpus、Volume 2)Datasetを使用しています。 TRC2データセットには、ロイターの金融ニュース記事の包括的な選択が含まれており、その幅広いカバレッジと金融イベントに関連するため、金融言語モデルでよく使用されます。
TRC2データセットを取得するには、研究者と組織はNISTを介してアクセスを要求する必要があります。データセットは、Nist Trec Reuters Corpusで入手でき、ライセンスと使用契約の詳細を提供します。あなたはする必要があります:
データセットを取得したら、前処理を行い、それをセニメンツ分析のために文にセグメント化し、Finbertを適用して専門家標識クラスを生成することができます。
Finbertから派生した感情ラベルを備えた微調整GPT-4Oミニの方法論は、次の主な手順で構成されています。
微調整データセットを作成するには、金融領域で事前に訓練された金融言語モデルであるFinbertを活用します。 TRC2データセット内の各文にFinbertを適用し、3つのクラスでエキスパートセンチメントラベルを生成します:ポジティブ、ネガティブ、ニュートラル。このプロセスでは、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を使用した感情分析に関する記事を確認してください!
この構造化された段階的なアプローチに従って、プロセスの各段階をシームレスにナビゲートします。あなたが初心者であろうと経験であろうと、このガイドは、最初から最後まで明確になり成功した実装を保証します。
必要なライブラリをロードし、環境を構成します。
変圧器から、オートトケン装置、AutomodelfOR SeckingEclassificationから トーチをインポートします PDとしてパンダをインポートします TQDMからImport TQDMから Tokenizer = autotokenizer.from_pretrained( "Prosusai/Finbert")) Model = AutomodelforSequenceClassification.from_pretrained( "Prosusai/Finbert")) device = torch.device( 'cuda' if torch.cuda.is_available()else 'cpu') model.o(device)
def get_sentiment(テキスト): inputs = tokenizer(text、return_tensors = "pt"、truncation = true、max_length = 512).o(device) torch.no_grad()を使用して: 出力=モデル(**入力) logits = outputs.logits センチメント= torch.argmax(logits、dim = 1).item() sentiment_label = ["positive"、 "negatiたち"、 "neutral"] [センチメント] Sentiment_labelを返します
微調整に関連する文のみを保持するには、TRC2データセットを慎重に前処理する必要があります。次の手順では、TRC2データセットからのデータの読み取り、クリーニング、分割、フィルタリングの概要を説明します。
非開示の制約を考慮して、このセクションでは、Pseudocodeを使用したデータ前処理ワークフローの高レベルの概要を提供します。
#ファイルから圧縮データセットをロードします compressed_fileをファイルとして開く: #ファイルの内容をメモリに読み取ります data = read_file(file) #各ドキュメントの関連セクションを抽出します データの各ドキュメントについて: document_idを抽出します 抽出日 Main_Text_Contentを抽出します #テキストコンテンツをクリーンおよびセグメント化する関数を定義します function clean_and_segment_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']) 構造化された形式に文章を保存します #個々の文の構造化されたデータストレージを作成します structured_dataの空のリストを初期化します 文の各文について: #構造化されたデータに文を追加します structured_data.append(cente) #特定の基準に基づいて不要な文を除外する関数を定義します function filter_sentences(cente): 文が短すぎる場合: falseを返します 文に特定のパターン(例えば、日付または過剰なシンボル)が含まれている場合: falseを返します 文が不要なフォーマット特性と一致する場合: falseを返します trueを返します #フィルターを構造化されたデータに適用します filtered_data = [filter_sentancesの場合はstructured_dataの文の文の文(文)] #最小長またはその他の基準に基づいて文をさらにフィルタリングする final_data = [meets_minimum_length(cente)]の場合、filtered_dataの文の文の文 #モデルトレーニングの最終データ構造を保存します final_dataをstructured_fileとして保存します
df_sampled = df.sample(n = 1000000、random_state = 42).reset_index(drop = true)
JSONをインポートします jsonl_data = [] _、tqdmのrow(df_sampled.iterrows()、total = df_sampled.shape [0]): content = row ['cente'] センチメント= get_sentiment(content) jsonl_entry = { 「メッセージ」:[ {「役割」:「システム」、「コンテンツ」:「アシスタントは金融の専門家です。 "}、 {「役割」:「ユーザー」、「コンテンツ」:コンテンツ}、 {「役割」:「アシスタント」、「コンテンツ」:感情} ] } jsonl_data.append(jsonl_entry) with open( 'finetuning_data.jsonl'、 'w')as jsonl_file: jsonl_dataへのエントリーの場合: jsonl_file.write(json.dumps(entry) '\ n')
with open( 'finetuning_data.jsonl'、 'r')as jsonl_file: data = [jsonl_fileの行のjson.loads(line)] データへの入力について: entry ["messages"] [2] ["content"] = entry ["messages"] [2] ["content"]。lower() with open( 'finetuning_data_lowercase.jsonl'、 'w')as new_jsonl_file: データへの入力について: new_jsonl_file.write(json.dumps(entry) '\ n')
ランダムをインポートします random.seed(42) random.shuffle(データ) split_ratio = 0.8 split_index = int(len(data) * split_ratio) training_data = data [:split_index] validation_data = data [split_index:] open( 'training_data.jsonl'、 'w')としてtrain_file: Training_Dataへのエントリ: train_file.write(json.dumps(entry) '\ n') with open( 'validation_data.jsonl'、 'w')as val_file: validation_dataへの入力: val_file.write(json.dumps(entry) '\ n')
sklearn.model_selectionからimport train_test_splitから data_df = pd.dataframe({ 'content':[entry ["messages"] [1] ["content"] for data for data]、 「ラベル」:[entry ["messages"] [2] ["content"]データへのエントリのための] }) DF_SAMPLED、_ = train_test_split(data_df、stratify = data_df ['label']、test_size = 0.9、random_state = 42) train_df、val_df = train_test_split(df_sampled、stratify = df_sampled ['label']、test_size = 0.2、random_state = 42) def df_to_jsonl(df、filename): jsonl_data = [] _、df.iterrows()の列(): jsonl_entry = { 「メッセージ」:[ {「役割」:「システム」、「コンテンツ」:「アシスタントは金融の専門家です。 "}、 {"role": "user"、 "content":row ['content']}、 {「役割」:「アシスタント」、「コンテンツ」:row ['label']} ] } jsonl_data.append(jsonl_entry) jsonl_fileとしてOpen(filename、 'w'): jsonl_dataへのエントリーの場合: jsonl_file.write(json.dumps(entry) '\ n') df_to_jsonl(train_df、 'decond_training_data.jsonl') df_to_jsonl(val_df、 'decond_validation_data.jsonl')
微調整されたGPT-4O MINIモデルのパフォーマンスを評価するために、Kaggleで利用可能なラベル付きの財務感情データセットでテストしました。このデータセットには、財務の文脈に5,843のラベル付けされた文が含まれており、微調整されたモデルとFinbertの意味のある比較が可能になります。
Finbertは75.81%の精度を獲得しましたが、微調整されたGPT-4O MINIモデルは76.46%を達成し、わずかな改善を示しました。
テストに使用されるコードは次のとおりです。
PDとしてパンダをインポートします OSをインポートします Openaiをインポートします dotenvインポートload_dotenvから #CSVファイルをロードします csv_file_path = 'data.csv'#実際のファイルパスに置き換えます df = pd.read_csv(csv_file_path) #データフレームをテキスト形式に変換します fite open( 'sentences.txt'、 'w'、encoding = 'utf-8')as f: インデックスの場合、df.iterrows()の行: cente = row ['centent']。ストリップ()#清掃文 センチメント= row ['センチメント']。ストリップ()。lower()#センチメントが小文字でクリーンであることを確認します f.write(f "{cente} @{sentiment} \ n") #環境変数をロードします load_dotenv() #Openai APIキーを設定します openai.api_key = os.getenv( "openai_api_key")#openai_api_keyが環境変数に設定されていることを確認してください #データセットテキストファイルへのパス file_path ='sentences.txt '#文とラベルを含むテキストファイル #データセットから文と真のラベルを読んでください 文= [] true_labels = [] fileとしてopen(file_path、 'r'、encoding = 'utf-8') lines = file.readlines() #文とラベルを抽出します 線の場合: line = line.strip() 「@」が並んでいる場合: 文、label = line.rsplit( '@'、1) sentences.append(cente.strip()) true_labels.append(label.strip()) #微調整されたモデルから予測を取得する機能 def get_openai_predictions(cente、model = "your_finetuned_model_name"):#モデル名に置き換えます 試す: 応答= openai.chatcompletion.create( モデル=モデル、 メッセージ= [ {「役割」:「システム」、「コンテンツ」:「あなたは財政的な感情分析の専門家です。 "}、 {「役割」:「ユーザー」、「コンテンツ」:文} ]、、 max_tokens = 50、 温度= 0.5 )) 返信応答['choices'] [0] ['message'] ['content']。ストリップ() eとしての例外を除く: 印刷(f "文の予測を生成するエラー: '{cente}'。エラー:{e}") 「不明」を返す #データセットの予測を生成します predicted_labels = [] 文の文のために: 予測= get_openai_predictions(cente) #予測を「ポジティブ」、「ニュートラル」、「ネガティブ」に正規化する prediction.lower()の「ポジティブ」の場合: Predicted_labels.append( 'Positive') prediction.lower()のelif 'neutral': Predicted_labels.append( 'neutral') prediction.lower()で「ネガティブ」をelif 'negative' Predicted_labels.append( 'ネガティブ') それ以外: Prosceded_labels.append( 'nownd') #モデルの精度を計算します record_count = sum([pred == pred for pred、true in zip(predicted_labels、true_labels))))) 精度= recort_count / len(文章) print(f'accuracy:{surcosity:.4f} ')#予想出力:0.7646
Finbertの金融ドメインラベルの専門知識をGPT-4O Miniの柔軟性と組み合わせることにより、このプロジェクトは、Finbertを精度で上回る高性能の金融センチメントモデルを実現します。このガイドと方法論は、特に金融業界に合わせて調整された、複製可能でスケーラブルで解釈可能な感情分析への道を開きます。
A. GPT-4O MINIは、軽量で柔軟な代替品を提供し、微調整を伴う特定のタスクでFinbertを上回ることができます。ドメイン固有のデータを微調整することにより、GPT-4O Miniは、より計算効率が高く展開しやすい一方で、財務テキストで微妙な感情パターンをキャプチャできます。
Q2。 TRC2データセットへのアクセスをリクエストするにはどうすればよいですか?A. TRC2データセットにアクセスするには、このリンクの国立標準技術研究所(NIST)を通じてリクエストを送信します。通常、研究と商業利用の両方に必要なライセンスと使用契約を完了するためのウェブサイトの指示を確認してください。
Q3。財務感情分析に別のデータセットを使用できますか?A.金融フレーズバンクやラベル付きの金融テキストを含むカスタムデータセットなど、他のデータセットを使用することもできます。 TRC2データセットは、財務ニュースコンテンツを含み、幅広い財務トピックをカバーするため、トレーニングセンチメントモデルに特に適しています。
Q4。 Finbertはどのようにしてセンチメントラベルを生成しますか?A. Finbertは、センチメント分析のための財務データと微調整を事前に訓練する金融ドメイン固有の言語モデルです。 TRC2文に適用されると、金融テキストの言語コンテキストに基づいて、各文を肯定的、否定的、または中立的な感情に分類します。
Q5。なぜラベルをJSONLの小文字に変換する必要があるのですか?A.ラベルを小文字に変換することで、Openaiの微調整要件との一貫性が保証され、多くの場合、ラベルがケースに敏感であると予想します。また、評価中の不一致を防ぐのに役立ち、JSONLデータセットの均一な構造を維持します。
この記事に示されているメディアは、Analytics Vidhyaが所有しておらず、著者の裁量で使用されています。
以上が金融センチメント分析のための微調整GPT-4Oミニの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。