# ========================================== # KAMUS & LINGUISTIC ASSETS # ========================================== # A. Kamus Aspek (Advanced with Triggers) ASPECT_KEYWORDS = { "en": { "Audio Quality": [ # Technical Terms "audio", "sound", "voice", "bass", "treble", "mid", "frequency", "equalizer", "eq", "dolby", "hifi", "stereo", "lossless", "bitrate", "kbps", "soundstage", "crisp", "volume", "normalize", "crossfade", "mono", "surround", "spatial", # Positive Nuance "crystal clear", "eargasm", "immersive", "HD", "punchy", # Negative Symptoms (The "Symptom-based Detection") "distortion", "noise", "static", "muffled", "robotic", "tinny", "echo", "glitchy sound", "crackling", "hissing", "cuts out", "popping", "clipping", "skip", "stutter", "quiet", "loud", "flat", "low quality", "muds", "leaking", ], "Content & Library": [ # Music Items "song", "track", "music", "playlist", "album", "artist", "band", "discography", "library", "catalog", "genre", "collection", "release", "single", "cover", "lyrics", "karaoke", "sing along", "verse", "chorus", # Non-Music Content "podcast", "episode", "audiobook", "host", "story", "content", "talk show", # Discovery & Trends "recommendation", "suggestion", "discover weekly", "release radar", "mix", "top 50", "viral", "k-pop", "indie", "hiphop", "jazz", "lofi", "ost", # Availability Issues "missing", "greyed out", "unavailable", "removed", "licensing", "region lock", ], "App Performance & Stability": [ # Crashes & Critical "crash", "force close", "closes itself", "shut down", "freeze", "froze", "black screen", "white screen", "boot", "stuck", "unresponsive", "hang", # Bugs & Glitches "glitch", "bug", "error", "failure", "broken", "issue", "problem", # Performance/Speed "slow", "lag", "laggy", "latency", "delay", "sluggish", "bloated", "heavy", # Connectivity & Data "loading", "buffer", "buffering", "waiting", "offline mode", "connection", "internet", "wifi", "signal", "data usage", "no connection", "network", # Resource Impact "battery", "drain", "heat", "overheat", "storage", "space", "cache", "ram", "app", ], "User Interface (UI) & UX": [ # Visual Elements "interface", "ui", "design", "layout", "look", "theme", "color", "icon", "dark mode", "light mode", "button", "font", "text", "size", # Navigation & Usability "navigation", "menu", "screen", "display", "cluttered", "confusing", "clean", "modern", "user friendly", "intuitive", "aesthetic", "scroll", "swipe", "gesture", "sidebar", "tab", "library view", ], "Features & Functionality": [ # Specific Features "search", "queue", "share", "connect", "devices", "remote", "car play", "android auto", "widget", "notification", "sleep timer", "lyrics sync", "canvas", "video", "story", "wrap", "wrapped", # Account & Login "login", "sign in", "logout", "account", "password", "profile", "download", "save", "install", "update", ], "Price, Premium & Ads": [ # Costs & Plans "price", "cost", "expensive", "cheap", "affordable", "fee", "charge", "billing", "payment", "money", "worth", "value", "greedy", "rip off", # Premium Features "premium", "subscription", "plan", "student", "family", "duo", "trial", "renew", "cancel", "refund", "upgrade", # Advertisements "ad", "ads", "advertisement", "commercial", "sponsor", "promotion", "interrupt", "unskippable", "video ads", "30 seconds", "spam", ], "Algorithm & Shuffle": [ # Randomness "shuffle", "random", "repeat", "loop", "smart shuffle", "enhanced shuffle", "mix", "radio", "pattern", "algorithm", "playing same song", # Quality of Suggestion "irrelevant", "repetitive", "bad suggestion", "same artists", "boring", ], }, "id": { "Audio Quality": [ # Keyword Formal "suara", "audio", "bunyi", "vokal", "instrumen", "kualitas", "volume", "bass", "bas", "treble", "equalizer", "eq", "dolby", "stereo", "speaker", # Kata Sifat & Gejala (Symptom-based) "jernih", "bening", # "bagus", "nendang", "mantap", "halus", "detail", "cempreng", "pecah", "sember", "mendem", "kresek", "kresek-kresek", "robot", "berisik", "kecil banget", "gede", "tenggelam", "hancur", "putus", "putus-putus", "macet-macet", "ngadat", "grebeg", "bocora", "mono", "low quality", "ga ada suara", "ilang suaranya", "bisor", ], "Content & Library": [ # Musik & Item "lagu", "musik", "track", "trek", "playlist", "album", "artis", "band", "penyanyi", "katalog", "rilisan", "single", "cover", "mp3", "genre", "dangdut", "koplo", "pop", "jazz", "rock", "indie", "kpop", # Non-Musik "podcast", "cerita", "dongeng", "horror", "episode", "konten", "lirik", "teks", "karaoke", "terjemahan", # Koleksi User "koleksi", "pustaka", "liked songs", "disukai", "downloadan", "unduhan", # Masalah Ketersediaan "lagu hilang", "dihapus", "ga ada", "ga lengkap", "judul", "cari lagu", ], "App Performance & Stability": [ # Crash & Hang (Bahasa PlayStore Liar) "crash", "force close", "fc", "mental", "keluar sendiri", "keluar terus", "keluar mulu", "kelempar", "tutup sendiri", "stopped", "stuck", "macet", "hang", "ngelag", "freeze", "layar hitam", "blank", "bapuk", # Masalah Kecepatan/Koneksi "lemot", "lambat", "lelet", "lola", "berat", "ngadat", "muter", "muter-muter", "loading", "buffer", "buffering", "lama banget", "lama", "koneksi", "sinyal", "offline", "internet", "jaringan", "server", "down", # Masalah Hardware/Sistem "baterai", "batrai", "batre", "boros", "panas", "cepet panas", "overheat", "memori", "ram", "penuh", "cache", "data", "kuota", "makan tempat", "sedot", "ngabisin", "hp kentang", "rusak", "aplikasi", ], "User Interface (UI) & UX": [ # Visual "tampilan", "ui", "desain", "interface", "layout", "tema", "warna", "menu", "tombol", "huruf", "tulisan", "font", "ikon", "gambar", "background", "latar", "gelap", "terang", "dark mode", # Navigasi & Rasa "bingung", "pusing", "ribet", "susah", "gampang", "mudah", "simpel", "bersih", "rapi", "berantakan", "aneh", "jelek", "keren", "elegan", "geser", "pencet", "klik", "navigasi", ], "Features & Functionality": [ # Fitur Spesifik "fitur", "lirik", "lyrics", "download", "unduh", "simpan", "cari", "search", "share", "bagi", "connect", "jam", "blend", "widget", "notif", "pemberitahuan", "update", "pembaruan", "versi", # Login & Akun "login", "masuk", "daftar", "logout", "keluar akun", "akun", "email", "password", "sandi", "verifikasi", "otp", ], "Price, Premium & Ads": [ # Iklan (Sangat Sering Dikeluhkan) "iklan", "ads", "ad", "promosi", "pariwara", "sponsor", "commercial", "banyak iklan", "iklan mulu", "kebanyakan iklan", "nonton iklan", "gangguan", "kepotong", "skip", # Harga "harga", "biaya", "tarif", "bayar", "tagihan", "uang", "duid", "mahal", "kemahalan", "murah", "terjangkau", "murmer", "naik harga", "matre", "maruk", "kuras dompet", "sedot pulsa", # Langganan & Premium "premium", "langganan", "berbayar", "gratisan", "vip", "paket", "family", "student", "pelajar", "trial", "percobaan", "metode", "gopay", "dana", "ovo", "shopeepay", "pulsa", ], "Algorithm & Shuffle": [ # Acak Lagu "shuffle", "acak", "random", "urutan", "ngulang", "itu-itu aja", "muter ulang", "campur", "smart shuffle", # Rekomendasi "rekomendasi", "saran", "mix", "radio", "algoritma", "pilihan", "sesuai selera", "ga nyambung", "maksa", ], }, } # B. Kamus Slang Indonesia (Normalisasi) SLANG_MAP = { # --- 1. NEGASI (Sangat Penting untuk Sentimen) --- "ga": "tidak", "gak": "tidak", "nggak": "tidak", "enggak": "tidak", "tak": "tidak", "tdk": "tidak", "kagak": "tidak", "kaga": "tidak", "nda": "tidak", "ndak": "tidak", "ora": "tidak", "g": "tidak", "gx": "tidak", "bkn": "tidak", "tidad": "tidak", "tidaklah": "tidak", "no": "tidak", "nop": "tidak", "nope": "tidak", "jangan": "jangan", "jgn": "jangan", "jan": "jangan", "blm": "belum", "blom": "belum", "lom": "belum", "belom": "belum", # --- 2. PRONOMINA (Kata Ganti Orang) --- "gw": "aku", "gue": "aku", "gua": "aku", "w": "aku", "gwe": "aku", "aku": "aku", "sy": "saya", "sya": "saya", "ane": "saya", "ogut": "saya", "aq": "saya", "lu": "kamu", "loe": "kamu", "lo": "kamu", "el": "kamu", "u": "kamu", "ente": "kamu", "km": "kamu", "kmu": "kamu", "situ": "kamu", "kalian": "kalian", "klian": "kalian", "dy": "dia", "die": "dia", "doi": "dia", "qt": "kita", "kitta": "kita", # --- 3. KATA HUBUNG & PREPOSISI (Structure) --- "yg": "yang", "yng": "yang", "yang": "yang", "dg": "dengan", "dgn": "dengan", "dengn": "dengan", "pake": "pakai", "pke": "pakai", "dr": "dari", "dri": "dari", "krn": "karena", "karna": "karena", "crn": "karena", "soalnya": "karena", "cz": "karena", "utk": "untuk", "untk": "untuk", "bwt": "untuk", "buat": "untuk", "tu": "untuk", "klo": "kalau", "kalo": "kalau", "kl": "kalau", "kalau": "kalau", "misal": "kalau", "tp": "tapi", "tpi": "tapi", "tapinya": "tapi", "ttapi": "tapi", "spt": "seperti", "kek": "seperti", "kyk": "seperti", "kayak": "seperti", "mcam": "seperti", "sm": "sama", "sma": "sama", "smua": "semua", "dlm": "dalam", "dlam": "dalam", "or": "atau", "ato": "atau", "dan": "dan", "dn": "dan", "ama": "sama", "pd": "pada", "pda": "pada", "ad": "ada", "ada": "ada", "adlh": "adalah", "itu": "itu", "tu": "itu", "tuh": "itu", "ntu": "itu", "ini": "ini", "ni": "ini", "nih": "ini", "bgt": "banget", "bangt": "banget", "bngt": "banget", "pisan": "banget", "kali": "banget", "aja": "saja", "aj": "saja", "ae": "saja", "doang": "saja", "dh": "sudah", "sdh": "sudah", "dah": "sudah", "udah": "sudah", "sudah": "sudah", "wis": "sudah", "lg": "sedang", "lagi": "sedang", "lgi": "sedang", "bs": "bisa", "bisa": "bisa", "iso": "bisa", "dapat": "bisa", # --- 4. SENTIMEN POSITIF (Adjectives & Expressions) --- "bgs": "bagus", "bagus": "bagus", "baguss": "bagus", "bgus": "bagus", "keren": "bagus", "kece": "bagus", "cakep": "bagus", "mantap": "bagus", "mantul": "bagus", "mantab": "bagus", "top": "bagus", "best": "bagus", "good": "bagus", "sip": "bagus", "jos": "bagus", "ok": "oke", "oke": "oke", "oks": "oke", "gacor": "bagus", "epik": "bagus", "epic": "bagus", "suka": "suka", "demen": "suka", "love": "suka", "luv": "suka", "laf": "suka", "enak": "nyaman", "pw": "nyaman", "nyaman": "nyaman", "asik": "asik", "puas": "puas", "worthed": "layak", "worth": "layak", "berguna": "berguna", "membantu": "membantu", "help": "membantu", "terbaik": "terbaik", "the best": "terbaik", "jernih": "jernih", "bening": "jernih", "bersih": "jernih", "kenceng": "keras", "lengkap": "lengkap", "komplit": "lengkap", "murah": "murah", "murmer": "murah", "terjangkau": "murah", "hemat": "murah", "cepet": "cepat", "cpt": "cepat", "lancar": "lancar", "wus": "cepat", "ngebut": "cepat", "mudah": "mudah", "gampang": "mudah", "simple": "mudah", "simpel": "mudah", # --- 5. SENTIMEN NEGATIF (Adjectives & Expressions) --- "jelek": "buruk", "jlek": "buruk", "bad": "buruk", "buruk": "buruk", "parah": "buruk", "payah": "buruk", "kacau": "buruk", "ancur": "buruk", "busuk": "buruk", "bosok": "buruk", "ampas": "buruk", "sampah": "buruk", "burik": "buruk", "zonk": "buruk", "gagal": "buruk", "kecewa": "kecewa", "nyesel": "menyesal", "rugi": "rugi", "nyesal": "menyesal", "benci": "benci", "sebel": "kesal", "kesel": "kesal", "emosi": "marah", "muak": "muak", "capek": "lelah", "bosen": "bosan", "bete": "bosan", "mahal": "mahal", "mehong": "mahal", "kemahalan": "mahal", "boros": "boros", "berat": "berat", "bapuk": "berat", "kentang": "berat", "ribet": "susah", "susah": "susah", "sulit": "susah", "mbulet": "susah", "aneh": "aneh", "gajelas": "aneh", "gj": "aneh", "gaje": "aneh", "berisik": "bising", "bising": "bising", "ganggu": "ganggu", "mengganggu": "ganggu", "palsu": "palsu", "fake": "palsu", "bohong": "bohong", "tipu": "tipu", "scam": "penipuan", # --- 6. ISTILAH TEKNIS / MASALAH APLIKASI (Technical Terms) --- "apk": "aplikasi", "app": "aplikasi", "apps": "aplikasi", "aplkasi": "aplikasi", "apl": "aplikasi", "donlot": "unduh", "download": "unduh", "dunlut": "unduh", "dl": "unduh", "unduh": "unduh", "install": "instal", "instal": "instal", "inul": "instal ulang", "apdet": "pembaruan", "update": "pembaruan", "updet": "pembaruan", "versi": "versi", "login": "masuk", "log in": "masuk", "sign in": "masuk", "masuk": "masuk", "logout": "keluar", "log out": "keluar", "sign out": "keluar", "loading": "memuat", "loding": "memuat", "load": "memuat", "buffer": "buffering", "bafer": "buffering", "buffering": "buffering", "muter": "buffering", "lemot": "lambat", "lelet": "lambat", "lola": "lambat", "lag": "lambat", "ngelag": "lambat", "slow": "lambat", "error": "rusak", "eror": "rusak", "err": "rusak", "bug": "rusak", "bugs": "rusak", "glitch": "rusak", "crash": "macet", "cras": "macet", "force close": "macet", "fc": "macet", "keluar sendiri": "macet", "mental": "macet", "stuck": "macet", "hang": "macet", "freze": "macet", "ngefreeze": "macet", "iklan": "iklan", "ads": "iklan", "ad": "iklan", "klan": "iklan", "kuota": "data", "kouta": "data", "paket": "data", "net": "internet", "inet": "internet", "wifi": "internet", "sinyal": "sinyal", "jaringan": "sinyal", "koneksi": "sinyal", "connect": "hubung", "offline": "luring", "online": "daring", "hp": "ponsel", "hape": "ponsel", "batre": "baterai", "batrai": "baterai", "lowbat": "baterai", "memori": "penyimpanan", "storage": "penyimpanan", "penuh": "penuh", "akun": "akun", "acc": "akun", "id": "akun", "pass": "sandi", "password": "sandi", "sandi": "sandi", "otp": "kode", "langganan": "langganan", "subs": "langganan", "subscribe": "langganan", "premium": "premium", "prem": "premium", "vip": "premium", "bayar": "bayar", "beli": "beli", "suara": "suara", "audio": "suara", "sound": "suara", "musik": "musik", "music": "musik", "lagu": "lagu", "song": "lagu", "playlist": "daftar putar", "lirik": "lirik", "lyrics": "lirik", "video": "video", "gambar": "gambar", "pic": "gambar", "foto": "gambar", "fitur": "fitur", "feature": "fitur", "menu": "menu", "tombol": "tombol", "button": "tombol", "layar": "layar", "screen": "layar", "tampilan": "tampilan", # "ui": "tampilan", "theme": "tema", "mode": "mode", # --- 7. KATA KERJA UMUM (Verbs) --- "tau": "tahu", "taw": "tahu", "bilang": "kata", "blg": "kata", "bikin": "buat", "buat": "buat", "liat": "lihat", "lht": "lihat", "nonton": "tonton", "denger": "dengar", "dengar": "dengar", "dengerin": "dengar", "mendengarkan": "dengar", "cari": "cari", "search": "cari", "browsing": "cari", "pencet": "tekan", "klik": "tekan", "geser": "geser", "swipe": "geser", "scroll": "gulir", "buka": "buka", "open": "buka", "tutup": "tutup", "close": "tutup", "kirim": "kirim", "send": "kirim", "share": "bagikan", "bagi": "bagikan", "simpan": "simpan", "save": "simpan", "hapus": "hapus", "delete": "hapus", "del": "hapus", "ilang": "hilang", "fix": "perbaiki", "benerin": "perbaiki", "betulin": "perbaiki", "mo": "mau", "mau": "mau", "mw": "mau", "pengen": "mau", "pingin": "mau", "ingin": "mau", "niat": "mau", "kudu": "harus", "hrs": "harus", "mesti": "harus", "wajib": "harus", "bantu": "bantu", "tolong": "bantu", "tlng": "bantu", "kasih": "beri", "kasi": "beri", "ngasih": "beri", "makasih": "terima kasih", "mksh": "terima kasih", "tq": "terima kasih", "thx": "terima kasih", "thanks": "terima kasih", "trims": "terima kasih", "suwun": "terima kasih", "sorry": "maaf", "maap": "maaf", "mnta": "minta", # --- 8. KATA KETERANGAN & LAINNYA (Adverbs/Others) --- "skrg": "sekarang", "now": "sekarang", "besok": "besok", "kemarin": "kemarin", "kpn": "kapan", "kapan": "kapan", "sini": "sini", "situ": "sana", "sana": "sana", "dimana": "dimana", "dmn": "dimana", "knp": "kenapa", "np": "kenapa", "napa": "kenapa", "mengapa": "kenapa", "gmn": "bagaimana", "gimana": "bagaimana", "gmna": "bagaimana", "kekmana": "bagaimana", "bijimane": "bagaimana", "smpe": "sampai", "sampe": "sampai", "smp": "sampai", "trus": "terus", "trs": "terus", "tros": "terus", "lanjut": "lanjut", "mulu": "terus", "melulu": "terus", "sering": "sering", "sring": "sering", "kerap": "sering", "kadang": "kadang", "kdang": "kadang", "pernah": "pernah", "prnah": "pernah", "jarang": "jarang", "banyak": "banyak", "bnyk": "banyak", "byk": "banyak", "full": "penuh", "dikit": "sedikit", "sdkit": "sedikit", "kurang": "kurang", "krg": "kurang", "lebih": "lebih", "lbh": "lebih", "paling": "paling", "pling": "paling", "ter": "paling", "sekali": "sekali", "skali": "sekali", "hanya": "hanya", "cuman": "hanya", "cuma": "hanya", "malah": "malah", "mlah": "malah", "justru": "malah", "kok": "kenapa", "kan": "kan", "khan": "kan", "lah": "lah", "dong": "dong", "dung": "dong", "deh": "deh", "sih": "sih", "tuh": "itu", "kok": "kenapa", # --- 9. NOISE / SWEAR WORDS (Diubah ke String Kosong / Netral) --- "anjing": "", "njir": "", "anjir": "", "asu": "", "bangsat": "", "bgst": "", "kampret": "", "kmprt": "", "babi": "", "monyet": "", "kunyuk": "", "bajingan": "", "tai": "", "taek": "", "sialan": "", "sial": "", "goblok": "bodoh", "gblk": "bodoh", "bego": "bodoh", "tolol": "bodoh", "bodoh": "bodoh", "idiot": "bodoh", "geblek": "bodoh", "dungo": "bodoh", "woy": "", "woi": "", "hoy": "", "eh": "", "bro": "", "gan": "", "min": "admin", "sis": "", "kak": "", "boss": "", "om": "", "wkwk": "", "wkwkwk": "", "haha": "", "hehe": "", "huhu": "", "hihi": "", "wk": "", } # C. Whitelist Negasi (Agar tidak dihapus Stopwords) NEGATION_WORDS = { # 1. Negasi Dasar & Variasi Slang (Direct Negation) "tidak", "tak", "tanpa", "bukan", "jangan", "dilarang", "tiada", "anti", "ga", "gak", "nggak", "kagak", "kaga", "ndak", "nda", "ora", "bkn", "jgn", "g", "gx", "blm", "belum", "lom", "blom", "tidaklah", "bukanlah", # 2. Konjungsi Kontras (Contrast - Pembalik Sentimen) "tapi", "tetapi", "namun", "melainkan", "sedangkan", "sebaliknya", "justru", "padahal", "walaupun", "meskipun", "kendati", "biarpun", "walau", "meski", "kecuali", "selain", "hanya", "cuma", "cuman", "cma", "cm", "saja", "sayang", "sayangnya", "syg", "disayangkan", "akan tetapi", "namun demikian", "hanya saja", # 3. Negasi Implisit & Keterbatasan (Scarcity) "kurang", "jarang", "sedikit", "hampir", "nyaris", "minim", "terbatas", "susah", "sulit", "sukar", "berat", # 4. Emotif Negatif & Kata Sifat Buruk (Strong Negative Sentiment) "kecewa", "mengecewakan", "jelek", "buruk", "parah", "kacau", "ancur", "hancur", "rusak", "sampah", "zonk", "nyesel", "menyesal", "rugi", "merugikan", "benci", "muak", "kesal", "sebal", "marah", "emosi", "bosan", "bosen", "aneh", "gajelas", "gaje", "burik", "bapuk", "kentang", "abal-abal", "palsu", "bohong", "penipu", "curang", "ribet", "lelet", "lemot", "lola", "ngelag", "berisik", "bising", "cempreng", "mahal", "boros", # 5. Indikator Masalah (Problem Indicators) "masalah", "kendala", "gangguan", "error", "bug", "glitch", "crash", "gagal", "macet", "stuck", "blank", "force close", "keluar sendiri", "hilang", "hapus", "dihapus", "kosong", "buggy", "ngadat", # 1. Basic Negation & Archaic "no", "not", "none", "neither", "never", "nobody", "nothing", "nowhere", "nor", "nary", "without", "lack", "lacking", "against", "anti", # 2. Contractions (Standard & Slang) "can't", "cannot", "cant", "don't", "dont", "doesn't", "doesnt", "didn't", "didnt", "won't", "wont", "wouldn't", "wouldnt", "shouldn't", "shouldnt", "couldn't", "couldnt", "isn't", "isnt", "aren't", "arent", "wasn't", "wasnt", "weren't", "werent", "hasn't", "hasnt", "haven't", "havent", "hadn't", "hadnt", "mustn't", "needn't", "daren't", "ain't", # 3. Contrast & Transition (Sentiment Shifters) "but", "however", "although", "though", "even though", "despite", "in spite of", "except", "unless", "yet", "whereas", "conversely", "instead", "otherwise", "unfortunately", "sadly", "regrettably", "alas", "nevertheless", "nonetheless", # 4. Implicit Negation (Adverbs of Frequency/Degree) "barely", "hardly", "scarcely", "seldom", "rarely", "infrequently", "little", "few", "insufficient", # 5. Strong Negative Adjectives/Verbs (Emotive) "hate", "dislike", "loathe", "detest", "bad", "worst", "worse", "awful", "terrible", "horrible", "horrendous", "sucks", "sucked", "useless", "pointless", "waste", "garbage", "trash", "rubbish", "disappointed", "disappointing", "dissatisfied", "annoying", "irritating", "frustrating", "confusing", "complicated", "slow", "laggy", "sluggish", "expensive", "greedy", # 6. Technical Issues (App Specific) "fail", "failure", "failed", "crash", "crashes", "crashing", "bug", "bugs", "buggy", "glitch", "glitchy", "error", "errors", "broken", "broke", "freeze", "freezing", "stuck", "unresponsive", "missing", "removed", "gone", "unavailable", "offline", }