186 lines
4.4 KiB
Python
186 lines
4.4 KiB
Python
import pandas as pd
|
|
import mysql.connector
|
|
import re
|
|
import string
|
|
import matplotlib.pyplot as plt
|
|
from sklearn.utils import resample
|
|
|
|
|
|
from Sastrawi.Stemmer.StemmerFactory import StemmerFactory
|
|
from Sastrawi.StopWordRemover.StopWordRemoverFactory import StopWordRemoverFactory
|
|
|
|
from sklearn.model_selection import train_test_split
|
|
from sklearn.feature_extraction.text import TfidfVectorizer
|
|
from sklearn.naive_bayes import MultinomialNB
|
|
from sklearn.metrics import accuracy_score, classification_report
|
|
|
|
from wordcloud import WordCloud
|
|
|
|
# =============================
|
|
# DATABASE
|
|
# =============================
|
|
conn = mysql.connector.connect(
|
|
host="localhost",
|
|
database="sentara",
|
|
user="root",
|
|
password=""
|
|
)
|
|
|
|
query = "SELECT wisata, ulasan, rating FROM ulasan"
|
|
df = pd.read_sql(query, conn)
|
|
|
|
print("Total data:", len(df))
|
|
|
|
# =============================
|
|
# STEMMER & STOPWORD
|
|
# =============================
|
|
factory = StemmerFactory()
|
|
stemmer = factory.create_stemmer()
|
|
|
|
factory_stop = StopWordRemoverFactory()
|
|
stopword = factory_stop.create_stop_word_remover()
|
|
|
|
# =============================
|
|
# PREPROCESSING
|
|
# =============================
|
|
# kamus slang
|
|
slang_dict = {
|
|
"gk": "tidak",
|
|
"ga": "tidak",
|
|
"bgt": "banget",
|
|
"tp": "tapi",
|
|
"dr": "dari",
|
|
"yg": "yang"
|
|
}
|
|
|
|
def normalize_slang(text):
|
|
words = text.split()
|
|
return ' '.join([slang_dict.get(w, w) for w in words])
|
|
|
|
|
|
def preprocess(text):
|
|
text = str(text)
|
|
text = text.lower()
|
|
|
|
# cleaning
|
|
text = re.sub(r'[^a-zA-Z\s]', '', text)
|
|
|
|
# 🔥 TAMBAHKAN DI SINI
|
|
text = normalize_slang(text)
|
|
|
|
# stopword
|
|
text = stopword.remove(text)
|
|
|
|
# stemming
|
|
text = stemmer.stem(text)
|
|
|
|
return text
|
|
|
|
def preprocess(text):
|
|
text = str(text)
|
|
text = text.lower()
|
|
text = re.sub(r'[^a-zA-Z\s]', '', text)
|
|
text = stopword.remove(text)
|
|
text = stemmer.stem(text)
|
|
return text
|
|
|
|
df['clean_text'] = df['ulasan'].apply(preprocess)
|
|
|
|
# =============================
|
|
# LABELING
|
|
# =============================
|
|
def label_sentimen(rating):
|
|
if rating >= 4:
|
|
return "positif"
|
|
elif rating == 3:
|
|
return "negatif" # 🔥 ubah ini
|
|
else:
|
|
return "negatif"
|
|
|
|
df['label'] = df['rating'].apply(label_sentimen)
|
|
|
|
print("\nDistribusi Label:")
|
|
print(df['label'].value_counts())
|
|
|
|
|
|
# =============================
|
|
# SPLIT DATA
|
|
# =============================
|
|
X_train, X_test, y_train, y_test = train_test_split(
|
|
df['clean_text'],
|
|
df['label'],
|
|
test_size=0.2,
|
|
random_state=42
|
|
)
|
|
|
|
# =============================
|
|
# TF-IDF
|
|
# =============================
|
|
vectorizer = TfidfVectorizer()
|
|
X_train_tfidf = vectorizer.fit_transform(X_train)
|
|
X_test_tfidf = vectorizer.transform(X_test)
|
|
|
|
# =============================
|
|
# MODEL NAIVE BAYES
|
|
# =============================
|
|
model = MultinomialNB()
|
|
model.fit(X_train_tfidf, y_train)
|
|
|
|
# =============================
|
|
# EVALUASI
|
|
# =============================
|
|
y_pred = model.predict(X_test_tfidf)
|
|
|
|
print("\nAccuracy:", accuracy_score(y_test, y_pred))
|
|
print("\nClassification Report:\n", classification_report(y_test, y_pred))
|
|
|
|
# =============================
|
|
# PREDIKSI SEMUA DATA
|
|
# =============================
|
|
print("\nMulai prediksi semua data...")
|
|
|
|
X_all_tfidf = vectorizer.transform(df['clean_text'])
|
|
df['prediksi'] = model.predict(X_all_tfidf)
|
|
|
|
# =============================
|
|
# SIMPAN KE DATABASE
|
|
# =============================
|
|
cursor = conn.cursor()
|
|
|
|
cursor.execute("DELETE FROM preprocessing_data")
|
|
cursor.execute("DELETE FROM hasil_analisis")
|
|
|
|
for i, row in df.iterrows():
|
|
try:
|
|
# preprocessing
|
|
cursor.execute("""
|
|
INSERT INTO preprocessing_data
|
|
(wisata, ulasan_asli, cleaning, tokenizing, stemming, final_text)
|
|
VALUES (%s, %s, %s, %s, %s, %s)
|
|
""", (
|
|
row['wisata'],
|
|
row['ulasan'],
|
|
row['clean_text'],
|
|
row['clean_text'],
|
|
row['clean_text'],
|
|
row['clean_text']
|
|
))
|
|
|
|
# hasil analisis
|
|
cursor.execute("""
|
|
INSERT INTO hasil_analisis
|
|
(wisata, ulasan_terolah, hasil_preprocessing, sentimen, probabilitas)
|
|
VALUES (%s, %s, %s, %s, %s)
|
|
""", (
|
|
row['wisata'],
|
|
row['clean_text'],
|
|
row['clean_text'],
|
|
row['prediksi'],
|
|
0.0
|
|
))
|
|
|
|
except Exception as e:
|
|
print("Error insert:", e)
|
|
|
|
conn.commit()
|
|
print(" Data berhasil disimpan") |