TIFNGK_E41222120/virtualEnvironment/textPreprocessing.ipynb

372 lines
14 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "adf2c795",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import re\n",
"import string"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e2dbcc87",
"metadata": {},
"outputs": [],
"source": [
"data = pd.read_csv('dataset\\dataYangDiPakai\\data_sound_horeg_total_mei.csv')\n",
"data.head(20)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8e082cd4",
"metadata": {},
"outputs": [],
"source": [
"\n",
"# 1. Pastikan 'favorite_count' TIDAK ada di daftar kolom yang dibuang\n",
"kolomDibuang = [\n",
" 'conversation_id_str', 'id_str', 'image_url', 'in_reply_to_screen_name',\n",
" 'lang', 'location', 'quote_count', 'reply_count', 'retweet_count',\n",
" 'tweet_url', 'user_id_str', 'username'\n",
"]\n",
"\n",
"# 2. Hapus kolom sampah\n",
"dataPembersihan = data.drop(columns=kolomDibuang)\n",
"\n",
"# 3. Hapus baris kosong agar tidak error\n",
"dataPembersihan = dataPembersihan.dropna(subset=['full_text'])\n",
"\n",
"# 4. Fungsi Pembersihan (Tetap sama)\n",
"def cleaningKhusus(text):\n",
" text = re.sub(r'http\\S+|www\\S+|https\\S+', '', text, flags=re.MULTILINE)\n",
" text = re.sub(r'\\@\\w+|\\#','', text)\n",
" text = text.translate(str.maketrans('', '', string.punctuation))\n",
" text = re.sub(r'\\d+', '', text)\n",
" text = text.strip()\n",
" return text\n",
"\n",
"def cleaningUmum(text):\n",
" text = text.lower()\n",
" text = re.sub(r'\\s+', ' ', text)\n",
" text = text.encode('ascii', 'ignore').decode('ascii')\n",
" text = ' '.join([word for word in text.split() if len(word) > 1])\n",
" return text\n",
"\n",
"# 5. BERSIHKAN TEKS dan langsung simpan kembali ke kolom 'full_text'\n",
"# Ini akan menimpa teks asli dengan teks yang sudah bersih\n",
"dataPembersihan['full_text'] = dataPembersihan['full_text'].apply(cleaningKhusus).apply(cleaningUmum)\n",
"\n",
"# 6. Pilih hanya 3 kolom yang Anda minta\n",
"df_hasil_akhir = dataPembersihan[['created_at', 'favorite_count', 'full_text']]\n",
"\n",
"# 7. Simpan ke CSV\n",
"df_hasil_akhir.to_csv('dataset\\dataYangDiPakai\\data_sound_horeg_total_mei_dibersihkan.csv', index=False)\n",
"\n",
"# Tampilkan hasil\n",
"print(\"Berhasil! Kolom sekarang hanya: created_at, favorite_count, dan full_text (sudah bersih).\")\n",
"print(df_hasil_akhir.head(20))"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "ee52f2ae",
"metadata": {},
"outputs": [],
"source": [
"pd.set_option('display.max_colwidth', None)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "414378d3",
"metadata": {},
"outputs": [],
"source": [
"df = pd.read_csv('dataset\\dataYangDiPakai\\hasil_preprocessing_intoleransi.csv')\n",
"df.head(20)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "69e6b2a9",
"metadata": {},
"outputs": [],
"source": [
"#membersihkan data\n",
"import pandas as pd\n",
"import re\n",
"from Sastrawi.StopWordRemover.StopWordRemoverFactory import StopWordRemoverFactory, StopWordRemover, ArrayDictionary\n",
"from Sastrawi.Stemmer.StemmerFactory import StemmerFactory\n",
"\n",
"# --- PENGATURAN TAMPILAN ---\n",
"pd.set_option('display.max_colwidth', None)\n",
"\n",
"# 1. LOAD DATA\n",
"# Path file sesuai dengan yang kamu berikan\n",
"filename = '/content/drive/MyDrive/proyek skiprsi sound horeg/hasil_data_bersih_lengkap2.csv'\n",
"\n",
"try:\n",
" df = pd.read_csv(filename)\n",
" print(f\"Data berhasil dimuat: {len(df)} baris\")\n",
"except FileNotFoundError:\n",
" print(\"Error: File tidak ditemukan. Pastikan path di Google Drive sudah benar.\")\n",
" # Dummy data untuk antisipasi error jika dijalankan orang lain\n",
" df = pd.DataFrame({'full_text': ['sound horeg jancok gak enak', 'asu tenan', 'saya tidak setuju']})\n",
"\n",
"# Hapus Duplikat\n",
"df = df.drop_duplicates(subset=['full_text'])\n",
"\n",
"# 2. DEFINISI KAMUS (Kamus Alay + Istilah Intoleransi + Bahasa Jawa)\n",
"kamus_alay = {\n",
" # --- A. KATA GANTI & SINGKATAN UMUM ---\n",
" 'org': 'orang', 'yg': 'yang', 'jg': 'juga', 'ga': 'tidak', 'udh': 'sudah',\n",
" 'jatim': 'jawa timur', 'bgt': 'banget', 'wong': 'orang', 'tak': 'tidak',\n",
" 'utk': 'untuk', 'trs': 'terus', 'gak': 'tidak', 'tu': 'itu', 'gimana': 'bagaimana',\n",
" 'sampe': 'sampai', 'ampe': 'sampai', 'jd': 'jadi', 'gw': 'aku', 'tau': 'tahu',\n",
" 'gara': 'karena', 'trus': 'terus', 'sm': 'sama', 'pake': 'pakai', 'klo': 'kalau',\n",
" 'gue': 'aku', 'tp': 'tapi', 'dr': 'dari', 'jgn': 'jangan', 'fasum': 'fasilitas umum',\n",
" 'gini': 'ini', 'ama': 'sama', 'knp': 'kenapa', 'cm': 'cuma', 'udah': 'sudah',\n",
" 'gada': 'tidak ada', 'gmn': 'bagaimana', 'emg': 'memang', 'krn': 'karena',\n",
" 'sdh': 'sudah', 'aja': 'saja', 'dlm': 'dalam', 'blm': 'belum', 'dgn': 'dengan',\n",
" 'scr': 'secara', 'adlh': 'adalah', 'tdk': 'tidak', 'skrg': 'sekarang',\n",
" 'bkn': 'bukan', 'sbg': 'sebagai', 'kalo': 'kalau', 'buanter': 'kencang',\n",
"\n",
" # --- B. ISTILAH KONFLIK & INTOLERANSI ---\n",
" 'brisik': 'berisik', 'bising': 'berisik', 'budeg': 'tuli', 'brebeken': 'berisik',\n",
" 'pekok': 'bodoh', 'goblok': 'bodoh', 'tolol': 'bodoh', 'edan': 'gila',\n",
" 'gendeng': 'gila', 'stress': 'gila', 'rusuh': 'rusak', 'ancur': 'hancur',\n",
" 'bakar': 'bakar', 'matek': 'mati', 'modar': 'mati', 'sampah': 'buruk',\n",
" 'sdm': 'sumber daya manusia', 'rendah': 'buruk', 'norak': 'kampungan',\n",
" 'ganggu': 'mengganggu', 'keganggu': 'terganggu',\n",
"\n",
" # --- C. BAHASA JAWA TIMURAN & KATA KASAR (UPDATED) ---\n",
" 'nek': 'kalau', 'iso': 'bisa', 'ra': 'tidak', 'ora': 'tidak', 'ae': 'saja',\n",
" 'wae': 'saja', 'akeh': 'banyak', 'seng': 'yang', 'sing': 'yang', 'wes': 'sudah',\n",
" 'wis': 'sudah', 'urung': 'belum', 'durung': 'belum', 'lapo': 'kenapa',\n",
" 'opo': 'apa', 'iki': 'ini', 'kuwi': 'itu', 'kae': 'itu', 'elek': 'jelek',\n",
" 'apik': 'bagus', 'onok': 'ada', 'karo': 'sama',\n",
"\n",
" # PERBAIKAN DI SINI:\n",
" 'cok': 'jancok', # Singkatan disamakan ke jancok\n",
" 'dancok': 'jancok', # Varian disamakan ke jancok\n",
" # 'jancok' KITA BIARKAN (TIDAK ADA DI KAMUS) AGAR TIDAK BERUBAH\n",
"\n",
" 'asu': 'anjing', # Hewan tetap diterjemahkan\n",
"\n",
" # --- D. PERBAIKAN TYPO ---\n",
" 'gabisa': 'tidak bisa', 'gaenak': 'tidak enak', 'soundhoreg': 'sound horeg',\n",
" 'soundsystem': 'sound system', 'gasemua': 'tidak semua',\n",
"\n",
" # --- E. PENGHAPUSAN (Kata tanpa makna) ---\n",
" 'wkwkwkw': '', 'wkwkw': '', 'wkwkwkwk': '', 'wkwk': '', 'sih': '', 'nya': ''\n",
"}\n",
"\n",
"# 3. PERSIAPAN SASTRAWI (MODIFIKASI KHUSUS INTOLERANSI)\n",
"factory_stop = StopWordRemoverFactory()\n",
"stopwords_list = factory_stop.get_stop_words()\n",
"\n",
"# WHITELIST: Kata yang HARAM dihapus\n",
"whitelist = [\n",
" 'tidak', 'enggak', 'bukan', 'jangan', 'tapi',\n",
" 'masalah', 'kurang', 'belum', 'tak', 'tanpa',\n",
" 'soal', 'sebab', 'karena', 'akibat', 'padahal'\n",
"]\n",
"\n",
"# Hapus whitelist dari daftar stopword bawaan\n",
"for word in whitelist:\n",
" if word in stopwords_list:\n",
" stopwords_list.remove(word)\n",
"\n",
"# Tambahkan stopword sampah\n",
"stopwords_list.extend(['min', 'kak', 'gan', 'sis', 'guys', 'halo', 'hai'])\n",
"\n",
"dictionary = ArrayDictionary(stopwords_list)\n",
"stopword_remover = StopWordRemover(dictionary)\n",
"\n",
"factory_stem = StemmerFactory()\n",
"stemmer = factory_stem.create_stemmer()\n",
"\n",
"# 4. FUNGSI PEMBERSIH UTAMA\n",
"def clean_text_complete(text):\n",
" if not isinstance(text, str):\n",
" return \"\"\n",
"\n",
" # A. Case Folding\n",
" text = text.lower()\n",
"\n",
" # B. Ganti simbol dengan spasi\n",
" text = re.sub(r'[^a-zA-Z0-9]', ' ', text)\n",
"\n",
" # C. Normalisasi Kata\n",
" words = text.split()\n",
" normalized_words = []\n",
" for w in words:\n",
" if w in kamus_alay:\n",
" # Jika ada di kamus, ganti. Jika replacement '', kata dihapus.\n",
" if kamus_alay[w] != '':\n",
" normalized_words.append(kamus_alay[w])\n",
" else:\n",
" # Jika tidak ada di kamus (misal: 'jancok'), biarkan apa adanya\n",
" normalized_words.append(w)\n",
"\n",
" text = ' '.join(normalized_words)\n",
"\n",
" # D. Stopword Removal\n",
" text = stopword_remover.remove(text)\n",
"\n",
" # E. Stemming\n",
" text = stemmer.stem(text)\n",
"\n",
" # F. Rapikan Spasi\n",
" text = re.sub(r'\\s+', ' ', text).strip()\n",
"\n",
" return text\n",
"\n",
"# 5. EKSEKUSI\n",
"print(\"Sedang memproses teks... (Mohon tunggu)\")\n",
"df['full_text_clean'] = df['full_text'].apply(clean_text_complete)\n",
"\n",
"# 6. SIMPAN HASIL\n",
"columns_to_save = ['created_at', 'favorite_count', 'full_text_clean']\n",
"valid_columns = [col for col in columns_to_save if col in df.columns]\n",
"df_final = df[valid_columns]\n",
"\n",
"# Rename kolom hasil bersih menjadi 'full_text' agar siap dipakai\n",
"df_final = df_final.rename(columns={'full_text_clean': 'full_text'})\n",
"\n",
"# Hapus baris kosong\n",
"df_final = df_final[df_final['full_text'].str.strip() != '']\n",
"\n",
"# Simpan\n",
"output_file = 'hasil_preprocessing_intoleransi_final.csv'\n",
"df_final.to_csv(output_file, index=False)\n",
"\n",
"print(\"\\n--- SELESAI! ---\")\n",
"print(f\"File siap disimpan sebagai: {output_file}\")\n",
"print(\"\\nContoh Hasil (5 baris pertama):\")\n",
"print(df_final.head())"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3d1636b6",
"metadata": {},
"outputs": [],
"source": [
"#labeling data ke 3 kategori\n",
"\n",
"import pandas as pd\n",
"# 1. MOUNT DRIVE\n",
"# 2. LOAD DATA BERSIH\n",
"# Pastikan path file benar\n",
"input_filename = '/content/drive/MyDrive/proyek skiprsi sound horeg/hasil_preprocessing_intoleransi_final.csv'\n",
"df = pd.read_csv(input_filename)\n",
"\n",
"# 3. DEFINISI KATA KUNCI (3 KATEGORI)\n",
"\n",
"# KATA KUNCI RASIONAL (Label 1)\n",
"# Fokus: Dampak fisik, gangguan situasi, penolakan logis\n",
"keywords_rasional = [\n",
" 'ganggu', 'bising', 'berisik', 'brisik', 'polusi', 'tuli', 'budeg',\n",
" 'pecah', 'getar', 'runtuh', 'rusak', 'macet', 'blokir', 'tutup jalan',\n",
" 'sakit', 'pusing', 'jantung', 'bayi', 'orang tua', 'anak', 'nangis',\n",
" 'tidak setuju', 'tidak suka', 'tolak', 'keberatan', 'komplain',\n",
" 'aturan', 'izin', 'waktu', 'jam', 'solusi', 'saran', 'uang', 'biaya',\n",
" 'sebab', 'karena', 'gara', 'akibat', 'dampak', 'bikin', 'buat',\n",
" 'tidur', 'istirahat', 'belajar', 'ibadah', 'sholat', 'ngaji'\n",
"]\n",
"\n",
"# KATA KUNCI CACI MAKI (Label 2)\n",
"# Fokus: Hinaan personal, hewan, kotoran, ancaman kosong\n",
"keywords_cacian = [\n",
" 'jancok', 'cok', 'dancok', 'asu', 'anjing', 'bangsat', 'bajingan',\n",
" 'goblok', 'tolol', 'pekok', 'bodoh', 'bego', 'idiot', 'setan', 'iblis',\n",
" 'sakit jiwa', 'gila', 'edan', 'gendeng', 'sdm rendah', 'kampungan',\n",
" 'bakar', 'musnah', 'usir', 'mati', 'modar', 'sampah', 'norak',\n",
" 'jelek', 'buruk'\n",
"]\n",
"\n",
"# 4. FUNGSI LABELING 3 KATEGORI\n",
"def auto_label_3_class(text):\n",
" if not isinstance(text, str):\n",
" return 0 # Default Netral\n",
"\n",
" text_check = f\" {text} \"\n",
"\n",
" # PRIORITAS 1: Apakah ini Kritik Rasional? (Label 1)\n",
" # Aturan: Walaupun kasar, kalau ada poin rasional, masuk sini.\n",
" for word in keywords_rasional:\n",
" if f\" {word} \" in text_check:\n",
" return 1\n",
"\n",
" # PRIORITAS 2: Apakah ini Murni Caci Maki? (Label 2)\n",
" # Aturan: Kasar tapi tidak ada alasan jelas.\n",
" for word in keywords_cacian:\n",
" if f\" {word} \" in text_check:\n",
" return 2\n",
"\n",
" # PRIORITAS 3: Sisanya adalah Netral/Info (Label 0)\n",
" return 0\n",
"\n",
"# 5. EKSEKUSI\n",
"print(\"Sedang melabeli data menjadi 3 Kategori...\")\n",
"print(\"0: Netral | 1: Kritik Rasional | 2: Caci Maki\")\n",
"df['label'] = df['full_text'].apply(auto_label_3_class)\n",
"\n",
"# 6. CEK HASIL SEBARAN\n",
"counts = df['label'].value_counts().sort_index()\n",
"print(\"\\n--- Statistik Label Sementara ---\")\n",
"print(f\"Label 0 (Netral/Info) : {counts.get(0, 0)} data\")\n",
"print(f\"Label 1 (Kritik Rasional) : {counts.get(1, 0)} data\")\n",
"print(f\"Label 2 (Caci Maki Murni) : {counts.get(2, 0)} data\")\n",
"\n",
"# 7. SIMPAN KE FILE BARU\n",
"output_file = '/content/drive/MyDrive/proyek skiprsi sound horeg/data_label_3_kategori.csv'\n",
"df.to_csv(output_file, index=False)\n",
"print(f\"\\n[SUKSES] File siap diverifikasi manual: {output_file}\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "dd1ab0e0",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "virtualEnvironment",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.9"
}
},
"nbformat": 4,
"nbformat_minor": 5
}