Label tidak selalu tersedia ketika teks masuk ke sistem. Arsip catatan rapat yang bertumbuh selama bertahun-tahun, log pesan antarpetugas, dan tumpukan laporan bulanan biasanya tersimpan apa adanya tanpa pengelompokan bawaan. Topik ini membahas penanganan teks tanpa supervisi (unsupervised), yaitu pekerjaan menemukan struktur dari dokumen tanpa arah label, serta menempatkan penemuan sebagai tugas tersendiri alih-alih pelengkap klasifikasi. Sebuah demo kecil pada korpus sintetis memperlihatkan bagaimana struktur pertama dapat dideteksi secara manual dari hitungan kata dan pola ko-okurensinya.
Arsip tanpa label#
Satu arsip berisi lima ratus catatan rapat dapat bertumbuh selama bertahun-tahun tanpa satu pun penanda kategori. Pertanyaan yang wajar muncul, misalnya ada berapa jenis isi di dalamnya, kata mana yang selalu muncul bersama, dan apakah catatan tentang perbaikan sarana terpisah dari catatan tentang kegiatan. Membaca seluruh arsip satu per satu memakan waktu, dan hasilnya sulit diulang dengan konsisten oleh orang yang berbeda.
Kondisi tanpa label mengubah bentuk tugasnya. Klasifikasi membutuhkan contoh yang sudah berlabel untuk melatih model, sehingga tanpa label tidak ada model yang dapat dilatih untuk memetakan dokumen ke kategori yang sudah dikenal. Yang tersisa adalah data itu sendiri, yaitu hitungan kata dan pola kemunculannya, dan di situlah penemuan (discovery) bekerja. Tujuannya mengurangi ruang dokumen yang besar menjadi struktur yang lebih kecil, misalnya beberapa kelompok tema, tanpa diberi tahu sebelumnya struktur seperti apa yang harus ditemukan.
Bekal representasi dari modul klasifikasi teks tetap dipakai di sini. Dokumen tetap diubah menjadi hitungan kata dengan bag of words, dan pembobotan TF-IDF tetap berguna ketika kemiripan antardokumen perlu diukur. Yang berubah adalah tujuan akhirnya, karena hitungan itu tidak lagi dipakai untuk memprediksi label, melainkan untuk mengungkap struktur.
Klasifikasi berbanding penemuan#
Kedua tugas itu sering tertukar karena keduanya menghasilkan kelompok dokumen, tetapi arah kerjanya berbeda. Klasifikasi berjalan setelah label tersedia, sedangkan penemuan berjalan justru untuk mendapatkan kandidat kelompok pada arsip yang belum memiliki kategori. Tabel berikut merangkum perbedaannya pada empat aspek.
| Aspek | Klasifikasi | Penemuan |
|---|---|---|
| Masukan | Dokumen yang sudah berlabel | Dokumen tanpa label |
| Arah | Kategori diketahui lebih dahulu | Kategori dicari dari data |
| Keluaran | Label untuk dokumen baru | Kelompok, topik, atau kemiripan |
| Cara menilai | Akurasi terhadap label | Koherensi dan penilaian manusia |
Diagram berikut menempatkan kedua alur itu berdampingan, dengan jalur berlabel di atas dan jalur tanpa label di bawahnya. Arah panah pada kedua baris berbeda makna, karena satu mengarah ke prediksi label dan yang lain mengarah ke struktur yang baru terbaca setelah prosesnya selesai. Keduanya sama-sama bergantung pada representasi hitungan kata, sehingga perbedaannya terletak pada penggunaan hasil, bukan pada peralatan dasarnya.
Perbedaan arah ini menentukan cara menilai hasilnya. Keluaran klasifikasi dapat diuji langsung terhadap label, sedangkan keluaran penemuan tidak memiliki jawaban bawaan sehingga penilaiannya berupa koherensi struktur dan pertimbangan manusia. Topik tentang membaca model topik membahas penilaian itu lebih rinci. Dengan peta itu, pertimbangan pertama sebelum memilih alat adalah ketersediaan label pada arsip yang sedang ditangani.
Membaca struktur secara manual#
Struktur pertama dapat dicari tanpa model sekalipun. Caranya adalah memilih dua kelompok kata yang dicurigai masing-masing membentuk satu tema, lalu menguji dua hal pada korpus, yaitu frekuensi setiap kata dan kecenderungan kata-kata satu kelompok muncul bersama dalam dokumen yang sama. Ko-okurensi (co-occurrence) adalah kemunculan dua kata pada dokumen yang sama. Program berikut melakukan pengujian itu pada enam belas catatan rapat sintetis.
import itertools
import re
from collections import Counter
# Enam belas catatan rapat dari satu arsip tanpa label.
dokumen = [
"rapat mingguan menetapkan agenda penggantian lampu ruang baca",
"peserta menyepakati jadwal piket ruang baca bulan depan",
"agenda rapat berikutnya membahas jadwal kunjungan sekolah dasar",
"jadwal pengadaan buku ditunda karena peserta rapat tidak lengkap",
"catatan agenda rapat persiapan lomba membaca diserahkan ke sekretariat",
"rapat menyetujui jadwal perbaikan rak arsip pada akhir bulan",
"peserta membahas agenda digitalisasi katalog dan jadwal petugas",
"notulen rapat mencatat agenda pelatihan katalogisasi untuk peserta baru",
"anggaran pengadaan buku disetujui setelah biaya pengiriman ditinjau",
"laporan keuangan menunjukkan realisasi anggaran di bawah batas biaya",
"biaya perbaikan listrik dicatat pada laporan belanja triwulan",
"anggaran seragam petugas dipangkas sehingga sisa dana masuk kas",
"laporan stok buku rusak diajukan bersama usulan anggaran penggantian",
"biaya langganan internet direncanakan masuk anggaran tahun depan",
"rapat pembahasan anggaran dijadwalkan ulang agar seluruh peserta hadir",
"gedung taman baca ditutup lebih awal karena perbaikan kelistrikan",
]
# Dua kelompok kata yang dicurigai masing-masing membentuk satu tema.
kelompok_a = ["rapat", "agenda", "jadwal", "peserta"]
kelompok_b = ["anggaran", "biaya", "laporan", "dana"]
# Hitung kemunculan setiap kata pada seluruh arsip.
frekuensi = Counter()
for teks in dokumen:
frekuensi.update(re.findall(r"[a-z]+", teks))
print("Frekuensi kelompok A:", {k: frekuensi[k] for k in kelompok_a})
print("Frekuensi kelompok B:", {k: frekuensi[k] for k in kelompok_b})
# Tabel presensi: kelompok mana saja yang muncul pada setiap dokumen.
hanya_a = hanya_b = keduanya = tidak_keduanya = 0
for teks in dokumen:
kata = set(re.findall(r"[a-z]+", teks))
ada_a = any(k in kata for k in kelompok_a)
ada_b = any(k in kata for k in kelompok_b)
if ada_a and ada_b:
keduanya += 1
elif ada_a:
hanya_a += 1
elif ada_b:
hanya_b += 1
else:
tidak_keduanya += 1
print("Presensi dokumen: hanya A =", hanya_a, ", hanya B =", hanya_b,
", keduanya =", keduanya, ", tidak keduanya =", tidak_keduanya)
def dokumen_bersama(k1, k2):
# Berapa dokumen memuat kata k1 dan k2 sekaligus.
n = 0
for teks in dokumen:
kata = set(re.findall(r"[a-z]+", teks))
if k1 in kata and k2 in kata:
n += 1
return n
def rata_rata_bersama(pasangan):
# Rata-rata jumlah dokumen bersama untuk sekumpulan pasangan kata.
return sum(dokumen_bersama(k1, k2) for k1, k2 in pasangan) / len(pasangan)
pasangan_a = list(itertools.combinations(kelompok_a, 2))
pasangan_b = list(itertools.combinations(kelompok_b, 2))
pasangan_ab = [(k1, k2) for k1 in kelompok_a for k2 in kelompok_b]
print("Rata-rata dokumen bersama:")
print(" pasangan di dalam kelompok A :", rata_rata_bersama(pasangan_a))
print(" pasangan di dalam kelompok B :", rata_rata_bersama(pasangan_b))
print(" pasangan antarkelompok :", rata_rata_bersama(pasangan_ab))Frekuensi kelompok A: {'rapat': 7, 'agenda': 5, 'jadwal': 5, 'peserta': 5}
Frekuensi kelompok B: {'anggaran': 6, 'biaya': 4, 'laporan': 3, 'dana': 1}
Presensi dokumen: hanya A = 8 , hanya B = 6 , keduanya = 1 , tidak keduanya = 1
Rata-rata dokumen bersama:
pasangan di dalam kelompok A : 2.8333333333333335
pasangan di dalam kelompok B : 1.3333333333333333
pasangan antarkelompok : 0.125Keluaran itu memberi tiga petunjuk struktur. Pertama, kedelapan kata teruji memang kerap muncul, sehingga kedua kelompok layak diuji lebih jauh. Kedua, tabel presensi menunjukkan delapan dokumen hanya memuat kata kelompok A, enam dokumen hanya memuat kata kelompok B, dan hanya satu dokumen yang memuat keduanya. Ketiga, pasangan kata di dalam kelompok yang sama rata-rata bertemu pada 2.83 dan 1.33 dokumen, sedangkan pasangan antarkelompok hanya bertemu pada 0.125 dokumen. Pola itu konsisten dengan dugaan dua tema yang terpisah, dan pengujian kecil semacam ini murah dilakukan sebelum model yang lebih besar dijalankan.
Kesalahan umum#
Mengira penemuan menggantikan klasifikasi. Hasil penemuan berupa kandidat kelompok, bukan label yang telah diuji. Kandidat itu perlu dibaca dan disahkan manusia sebelum dipakai, misalnya menjadi label awal untuk pelatihan klasifikasi di kemudian hari. Mengalirkan hasil penemuan langsung ke sistem production tanpa pengesahan menyerahkan keputusan penting kepada skor yang belum diverifikasi.
Menyimpulkan struktur dari frekuensi total. Kata yang tersebar merata di seluruh arsip dapat berfrekuensi tertinggi tanpa menunjuk kelompok apa pun. Struktur terletak pada pola kemunculan bersama antarkata dalam dokumen yang sama, sehingga tabel presensi dan rata-rata dokumen bersama lebih informatif daripada hitungan total. Kata pengadaan pada demo muncul di dokumen dari kedua kelompok, sehingga kemunculannya tidak menunjuk tema mana pun.
Menarik kesimpulan dari sampel terlalu kecil. Enam belas dokumen hanya uji coba kecil, bukan pembuktian. Pola yang terbaca pada sampel kecil wajib diuji ulang pada porsi arsip yang lebih besar sebelum dinyatakan sebagai struktur arsip keseluruhan. Dokumen baru yang masuk setelah pengujian pun dapat mengubah pola, sehingga pengujian diulang secara berkala.
Ringkasan#
- Teks tanpa label menggeser tugas dari memprediksi kategori yang sudah diketahui menjadi menemukan struktur, dan penemuan menjadi tugas tersendiri pada situasi ini.
- Klasifikasi dan penemuan berbeda pada masukan, arah, keluaran, dan cara penilaiannya, sebagaimana dirangkum diagram pada topik ini.
- Struktur pertama dapat dideteksi manual melalui frekuensi kata, tabel presensi kelompok, dan rata-rata dokumen bersama antarpasangan kata.
- Frekuensi total tidak membuktikan struktur, dan uji coba pada sampel kecil wajib diulang pada porsi arsip yang lebih besar.
Referensi#
- An Introduction to Information Retrieval — Manning, Raghavan & Schütze, Cambridge — Bab pengelompokan dokumen membahas penemuan grup tanpa label dan ukuran kemiripannya.
- Speech and Language Processing, draf edisi ke-3 — Jurafsky & Martin, Stanford — Bab klasifikasi teks dan pemodelan topik menempatkan tugas berlabel dan tanpa label berdampingan.