-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsentiment-prediction.py
91 lines (66 loc) · 3.12 KB
/
sentiment-prediction.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# -*- coding: utf-8 -*-
"""
Created on Fri Oct 11 13:02:31 2024
@author: Habib
"""
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
from collections import Counter
headline = pd.read_csv(r"D:\stock-sentiment\ihsg-headline.csv")
import nltk
from nltk.sentiment import SentimentIntensityAnalyzer
# Pastikan nltk corpus dan resources di-download
nltk.download('vader_lexicon')
def analyze_sentiment(df, column_name):
"""
Fungsi untuk melakukan analisis sentimen pada kolom headline yang sudah diterjemahkan.
Args:
df (pd.DataFrame): DataFrame yang berisi kolom dengan teks yang akan dianalisis sentimennya.
column_name (str): Nama kolom dalam DataFrame yang berisi headline yang sudah diterjemahkan.
Returns:
pd.DataFrame: DataFrame dengan kolom baru 'Sentiment', 'Sentiment_Score', dan 'Sentiment_Encoded'.
"""
sia = SentimentIntensityAnalyzer()
def get_sentiment_and_score(text):
# Menghitung skor sentimen
sentiment_scores = sia.polarity_scores(text)
compound_score = sentiment_scores['compound']
# Mengkategorikan sentimen berdasarkan skor compound
if compound_score >= 0.05:
return 'positive', compound_score
elif compound_score <= -0.05:
return 'negative', compound_score
else:
return 'neutral', compound_score
# Menambahkan kolom sentimen dan skor ke DataFrame
df[['Sentiment', 'Sentiment_Score']] = df[column_name].apply(
lambda text: pd.Series(get_sentiment_and_score(text))
)
# Mapping label sentimen menjadi float
sentiment_encoding = {'positive': 1.0, 'neutral': 0.0, 'negative': -1.0}
df['Sentiment_Encoded'] = df['Sentiment'].map(sentiment_encoding)
return df
# Melakukan analisis sentimen pada kolom yang diterjemahkan
df_with_sentiment = analyze_sentiment(headline, 'Headline_en')
print(df_with_sentiment)
df_with_sentiment.to_csv('input-sentiment.csv')
def get_dominant_sentiment_per_day(df, date_column, sentiment_column):
"""
Fungsi untuk mendapatkan sentimen dominan per hari.
Args:
df (pd.DataFrame): DataFrame yang berisi kolom tanggal dan sentimen.
date_column (str): Nama kolom tanggal dalam DataFrame.
sentiment_column (str): Nama kolom sentimen dalam DataFrame.
Returns:
pd.DataFrame: DataFrame dengan satu baris per tanggal, berisi sentimen dominan.
"""
# Fungsi untuk menghitung sentimen yang paling sering muncul (modus)
def find_dominant_sentiment(sentiments):
return Counter(sentiments).most_common(1)[0][0]
# Kelompokkan berdasarkan tanggal, lalu ambil sentimen yang paling sering muncul
dominant_sentiment_df = df.groupby(date_column)[sentiment_column].apply(find_dominant_sentiment).reset_index()
dominant_sentiment_df.columns = [date_column, 'Dominant_Sentiment']
return dominant_sentiment_df
df_dominant_sentiment = get_dominant_sentiment_per_day(df_with_sentiment, 'Date', 'Sentiment')
df_dominant_sentiment.to_csv('datasentiment.csv')