Membaca model topik

Skor koherensi, penilaian manusia, dan jebakan interpretasi berlebihan.

Daftar isi

Model topik yang sudah dilatih menghasilkan daftar kata dan angka skor, tetapi keduanya belum menjadi kesimpulan sampai dibaca dengan benar. Topik ini membahas cara membaca model topik, yaitu menafsirkan daftar kata tiap topik, menilai koherensi melalui skor otomatis, dan mengenali jebakan interpretasi berlebihan. Perbandingan jumlah topik dua, tiga, dan empat pada korpus yang sama diperlihatkan dengan skor koherensi hasil eksekusi nyata.

Membaca daftar kata topik#

Daftar kata topik adalah daftar kata berbobot tertinggi dari distribusi sebuah topik, dan baris pertamanya adalah kata berprobabilitas paling besar. Pembacaan yang tepat berangkat dari kata-kata berbobot besar, karena kata-kata itulah yang paling mewakili tema. Baris seperti 0.130*"buku" + 0.113*"perpustakaan" + 0.049*"katalog" dibaca sebagai tema perpustakaan, dengan buku sebagai penunjuk utamanya dan kosakata pendukung di belakangnya. Angka di depan setiap kata adalah probabilitasnya dalam distribusi topik, sehingga bobot turun seiring urutan baris.

Kata berbobot kecil di akhir daftar juga perlu dibaca secara berbeda. Kata sambung umum seperti di, pada, dan dan dapat muncul di antara kata teratas sebuah topik meskipun tidak membawa tema apa pun. Kehadiran kata seperti itu bukan akibat kesalahan pelatihan, melainkan sifat korpusnya, dan cara menanganinya berupa penyaringan kata sebelum pelatihan. Bobot kata pendukung yang jauh di bawah kata teratas biasanya dilewati, karena lima sampai sepuluh kata teratas sudah cukup untuk menyebut tema. Kebiasaan membaca yang sehat adalah menandai kata mana yang membentuk tema dan kata mana yang hanya menumpang.

Koherensi sebagai skor otomatis#

Koherensi adalah skor otomatis yang mengukur seberapa sering kata-kata teratas sebuah topik muncul bersama pada dokumen-dokumen korpus. Gensim menyediakan perhitungannya melalui CoherenceModel, dengan beberapa varian rumus. Varian u_mass membandingkan kemunculan bersama pasangan kata teratas dengan kemunculan kata pertamanya, lalu merata-ratakannya dalam bentuk logaritma, dan varian ini dihitung cepat sehingga cocok untuk korpus kecil.

Nilai u_mass umumnya negatif, dan semakin mendekati nol semakin sering kata-kata topik itu bertemu pada dokumen yang sama. Angka absolutnya bergantung pada korpus, sehingga yang bermakna adalah perbandingan relatif antarpelatihan pada korpus yang sama, bukan besaran satu angka untuk dirinya sendiri. Dengan kata lain, skor koherensi menjawab pertanyaan model mana yang lebih rapat, bukan pertanyaan apakah model itu baik secara mutlak.

Perhitungan u_mass pada Gensim memakai korpus dan Dictionary yang sama dengan pelatihan, sehingga tidak ada data tambahan yang disiapkan. Skor per topik dapat dibaca satu per satu melalui metode get_coherence_per_topic, sehingga topik yang paling jelek mudah dicari. Varian rumus lain seperti c_v tersedia di Gensim, tetapi varian itu lebih lambat dan tidak dipakai pada demo korpus kecil di bawah.

Membandingkan jumlah topik pada korpus yang sama#

Jumlah topik num_topics adalah keputusan yang paling sering diperdebatkan, dan skor koherensi memberi petunjuk yang terukur. Korpus yang sama dilatih tiga kali dengan jumlah topik berbeda, sehingga satu-satunya variabel yang berubah adalah num_topics itu sendiri. Program berikut melatih LDA dengan dua, tiga, dan empat topik, lalu mencetak skor koherensi beserta daftar kata tiap topik.

python banding-koherensi.py
import warnings
warnings.filterwarnings("ignore")
import logging
logging.getLogger("gensim").setLevel(logging.ERROR)

import re
from gensim.corpora import Dictionary
from gensim.models import LdaModel, CoherenceModel

# Korpus dua puluh empat dokumen dari tiga tema yang sama dengan topik LDA.
dokumen = [
    "harga sayur di pasar pagi menjadi lebih mahal karena panen sayur terlambat",
    "belanja sayur mingguan mencatat bayam wortel dan kangkung dari pasar",
    "petani sayur membawa hasil panen ke kios pasar setiap pagi",
    "pedagang pasar menaikkan harga bayam dan wortel saat panen berkurang",
    "keranjang belanja berisi sayur segar kangkung dan bayam dari kios pasar",
    "dagang sayur di pasar menghitung harga hasil panen setiap hari",
    "belanja sayur untuk dapur mencatat harga wortel dan kangkung",
    "harga sayur turun ketika petani panen melimpah di pasar",
    "peminjaman buku di perpustakaan dicatat petugas pada kartu anggota",
    "anggota perpustakaan mengembalikan buku pinjaman pada rak katalog",
    "katalog koleksi perpustakaan memuat judul dan penulis setiap buku",
    "rak buku bacaan anak ditata ulang oleh petugas perpustakaan",
    "pengembalian buku terlambat dikenakan denda pada peminjaman berikutnya",
    "koleksi buku referensi di perpustakaan hanya dibaca di tempat",
    "pengadaan buku baru menambah koleksi rak perpustakaan sekolah",
    "petugas perpustakaan memperbarui katalog peminjaman dan pengembalian buku",
    "sensor suhu gudang merekam bacaan pada log pemantauan",
    "bacaan sensor suhu naik ketika pintu gudang terbuka",
    "teknisi mengkalibrasi sensor suhu dan peralatan pendukungnya",
    "log suhu gudang disimpan pada komputer pemantauan peralatan",
    "alarm suhu berbunyi ketika bacaan gudang melewati batas",
    "teknisi memeriksa peralatan sensor yang bacaannya tidak stabil",
    "panel indikator menampilkan bacaan suhu mesin pengering",
    "pemeliharaan peralatan gudang dijadwalkan setelah kalibrasi sensor",
]

teks_token = [re.findall(r"[a-z]+", d.lower()) for d in dokumen]
dictionary = Dictionary(teks_token)
corpus = [dictionary.doc2bow(t) for t in teks_token]

# Pelatihan berulang dengan num_topics 2, 3, dan 4 pada korpus yang sama.
for k in (2, 3, 4):
    model = LdaModel(
        corpus=corpus,
        id2word=dictionary,
        num_topics=k,
        random_state=42,
        passes=15,
        iterations=200,
        alpha="symmetric",
        eta=0.01,
    )
    cm = CoherenceModel(
        model=model,
        corpus=corpus,
        dictionary=dictionary,
        coherence="u_mass",
    )
    print(f"num_topics={k} koherensi u_mass = {cm.get_coherence():.3f}")
    for t in model.print_topics(num_words=5):
        print("   ", t)
text Keluaran
num_topics=2 koherensi u_mass = -14.810
    (0, '0.076*"buku" + 0.067*"perpustakaan" + 0.064*"dan" + 0.029*"rak" + 0.029*"katalog"')
    (1, '0.056*"di" + 0.048*"sayur" + 0.047*"sensor" + 0.047*"panen" + 0.047*"gudang"')
num_topics=3 koherensi u_mass = -14.062
    (0, '0.130*"buku" + 0.113*"perpustakaan" + 0.049*"katalog" + 0.049*"rak" + 0.049*"peminjaman"')
    (1, '0.097*"sensor" + 0.094*"suhu" + 0.079*"peralatan" + 0.076*"gudang" + 0.060*"di"')
    (2, '0.079*"sayur" + 0.069*"pasar" + 0.050*"harga" + 0.050*"panen" + 0.040*"dan"')
num_topics=4 koherensi u_mass = -14.101
    (0, '0.125*"perpustakaan" + 0.115*"buku" + 0.076*"katalog" + 0.075*"rak" + 0.051*"koleksi"')
    (1, '0.093*"di" + 0.046*"panen" + 0.046*"petani" + 0.046*"pasar" + 0.046*"sayur"')
    (2, '0.098*"sayur" + 0.082*"pasar" + 0.066*"dan" + 0.066*"harga" + 0.049*"belanja"')
    (3, '0.071*"gudang" + 0.068*"sensor" + 0.068*"suhu" + 0.055*"bacaan" + 0.054*"peralatan"')

Tiga hasil itu perlu dibaca berpasangan dengan daftar katanya. Pelatihan dua topik memperoleh skor terendah, yaitu -14.810, karena satu topik dipaksa menampung tema pasar dan tema sensor sekaligus, padahal kosakata kedua tema itu hampir tidak pernah muncul bersama dalam satu dokumen. Pelatihan tiga topik memperoleh skor tertinggi, yaitu -14.062, dan ketiga topiknya terbaca rapi sesuai tema korpus. Pelatihan empat topik turun sedikit menjadi -14.101, karena tema pasar terpecah menjadi dua topik dan salah satunya diawali kata umum di. Korpus ini memang disusun dari tiga tema, sehingga kecocokan skor tertinggi pada tiga topik tidak mengejutkan, tetapi pola berupa skor turun ketika topik digabung atau dipecah adalah pola yang diharapkan pada korpus sungguhan.

Penilaian manusia dan jebakan interpretasi#

Skor otomatis tidak menggantikan pembacaan manusia, karena skor tidak mengetahui makna kata. Penilaian manusia yang sederhana mencakup tiga langkah, yaitu membaca daftar kata tiap topik, mencocokkan tema itu dengan pengetahuan tentang korpus, dan memeriksa campuran topik pada beberapa dokumen yang isinya sudah diketahui. Pada demo di atas, keluaran tiga topik mudah disahkan karena setiap topik terbaca sebagai satu tema, sedangkan topik yang diawali kata di pada pelatihan empat topik layak dipertanyakan.

Tiga jebakan paling sering muncul saat menafsirkan model topik, dan semuanya terlihat pada keluaran di atas.

  • Topik bergaya kata umum. Kata seperti di, pada, dan dan menempati bobot besar tanpa membentuk tema, sehingga topiknya sulit diberi nama. Penyaringan kata umum sebelum pelatihan mengurangi jebakan ini.
  • Jumlah topik yang dipaksakan. Jumlah yang terlalu kecil menggabungkan tema yang berbeda, sedangkan jumlah yang terlalu besar memecah satu tema menjadi dua, sebagaimana tema pasar terpecah pada pelatihan empat topik.
  • Label topik yang dibuat dari kata pertama saja. Satu kata pertama tidak mewakili seluruh distribusi, terlebih bila kata itu kata umum.

Ringkasan#

  • Daftar kata topik dibaca dari bobot probabilitasnya, dengan kata berbobot besar sebagai penunjuk tema dan kata umum sebagai penumpang yang perlu dicurigai.
  • Koherensi u_mass mengukur kemunculan bersama kata teratas sebuah topik pada korpus, bernilai negatif, dan bermakna sebagai perbandingan antarpelatihan pada korpus yang sama.
  • Pada demo ini, dua topik memperoleh skor -14.810 karena tema digabung, tiga topik memperoleh -14.062 sebagai skor tertinggi, dan empat topik memperoleh -14.101 karena satu tema terpecah.
  • Skor otomatis tidak menggantikan penilaian manusia, dan tiga jebakannya adalah kata umum, jumlah topik yang dipaksakan, serta label dari kata pertama saja.

Referensi#