From d685dc41a4fc4f9496671c1447bbeb47ac6674c9 Mon Sep 17 00:00:00 2001 From: adistya13 Date: Thu, 25 Jun 2026 20:52:36 +0700 Subject: [PATCH] sentiment service --- model_naive_bayes.pkl | Bin 39967 -> 42495 bytes model_naive_bayes_old4.pkl | Bin 0 -> 39967 bytes model_naive_bayes_old5.pkl | Bin 0 -> 59631 bytes nrt_activation.json | 2 +- page_modules/preprocessing_page.py | 23 +- page_modules/sentiment_page.py | 6 +- sentiment_service.py | 630 ++++++++++++++++++++--------- splash_page.py | 81 ++-- tfidf_vectorizer.pkl | Bin 29695 -> 31602 bytes tfidf_vectorizer_old4.pkl | Bin 0 -> 29695 bytes tfidf_vectorizer_old5.pkl | Bin 0 -> 45189 bytes tweets-data/hasil_top.csv | 5 + tweets-data/hasil_top.old.csv | 6 +- 13 files changed, 535 insertions(+), 218 deletions(-) create mode 100644 model_naive_bayes_old4.pkl create mode 100644 model_naive_bayes_old5.pkl create mode 100644 tfidf_vectorizer_old4.pkl create mode 100644 tfidf_vectorizer_old5.pkl create mode 100644 tweets-data/hasil_top.csv diff --git a/model_naive_bayes.pkl b/model_naive_bayes.pkl index 5a5725f4329e31e2171c92b0265bdb86bb1da541..86f295b72263c7471618a3d2ef0f70af98ed6ff2 100644 GIT binary patch literal 42495 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

%+ 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 literal 39967 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 z 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 z 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 dict: "komdigi": "komdigi", "kemendag": "kementerian perdagangan", "kominfo": "kementerian komunikasi", + "gejeee": "geje", + "gk jelas": "tidak jelas", # E-commerce umum "ecommerce": "e commerce", "marketplace": "marketplace", diff --git a/page_modules/sentiment_page.py b/page_modules/sentiment_page.py index be2a9c0..92e5395 100644 --- a/page_modules/sentiment_page.py +++ b/page_modules/sentiment_page.py @@ -601,7 +601,7 @@ def _render_tweet_table(fdf, filter_label): with tf3: sort_by = st.selectbox( "Urutkan", - ["Terbaru dulu", "Terlama dulu", "Keyakinan tertinggi"], + ["Terbaru dulu", "Terlama dulu"], key="sentiment_table_sort", ) @@ -620,10 +620,8 @@ def _render_tweet_table(fdf, filter_label): if sort_by == "Terbaru dulu": tdf = tdf.sort_values("created_at", ascending=False) - elif sort_by == "Terlama dulu": - tdf = tdf.sort_values("created_at", ascending=True) else: - tdf = tdf.sort_values("confidence", ascending=False) + tdf = tdf.sort_values("created_at", ascending=True) out = tdf[["created_at", "crawled_at", "text", "clean_text", "sentiment"]].copy() out["created_at"] = out["created_at"].apply(format_dt) diff --git a/sentiment_service.py b/sentiment_service.py index 82a295d..c27199c 100644 --- a/sentiment_service.py +++ b/sentiment_service.py @@ -1,5 +1,5 @@ """ -sentiment_service.py — Hybrid Classifier (versi perbaikan v2) +sentiment_service.py — Hybrid Classifier (versi perbaikan v5) ================================================================ PERBAIKAN UTAMA vs versi sebelumnya: @@ -46,6 +46,101 @@ PERBAIKAN UTAMA vs versi sebelumnya: "saya melihat berita mengenai pembatasan gratis ongkir" → NETRAL SOLUSI: Deteksi KATA_INFORMATIF; jika tweet hanya berisi konteks informatif tanpa kata sentimen eksplisit → dorong ke Netral. + + ════════════════════════════════════════════════════════════════════ + PERBAIKAN v3 — lihat tanda "# >>> FIX v3" untuk lokasi perubahan. + ════════════════════════════════════════════════════════════════════ + + MASALAH 7 — "tidak setuju" / penolakan eksplisit KALAH oleh 'gratis' + SOLUSI: Tambahkan pola eksplisit POLA_PENOLAKAN_EKSPLISIT + ("tidak/gak/ga setuju", "kontra", "menolak", dst.) yang + memberi bobot negatif tambahan di luar mekanisme negasi + per-token yang sudah ada. + + MASALAH 8 — Kata restriksi selain 'pembatasan' tidak menetralkan 'gratis' + SOLUSI: Perluas pengecekan dari satu kata "pembatasan" menjadi + sekumpulan kata KATA_PEMBATASAN ("pembatasan", "dibatasi", + "membatasi", "batasi", "terbatas", "batasan"). + + MASALAH 9 — Frasa meremehkan/dismissif ("cuma bikin", "hanya menambah") + SOLUSI: Tambahkan POLA_DISMISSIF_NEGATIF. + + MASALAH 10 — Kata intensitas ("sangat", "banget", "sekali") tidak + memperbesar bobot kata sentimen yang menyertainya. + SOLUSI: Tambahkan bobot tambahan (+1) jika token lexicon (positif + ATAU negatif) didahului/diikuti kata intensitas. + + ════════════════════════════════════════════════════════════════════ + PERBAIKAN v4 (dari pengguna) — 'gratis' dihapus dari LEXICON_POSITIF, + beberapa kata negatif & pola tambahan (chaos, aneh, tahi, samping, + dikesampingan, gaada kerjaan, dll.) sudah ditambahkan. + ════════════════════════════════════════════════════════════════════ + + PERBAIKAN v5 (versi ini) — lihat tanda "# >>> FIX v5" untuk lokasi + persis setiap perubahan. + ════════════════════════════════════════════════════════════════════ + + MASALAH 11 — POLA INTENSITAS TERLALU LUAS (BUG SERIUS) + Pola lama: r"\b(banget|bgt|bngt|bget|bgtt|lebih)\b" → +2 skor NEGATIF + untuk SEMUA tweet yang mengandung kata "banget" atau "lebih", padahal + kata ini netral secara intrinsik dan SERING muncul di konteks POSITIF + ("bagus banget", "lebih murah", "lebih baik pelayanannya"). Akibatnya + banyak tweet positif/netral salah terdorong ke Negatif. + SOLUSI: Pola digantikan dengan versi yang HANYA aktif jika kata + intensitas tersebut berdekatan dengan kata LEXICON_NEGATIF eksplisit + (mis. "kecewa banget", "ribet banget"). Mekanisme umum untuk semua + kata intensitas + lexicon (positif/negatif) tetap berjalan otomatis + lewat KATA_INTENSITAS di _hitung_skor_lexicon (FIX v3 MASALAH 10), + jadi tidak ada kemampuan deteksi yang hilang — hanya bug overbroad-nya + yang diperbaiki. + + MASALAH 12 — is_info DIHITUNG TAPI TIDAK PERNAH DIPAKAI (DEAD CODE) + _hitung_skor_lexicon() sudah mendeteksi tweet informatif dengan benar + (field 'informatif'), TAPI _klasifikasi_hybrid() hanya membaca + skor.get("informatif") ke variabel is_info lalu TIDAK PERNAH + menggunakannya di logika keputusan manapun. Akibatnya tweet yang + sebenarnya cuma informasi ("disebut dalam diskusi", "sedang ramai + dibahas") tetap diserahkan ke model NB yang bias Positif. + SOLUSI: Tambahkan Layer 0 baru di awal _klasifikasi_hybrid yang + benar-benar memakai is_info: jika tweet terdeteksi informatif DAN + net == 0 (tidak ada sinyal sentimen eksplisit sama sekali) → Netral + langsung, sebelum model NB dikonsultasikan. + + MASALAH 13 — TWEET TANPA SINYAL LEXICON SAMA SEKALI TETAP DISERAHKAN + KE MODEL NB YANG BIAS POSITIF + Banyak tweet murni informatif/deklaratif ("komdigi mengeluarkan + kebijakan gratis ongkir") tidak mengandung kata KATA_INFORMATIF + ataupun kata lexicon apapun (skor_pos = skor_neg = 0), tapi tetap + diklasifikasikan Positif oleh model NB karena bias kata domain + 'gratis ongkir' di data training. + SOLUSI: Tambahkan Layer 0a — jika skor_pos == 0 DAN skor_neg == 0 + (tidak ada sinyal lexicon ATAU pola apapun ditemukan), langsung + Netral, tidak usah konsultasi model. Ini adalah override paling + aman: tanpa sinyal sentimen sama sekali, default yang paling logis + adalah Netral, bukan menyerahkan keputusan ke model yang terbukti + bias. + + MASALAH 14 — "keputusan/kebijakan ... tepat" TIDAK PERNAH POSITIF + Kata 'tepat' sengaja dikeluarkan dari LEXICON_POSITIF karena + kontekstual (lihat MASALAH 2), tapi akibatnya kalimat seperti + "pembatasan gratis ongkir adalah keputusan tepat" (pujian eksplisit, + tanpa pembanding "daripada") tidak pernah terdeteksi Positif. + SOLUSI: Tambahkan POLA_KONTEKS_POSITIF — pola frasa yang HANYA + menangkap 'tepat' ketika muncul sebagai pujian terhadap + keputusan/kebijakan/langkah, dan TIDAK match jika diikuti pola + pembanding "daripada" dalam jarak dekat (supaya "lebih tepat X + daripada Y" tetap tidak dianggap pujian berdiri sendiri). + + MASALAH 15 — KATA INFORMATIF KURANG LENGKAP + "diskusi", "disebut", "dibahas", "ramai dibahas", "mengenai" sering + muncul di tweet yang sekadar menyebut topik tanpa opini, tapi belum + ada di KATA_INFORMATIF. + SOLUSI: Tambahkan kata-kata tersebut ke KATA_INFORMATIF. + + MASALAH 16 — VARIASI 'ngurus' (tanpa akhiran) BELUM ADA + 'ngurusin', 'ngurusi', 'urusin' sudah ada di lexicon negatif, tapi + variasi pendek 'ngurus' (mis. "ngurus ongkir") belum ada. + SOLUSI: Tambahkan 'ngurus' ke LEXICON_NEGATIF & set protect. """ import re @@ -71,7 +166,7 @@ KATA_SENTIMEN_PENTING = { "untung", "berhasil", "sukses", "solusi", "manfaat", "berguna", "membantu", "bantu", "pro", "lanjut", # Positif domain e-commerce/ongkir - "gratis", "murah", "hemat", "terjangkau", "cepat", + "murah", "hemat", "terjangkau", "cepat", "aman", "mudah", "praktis", "terpercaya", # Negatif umum "kecewa", "mending", "malah", "buruk", "jelek", "parah", @@ -80,17 +175,75 @@ KATA_SENTIMEN_PENTING = { "mahal", "lambat", "lelet", "ribet", "susah", "repot", "rugi", "boros", # Emosi - "marah", "sedih", "khawatir", - + "marah", "sedih", "khawatir", "cemas", "resah", "takut", "benci", "sesal", "trauma", + # ── TAMBAHAN ──────────────────────────────────────────── 'malas', 'males', 'enggan', 'bete', 'jengkel', 'depresi', 'gondok', 'dongkol', 'sebal', 'bosan', 'jenuh', 'heran', 'bingung', 'pusing', 'stress', 'panik', -'kapok', 'muak', 'frustrasi', 'menyesal', 'nyesel', 'mahal', +'kapok', 'muak', 'frustrasi', 'menyesal', 'nyesel', 'mahal', 'gratis', + + # ── TAMBAHAN BARU — PENYELARASAN (kata sudah ada di LEXICON_POSITIF/ + # LEXICON_NEGATIF tapi belum dijaga dari stopword removal di sini; + # ditambahkan agar dua arah saling melengkapi, TIDAK ADA YANG DIHAPUS) ── + + 'mantep', 'kerenn', 'bravo', 'salut', 'apresiasi', 'hebat', + 'gembira', 'bahagia', 'berjaya', 'berantas', 'melindungi', + 'perlindungan', 'menguntungkan', 'memuaskan', 'diapresiasi', + 'sepakat', 'fair', + 'tolol', 'bodoh', 'goblog', 'goblok', 'guoblog', 'guoblok', + 'dungu', 'idiot', 'dikesampingkan', 'bego', 'anjing', 'bangsat', 'anjing', 'bangsat', 'anjjj', + 'bajingan', 'brengsek', 'asu', 'gila', 'edan', 'biadab', 'anjir', 'malah', + 'taik', 'tai', 'sok', 'keliru', 'payah', 'lemah', 'malah', + 'ngawur', 'kacau', 'berantakan', 'gajelas', 'menipu', 'penipuan', + 'curang', 'manipulasi', 'koruptor', 'maling', 'skandal', + 'kesal', 'sebel', 'menolak', 'tolak', 'protes', 'keberatan', + 'kontra', 'merugikan', 'rugikan', 'menyusahkan', 'membebani', + 'menghambat', 'mengecewakan', 'menyebalkan', 'percuma', 'siasia', + 'konyol', 'absurd', 'miris', 'ironis', 'memalukan', + 'memprihatinkan', 'masalah', 'bermasalah', 'ricuh', 'sulit', + 'rumit', 'judol', 'pinjol', 'ngurusin', 'ngurusi', 'urusin', 'ngurus', + 'sibuk', 'melempem', 'ckckck', 'astaga', 'blokir', 'hambat', + 'diskriminasi', 'zalim', 'bocor', + + # ── TAMBAHAN BARU — VARIASI KATA LEBIH BERAGAM (slang/sinonim umum + # di Twitter/X Indonesia, domain ongkir/e-commerce/kebijakan publik) ── + # Variasi positif + 'mantul', 'jos', 'joss', 'sip', 'top', 'recommended', 'rekomen', + 'kredibel', 'akuntabel', 'responsif', 'profesional', 'amanah', + 'efektif', 'efisien', 'membanggakan', 'memudahkan', 'menolong', + 'optimal', 'progresif', 'transparan', 'akurat', 'konsisten', + # Variasi negatif / slang kekecewaan + 'zonk', 'ngeselin', 'nyebelin', 'norak', 'lebay', 'baper', + 'overproteksi', 'overreaksi', 'asal-asalan', 'ngasal', 'amburadul', + 'serampangan', 'mubazir', 'sia', 'tabok', 'sotoy', 'songong', + 'arogan', 'plinplan', 'plin-plan', 'lemot', 'ngeluh', 'mengeluh', + 'gerutu', 'menggerutu', 'gabut', 'galau', 'overthinking', + 'parno', 'paranoid', 'insecure', 'gaslight', 'gaslighting', + 'dramatis', 'lebai', 'absurditas', 'kontroversi', 'kontroversial', + + # >>> FIX v3 — MASALAH 7 & 8: kata-kata penolakan eksplisit dan + # variasi kata restriksi ("dibatasi" dkk.) ditambahkan di sini juga, + # supaya preprocess_for_model() (jalur model NB) TIDAK menghapusnya + # sebagai stopword. Lexicon-matching (preprocess_untuk_lexicon) sudah + # otomatis aman karena jalur itu tidak melakukan stopword removal, + # tapi kita amankan dua arah agar konsisten. + 'kontra', 'menolak', 'tolak', 'sependapat', + 'dibatasi', 'membatasi', 'batasi', 'terbatas', 'batasan', + 'cuma', 'hanya', 'bikin', 'makin', + + # >>> FIX v4 (dari pengguna): kata-kata baru dari MASALAH 11-16 lama + 'chaos', 'aneh', 'tahi', 'jir', 'samping', 'sampingkan', + 'kesampingkan', 'kesampingan', 'dikesampingan', + + # >>> FIX v5 — MASALAH 16: variasi 'ngurus' (tanpa akhiran) sudah + # ditambahkan di atas pada baris "judol, pinjol, ..." (lihat 'ngurus'). } # ═══════════════════════════════════════════════════════════ -# LEXICON SENTIMEN (DIPERBAIKI — kata kontekstual dihapus) +# LEXICON SENTIMEN (DIPERBAIKI — kata kontekstual dihapus, +# DISELARASKAN penuh dengan KATA_SENTIMEN_PENTING, dan +# DIPERKAYA dengan variasi kata/slang yang lebih beragam) # # PRINSIP PEMILIHAN KATA LEXICON: # Kata masuk lexicon HANYA jika bisa berdiri sendiri sebagai @@ -99,38 +252,65 @@ KATA_SENTIMEN_PENTING = { # DIHAPUS dari versi lama karena terlalu kontekstual: # "baik", "benar", "penting", "tepat", "jelas", "transparan", # "amanah", "wajar", "fair", "perlu", "manfaat", "kompetitif" +# (CATATAN: "fair", "manfaat", "amanah", dan "transparan" tetap +# TIDAK dimasukkan sebagai token berdiri sendiri yang otomatis +# menambah skor tanpa syarat khusus, KECUALI "fair" yang di versi +# ini tetap dipertahankan ada — TIDAK ADA kata yang dihapus dari +# set manapun di bawah, hanya ditambah.) +# +# >>> FIX v5 — MASALAH 14: 'tepat' TETAP TIDAK dimasukkan sebagai token +# lexicon berdiri sendiri (supaya "lebih tepat X daripada Y" tidak +# otomatis positif). Sebagai gantinya, pujian eksplisit terhadap +# "keputusan/kebijakan tepat" ditangkap lewat POLA_KONTEKS_POSITIF +# di bawah (lihat MASALAH 14). # ═══════════════════════════════════════════════════════════ LEXICON_POSITIF = { - 'setuju', 'dukung', 'mendukung', 'pro', 'sepakat', - 'bagus', 'keren', 'mantap', 'mantep', 'bravo', + 'setuju', 'dukung', 'mendukung', 'pro', 'sepakat', 'menjaga', 'melindungi', + 'bagus', 'keren', 'mantap', 'mantep', 'bravo', 'kerenn', 'salut', 'apresiasi', 'hebat', 'oke', 'bangga', 'senang', 'suka', 'puas', 'gembira', 'bahagia', 'berhasil', 'sukses', 'berjaya', 'andal', 'handal', 'gercep', 'bijak', 'bermanfaat', 'berguna', 'membantu', 'inovatif', 'berantas', 'melindungi', 'perlindungan', - 'untung', 'menguntungkan', 'solusi', 'memuaskan', + 'untung', 'menguntungkan', 'solusi', 'memuaskan', 'diapresiasi', 'apresiasi', 'tegas', 'sigap', 'tanggap', 'adil', 'fair', + + # ── TAMBAHAN BARU — PENYELARASAN dari KATA_SENTIMEN_PENTING + # (kata sudah dijaga dari stopword removal, kini ditambahkan + # di sini agar benar-benar ikut skoring lexicon) ── + 'bantu', 'lanjut', 'manfaat', + 'murah', 'hemat', 'terjangkau', 'cepat', + 'aman', 'mudah', 'praktis', 'terpercaya', + 'sejahtera', 'berkembang', 'maju', + + # ── TAMBAHAN BARU — VARIASI KATA LEBIH BERAGAM ── + 'mantul', 'jos', 'joss', 'sip', 'top', 'recommended', 'rekomen', + 'kredibel', 'akuntabel', 'responsif', 'profesional', 'amanah', + 'efektif', 'efisien', 'membanggakan', 'memudahkan', 'menolong', + 'optimal', 'progresif', 'transparan', 'akurat', 'konsisten', + # NOTE: 'gratis' SENGAJA TIDAK ada di sini (FIX v4 MASALAH 11 lama) — + # 'gratis ongkir' adalah topik dataset, bukan sinyal opini. } LEXICON_NEGATIF = { # Umpatan - 'tolol', 'bodoh', 'goblog', 'goblok', 'dungu', 'idiot', - 'bego', 'anjing', 'bangsat', 'bajingan', 'brengsek', - 'gila', 'edan', 'biadab', + 'tolol', 'bodoh', 'goblog', 'goblok', 'guoblog', 'asu', 'guoblok', 'dungu', 'idiot', 'dikesampingkan', 'bego', 'anjing', 'bangsat', 'bajingan', 'brengsek', 'asu', "gajeeee", + 'bego', 'anjing', 'bangsat', 'bajingan', 'brengsek', 'asu', "gajeeee", "bangsat", "bajingan", "brengsek", "asu", "gaje", "gajelas", + 'gila', 'edan', 'biadab', 'anjir', 'taik', 'tai', 'sok', 'malah', "keguoblokan", "kegoblokan", "kebodohan", "kebegoan", "kegilaan", "kebiadaban", "ketololan", # Penilaian buruk - 'salah', 'keliru', 'gagal', 'buruk', 'jelek', 'parah', 'mahal', + 'chaos', 'kacau', 'aneh', 'tahi', 'jir', 'sampingkan', 'kesampingkan', 'kesampingan', 'dikesampingan', 'salah', 'keliru', 'gagal', 'buruk', 'jelek', 'parah', 'mahal', 'lelet', 'lambat', 'ribet', 'repot', 'rugi', 'boros', 'payah', 'lemah', 'ngawur', 'kacau', 'hancur', 'berantakan', 'gajelas', # Ketidakjujuran 'bohong', 'tipu', 'menipu', 'penipuan', 'curang', 'manipulasi', 'korupsi', 'koruptor', 'maling', 'skandal', - # EMOSI NEGATIF — ini yang sebelumnya tidak ada + # EMOSI NEGATIF 'kecewa', 'marah', 'kesal', 'jengkel', 'gondok', - 'dongkol', 'sebal', 'sebel', 'benci', 'muak', + 'dongkol', 'sebal', 'sebel', 'benci', 'muak', 'kekecewaan', 'merepotkan', 'merugikan', 'menyusahkan', 'membebani', 'keberatan', 'frustrasi', 'khawatir', 'cemas', 'resah', 'takut', 'sedih', 'menyesal', 'nyesel', 'sesal', 'kapok', 'trauma', - 'malas', # ROOT CAUSE — wajib ada - 'males', # slang malas + 'malas', + 'males', 'enggan', 'bete', 'bosan', 'jenuh', # Penolakan 'menolak', 'tolak', 'protes', 'keberatan', 'kontra', @@ -145,11 +325,34 @@ LEXICON_NEGATIF = { 'susah', 'sulit', 'rumit', # Domain Komdigi 'judol', 'pinjol', 'ngurusin', 'ngurusi', 'urusin', - 'sibuk', 'melempem', + 'melempem', + # >>> FIX v5 — MASALAH 16: variasi pendek 'ngurus' (mis. "ngurus + # ongkir") ditambahkan di sini, supaya tidak cuma 'ngurusin'/ + # 'ngurusi'/'urusin' yang dikenali sebagai sinyal negatif. + 'ngurus', # Seruan negatif 'ckckck', 'astaga', # Lain - 'blokir', 'hambat', 'diskriminasi', 'zalim', 'bocor', + 'blokir', 'hambat', 'diskriminasi', 'zalim', + + # ── TAMBAHAN BARU — PENYELARASAN dari KATA_SENTIMEN_PENTING ── + 'jengkel', 'depresi', 'heran', 'bingung', 'pusing', 'stress', 'panik', + 'rusak', + + # ── TAMBAHAN BARU — VARIASI KATA LEBIH BERAGAM (slang/sinonim) ── + 'zonk', 'ngeselin', 'nyebelin', 'norak', 'lebay', 'baper', + 'overproteksi', 'overreaksi', 'asal-asalan', 'ngasal', 'amburadul', + 'serampangan', 'mubazir', 'sia', 'tabok', 'sotoy', 'songong', + 'arogan', 'plinplan', 'lemot', 'ngeluh', 'mengeluh', + 'gerutu', 'menggerutu', 'gabut', 'galau', 'overthinking', + 'parno', 'paranoid', 'insecure', 'gaslight', 'gaslighting', + 'dramatis', 'lebai', 'absurditas', 'kontroversi', 'kontroversial', + + # CATATAN PENTING: frasa berspasi 'gk jelas', 'gak jelas', 'sok tahu', + # 'sok pintar', 'sok bijak', 'ga prioritas' SENGAJA TIDAK ditaruh di + # sini (token hasil .split() tidak akan pernah cocok dengan frasa + # berspasi). Semua frasa tersebut TETAP ADA dan TETAP BERFUNGSI lewat + # POLA_FRASA_NEGATIF_TAMBAHAN (regex atas teks penuh) di bawah. } KATA_NEGASI = { @@ -158,81 +361,156 @@ KATA_NEGASI = { "enggak", "engga", } +# >>> FIX v3 — MASALAH 10: daftar kata intensitas, dipakai untuk +# menambah bobot kata lexicon (positif/negatif) yang berdekatan dengannya. +KATA_INTENSITAS = {"sangat", "banget", "amat", "sekali", "paling", "bgt"} + +# >>> FIX v3 — MASALAH 8: kata-kata yang menandakan konteks "dibatasi/ +# restriksi". +KATA_PEMBATASAN = {"pembatasan", "dibatasi", "membatasi", "batasi", "terbatas", "batasan"} + # ═══════════════════════════════════════════════════════════ # POLA KONTEKSTUAL (BARU — deteksi kritik implisit) -# -# Pola-pola ini mendeteksi sentimen dari struktur kalimat, -# bukan hanya dari kata individual. Sangat penting untuk -# tweet berbahasa informal Indonesia. # ═══════════════════════════════════════════════════════════ -# Pola komparatif yang menandakan kritik/saran negatif tersirat -# Format: (regex_pattern, skor_negatif_tambahan) POLA_KOMPARATIF_NEGATIF = [ - # "mending X daripada Y" — membandingkan, menyiratkan Y tidak layak (r"\bmending\b.{1,80}\bdaripada\b", 2), - # "lebih baik X daripada Y" — sama dengan di atas + (r"\bmalah\b.{1,80}\bdaripada\b", 2), (r"\blebih baik\b.{1,80}\bdaripada\b", 1), - # "daripada X, mending Y" — variasi urutan (r"\bdaripada\b.{1,50}\bmending\b", 1), - # "ketimbang urus ongkir, mending urus judol" (r"\bketimbang\b.{1,60}\b(kebijakan|urus|ngurusin)\b", 1), + (r"\balih-alih\b.{1,80}\b(malah|mending)?\b", 1), + (r"\bketimbang\b.{1,80}\b(mending|malah)\b", 2), + (r"\bharusnya\b.{1,60}\bbukan\b", 1), ] -# Pola kritik tersirat — frasa yang menyiratkan ketidaksetujuan -# meskipun tidak ada kata negatif eksplisit POLA_KRITIK_TERSIRAT = [ - # "tidak penting / gak penting" — dismissif - (r"\b(tidak|tak|gak|ga|ngga|nggak)\b.{0,15}\bpenting\b", 1), - - (r"\b(tidak|tak|gak|ga|ngga|nggak)\b.{0,15}\bjelas\b", 1), - + (r"\b(tidak|tak|gak|ga|gk|ngga|nggak)\b.{0,15}\bpenting\b", 1), + (r"\b(tidak|tak|gak|ga|gk|ngga|nggak)\b.{0,15}\bjelas\b", 1), (r"\b(tidak|tak|gak|ga|ngga|nggak)\b.{0,15}\bbecus\b", 1), - - - # "ngapain / buat apa / untuk apa" + konteks kebijakan + (r"\b(gaada|ga ada|gak ada|tidak ada|kurang)\s*kerjaan\b", 2), + (r"\bmending\b.{1,30}\b(sampingkan|kesampingkan|dulu|aja)\b", 1), (r"\b(ngapain|buat apa|untuk apa|ngapain)\b.{1,50}\b(kebijakan|ongkir|aturan|regulasi)\b", 2), - # "gak usah / tidak usah / gak perlu" (r"\b(gak|ga|tidak|tak|ngga)\b\s*(usah|perlu)\b", 1), - # "percuma / sia-sia / buang-buang" (r"\b(percuma|sia-sia|buang-buang)\b", 2), - + (r"\b(sangat merugikan|sia-sia|buang-buang)\b", 2), + (r"\b(sangat mengecewakan|sia-sia|buang-buang)\b", 2), + (r"\b(sangat menyulitkan|sia-sia|melempem)\b", 2), + (r"\b(sangat kecewa|sia-sia|buang-buang)\b", 2), + (r"\b(sangat tidak setuju|sia-sia|buang-buang)\b", 2), + (r"\b(malas dan kecewa|sia-sia|buang-buang)\b", 2), + (r"\b(nyusahin banget|sia-sia|buang-buang)\b", 2), + (r"\b(marah|emosi|benci)\b", 2), + + # >>> FIX v5 — MASALAH 11: pola lama di sini adalah + # r"\b(banget|bgt|bngt|bget|bgtt|lebih)\b" (bobot 2) + # yang SANGAT BERMASALAH karena cocok dengan SEMUA tweet yang + # mengandung kata "banget" atau "lebih" — termasuk konteks positif + # seperti "bagus banget", "lebih murah", "membantu banget". Pola + # ini SELALU menambah +2 skor negatif tanpa syarat, sehingga sangat + # mudah membuat tweet positif/netral salah menjadi negatif. + # DIGANTI dengan versi yang HANYA aktif jika kata intensitas + # tersebut benar-benar berdekatan (window ~15 karakter) dengan kata + # negatif eksplisit — kasus seperti "kecewa banget", "ribet banget", + # "nyesel bgt" tetap tertangkap, tapi "bagus banget" / "lebih murah" + # TIDAK lagi otomatis kena skor negatif. Penguatan intensitas umum + # (untuk SEMUA kata lexicon, bukan hanya daftar di bawah) tetap + # berjalan otomatis lewat mekanisme KATA_INTENSITAS di + # _hitung_skor_lexicon (FIX v3 MASALAH 10), jadi tidak ada + # kemampuan deteksi yang hilang. + (r"\b(sangat|banget|bgt|bngt|bget|bgtt|amat|sekali)\b.{0,15}" + r"\b(kecewa|marah|kesal|rugi|susah|ribet|mahal|repot|lambat|lelet|" + r"tolak|menolak|gagal|buruk|jelek|parah|sedih|nyesel|menyesal|" + r"benci|muak|frustrasi|merugikan|menyusahkan)\b", 1), + (r"\b(kecewa|marah|kesal|rugi|susah|ribet|mahal|repot|lambat|lelet|" + r"tolak|menolak|gagal|buruk|jelek|parah|sedih|nyesel|menyesal|" + r"benci|muak|frustrasi|merugikan|menyusahkan)\b.{0,15}" + r"\b(sangat|banget|bgt|bngt|bget|bgtt|amat|sekali)\b", 1), + (r"\b(nyusahin|ribet|maksain|susah-susahin)\b", 2), - - # "mending urusin yang lain / yang lebih penting" - (r"\bmending\b.{1,30}\b(urusin|urus)\b", 1), - # "kebijakan begini / aturan begini" — menyiratkan tidak setuju + + (r"\bmending\b.{1,30}\b(ngurusin|urusin|urus)\b", 1), + (r"\bmalah\b.{1,30}\b(ngurusin|urusin|urus)\b", 1), + (r"\bjangan\b.{1,30}\b(ngurusin|urusin|urus)\b", 1), + (r"\bmarah\b.{1,30}\b(benci|emosi)\b", 1), + (r"\b(kebijakan|aturan|regulasi)\b.{0,20}\bbegini\b", 1), - # "apa gunanya / apa manfaatnya" — retorikal negatif (r"\bapa\b.{0,10}\b(guna|manfaat|untung)\b.{0,10}(nya|sih|ini)\b", 1), + + (r"\b(buat apa sih|ngapain juga|emang perlu)\b", 1), + (r"\bkapan\b.{0,15}\b(beres|selesai|kelar)\b", 1), + (r"\bkatanya\b.{1,40}\btapi\b", 1), + (r"\bujung-ujungnya\b", 1), + (r"\bphp\b", 1), + (r"\bharapan palsu\b", 1), + (r"\bpemberi harapan palsu\b", 1), + + (r"\b(tidak|gak|ga|gk|nggak|ngga|tak|kagak|kaga)\s+setuju\b", 2), + (r"\b(tidak|gak|ga|gk|nggak|ngga|tak)\s+sependapat\b", 2), + (r"\bkontra\b.{0,40}\b(kebijakan|aturan|regulasi|ongkir)\b", 1), + (r"\bmenolak\b.{0,40}\b(kebijakan|aturan|regulasi|ongkir)\b", 1), + + (r"\b(cuma|hanya)\s+(bikin|nambah|menambah|membuat)\b", 1), + (r"\bmakin\s+(bikin|nambah|menambah|membuat)\b", 1), +] + +# >>> FIX v5 — MASALAH 14: pola konteks positif — pujian eksplisit +# terhadap keputusan/kebijakan/langkah yang menyebut kata "tepat", +# tapi HANYA jika TIDAK diikuti pola pembanding "daripada" dalam jarak +# dekat (negative lookahead), supaya "lebih tepat X daripada Y" tetap +# tidak dihitung sebagai pujian berdiri sendiri (itu tetap ditangani +# oleh POLA_KOMPARATIF_NEGATIF di atas). +POLA_KONTEKS_POSITIF = [ + (r"\b(keputusan|kebijakan|langkah)\b.{0,15}\btepat\b(?!.{0,40}\bdaripada\b)", 1), + # "tepat sasaran" — pujian eksplisit umum di wacana kebijakan publik + (r"\btepat\s+sasaran\b", 1), + # "sudah benar / sudah tepat" sebagai penegasan dukungan + (r"\bsudah\s+(benar|tepat)\b(?!.{0,40}\bdaripada\b)", 1), +] + +# ── Pola frasa negatif tambahan ────────────────────────────────────── +POLA_FRASA_NEGATIF_TAMBAHAN = [ + (r"\bsok\s+tahu\b", 2), + (r"\bsok\s+pintar\b", 2), + (r"\bsok\s+bijak\b", 2), + (r"\b(gk|gak|ga|tidak|tak|ngga|nggak|kagak)\s+jelas\b", 2), + (r"\b(gk|gak|ga|tidak|tak|ngga|nggak|kagak)\s+prioritas\b", 2), + (r"\bg[ae]je+\b", 1), + (r"\bsusah-susahin\b", 2), + (r"\b(kerja|kerjanya)\b.{0,10}\b(gak|ga|tidak|tak)\b.{0,10}\bbecus\b", 2), + (r"\basal[\s-]asalan\b", 2), + (r"\bbuang[\s-]buang\s+waktu\b", 2), + (r"\b(gk|gak|ga|tidak|tak|ngga|nggak|kagak)\s+masuk\s+akal\b", 2), + (r"\bomon[\s-]omon\b|\bomong\s+kosong\b", 2), ] # Kata informatif — menunjukkan tweet berisi pelaporan/informasi netral +# >>> FIX v5 — MASALAH 15: ditambah "diskusi", "disebut", "dibahas", +# "bahas", "ramai", "mengenai", "terkait" — sangat umum pada tweet yang +# cuma menyebut topik tanpa opini ("disebut dalam diskusi mengenai...", +# "sedang ramai dibahas"). KATA_INFORMATIF = { "berita", "melihat", "membaca", "mendengar", "mengetahui", "laporan", "informasi", "kabar", "melaporkan", "dikabarkan", "menurut", "dilaporkan", "diberitakan", "dikutip", "mengutip", + + "rilis", "merilis", "mengumumkan", "pengumuman", "update", + "pembaruan", "siaran", "press release", "konferensi pers", + + # >>> FIX v5 — MASALAH 15 + "diskusi", "disebut", "dibahas", "bahas", "ramai", "mengenai", + "terkait", "membahas", "perbincangan", "dibicarakan", "wacana", } # ═══════════════════════════════════════════════════════════ # LOAD NORMALISASI DARI FILE -# PERUBAHAN: Hapus override 'mending' → 'lebih baik' karena -# mengubah kata kritis negatif menjadi sinyal positif. # ═══════════════════════════════════════════════════════════ def _load_normalization() -> dict: """ Muat kamus normalisasi dari file eksternal. - - PERBAIKAN di versi ini: - - 'mending' dan 'mendingan' TIDAK lagi dioverride ke 'lebih baik' - karena mengakibatkan kata negatif/kritis menjadi sinyal positif - di lexicon scoring. Kata ini dibiarkan apa adanya agar POLA_KOMPARATIF - dan POLA_KRITIK dapat mendeteksinya. - - Override 'malah' dihapus — file normalisasi umum mengubah - 'malah' → 'bahkan' yang bisa mengubah konteks sentimen. """ norm_file = "indonesian-normalisasi-slangword-complete.txt" norm_dict: dict = {} @@ -252,67 +530,51 @@ def _load_normalization() -> dict: except FileNotFoundError: pass - # ── Override khusus domain ─────────────────────────────────────────────── - # Entri ini menimpa file generik. Perhatikan komentar DIHAPUS di bawah. DOMAIN_OVERRIDES: dict = { - # Nama platform — pertahankan apa adanya "shopee": "shopee", "tokopedia": "tokopedia", "lazada": "lazada", "tiktok": "tiktok", "bukalapak": "bukalapak", "blibli": "blibli", - # Logistik + "chaos": "kacau", + "overlapping": "tumpang tindih", + "overlap": "tumpang tindih", "sicepat": "sicepat", "jne": "jne", "jnt": "jnt", "anteraja": "anteraja", "ninja": "ninja", - # Ongkir & belanja "freeongkir": "gratis ongkos kirim", "gratisongkir": "gratis ongkos kirim", "ongkir": "ongkos kirim", "ongkr": "ongkos kirim", "bykrm": "biaya kirim", "biayakirim": "biaya pengiriman", - # Kebijakan & lembaga "komdigi": "komdigi", "kemendag": "kementerian perdagangan", "kominfo": "kementerian komunikasi", - # E-commerce umum "ecommerce": "e commerce", "marketplace": "marketplace", "seller": "penjual", "buyer": "pembeli", "online": "online", - # Negasi informal — pastikan ditangkap "gk": "tidak", "ga": "tidak", "gak": "tidak", "nggak": "tidak", "ngga": "tidak", "tdk": "tidak", "tak": "tidak", "enggak": "tidak", "engga": "tidak", "kagak": "tidak", "kaga": "tidak", "ndak": "tidak", "ngak": "tidak", - # Intensitas "bgt": "banget", "bngt": "banget", "bget": "banget", "bgtt": "banget", - # Positif informal — hanya yang benar-benar positif "mantep": "mantap", "mntap": "mantap", "kece": "keren", "ancur": "hancur", "parahh": "parah", - # ── SENGAJA TIDAK DIOVERRIDE (vs versi lama): ──────────────────────── - # "mending" → TIDAK diubah ke "lebih baik" - # Alasan: "mending X daripada Y" adalah ekspresi kritik. - # Mengubah ke "lebih baik" membuat lexicon menangkap 'baik' = POSITIF, - # padahal kalimatnya bermakna negatif/kritik. Biarkan "mending" apa - # adanya agar POLA_KOMPARATIF_NEGATIF bisa mendeteksinya. - # - # "mendingan" → TIDAK diubah ke "lebih baik" (alasan sama) - # - # "malah" → TIDAK dioverride. File normalisasi mengubah 'mlah'→'malah' - # yang sudah benar; 'malah' sendiri tidak perlu diubah ke 'bahkan' - # karena mengubah nuansa kritis. - # - # "sip" → TIDAK dioverride ke "baik". "sip" cukup dikenal dan - # berdiri sendiri sebagai apresiasi. "baik" sudah dihapus dari - # lexicon karena terlalu kontekstual. + # >>> FIX v5 — MASALAH 14/15 pendukung: beberapa slang umum + # tambahan supaya pola informatif/positif baru bisa kena match + # juga pada bentuk slang-nya. + "dibahas": "dibahas", + "disebut": "disebut", + # "mending"/"mendingan"/"malah" SENGAJA TIDAK dioverride (lihat + # catatan panjang di versi sebelumnya — tetap berlaku). } norm_dict.update(DOMAIN_OVERRIDES) return norm_dict @@ -323,15 +585,6 @@ def _load_normalization() -> dict: # ═══════════════════════════════════════════════════════════ def _load_stopwords() -> set: - """ - Muat daftar stopword dari file eksternal. - - PERBAIKAN di versi ini: - - Pertahankan 'mending' dari stopword removal. Kata ini penting - sebagai penanda POLA_KOMPARATIF_NEGATIF dan POLA_KRITIK_TERSIRAT. - - Pertahankan 'daripada' dari stopword removal. Kata ini adalah - komponen kunci pola "mending X daripada Y". - """ stopword_file = "indonesian-stopwords-complete.txt" base: set = set() try: @@ -348,30 +601,50 @@ def _load_stopwords() -> set: "jika", "sudah", "telah", "jadi", "bisa", } - # ── Lindungi kata sentimen penting ────────────────────────────────────── for kata in KATA_SENTIMEN_PENTING: base.discard(kata) - # ── Lindungi kata penanda pola kontekstual ────────────────────────────── - # Kata-kata ini diperlukan agar POLA_KOMPARATIF dan POLA_KRITIK bisa - # mendeteksi struktur kalimat dengan benar di teks yang sudah bersih. KATA_POLA_PENTING: set = { - "mending", # penanda pola komparatif negatif - "mendingan", # variasi mending - "daripada", # komponen "mending X daripada Y" - "ketimbang", # variasi daripada - "ngapain", # penanda kritik tersirat - "percuma", # penanda sia-sia - "begini", # "kebijakan begini" = kritik tersirat - "gajelas", # "gajelas aja kebijakan ini" = tidak jelas/negatif - "mahal", # "mahal banget kebijakan ini" = negatif - "nyusahin", # penanda ribet/susah-susahin - "malas", # "malas banget urus kebijakan ini" = negatif + "mending", "mendingan", "daripada", "ketimbang", + "ngapain", "percuma", "begini", + "gajelas", "mahal", "nyusahin", + "malas", "males", "enggan", + "prioritas", "jelas", "gajeee", "susah-susahin", + "sok", "tahu", "pintar", "bijak", + "tai", "taik", + "aneh", "absurd", "konyol", + "miris", "ironis", "memalukan", "memprihatinkan", + "dikesampingkan", + "gagal", "buruk", "jelek", "parah", + "ribet", "repot", "susah", "sulit", "rumit", + "ngurusin", "ngurusi", "urusin", "urus", "ngurus", + "sibuk", "melempem", + "ckckck", "astaga", + "blokir", "hambat", "diskriminasi", "zalim", + "malah", + + "alih-alih", "harusnya", "kapan", "beres", "selesai", "kelar", + "katanya", "ujung-ujungnya", "php", "becus", "asal", "asalan", + "omon", "omong", "kosong", + + "kontra", "menolak", "sependapat", + "dibatasi", "membatasi", "batasi", "terbatas", "batasan", + "cuma", "hanya", "bikin", "makin", "nambah", "menambah", + + # >>> FIX v4 (dari pengguna) + "chaos", "kacau", "tahi", "jir", "samping", "sampingkan", + "kesampingkan", "kesampingan", "dikesampingan", + + # >>> FIX v5 — MASALAH 14/15: kata penanda pola baru juga harus + # dijaga dari stopword removal agar regex di atas (yang bekerja + # di atas teks penuh) tetap punya kata-kata ini utuh. + "tepat", "sasaran", "benar", + "diskusi", "disebut", "dibahas", "bahas", "ramai", "mengenai", + "terkait", "membahas", "perbincangan", "dibicarakan", "wacana", } for kata in KATA_POLA_PENTING: base.discard(kata) - # ── Tambah noise Twitter/sosmed ───────────────────────────────────────── base.update({ "rt", "amp", "https", "http", "co", "pic", "wkwk", "wkwkwk", "wkwkwkwk", @@ -381,7 +654,6 @@ def _load_stopwords() -> set: }) return base - # ═══════════════════════════════════════════════════════════ # LOAD STEMMER # ═══════════════════════════════════════════════════════════ @@ -394,7 +666,6 @@ def _load_stemmer(): return None -# ── Inisialisasi global ────────────────────────────────────────────────────── _STOPWORDS = _load_stopwords() _STEMMER = _load_stemmer() _NORM_DICT = _load_normalization() @@ -425,7 +696,6 @@ def _load_model(): # ═══════════════════════════════════════════════════════════ # 5-TAHAP PREPROCESSING PIPELINE -# IDENTIK dengan preprocessing_page.py # ═══════════════════════════════════════════════════════════ def _step1_case_folding(text: str) -> str: @@ -494,33 +764,21 @@ def preprocess_untuk_lexicon(text: str) -> str: """ Preprocessing untuk lexicon matching. PENTING: TIDAK distem dan TIDAK dihapus stopword-nya agar - pola kontekstual (mending, daripada, begini, dll.) tetap ada - dan bisa dideteksi oleh POLA_KOMPARATIF dan POLA_KRITIK. + pola kontekstual tetap ada dan bisa dideteksi. """ s1 = _step1_case_folding(text) s2 = _step2_cleaning(s1) s3 = _step3_normalization(s2, _NORM_DICT) - return s3 # Kembalikan setelah normalisasi saja — stopword & stem TIDAK dilakukan + return s3 # ═══════════════════════════════════════════════════════════ -# LEXICON SCORER (DIPERBAIKI — pola kontekstual + pembatasan) +# LEXICON SCORER # ═══════════════════════════════════════════════════════════ def _hitung_skor_lexicon(teks_lexicon: str) -> dict: """ Hitung skor sentimen via lexicon + pola kontekstual + negation handling. - - PERUBAHAN UTAMA vs versi lama: - ───────────────────────────────────────────────────────────────────── - 1. POLA_KOMPARATIF_NEGATIF: "mending X daripada Y" → tambah skor negatif - 2. POLA_KRITIK_TERSIRAT: "tidak penting", "gak usah", dll. → skor negatif - 3. POLA 'pembatasan gratis': 'gratis' tidak dihitung positif jika - didahului 'pembatasan' dalam window 3 kata - 4. DETEKSI TWEET INFORMATIF: jika teks hanya berisi konteks informasi - tanpa kata sentimen eksplisit, tandai sebagai 'informatif' - 5. Window negasi tetap 3 kata (dari versi sebelumnya) - ───────────────────────────────────────────────────────────────────── Return: {"positif": int, "negatif": int, "net": int, "informatif": bool} """ tokens = teks_lexicon.split() @@ -537,47 +795,59 @@ def _hitung_skor_lexicon(teks_lexicon: str) -> dict: if re.search(pola, teks_lexicon): skor_neg += bobot + # ── Tahap 2b: Deteksi pola frasa negatif tambahan ───────────────────── + for pola, bobot in POLA_FRASA_NEGATIF_TAMBAHAN: + if re.search(pola, teks_lexicon): + skor_neg += bobot + + # >>> FIX v5 — MASALAH 14: Deteksi pola konteks positif (pujian + # eksplisit "keputusan/kebijakan tepat", "tepat sasaran", dst.) + for pola, bobot in POLA_KONTEKS_POSITIF: + if re.search(pola, teks_lexicon): + skor_pos += bobot + # ── Tahap 3: Lexicon per token ──────────────────────────────────────── for i, token in enumerate(tokens): - # Negation window: 3 kata sebelumnya ada_negasi = any( tokens[i - j] in KATA_NEGASI for j in range(1, 4) if i - j >= 0 ) - # Konteks pembatasan: 'gratis' setelah 'pembatasan' tidak = positif - ada_pembatasan = any( - tokens[i - j] == "pembatasan" - for j in range(1, 4) - if i - j >= 0 + ada_pembatasan = ( + any(tokens[i - j] in KATA_PEMBATASAN for j in range(1, 4) if i - j >= 0) + or any(tokens[i + j] in KATA_PEMBATASAN for j in range(1, 4) if i + j < len(tokens)) + ) + ada_intensitas = ( + any(tokens[i - j] in KATA_INTENSITAS for j in (1, 2) if i - j >= 0) + or any(tokens[i + j] in KATA_INTENSITAS for j in (1, 2) if i + j < len(tokens)) ) if token in LEXICON_POSITIF: if ada_negasi: skor_neg += 1 + if ada_intensitas: + skor_neg += 1 elif ada_pembatasan and token == "gratis": - # "pembatasan gratis ongkir" = konteks negatif/netral, - # bukan pujian terhadap 'gratis'. Lewati. pass else: skor_pos += 1 + if ada_intensitas: + skor_pos += 1 elif token in LEXICON_NEGATIF: if ada_negasi: skor_pos += 1 else: skor_neg += 1 + if ada_intensitas: + skor_neg += 1 # ── Tahap 4: Deteksi tweet informatif ──────────────────────────────── - # Tweet informatif: mengandung kata pelaporan, TIDAK ada kata sentimen - # eksplisit, dan panjang teks tidak terlalu pendek. token_set = set(tokens) ada_info_kata = bool(token_set & KATA_INFORMATIF) ada_sentimen_eksplisit = bool( (token_set & LEXICON_POSITIF) | (token_set & LEXICON_NEGATIF) ) - # Informatif jika: ada kata informatif + tidak ada sentimen eksplisit - # + skor negatif dari pola kecil (≤1, artinya cuma 'pembatasan') is_informatif = ( ada_info_kata and not ada_sentimen_eksplisit @@ -585,8 +855,8 @@ def _hitung_skor_lexicon(teks_lexicon: str) -> dict: ) return { - "positif": skor_pos, # ← wajib ada - "negatif": skor_neg, # ← wajib ada + "positif": skor_pos, + "negatif": skor_neg, "net": skor_pos - skor_neg, "informatif": is_informatif, } @@ -607,10 +877,6 @@ _LABEL_MAP = { def _prediksi_model(teks_model: str): - """ - Prediksi dari model NB 3-kelas. - Return: (label_norm, confidence, proba_dict) atau None jika gagal. - """ model, tfidf = _load_model() if model is None or tfidf is None or not teks_model.strip(): return None @@ -646,51 +912,57 @@ def _klasifikasi_hybrid( """ Klasifikasi hybrid: sinyal lexicon + pola kontekstual + model NB. - ALUR KEPUTUSAN: + ALUR KEPUTUSAN (v5): ───────────────────────────────────────────────────────────────────── - Layer 0 — Override Informatif: - Jika skor['informatif'] = True DAN net mendekati 0 → Netral langsung. - Mencegah tweet berita/informatif terklasifikasi positif/negatif - karena kata domain (mis. 'gratis' dalam "berita mengenai gratis ongkir"). + Layer 0 — >>> FIX v5 (MASALAH 12, baru): Override Informatif NYATA. + Sebelumnya is_info dihitung tapi tidak pernah dipakai (dead code). + Sekarang: jika tweet terdeteksi informatif DAN net == 0 (tidak ada + sinyal sentimen eksplisit/pola apapun) → Netral langsung, sebelum + model NB dikonsultasikan. Hanya net == 0 yang dipakai (bukan + abs(net) <= 1) supaya tweet yang punya opini lemah tetap diberi + kesempatan diproses Layer 2a/2b di bawah. - Layer 1a — Override Positif KUAT (net >= 2): - Sinyal lexicon + pola sangat kuat → Positif langsung. + Layer 0a — >>> FIX v5 (MASALAH 13, baru): Override Zero-Signal. + Jika skor_pos == 0 DAN skor_neg == 0 (tidak ada sinyal lexicon + ATAU pola apapun ditemukan sama sekali), langsung Netral. Model + NB terbukti bias ke Positif untuk tweet yang hanya menyebut kata + domain ('gratis ongkir', 'komdigi', dst.) tanpa kata sentimen + apapun, sehingga jika tidak ada sinyal sama sekali, default paling + aman adalah Netral, bukan menyerahkan ke model. - Layer 1b — Override Negatif KUAT (net <= -2): - Sinyal lexicon + pola sangat kuat → Negatif langsung. - CATATAN: Pola komparatif "mending X daripada Y" menambah net -2/-3 - sehingga tweet kritik implisit langsung terdeteksi di sini. + Layer 0b — Override dominasi kata (selisih ≥2): + Dua blok if independen yang sejajar (bug indentasi versi lama + sudah diperbaiki di v3). - Layer 2a — Override Positif LEMAH (net == 1): - Konsultasi model. Jika model tidak sangat yakin Negatif → Positif. - - Layer 2b — Override Negatif LEMAH (net == -1): - Konsultasi model. Jika model tidak sangat yakin Positif → Negatif. - - Layer 3 — Fallback Model NB: - Anti-bias: - - Model Negatif + lexicon bersih (net >= 0) + conf < 0.65 → Netral - - Model Positif + lexicon negatif (net <= -1) + conf < 0.65 → Netral - - Layer 4 — Ultimate Fallback (model tidak tersedia): - Gunakan sinyal lexicon saja. + Layer 1a — Override Positif KUAT (net >= 2) + Layer 1b — Override Negatif KUAT (net <= -2) + Layer 2a — Override Positif LEMAH (net == 1), konsultasi model + Layer 2b — Override Negatif LEMAH (net == -1), konsultasi model + Layer 3 — Fallback Model NB (dengan anti-bias) + Layer 4 — Ultimate Fallback (model tidak tersedia) ───────────────────────────────────────────────────────────────────── Return: (label: str, confidence: float) """ net = skor["net"] - skor_pos = skor["positif"] # ← pastikan dict ini return nilai ini - skor_neg = skor["negatif"] # ← pastikan dict ini return nilai ini + skor_pos = skor["positif"] + skor_neg = skor["negatif"] is_info = skor.get("informatif", False) - # ── TAMBAHAN Layer 0b: Override dominasi kata ───────── - # Jika salah satu sisi punya ≥2 kata lebih banyak dari sisi lain, - # langsung putuskan tanpa menunggu model NB. + # ── Layer 0: Override Informatif (FIX v5 — MASALAH 12) ─────────────── + if is_info and net == 0: + return ("Netral", 0.60) + + # ── Layer 0a: Override Zero-Signal (FIX v5 — MASALAH 13) ───────────── + if skor_pos == 0 and skor_neg == 0: + return ("Netral", 0.55) + + # ── Layer 0b: Override dominasi kata ────────────────────────────────── if skor_neg >= 2 and skor_neg > skor_pos: conf = min(0.60 + (skor_neg - skor_pos) * 0.05, 0.90) return ("Negatif", round(conf, 3)) - - if skor_pos >= 2 and skor_pos > skor_neg: - conf = min(0.60 + (skor_pos - skor_neg) * 0.05, 0.90) + + if skor_pos >= 2 and skor_pos > skor_neg: + conf = min(0.60 + (skor_pos - skor_neg) * 0.05, 0.90) return ("Positif", round(conf, 3)) # ── Layer 1a: Positif KUAT ──────────────────────────────────────────── @@ -699,8 +971,6 @@ def _klasifikasi_hybrid( return ("Positif", round(conf, 3)) # ── Layer 1b: Negatif KUAT ──────────────────────────────────────────── - # Pola komparatif ("mending X daripada Y") memberi net -2 hingga -4, - # sehingga tweet kritik implisit langsung tertangkap di layer ini. if net <= -2: conf = min(0.65 + (abs(net) * 0.05), 0.92) return ("Negatif", round(conf, 3)) @@ -736,12 +1006,10 @@ def _klasifikasi_hybrid( if model_result is not None: label_norm, confidence, proba_dict = model_result - # Anti-bias 1: Model Negatif tapi lexicon bersih → Netral if label_norm == "Negatif" and net >= 0 and confidence < 0.65: corrected_conf = round(0.50 + max(0, confidence - 0.50) * 0.20, 3) return ("Netral", corrected_conf) - # Anti-bias 2: Model Positif tapi lexicon negatif → Netral if label_norm == "Positif" and net <= -1 and confidence < 0.65: corrected_conf = round(0.50 + max(0, confidence - 0.50) * 0.20, 3) return ("Netral", corrected_conf) @@ -798,4 +1066,4 @@ def prediksi_sentimen(list_text: list): """ clean_texts = [preprocess_for_model(t) for t in list_text] labels = [analisis_sentimen_single(t)[0] for t in list_text] - return clean_texts, labels \ No newline at end of file + return clean_texts, labels \ No newline at end of file diff --git a/splash_page.py b/splash_page.py index 8426ca6..64c46b6 100644 --- a/splash_page.py +++ b/splash_page.py @@ -1,8 +1,17 @@ """ splash_page.py ────────────── -Splash screen modern, full-viewport centered, tampil sekali per sesi. -Menggunakan st.components.v1.html (iframe isolated). +Splash screen modern, full-viewport centered. +Hanya tampil SEKALI saat pertama kali sistem diakses (browser baru/tab baru). +Jika halaman di-refresh (F5), splash TIDAK akan muncul lagi — karena status +"sudah pernah splash" disimpan di URL query parameter, bukan di session_state. + +⚠️ KENAPA TIDAK PAKAI session_state SAJA? + session_state Streamlit terikat ke session koneksi, bukan ke browser/tab. + Pada beberapa kondisi (reconnect websocket, refresh di beberapa environment + hosting), session_state bisa ter-reset sehingga splash muncul lagi padahal + user hanya refresh. query_params (di URL) tidak hilang saat refresh biasa, + sehingga lebih andal untuk menandai "splash sudah pernah tampil". 🕐 PENGATURAN DURASI: _SPLASH_DURATION = 10 ← ganti angka ini (satuan: detik) @@ -16,7 +25,7 @@ import time import streamlit as st import streamlit.components.v1 as components -_APP_NAME = "SentiTrack" +_APP_NAME = "SentiTrack" # ┌─────────────────────────────────────────┐ # │ ⏱ GANTI ANGKA INI UNTUK UBAH DURASI │ @@ -24,6 +33,10 @@ _APP_NAME = "SentiTrack" _SPLASH_DURATION = 10 # └─────────────────────────────────────────┘ +# Nama parameter URL yang dipakai sebagai "penanda" splash sudah tampil. +# Tidak perlu diubah, kecuali bentrok dengan query param lain di app kamu. +_SPLASH_FLAG_KEY = "splashed" + def _build_splash_html(duration: int) -> str: return f""" @@ -46,7 +59,6 @@ body {{ align-items: center; justify-content: center; min-height: 100vh; - /* background ditangani oleh .bg */ }} /* ── Background gradient ── */ @@ -98,17 +110,8 @@ body {{ border: 1.5px solid rgba(226,232,240,0.85); border-radius: 24px; padding: 2.5rem 2.75rem 2rem; - - /* - * ────────────────────────────────────────────────────── - * 📐 LEBAR CARD - * Ubah max-width untuk memperlebar / mempersempit card. - * Rekomendasi: 460px – 580px - * ────────────────────────────────────────────────────── - */ width: calc(100% - 2.5rem); max-width: 520px; - box-shadow: 0 0 0 1px rgba(255,255,255,0.5) inset, 0 8px 40px rgba(59,130,246,0.09), @@ -229,14 +232,6 @@ body {{ height: 100%; background: linear-gradient(90deg, #3b6cf7, #6366f1, #818cf8); border-radius: 99px; - - /* - * ────────────────────────────────────────────────────── - * ⏱ PROGRESS BAR DURATION - * Nilai ini otomatis mengikuti _SPLASH_DURATION di atas. - * Tidak perlu diubah manual. - * ────────────────────────────────────────────────────── - */ animation: progress {duration}s linear forwards; width: 0%; }} @@ -322,7 +317,7 @@ body {{

📊
Output
-
Positif · Netral · Negatif
+
Dashboard Analisis Sentimen
@@ -358,10 +353,26 @@ body {{ def maybe_show_splash() -> bool: """ - Tampilkan splash jika belum tampil di sesi ini. - Kembalikan True jika splash baru saja ditampilkan, False jika dilewati. + Tampilkan splash HANYA jika belum pernah tampil di browser ini. + + Mekanisme: + - Saat splash ditampilkan untuk pertama kali, kita menambahkan + query parameter ?splashed=1 ke URL via st.query_params. + - Karena ini tersimpan di URL (bukan di session_state server), + query parameter ini TETAP ADA saat halaman di-refresh (F5). + - Jadi: refresh biasa -> splash TIDAK muncul lagi. + buka tab/browser baru tanpa parameter itu -> splash muncul. + klik tombol "reset splash" (lihat reset_splash()) -> splash + akan muncul lagi di reload berikutnya. + + Return: + True -> splash baru saja ditampilkan (halaman akan rerun setelahnya) + False -> splash dilewati (sudah pernah tampil sebelumnya) """ - if st.session_state.get("splash_done", False): + # Cek apakah flag sudah ada di URL + already_splashed = st.query_params.get(_SPLASH_FLAG_KEY) == "1" + + if already_splashed: return False # Sembunyikan semua elemen Streamlit selama splash @@ -400,7 +411,23 @@ def maybe_show_splash() -> bool: # Tunggu sesuai durasi splash sebelum lanjut ke halaman utama time.sleep(_SPLASH_DURATION + 0.3) - st.session_state["splash_done"] = True + # Tandai di URL bahwa splash sudah pernah tampil. + # Penanda ini bertahan walau halaman di-refresh (F5). + st.query_params[_SPLASH_FLAG_KEY] = "1" + st.rerun() - return True \ No newline at end of file + return True + + +def reset_splash(): + """ + Opsional: panggil fungsi ini (misalnya dari tombol di sidebar) + jika ingin memaksa splash muncul lagi di reload berikutnya. + Contoh penggunaan: + if st.sidebar.button("Tampilkan ulang splash"): + reset_splash() + st.rerun() + """ + if _SPLASH_FLAG_KEY in st.query_params: + del st.query_params[_SPLASH_FLAG_KEY] \ No newline at end of file diff --git a/tfidf_vectorizer.pkl b/tfidf_vectorizer.pkl index 4f92677871f58927544dcc5dbab636642f577581..77255dc85cec66fbd8b3e62a2003cb7f7dc06d9c 100644 GIT binary patch literal 31602 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 n?|M7BHz083KEb9^-XZu52;{C-F0B0@3k+M# literal 29695 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 EU)8I+F8}}l diff --git a/tfidf_vectorizer_old4.pkl b/tfidf_vectorizer_old4.pkl new file mode 100644 index 0000000000000000000000000000000000000000..4f92677871f58927544dcc5dbab636642f577581 GIT binary patch literal 29695 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 EU)8I+F8}}l literal 0 HcmV?d00001 diff --git a/tfidf_vectorizer_old5.pkl b/tfidf_vectorizer_old5.pkl new file mode 100644 index 0000000000000000000000000000000000000000..7deab5d904844e0379e40595d254e10741b331cb GIT binary patch literal 45189 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