File size: 1,731 Bytes
5360f9f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
"""
Preprocessing teks untuk SentiMart.

PENTING: IndoBERT adalah model berbasis konteks kalimat, sehingga input yang
dikirim ke tokenizer HARUS teks yang masih utuh strukturnya (bukan hasil
`preprocess_text` versi TF-IDF yang membuang stopword & tanda baca).
Fungsi `light_normalize` di bawah ini identik dengan yang dipakai pada Cell 6
notebook training (fine-tuning IndoBERT), supaya perilaku model di web app
sama persis dengan saat training/testing.
"""
import re

# Slang tambahan yang dirapikan sebelum masuk ke tokenizer IndoBERT
SLANG_EXTRA = {
    "aing": "aku", "gw": "aku", "gue": "aku",
    "lo": "kamu", "elo": "kamu",
}


def light_normalize(text: str) -> str:
    """Normalisasi ringan sebelum tokenisasi IndoBERT (samakan dengan notebook)."""
    text = str(text)
    # Rapikan huruf yang diulang berlebihan: "BANGETTT" -> "BANGET"
    text = re.sub(r"(.)\1{2,}", r"\1", text)
    words = text.split()
    words = [SLANG_EXTRA.get(w.lower(), w) for w in words]
    return " ".join(words)


# --- Dipakai khusus untuk statistik/EDA di halaman Batch & Beranda ---
STOPWORDS_ID = {
    "yang", "dan", "di", "ke", "dari", "ini", "itu", "dengan", "tidak",
    "ada", "untuk", "juga", "saya", "iya", "ya", "nya", "lah", "kah",
    "pun", "akan", "sudah", "belum", "lebih", "bisa", "kami", "kita",
    "dia", "mereka", "anda", "saja", "banget", "buat", "pada", "tapi",
    "atau", "jadi", "karena", "kalau", "beli", "barang", "sama", "sangat",
}


def basic_clean_for_stats(text: str) -> list[str]:
    """Tokenisasi kasar (huruf saja) untuk keperluan word-frequency di dashboard."""
    words = re.sub(r"[^a-zA-Z\s]", " ", str(text).lower()).split()
    return [w for w in words if w not in STOPWORDS_ID and len(w) > 2]