금융의 감정 분석은 시장 동향과 투자자 행동을 이해하기위한 강력한 도구입니다. 그러나 일반적인 감정 분석 모델은 복잡성과 미묘한 특성으로 인해 재무 텍스트에 적용될 때 종종 부족합니다. 이 프로젝트는 가벼운 언어 모델 인 GPT-4O Mini를 미세 조정하여 솔루션을 제안합니다. 전문가 모델 Finbert의 감정 클래스로 표시된 로이터 금융 뉴스 기사 모음 인 TRC2 데이터 세트를 사용하여 GPT-4O 미니의 재무 감정 뉘앙스를 캡처하는 능력을 향상시키는 것을 목표로합니다.
이 프로젝트는 금융 감정 분석에 효율적이고 확장 가능한 접근 방식을 제공하여 금융에서보다 미묘한 감정 기반 분석을위한 문을 열어줍니다. 결국, 우리는 도메인 별 데이터로 미세 조정할 때 GPT-4O MINI가 재무 상황에서 Finbert와 같은보다 복잡한 모델에 대한 실행 가능한 대안으로 작용할 수 있음을 보여줍니다.
이 기사는 Data Science Blogathon 의 일부로 출판되었습니다 .
이 프로젝트를 위해, 우리는 로이터가 큐레이터하고 NIST (National Institute of Standards and Technology)를 통해 제공되는 금융 뉴스 기사 모음 인 TRC2 (Trec Reuters Corpus, Volume 2) DataSet을 사용합니다. TRC2 데이터 세트에는 광범위한 범위와 금융 이벤트와의 관련성으로 인해 금융 언어 모델에 종종 사용되는 포괄적 인 로이터 금융 뉴스 기사가 포함되어 있습니다.
TRC2 데이터 세트를 얻으려면 연구원과 조직은 NIST를 통해 액세스를 요청해야합니다. 이 데이터 세트는 NIST TREC Reuters Corpus에서 제공되며 라이센스 및 사용 계약에 대한 세부 정보를 제공합니다. 당신은 다음을 필요로합니다.
데이터 세트를 얻으면 전처리 및 감정 분석을 위해 문장으로 분류하여 Finbert를 적용하여 전문가 라벨 정서 클래스를 생성 할 수 있습니다.
Finbert에서 파생 된 감정 라벨이있는 GPT-4O MINI를 미세 조정하는 방법론은 다음과 같은 주요 단계로 구성됩니다.
미세 조정 데이터 세트를 만들려면 금융 영역에서 미리 훈련 된 금융 언어 모델 인 Finbert를 활용합니다. 우리는 TRC2 데이터 세트의 각 문장에 Finbert를 적용하여 긍정적, 부정적 및 중립의 세 가지 클래스에서 전문가 감정 레이블을 생성합니다. 이 프로세스는 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을 사용하여 감정 분석에 대한 기사를 확인하십시오!
이 구조화 된 단계별 접근 방식을 따라 프로세스의 각 단계를 완벽하게 탐색하십시오. 초보자이든 경험이든,이 가이드는 처음부터 끝까지 명확하고 성공적인 구현을 보장합니다.
필요한 라이브러리를로드하고 환경을 구성합니다.
변압기에서 Autotokenizer, AutomodElforeceenceColassification에서 토치 수입 팬더를 PD로 가져옵니다 TQDM에서 TQDM에서 Tokenizer = autotokenizer.from_pretraind ( "prosusai/finbert") model = automodelforedeceenceclassification.from_pretrained ( "prosusai/finbert") device = torch.device ( 'cuda'인 경우 torch.cuda.is_available () else 'cpu') model.to (장치)
def get_sentiment (텍스트) : inputs = tokenizer (text, return_tensors = "pt", truncation = true, max_length = 512). Torch.no_grad ()로 : 출력 = 모델 (** 입력) logits = outputs.logits sentiment = torch.argmax (logits, dim = 1) .item () sentiment_label = [ "positive", "negative", "neutral"] [sentiment] Sentiment_Label을 반환합니다
미세 조정을위한 관련 문장 만 유지하려면 TRC2 데이터 세트를 신중하게 전처리해야합니다. 다음 단계는 TRC2 데이터 세트에서 데이터를 읽고, 청소하고, 분할하고, 필터링하는 방법을 설명합니다.
비공개의 제약 조건을 고려할 때,이 섹션은 데이터 전처리 워크 플로우와 함께 높은 수준의 개요를 제공합니다.
# 파일에서 압축 데이터 세트를로드하십시오 compressed_file을 파일로 엽니 다 : # 파일의 내용을 메모리로 읽습니다 data = read_file (파일) # 각 문서의 관련 섹션을 추출합니다 데이터의 각 문서에 대해 : Document_ID 추출 추출 날짜 main_text_content를 추출합니다 # 텍스트 컨텐츠를 정리하고 세그먼트 할 함수 정의 함수 clean_and_segment_text (텍스트) : # 원치 않는 문자와 공백을 제거하십시오 cleaned_text = remove_special_characters (텍스트) cleaned_text = Standardize_whitespace (cleaned_text) # 정리 된 텍스트를 문장 또는 텍스트 세그먼트로 분할 문장 = split_into_sentences (cleaned_text) 반환 문장 # 각 문서의 내용에 청소 및 세분화 기능을 적용하십시오. 데이터의 각 문서에 대해 : sentences = clean_and_segment_text (document [ 'main_text_content'])) 문장을 구조화 된 형식으로 저장합니다 # 개별 문장에 대한 구조화 된 데이터 저장소를 만듭니다 구조화 된 _data의 빈 목록을 초기화하십시오 문장의 각 문장에 대해 : # 구조화 된 데이터에 문장을 추가하십시오 구조화 된 _data.append (문장) # 특정 기준에 따라 원치 않는 문장을 걸러내는 함수 정의 함수 filter_sentence (문장) : 문장이 너무 짧은 경우 : 거짓을 반환하십시오 문장이 특정 패턴 (예 : 날짜 또는 과도한 기호)이 포함 된 경우 : 거짓을 반환하십시오 문장이 원치 않는 서식 특성과 일치하는 경우 : 거짓을 반환하십시오 진실을 반환하십시오 # 필터를 구조화 된 데이터에 적용하십시오 filterd_data = [filter_sentence (sentence) 인 경우 condratured_data의 문장 문장]] # 최소 길이 또는 기타 기준에 따라 문장을 추가로 필터링합니다. final_data = [meets_minimum_length (sentence) 인 경우 filtered_data 문장 문장]]] # 모델 교육을위한 최종 데이터 구조를 저장합니다 final_data를 conductured_file로 저장하십시오
df_sampled = df.sample (n = 10000000, random_state = 42) .reset_index (drop = true)
JSON 수입 jsonl_data = [] _, tqdm의 행 content = row [ 'sentence'] 감정 = get_sentiment (내용) jsonl_entry = { "메시지": [ { "역할": "System", "Content": "보조원은 재무 전문가입니다."}, { "역할": "사용자", "content": content}, { "역할": "Assistant", "Content": Sentiment} ]] } jsonl_data.append (jsonl_entry) jsonl_file로 Open ( 'finetuning_data.jsonl', 'w')을 사용하여 : JSONL_DATA 입력 : JSONL_FILE.WRITE (json.dumps (Entry) '\ n')
jsonl_file로 Open ( 'finetuning_data.jsonl', 'r')을 사용하여 : data = [JSONL_FILE의 라인에 대한 JSON.LOADS (라인)]] 데이터 입력 : Entry [ "메시지"] [2] [ "Content"] = entry [ "메시지"] [2] [ "Content"]. Lower () new_jsonl_file로 Open ( 'finetuning_data_lowercase.jsonl', 'w')을 사용하여 : 데이터 입력 : 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 :] rain_file로 Open ( 'training_data.jsonl', 'w')을 사용하여 : Training_Data의 입력 : train_file.write (json.dumps (Entry) '\ n') val_file로 Open ( 'validation_data.jsonl', 'w')으로 : validation_data의 항목 : val_file.write (json.dumps (Entry) '\ n')
sklearn.model_selection import train_test_split data_df = pd.dataframe ({ 'content': [entry [ "메시지"] [1] [ "Content"] 데이터 입력의 경우], 'label': [entry [ "메시지"] [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 = { "메시지": [ { "역할": "System", "Content": "보조원은 재무 전문가입니다."}, { "역할": "사용자", "내용": row [ 'content']}, { "역할": "Assistant", "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, 'reted_training_data.jsonl') df_to_jsonl (val_df, 'reted_validation_data.jsonl')
미세 조정 된 GPT-4O Mini Model의 성능을 평가하기 위해 Kaggle에서 사용할 수있는 라벨이있는 재무 감정 데이터 세트에서 테스트했습니다. 이 데이터 세트에는 재무 상황에 5,843 개의 라벨이 붙은 문장이 포함되어있어 미세 조정 모델과 핀버트를 의미있는 비교할 수 있습니다.
Finbert는 75.81%의 정확도를 기록한 반면 미세 조정 된 GPT-4O 미니 모델은 76.46%를 달성하여 약간의 개선을 보여주었습니다.
테스트에 사용되는 코드는 다음과 같습니다.
팬더를 PD로 가져옵니다 OS 가져 오기 OpenAi 가져 오기 dotenv import load_dotenv에서 # CSV 파일을로드하십시오 csv_file_path = 'data.csv' # 실제 파일 경로로 교체 df = pd.read_csv (csv_file_path) # dataframe을 텍스트 형식으로 변환합니다 open ( 'sentences.txt', 'w', encoding = 'utf-8')로 f : 인덱스의 경우 df.iterrows ()의 행 : sentence = row [ 'sentence']. strip () # clean sentence 감정 = 행 f.write (f "{sentence} @{sentiment} \ n") #로드 환경 변수 load_dotenv () # OpenAI API 키를 설정하십시오 Openai.api_key = os.getenv ( "OpenAi_api_key") # OpenAi_api_key가 환경 변수에 설정되었는지 확인 # 데이터 세트 텍스트 파일로가는 경로 file_path = 'sentences.txt' # 문장 및 레이블이 포함 된 텍스트 파일 # 데이터 세트에서 문장 및 실제 레이블을 읽습니다 문장 = [] true_labels = [] 파일로 닫는 (file_path, 'r', encoding = 'utf-8')를 사용하여 : lines = file.readlines () # 문장 및 레이블 추출 라인으로 : line = line.strip () '@'라인 인 경우 : 문장, label = line.rsplit ( '@', 1) sentences.append (sentence.strip ()) true_labels.append (label.strip ()) # 미세 조정 모델에서 예측을 얻는 기능 def get_openai_predictions (sentence, model = "your_finetuned_model_name") : # 모델 이름으로 바꾸십시오 노력하다: 응답 = openai.chatcompletion.create ( 모델 = 모델, 메시지 = [ { "역할": "System", "Content": "당신은 금융 감정 분석 전문가입니다."}, { "역할": "사용자", "내용": sentence} ],, max_tokens = 50, 온도 = 0.5 )) 반환 응답 [ '선택'] [0] [ 'message'] [ 'content']. strip () E로 예외를 제외하고 : print (f "문장에 대한 예측을 생성하는 오류 : '{sentence}'. 오류 : {e}") "알 수없는"반환 # 데이터 세트에 대한 예측을 생성합니다 예측 된 _labels = [] 문장 문장의 경우 : 예측 = get_openai_predictions (문장) # 예측을 '긍정적', '중립', '부정'으로 정상화하십시오. prediction.lower ()에서 'positive'인 경우 : predited_labels.append ( 'positive') prediction.lower ()의 elif '중립': predited_labels.append ( '중립') elif prediction.lower ()의 '음수': predited_labels.append ( 'negative') 또 다른: predited_labels.append ( '알 수없는') # 모델의 정확도를 계산합니다 right_count = sum ([pred == pred의 경우 pred == true, true in zip (predicted_labels, true_labels)])) 정확도 = 정확한 _count / len (문장) print (f'Accuracy : {정확도 : .4f} ') # 예상 출력 : 0.7646
이 프로젝트는 Finbert의 재무 도메인 레이블의 전문 지식을 GPT-4O MINI의 유연성과 결합함으로써 Finbert를 정확하게 능가하는 고성능 재무 감정 모델을 달성합니다. 이 안내서와 방법론은 특히 금융 산업에 맞게 조정 된 복제 가능하고 확장 가능하며 해석 가능한 감정 분석의 길을 열어줍니다.
A. GPT-4O MINI는 가볍고 유연한 대안을 제공하며 미세 조정으로 특정 작업에 대해 Finbert를 능가 할 수 있습니다. 도메인 별 데이터로 미세 조정함으로써 GPT-4O MINI는 재무 텍스트에서 미묘한 감정 패턴을 캡처하면서보다 계산적으로 효율적이고 배포하기 쉽습니다.
Q2. TRC2 데이터 세트에 대한 액세스를 어떻게 요청합니까?A. TRC2 데이터 세트에 액세스하려면이 링크에서 NIST (National Institute of Standards and Technology)를 통해 요청을 제출하십시오. 일반적으로 연구 및 상업용 사용에 필요한 라이센스 및 사용 계약을 완료하기위한 웹 사이트의 지침을 검토하십시오.
Q3. 재무 감정 분석을 위해 다른 데이터 세트를 사용할 수 있습니까?A. 금융 문자 뱅크와 같은 다른 데이터 세트 또는 레이블이 지정된 재무 텍스트가 포함 된 사용자 정의 데이터 세트를 사용할 수도 있습니다. TRC2 데이터 세트는 재무 뉴스 컨텐츠를 포함하고 광범위한 재무 주제를 다루기 때문에 감정 모델 교육에 적합합니다.
Q4. Finbert는 감정 레이블을 어떻게 생성합니까?A. Finbert는 재무 데이터에 대한 사전 훈련 및 감정 분석을위한 미세 조정을하는 금융 영역 별 언어 모델입니다. TRC2 문장에 적용될 때, 그것은 각 문장을 재무 텍스트의 언어 맥락에 따라 긍정적, 부정 또는 중립 정서로 분류합니다.
Q5. JSONL의 라벨을 소문자로 변환 해야하는 이유는 무엇입니까?A. 라벨을 소문자로 변환하면 OpenAI의 미세 조정 요구 사항과 일관성이 유지되며, 이는 종종 라벨이 대소 문자에 민감 할 것으로 예상됩니다. 또한 평가 중 불일치를 방지하고 JSONL 데이터 세트에서 균일 한 구조를 유지합니다.
이 기사에 표시된 미디어는 분석 Vidhya가 소유하지 않으며 저자의 재량에 따라 사용됩니다.
위 내용은 재무 감정 분석을위한 미세 조정 GPT-4O MINI의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!