MIF_E31231226/scraper/preprocessing.py

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")