This commit is contained in:
adistya13 2026-06-14 13:37:17 +07:00
parent 29a2ae2515
commit 7588f26c1e
20 changed files with 94 additions and 65 deletions

Binary file not shown.

BIN
model_naive_bayes_old2.pkl Normal file

Binary file not shown.

BIN
model_naive_bayes_old3.pkl Normal file

Binary file not shown.

View File

@ -1 +1 @@
{"activated": true, "updated_at": "2026-06-13T08:45:55.522176+00:00"} {"activated": true, "updated_at": "2026-06-14T06:33:33.496213+00:00"}

View File

@ -159,6 +159,18 @@ KATA_SENTIMEN_PENTING = {
"mendingan", # variasi mending "mendingan", # variasi mending
"malah", # "malah rugi / malah tambah mahal" = negatif "malah", # "malah rugi / malah tambah mahal" = negatif
"percuma", # "percuma aja kebijakan ini" = sia-sia/negatif "percuma", # "percuma aja kebijakan ini" = sia-sia/negatif
"ngapain", # "ngapain buat kebijakan ini" = kritik tersirat
"daripada", # komponen "mending X daripada Y"
"ketimbang", # variasi daripada
"begini", # "kebijakan begini" = kritik tersirat
"gajelas", # "gajelas aja kebijakan ini" = tidak jelas/negatif
"nyusahin", # "kebijakan ini nyusahin" = ribet/susah-susahin"
"malas", # "malas banget urus kebijakan ini" = negatif
# TAMBAHAN — kata emosi negatif
'malas', 'males', 'enggan', 'bete', 'jengkel', 'depresi',
'gondok', 'dongkol', 'sebal', 'bosan', 'jenuh', 'heran', 'bingung', 'pusing', 'stress', 'panik',
'kapok', 'muak', 'frustrasi', 'menyesal', 'nyesel', 'mahal',
} }
@ -176,6 +188,9 @@ KATA_POLA_PENTING = {
"ngapain", # penanda kritik tersirat "ngapain", # penanda kritik tersirat
"percuma", # penanda sia-sia "percuma", # penanda sia-sia
"begini", # "kebijakan begini" = kritik tersirat "begini", # "kebijakan begini" = kritik tersirat
"gajelas", # "gajelas aja kebijakan ini" = tidak jelas/negatif
"mahal", # "mahal banget kebijakan ini" = negatif
"nyusahin", # penanda ribet/susah-susahin
} }

View File

@ -81,6 +81,11 @@ KATA_SENTIMEN_PENTING = {
"rugi", "boros", "rugi", "boros",
# Emosi # Emosi
"marah", "sedih", "khawatir", "marah", "sedih", "khawatir",
# ── TAMBAHAN ────────────────────────────────────────────
'malas', 'males', 'enggan', 'bete', 'jengkel', 'depresi',
'gondok', 'dongkol', 'sebal', 'bosan', 'jenuh', 'heran', 'bingung', 'pusing', 'stress', 'panik',
'kapok', 'muak', 'frustrasi', 'menyesal', 'nyesel', 'mahal',
} }
@ -97,66 +102,54 @@ KATA_SENTIMEN_PENTING = {
# ═══════════════════════════════════════════════════════════ # ═══════════════════════════════════════════════════════════
LEXICON_POSITIF = { LEXICON_POSITIF = {
# Apresiasi murni 'setuju', 'dukung', 'mendukung', 'pro', 'sepakat',
"bagus", "keren", "mantap", "mantep", "hebat", 'bagus', 'keren', 'mantap', 'mantep', 'bravo',
"oke", "sip", "top", "jos", "goks", "kece", "mantul", 'salut', 'apresiasi', 'hebat', 'oke',
"terbaik", "cakep", "cucok", "gaskeun", "kuy", 'bangga', 'senang', 'suka', 'puas', 'gembira', 'bahagia',
# Dukungan / persetujuan 'berhasil', 'sukses', 'berjaya',
"setuju", "dukung", "mendukung", "pro", "lanjut", "sepakat", 'andal', 'handal', 'gercep', 'bijak', 'bermanfaat',
# Emosi positif 'berguna', 'membantu', 'inovatif',
"bangga", "senang", "suka", "puas", "gembira", "bahagia", 'berantas', 'melindungi', 'perlindungan',
"syukur", "alhamdulillah", 'untung', 'menguntungkan', 'solusi', 'memuaskan',
# Keberhasilan
"berhasil", "sukses", "berjaya",
# Kualitas SDM/institusi
"andal", "handal", "gercep", "sigap", "tanggap", "tegas",
"adil", "bijak", "bermanfaat", "berguna", "membantu",
"inovatif", "maju", "berkembang", "sejahtera", "terpercaya",
# Ekonomi / ongkir positif
"untung", "gratis", "murah", "hemat", "terjangkau",
"efisien", "mudah", "praktis", "cepat", "aman", "andalan",
# Solusi
"solusi", "menguntungkan", "memuaskan", "membanggakan",
"mengagumkan",
# ─── DIHAPUS (terlalu kontekstual): ────────────────
# "baik" → "lebih baik X daripada Y" bukan pujian langsung
# "benar" → kontekstual ("itu benar" bisa netral)
# "penting" → "lebih penting" bukan pujian
# "wajar" → netral kontekstual
# "perlu" → netral kontekstual
# "tepat" → kontekstual
# "jelas" → kontekstual
# "fair" → kontekstual
# "manfaat" → kontekstual
# "kompetitif", "saing" → kontekstual
} }
LEXICON_NEGATIF = { LEXICON_NEGATIF = {
# Umpatan
'tolol', 'bodoh', 'goblog', 'goblok', 'dungu', 'idiot',
'bego', 'anjing', 'bangsat', 'bajingan', 'brengsek',
'gila', 'edan', 'biadab',
# Penilaian buruk # Penilaian buruk
"buruk", "jelek", "parah", "rusak", "hancur", "ancur", 'salah', 'keliru', 'gagal', 'buruk', 'jelek', 'parah', 'mahal',
"gagal", "ambruk", "terpuruk", "bangkrut", 'payah', 'lemah', 'ngawur', 'kacau', 'hancur', 'berantakan', 'gajelas',
"ngaco", "ngasal", "gaje", "receh",
"salah", "keliru", "gegabah", "sembarangan", "ngawur",
# Ketidakjujuran # Ketidakjujuran
"bohong", "tipu", "curang", "manipulasi", "korupsi", 'bohong', 'tipu', 'menipu', 'penipuan', 'curang',
"kebohongan", "penipuan", "hoax", "kibul", 'manipulasi', 'korupsi', 'koruptor', 'maling', 'skandal',
"monopoli", "licik", # EMOSI NEGATIF — ini yang sebelumnya tidak ada
# Emosi negatif 'kecewa', 'marah', 'kesal', 'jengkel', 'gondok',
"kecewa", "marah", "sedih", "khawatir", "takut", 'dongkol', 'sebal', 'sebel', 'benci', 'muak',
"benci", "jijik", "muak", "kesal", "frustrasi", 'frustrasi', 'khawatir', 'cemas', 'resah', 'takut',
"geram", "dongkol", 'sedih', 'menyesal', 'nyesel', 'sesal', 'kapok', 'trauma',
# Ekonomi / ongkir negatif 'malas', # ROOT CAUSE — wajib ada
"mahal", "rugi", "merugikan", "rugikan", "overprice", 'males', # slang malas
"lambat", "lemot", "lelet", "boros", 'enggan', 'bete', 'bosan', 'jenuh',
"memberatkan", "menyulitkan", # Penolakan
# Kesulitan / masalah 'menolak', 'tolak', 'protes', 'keberatan', 'kontra',
"ribet", "susah", "sulit", "bermasalah", "repot", # Dampak negatif
"ngeributin", 'merugikan', 'rugikan', 'menyusahkan', 'membebani',
# Sifat mengecewakan 'menghambat', 'mengecewakan', 'menyebalkan',
"mengecewakan", "menyebalkan", "menyusahkan", # Sindiran
# Kritik / penolakan 'percuma', 'siasia', 'konyol', 'absurd', 'miris',
"mengeluh", "protes", "menolak", "tolak", "keberatan", 'ironis', 'memalukan', 'memprihatinkan',
"diskriminasi", "zalim", # Masalah
'masalah', 'bermasalah', 'ricuh', 'kacau', 'ribet',
'susah', 'sulit', 'rumit',
# Domain Komdigi
'judol', 'pinjol', 'ngurusin', 'ngurusi', 'urusin',
'sibuk', 'melempem',
# Seruan negatif
'ckckck', 'astaga',
# Lain
'blokir', 'hambat', 'diskriminasi', 'zalim', 'bocor',
} }
KATA_NEGASI = { KATA_NEGASI = {
@ -192,12 +185,21 @@ POLA_KOMPARATIF_NEGATIF = [
POLA_KRITIK_TERSIRAT = [ POLA_KRITIK_TERSIRAT = [
# "tidak penting / gak penting" — dismissif # "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}\bpenting\b", 1),
(r"\b(tidak|tak|gak|ga|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 # "ngapain / buat apa / untuk apa" + konteks kebijakan
(r"\b(ngapain|buat apa|untuk apa|ngapain)\b.{1,50}\b(kebijakan|ongkir|aturan|regulasi)\b", 2), (r"\b(ngapain|buat apa|untuk apa|ngapain)\b.{1,50}\b(kebijakan|ongkir|aturan|regulasi)\b", 2),
# "gak usah / tidak usah / gak perlu" # "gak usah / tidak usah / gak perlu"
(r"\b(gak|ga|tidak|tak|ngga)\b\s*(usah|perlu)\b", 1), (r"\b(gak|ga|tidak|tak|ngga)\b\s*(usah|perlu)\b", 1),
# "percuma / sia-sia / buang-buang" # "percuma / sia-sia / buang-buang"
(r"\b(percuma|sia-sia|buang-buang)\b", 2), (r"\b(percuma|sia-sia|buang-buang)\b", 2),
(r"\b(nyusahin|ribet|maksain|susah-susahin)\b", 2),
# "mending urusin yang lain / yang lebih penting" # "mending urusin yang lain / yang lebih penting"
(r"\bmending\b.{1,30}\b(urusin|urus)\b", 1), (r"\bmending\b.{1,30}\b(urusin|urus)\b", 1),
# "kebijakan begini / aturan begini" — menyiratkan tidak setuju # "kebijakan begini / aturan begini" — menyiratkan tidak setuju
@ -361,6 +363,10 @@ def _load_stopwords() -> set:
"ngapain", # penanda kritik tersirat "ngapain", # penanda kritik tersirat
"percuma", # penanda sia-sia "percuma", # penanda sia-sia
"begini", # "kebijakan begini" = kritik tersirat "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
} }
for kata in KATA_POLA_PENTING: for kata in KATA_POLA_PENTING:
base.discard(kata) base.discard(kata)
@ -579,8 +585,8 @@ def _hitung_skor_lexicon(teks_lexicon: str) -> dict:
) )
return { return {
"positif": skor_pos, "positif": skor_pos, # ← wajib ada
"negatif": skor_neg, "negatif": skor_neg, # ← wajib ada
"net": skor_pos - skor_neg, "net": skor_pos - skor_neg,
"informatif": is_informatif, "informatif": is_informatif,
} }
@ -672,13 +678,20 @@ def _klasifikasi_hybrid(
Return: (label: str, confidence: float) Return: (label: str, confidence: float)
""" """
net = skor["net"] net = skor["net"]
skor_pos = skor["positif"] # ← pastikan dict ini return nilai ini
skor_neg = skor["negatif"] # ← pastikan dict ini return nilai ini
is_info = skor.get("informatif", False) is_info = skor.get("informatif", False)
# ── Layer 0: Override tweet informatif ─────────────────────────────── # ── TAMBAHAN Layer 0b: Override dominasi kata ─────────
# Tweet yang hanya berisi pelaporan/informasi tanpa sentimen eksplisit # Jika salah satu sisi punya ≥2 kata lebih banyak dari sisi lain,
# dan net mendekati 0 → langsung Netral agar tidak salah klasifikasi. # langsung putuskan tanpa menunggu model NB.
if is_info and -1 <= net <= 1: if skor_neg >= 2 and skor_neg > skor_pos:
return ("Netral", 0.52) 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)
return ("Positif", round(conf, 3))
# ── Layer 1a: Positif KUAT ──────────────────────────────────────────── # ── Layer 1a: Positif KUAT ────────────────────────────────────────────
if net >= 2: if net >= 2:

Binary file not shown.

BIN
tfidf_vectorizer_old2.pkl Normal file

Binary file not shown.

BIN
tfidf_vectorizer_old3.pkl Normal file

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

View File

@ -1 +0,0 @@

View File

@ -1 +1,3 @@
"conversation_id_str","created_at","favorite_count","full_text","id_str","image_url","in_reply_to_screen_name","lang","location","quote_count","reply_count","retweet_count","tweet_url","user_id_str","username"
"2065876194948743503","Sat Jun 13 19:17:21 +0000 2026","0","setuju komdigi mengeluarkan gratis ongkir sehingga saya menjadi malas dan kecewa","2065876194948743503","","","in","","0","0","0","https://x.com/undefined/status/2065876194948743503","1814143201718247424",
"2066043912842822069","Sun Jun 14 06:23:48 +0000 2026","0","saya tidak setuju dengan kebijakan komdigi dengan mengeluarkan kebijakan gratis ongkir ini membuat saya jadi senang berbelanja","2066043912842822069","","","in","","0","0","0","https://x.com/undefined/status/2066043912842822069","1814143201718247424",

1 conversation_id_str created_at favorite_count full_text id_str image_url in_reply_to_screen_name lang location quote_count reply_count retweet_count tweet_url user_id_str username
2 2065876194948743503 Sat Jun 13 19:17:21 +0000 2026 0 setuju komdigi mengeluarkan gratis ongkir sehingga saya menjadi malas dan kecewa 2065876194948743503 in 0 0 0 https://x.com/undefined/status/2065876194948743503 1814143201718247424
3 2066043912842822069 Sun Jun 14 06:23:48 +0000 2026 0 saya tidak setuju dengan kebijakan komdigi dengan mengeluarkan kebijakan gratis ongkir ini membuat saya jadi senang berbelanja 2066043912842822069 in 0 0 0 https://x.com/undefined/status/2066043912842822069 1814143201718247424