Skip to content

Latest commit

 

History

History
310 lines (212 loc) · 15.8 KB

File metadata and controls

310 lines (212 loc) · 15.8 KB

Tempo Sentiment Lab

CI Release License Python Static Site Tests Zero Dependencies

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.

Kenapa Repo Ini Perlu Dibangun Ulang

Dari analisa notebook dan PDF skripsi, ada beberapa gap yang cukup jelas:

  1. Notebook asli belum bisa dianggap repo publik yang siap audit karena bergantung pada upload manual ala Google Colab.
  2. Ada cell yang mengisi sentimen secara random untuk demonstrasi, jadi tidak boleh diperlakukan sebagai hasil machine learning final.
  3. Korpus berlabel yang dipakai untuk eksperimen akhir di skripsi tidak ikut tersedia di folder kerja ini.
  4. File lokal yang tersedia hanya satu ekspor komentar, sedangkan skripsi membahas lebih dari satu kasus unggahan.
  5. 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.

Tujuan Repo

  • 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.

Snapshot Proyek

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.

Arsitektur Keseluruhan

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.

Diagram Alur

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]
Loading

Diagram Struktur Repo

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]
Loading

Pembacaan Metodologi

Bagian ini penting karena repo ini bukan sekadar kumpulan file. Ada keputusan metodologis yang sengaja dibuat terbuka:

1. Ingest dan cleaning

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.

2. Bootstrap labeling

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.

3. Model Multinomial Naive Bayes

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.

4. Evaluasi

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.

5. Publishing artifacts

Setelah pipeline jalan, repo menghasilkan:

  • out/predictions.csv
  • out/report.json
  • web/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.

Hasil yang Didapat Saat Ini

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.

Screenshot Halaman

Beranda

Beranda Tempo Sentiment Lab

Metodologi

Halaman metodologi Tempo Sentiment Lab

Hasil

Halaman hasil Tempo Sentiment Lab

Cara Menjalankan

1. Build report

python scripts/build_report.py --input data/raw/sa_ig1.csv --output out

Perintah ini menjalankan parser, cleaning, bootstrap labeling, training Naive Bayes, evaluasi, lalu menulis report.json, predictions.csv, dan SVG chart ke folder output.

2. Build asset site

python scripts/build_site.py

Perintah ini membaca out/report.json lalu menghasilkan asset yang dipakai halaman web statis.

3. Jalankan test

python -m unittest discover -s tests -p "test_*.py"

4. Buka site lokal

Buka saja file berikut langsung di browser:

  • web/index.html
  • web/methodology.html
  • web/results.html

Kalau mau disajikan lewat server lokal:

python -m http.server 8080

Lalu akses http://localhost:8080/web/.

CI/CD dan Release

Repo ini sudah disiapkan dengan dua workflow:

CI

Workflow ci.yml akan:

  1. checkout repository
  2. setup Python (matrix: 3.11, 3.12, 3.13)
  3. compile source untuk sanity check syntax
  4. menjalankan seluruh unit test dengan verbose output

Release

Workflow release.yml akan:

  1. membuat tag rilis otomatis berbasis tanggal UTC dan nomor run
  2. push tag tersebut
  3. membuat GitHub Release dengan catatan rilis otomatis
  4. 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 -DryRun

Kebijakan Keamanan Repo

Ada beberapa kebijakan yang sengaja dijaga ketat:

  • File skripsi .pdf, .docx, dan .rar di-ignore supaya naskah asli tidak ikut terdorong ke repo.
  • Pola .env, .env.*, *.key, *.pem, dan config.json di-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.

Limitasi yang Harus Diakui

Repo ini berguna, tapi tidak boleh dibaca berlebihan. Batasnya jelas:

  1. Label final dari penelitian asli tidak tersedia di folder lokal.
  2. Dataset lokal baru mewakili satu ekspor komentar, belum seluruh kasus yang dibahas di skripsi.
  3. Kelas netral sangat dominan, sehingga model baseline rentan bias mayoritas.
  4. Sarkasme, ironi, dan kritik implisit khas diskursus politik Indonesia belum tertangkap dengan baik.
  5. 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

Roadmap Improvement Berikutnya

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.

Kenapa Pendekatan Ini Tetap Penting

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.

Struktur File Penting

.
|-- .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/

Troubleshooting

Test gagal di Python < 3.11

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.

Site tidak menampilkan data

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.py

Import error saat jalankan script

Script di folder scripts/ menggunakan sys.path.insert untuk menemukan modul di src/. Pastikan kamu menjalankan script dari root repo, bukan dari dalam folder scripts/.

Kontributor

Nama Peran
Adinda Salsa Aryadi Putri Owner riset, author repo target GitHub
Codex local runtime Implementasi teknis, refactor pipeline, site, test, dan automasi repo

Penutup

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.