Repo ini adalah hasil ekstraksi dan perapihan bagian machine learning dari artefak skripsi Adinda Salsa tentang represifitas siber terhadap kebebasan pers. Fokus repo ini bukan mengunggah naskah skripsi, bukan juga pura-pura bilang eksperimen lama sudah lengkap, tapi membangun ulang bagian yang memang tersedia secara lokal menjadi pipeline yang bisa diuji, dibaca, dan diulang jalannya. Sumber yang tersedia saat repo ini dikerjakan adalah satu file ekspor komentar Instagram dan satu notebook SA_IG_2.ipynb yang masih campur aduk antara upload manual, eksplorasi data, simulasi sentimen acak, dan potongan kode klasifikasi. Dari situ, repo ini dirancang ulang menjadi proyek Python modular plus site dokumentasi visual tiga halaman.
Kalau disingkat, repo ini mengerjakan tiga hal sekaligus. Pertama, repo ini menjaga konteks penelitian supaya pembaca paham bahwa analisis sentimen di sini berdiri di dalam riset sosial tentang represifitas siber, bukan berdiri sendiri tanpa konteks. Kedua, repo ini memisahkan data mentah, preprocessing, bootstrap labeling, model Naive Bayes, dan reporting ke modul yang bisa dites satu per satu. Ketiga, repo ini membuat dokumentasi yang enak dipakai orang lain: ada README detail, ada site visual, ada workflow CI, ada release tagging, dan ada skrip metadata repo untuk nyiapin deskripsi serta topik GitHub tanpa menaruh token di source code.
Dari analisa notebook dan PDF skripsi, ada beberapa gap yang cukup jelas:
- Notebook asli belum bisa dianggap repo publik yang siap audit karena bergantung pada upload manual ala Google Colab.
- Ada cell yang mengisi sentimen secara random untuk demonstrasi, jadi tidak boleh diperlakukan sebagai hasil machine learning final.
- Korpus berlabel yang dipakai untuk eksperimen akhir di skripsi tidak ikut tersedia di folder kerja ini.
- File lokal yang tersedia hanya satu ekspor komentar, sedangkan skripsi membahas lebih dari satu kasus unggahan.
- Belum ada struktur repo, test, CI, release, atau dokumentasi yang menjelaskan batas validitas hasil.
Daripada menutup-nutupi celah itu, repo ini memilih jalur yang lebih jujur. Yang tersedia diekstrak dan diperbaiki. Yang tidak tersedia dijelaskan sebagai batas reproduksi. Hasilnya adalah baseline yang reproducible, bukan replika identik yang dipaksakan. Pendekatan ini penting karena sentimen publik di isu politik dan media sangat gampang disederhanakan secara salah kalau pipeline-nya tidak dibuka dengan jelas.
- Mengambil artefak yang benar-benar tersedia dari folder kerja dan mengubahnya menjadi proyek yang rapi.
- Memisahkan bagian penelitian, bagian pengolahan data, dan bagian presentasi hasil.
- Menyediakan baseline Multinomial Naive Bayes yang bisa jalan ulang tanpa dependensi eksternal tambahan.
- Menyediakan dokumentasi visual supaya orang non-teknis tetap bisa mengikuti alur proses.
- Menjaga repo tetap aman: skripsi asli tidak ikut diunggah, token GitHub tidak di-hardcode, dan pola ignore untuk file sensitif sudah disiapkan.
| Aspek | Nilai |
|---|---|
| Dataset lokal yang diproses | data/raw/sa_ig1.csv |
| Total komentar terproses | 1192 |
| Split train/test | 952 / 240 |
| Akurasi holdout | 85.4% |
| Weighted F1 | 86.9% |
| Macro F1 | 45.3% |
| Jumlah halaman site | 3 |
| Jumlah unit test | 8 |
| Bahasa implementasi utama | Python 3.11 + HTML/CSS/JS statis |
Angka-angka di atas harus dibaca dengan konteks yang tepat. Akurasi cukup tinggi karena distribusi kelas sangat condong ke netral, sedangkan macro F1 jauh lebih rendah karena kelas minoritas masih berat. Itu justru menguatkan catatan metodologis yang juga muncul di skripsi: komentar yang terlihat netral sering mengandung kritik implisit, sarkasme, atau ambiguitas yang susah dibaca model baseline.
Repo ini sengaja dibuat dengan pemisahan lapis yang tegas supaya mudah di-review:
data/raw/menyimpan ekspor komentar yang memang tersedia secara lokal.notebooks/menyimpan notebook asli sebagai artefak sumber, bukan sebagai mesin produksi utama.src/tempo_sentiment/berisi parser, preprocessing, leksikon, model Naive Bayes, pipeline, dan reporting.scripts/berisi entrypoint build laporan, build asset site, dan update metadata GitHub.web/berisi site dokumentasi tiga halaman yang membaca output report ter-generasi.tests/berisi unit test untuk preprocessing, model, pipeline, dan reporting..github/workflows/berisi workflow CI dan rilis otomatis berbasis tag.
flowchart LR
A[CSV komentar mentah] --> B[Parser dan cleaning teks]
B --> C[Bootstrap labeling dari leksikon]
C --> D[Split train dan test]
D --> E[Multinomial Naive Bayes]
E --> F[Prediksi seluruh komentar]
F --> G[report.json + predictions.csv]
G --> H[Asset site visual]
H --> I[README dan screenshot]
flowchart TD
ROOT[tempo-sentiment-lab]
ROOT --> DATA[data/raw]
ROOT --> NOTEBOOK[notebooks]
ROOT --> SRC[src/tempo_sentiment]
ROOT --> SCRIPTS[scripts]
ROOT --> WEB[web]
ROOT --> TESTS[tests]
ROOT --> GH[.github/workflows]
SRC --> IO[io.py]
SRC --> PRE[preprocess.py]
SRC --> LEX[lexicon.py]
SRC --> NB[naive_bayes.py]
SRC --> PIPE[pipeline.py]
SRC --> REP[reporting.py]
Bagian ini penting karena repo ini bukan sekadar kumpulan file. Ada keputusan metodologis yang sengaja dibuat terbuka:
CSV dibaca lewat read_comment_csv, lalu setiap baris dirapikan. Sender yang punya koma berlebih dibersihkan, teks dinormalisasi ke lowercase, URL dan mention dihapus, angka dipangkas, dan noise Unicode dikendalikan. Tujuannya sederhana: bikin data yang tadinya berantakan jadi token yang relatif stabil.
Karena label final dari eksperimen skripsi tidak tersedia, repo ini membangun label bootstrap berbasis leksikon yang diekstrak dari notebook. Ini langkah yang sengaja disebut sebagai bootstrap, bukan ground truth. Jadi repo ini tidak sedang berpura-pura punya anotasi manual penuh. Label bootstrap dipakai untuk dua hal: baseline klasifikasi dan sanity check awal terhadap distribusi komentar.
Model ditulis ulang tanpa bergantung ke library eksternal. Keputusan ini pragmatis: repo bisa dites di CI yang ringan, pengguna tidak dipaksa install paket tambahan, dan logika probabilitasnya lebih gampang diaudit. Model menghitung prior kelas, frekuensi token per kelas, dan probabilitas kata dengan smoothing alpha=1.0.
Repo ini menghitung accuracy, weighted_f1, macro_f1, dan confusion matrix. Kenapa macro F1 dipertahankan walau jelek? Karena kelas minoritas justru yang paling gampang tenggelam kalau kita cuma lihat accuracy. Jadi metrik yang kurang nyaman dilihat tetap ditampilkan supaya pembaca tidak salah merasa modelnya sudah aman.
Setelah pipeline jalan, repo menghasilkan:
out/predictions.csvout/report.jsonweb/assets/report.js- dua grafik SVG untuk distribusi label dan prediksi
- screenshot halaman dokumentasi
Dengan cara ini, dokumentasi visual bukan tempelan manual, tapi turunan langsung dari hasil pipeline.
Berikut pembacaan ringkas dari output yang terhitung saat repo ini dirakit:
- Distribusi bootstrap label: netral sangat dominan, dengan positif dan negatif jauh lebih kecil.
- Distribusi prediksi model: tetap condong ke netral, walau ada sedikit perpindahan ke kelas positif dan negatif.
- Akurasi holdout 85.4% terlihat tinggi, tetapi macro F1 45.3% menunjukkan kelas minoritas masih belum tertangani bagus.
- Contoh komentar yang masuk kelas netral banyak yang sebenarnya berupa ekspresi pendek, simbolik, atau ambigu.
- Ini konsisten dengan catatan teoritis skripsi bahwa komentar "netral" di konteks represi digital belum tentu benar-benar netral secara makna.
Dengan kata lain, repo ini tidak cuma menyajikan angka, tapi juga membantu membingkai angka itu. Kalau pembaca hanya melihat akurasi, dia bisa terlalu cepat puas. Kalau pembaca juga melihat distribusi kelas, contoh komentar, dan token dominan, dia akan sadar bahwa baseline ini masih butuh data anotasi yang lebih kuat.
python scripts/build_report.py --input data/raw/sa_ig1.csv --output outPerintah ini menjalankan parser, cleaning, bootstrap labeling, training Naive Bayes, evaluasi, lalu menulis report.json, predictions.csv, dan SVG chart ke folder output.
python scripts/build_site.pyPerintah ini membaca out/report.json lalu menghasilkan asset yang dipakai halaman web statis.
python -m unittest discover -s tests -p "test_*.py"Buka saja file berikut langsung di browser:
web/index.htmlweb/methodology.htmlweb/results.html
Kalau mau disajikan lewat server lokal:
python -m http.server 8080Lalu akses http://localhost:8080/web/.
Repo ini sudah disiapkan dengan dua workflow:
Workflow ci.yml akan:
- checkout repository
- setup Python (matrix: 3.11, 3.12, 3.13)
- compile source untuk sanity check syntax
- menjalankan seluruh unit test dengan verbose output
Workflow release.yml akan:
- membuat tag rilis otomatis berbasis tanggal UTC dan nomor run
- push tag tersebut
- membuat GitHub Release dengan catatan rilis otomatis
- menandai rilis terbaru sebagai
latest
Selain itu, repo ini juga punya skrip scripts/github_repo_metadata.ps1 untuk nyiapin deskripsi dan topik GitHub secara aman lewat environment variable GITHUB_TOKEN. Jadi kalau network GitHub di mesin lokal sedang sehat, metadata repo bisa diupdate tanpa menyimpan token ke source code.
Contoh dry run:
powershell -ExecutionPolicy Bypass -File .\scripts\github_repo_metadata.ps1 -DryRunAda beberapa kebijakan yang sengaja dijaga ketat:
- File skripsi
.pdf,.docx, dan.rardi-ignore supaya naskah asli tidak ikut terdorong ke repo. - Pola
.env,.env.*,*.key,*.pem, danconfig.jsondi-ignore. - README adalah satu-satunya file Markdown yang sengaja dipelihara sebagai dokumentasi utama.
- Token GitHub tidak pernah di-hardcode ke file repo.
Pendekatan ini penting karena user secara eksplisit meminta kredensial tidak terekspos. Jadi seluruh otomasi metadata dibuat membaca token dari environment variable, bukan dari source.
Repo ini berguna, tapi tidak boleh dibaca berlebihan. Batasnya jelas:
- Label final dari penelitian asli tidak tersedia di folder lokal.
- Dataset lokal baru mewakili satu ekspor komentar, belum seluruh kasus yang dibahas di skripsi.
- Kelas netral sangat dominan, sehingga model baseline rentan bias mayoritas.
- Sarkasme, ironi, dan kritik implisit khas diskursus politik Indonesia belum tertangkap dengan baik.
- Repo ini lebih tepat dipakai sebagai baseline dan fondasi tooling, bukan endpoint metodologi.
Karena itu, langkah lanjutan yang paling masuk akal adalah:
- menambah corpus anotasi manual
- membandingkan baseline ini dengan SVM atau IndoBERT
- memperluas ekspor komentar lintas unggahan atau lintas platform
- menambah analisis error pada komentar ambigu
Supaya repo ini tidak berhenti sebagai baseline bagus yang mandek di dokumentasi, ada beberapa arah pengembangan yang paling realistis untuk dikerjakan sesudah push GitHub-nya beres. Pertama, bikin skema anotasi manual yang rapih untuk komentar Instagram dengan pedoman yang membedakan dukungan eksplisit, kritik implisit, sarkasme, dan ujaran intimidatif. Kedua, jadikan baseline Naive Bayes di repo ini sebagai patokan pembanding, lalu tambahkan eksperimen SVM, KNN, dan model transformer seperti IndoBERT dalam cabang eksperimen terpisah. Ketiga, perluas data sumber ke unggahan lain yang masih relevan dengan kasus Tempo supaya distribusi kelas tidak bergantung pada satu ekspor komentar saja. Keempat, tambahkan analisis error yang menampilkan komentar salah klasifikasi paling penting, karena justru di sanalah nilai penelitian sosial dan nilai machine learning bisa ketemu. Kelima, kalau nantinya data makin banyak, repo ini sudah siap ditingkatkan jadi dashboard analitik yang menampilkan tren sentimen lintas unggahan, bukan cuma satu korpus statis.
Walau masih baseline, repo ini tetap punya nilai besar. Banyak proyek riset berhenti sebagai file notebook tunggal yang sulit diaudit. Di sini, bagian yang tadinya tercecer disatukan ke bentuk yang jauh lebih operasional. Orang lain bisa lihat struktur datanya, ngerti asumsi labeling, membaca metrik, membuka site visual, dan menjalankan test. Itu berarti repositori ini sudah naik kelas: dari artefak kerja personal ke fondasi teknis yang bisa diteruskan.
Buat konteks skripsi juga ini relevan. Penelitian sosial yang memakai komputasi sering macet di titik translasi. Hasil teoritisnya kuat, tapi jalur teknisnya sulit diulang. Repo ini menjembatani celah itu. Ia tidak menggantikan naskah skripsi, tapi ia mengekstrak bagian machine learning-nya menjadi bentuk yang lebih bersih, bisa dibaca ulang, dan lebih siap diimprove.
.
|-- .github/workflows/
| |-- ci.yml
| `-- release.yml
|-- assets/screenshots/
|-- data/raw/sa_ig1.csv
|-- notebooks/sa_ig_2_original.ipynb
|-- scripts/
| |-- build_report.py
| |-- build_site.py
| `-- github_repo_metadata.ps1
|-- src/tempo_sentiment/
|-- tests/
`-- web/
Repo ini membutuhkan Python 3.11+ karena menggunakan slots=True di dataclass dan beberapa fitur typing modern. Pastikan versi Python yang terinstall minimal 3.11.
Pastikan web/assets/report.js sudah ada. Jika belum, jalankan pipeline dulu:
python scripts/build_report.py --input data/raw/sa_ig1.csv --output out
python scripts/build_site.pyScript di folder scripts/ menggunakan sys.path.insert untuk menemukan modul di src/. Pastikan kamu menjalankan script dari root repo, bukan dari dalam folder scripts/.
| Nama | Peran |
|---|---|
| Adinda Salsa Aryadi Putri | Owner riset, author repo target GitHub |
| Codex local runtime | Implementasi teknis, refactor pipeline, site, test, dan automasi repo |
Kalau kamu cari repo yang pura-pura sempurna, ini bukan itu. Repo ini lebih berguna dari itu: ia jujur soal sumbernya, rapi secara struktur, lulus unit test, punya site visual, dan siap dijadikan dasar iterasi berikutnya. Buat fase sekarang, itu justru keputusan yang paling sehat. Machine learning dari artefak skripsi sudah berhasil diekstrak ke bentuk proyek yang bisa dijalankan ulang tanpa membawa dokumen skripsi ke publik. Tinggal ketika akses GitHub dari mesin lokal kembali normal, repo ini siap didorong ke adndaaryadi/tempo-sentiment-lab dengan metadata, release, dan dokumentasi yang sudah matang.


