import pandas as pd
from bs4 import BeautifulSoup
import requests
from deep_translator import GoogleTranslator
from transformers import pipelineGiriş
Finans dünyası, her gün çok sayıda yatırımcı ve profesyonel için hayati öneme sahip bilgilerle doludur. Hisse senetleri, piyasa hareketleri ve ekonomik göstergeler gibi konular, yatırımcıların kararlarını doğrudan etkiler. Ancak bu bilgilerin nasıl yorumlandığı ve hissedilen duygular da yatırım stratejilerinde kritik bir rol üstlenir. Buradan hareketle, Türkçe finans haberlerinde duygu sınıflandırması konusunu ele alacağız.
Başlangıç noktamız, Türkçe finans haberlerinden elde edilen başlıkları çekip İngilizceye çeviren bir veri işleme sürecidir. Ardından, bu başlıkları duygu analizi yapabilen bir yapay zeka modeli üzerinden değerlendireceğiz.
İlk adım olarak, bu hafta içerisinde yayın hayatına başlayan cnbc-e’den finans haberlerini çekiyoruz ve başlıkları analiz için hazırlıyoruz. Ardından, Google Çeviri aracılığıyla Türkçe başlıkları İngilizceye çeviriyoruz. Bu adım, finans haberlerine erişim sağlayarak dil bariyerlerini aşmamıza yardımcı olur. Daha sonra, derin öğrenme tabanlı bir duygu analizi modeli kullanarak çevrilen başlıkların duygu tonlamalarını değerlendiriyoruz. Bu model, her başlığın olumlu, olumsuz veya nötr olarak sınıflandırılmasına olanak tanır. Bu sayede, finans haberlerinin yatırımcılar üzerindeki duygusal etkilerini anlama ve analiz etme yeteneğimizi artırabiliriz.
Sonuçlarımızı görsel olarak sunmak için etiketlenmiş başlıkları renklendiriyoruz. Bu, her bir başlığın duygusal tonunu hızlıca görselleştirmemize ve verileri daha anlamlı hale getirmemize yardımcı olur.
Kullanılacak Kütüphaneler
Haber Başlıklarının Elde Edilmesi
url = "https://www.cnbce.com/piyasalar"
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
post_cards = soup.find_all('div', class_='post-card-title')
titles = []
for post_card in post_cards:
a_tag = post_card.find('a')
if a_tag:
text = a_tag.get_text().strip()
titles.append(text)İngilizce Çevirilerin Yapılması
translated_titles = []
for title in titles:
translated_title = GoogleTranslator(source='auto', target='en').translate(title)
translated_titles.append(translated_title)
df = pd.DataFrame({'Turkish': titles, 'English': translated_titles})Duygu Sınıflandırması
Pipeline’ın Oluşturulması
sentiment_analysis = pipeline(
'sentiment-analysis',
model='soleimanian/financial-roberta-large-sentiment'
)Financial-RoBERTa adlı önceden eğitilmiş doğal dil işleme modeli, finansal metinlerin duygusunu analiz etmek için özel olarak tasarlanmıştır. Bu metinler arasında finansal beyanlar (financial statements), kazanç duyuruları (earnings announcements), kazanç çağrısı metinleri (earnings call transcripts), kurumsal sosyal sorumluluk (CSR) raporları (corporate social responsibility (CSR) reports), çevresel, sosyal ve yönetişim (ESG) haberleri (environmental, social, and governance (ESG) news), finansal haberler (financial news) gibi çeşitli belgeler bulunmaktadır.
Financial-RoBERTa, RoBERTa büyük dil modelini temel alarak daha fazla eğitim ve ayarlama ile oluşturulmuştur. Bu süreçte, 10K ve 10Q raporları, 8K bildirimleri, kazanç çağrısı transkriptleri, CSR raporları, ESG haberleri ve finansal haberler gibi geniş bir metin korpusu kullanılmıştır.
Model, metin girdilerini alır ve bu metinlerin duygu durumunu belirlemek için softmax çıktılarını üretir. Çıktılar üç temel etiket üzerinden tanımlanır: Pozitif, Negatif veya Nötr.
Financial-RoBERTa’nın temel amacı, bu çeşitli finansal belgeleri otomatik olarak analiz ederek, yatırımcıların ve finans profesyonellerinin büyük veri setleri içindeki önemli bilgileri daha hızlı ve etkili bir şekilde keşfetmelerine yardımcı olmaktır.
Duyguların Oluşturulması
results = []
for english_title in df['English']:
result = sentiment_analysis(english_title)
results.append(result[0])
df['Label'] = [res['label'].title() for res in results]
df['Score'] = [res['score'] for res in results]Sonuçların Veri Çerçevesinde Renklendirilerek Gösterilmesi
def color_label(val):
color = ''
if val == 'Positive':
color = 'background-color: skyblue; color: black'
elif val == 'Negative':
color = 'background-color: lightcoral; color: black'
elif val == 'Neutral':
color = 'background-color: lightgrey; color: black'
return color
styled_df = df.style.applymap(color_label, subset=['Label'])Gelecek içeriklerde görüşmek dileğiyle.