Lensa ML

TF-IDF

Langkah 1 dari 6: Term Frequency

Menghitung kata dalam dokumen

Korpus berisi 4 dokumen, menghitung "rocket"
D1: Antariksa2 dari 9 token → TF = 0.222
therocketlaunchedintospacetherocketorbitedearth
D2: Laut0 dari 10 token → TF = 0.000
thewhaleswaminthedeepoceanthewhalesurfaced
D3: Antariksa1 dari 8 token → TF = 0.125
theastronautfloatedinspaceneartherocket
D4: Makanan0 dari 10 token → TF = 0.000
thechefcookedthefreshfishinthedeeppan
TF("rocket") per dokumenD1 Antariksa0.222D2 Laut0.000D3 Antariksa0.125D4 Makanan0.000
TF("rocket", doc) = count("rocket") ÷ total token dalam dokumen
TF (D1)
0.222
TF (D2)
0.000
TF (D3)
0.125
TF (D4)
0.000

"rocket" punya TF bukan nol di D1, D3 dan nol di dokumen lain. Term yang terkumpul di sedikit dokumen membuat dokumen-dokumen itu bisa dibedakan.

Klik setiap kata di baris kosakata, dari "rocket" sampai "the", untuk melihat jumlah dan TF-nya di keempat dokumen. Pembagian dengan panjang dokumen mencegah dokumen panjang menang hanya karena katanya lebih banyak: "rocket" muncul dua kali di 9 token D1 (TF = 0.222) dan sekali di 8 token D3 (TF = 0.125). Ini hanya salah satu varian TF. Jumlah mentah, penanda biner ada atau tidak ada, dan 1 + log(count) sama-sama umum. Versi log mencegah kata yang muncul 50 kali dihitung 50 kali lebih besar daripada kata yang muncul sekali.

Langkah 2 dari 6: Inverse Document Frequency

Kata yang jarang muncul lebih berarti

Di berapa dokumen "rocket" muncul?
D1: Antariksaada
therocketlaunchedintospacetherocketorbitedearth
D2: Lauttidak ada
thewhaleswaminthedeepoceanthewhalesurfaced
D3: Antariksaada
theastronautfloatedinspaceneartherocket
D4: Makanantidak ada
thechefcookedthefreshfishinthedeeppan
IDF = log(N / DF), N = 412340.000.691.39dokumen yang memuat term (DF)0.693
IDF("rocket") = log(4 / 2) = 0.693
N (dokumen)
4
DF
2
IDF
0.693

"rocket" muncul di 2 dari 4 dokumen, jadi IDF = log(4/2) = 0.69. Makin sedikit dokumen yang memuat sebuah term, makin tinggi IDF-nya.

Klik kata langka seperti "whale", lalu kata umum seperti "the", dan bandingkan baris IDF-nya. Demo ini memakai logaritma natural: "whale" muncul di 1 dari 4 dokumen, jadi IDF = ln 4 ≈ 1.386, dan "rocket" muncul di 2 dari 4, jadi IDF = ln 2 ≈ 0.693. Karen Spärck Jones mengusulkan pembobotan ini pada 1972, dengan argumen bahwa nilai sebuah term turun seiring jumlah dokumen yang memakainya. scikit-learn menghaluskannya menjadi ln((1 + N) / (1 + df)) + 1, sehingga "the" tetap sedikit di atas nol.

Langkah 3 dari 6: Skor TF-IDF

Menggabungkan frekuensi dan kelangkaan

TF-IDF("rocket") = TF × IDF untuk setiap dokumen
D1: AntariksaTF=0.222 × IDF=0.693 = 0.154
therocketlaunchedintospacetherocketorbitedearth
D2: LautTF=0.000 × IDF=0.693 = 0.000
thewhaleswaminthedeepoceanthewhalesurfaced
D3: AntariksaTF=0.125 × IDF=0.693 = 0.087
theastronautfloatedinspaceneartherocket
D4: MakananTF=0.000 × IDF=0.693 = 0.000
thechefcookedthefreshfishinthedeeppan
TF-IDF("rocket") per dokumenD1 Antariksa0.154D2 Laut0.000D3 Antariksa0.087D4 Makanan0.000
TF-IDF = TF × IDF · IDF("rocket") = log(4/2) = 0.693
TF-IDF (D1)
0.154
TF-IDF (D2)
0.000
TF-IDF (D3)
0.087
TF-IDF (D4)
0.000

"rocket" punya satu nilai IDF yang sama untuk semua dokumen, jadi skornya hanya berbeda karena TF. Dokumen yang lebih sering mengulangnya mendapat skor lebih tinggi.

Klik term satu per satu dan lihat kartu dokumen mana yang menyala. Skornya berupa perkalian, jadi sebuah term butuh kedua bagiannya: "whale" di D2 punya TF = 0.2 dan IDF = 1.386, menghasilkan 0,277, nilai terbesar di korpus ini. Kata yang sering muncul tetapi IDF-nya nol dan kata langka yang tidak ada di sebuah dokumen sama-sama mendapat skor 0 di dokumen itu. Mesin pencari kemudian menyempurnakan rumusnya. BM25 mempertahankan IDF tetapi membuat bagian TF jenuh, sehingga pengulangan kesepuluh sebuah kata menambah skor jauh lebih sedikit daripada pengulangan kedua.

Langkah 4 dari 6: Vector Dokumen

Dokumen sebagai titik di ruang term

D1: Antariksa
therocketlaunchedintospacetherocketorbitedearth
Vector TF-IDF untuk D1: Antariksa, satu dimensi per term kosakata:
rocket
0.154
space
0.077
whale
0.000
ocean
0.000
deep
0.000
astronaut
0.000
chef
0.000
fish
0.000
the
0.000
vector = [0.15, 0.08, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00]
Dimensi
9
Bukan nol
2
Nilai maks
0.154
Sparsity
78%

D1: Antariksa punya vector yang sangat sparse: hanya 2 dimensi bukan nol. Setiap term kosakata yang tidak ada di dokumen ini, ditambah "the", bernilai 0.

Klik D1 sampai D4 untuk melihat setiap dokumen sebagai vector dengan satu dimensi per term kosakata. Demo ini melacak 9 term. Korpus sungguhan punya puluhan ribu term, dan dokumen biasa memakai jauh di bawah 1% darinya, jadi library menyimpan matriks TF-IDF dalam format sparse yang hanya mencatat nilai bukan nol. Setiap baris biasanya diskalakan ke panjang satu (L2 normalization) supaya dokumen panjang dan pendek bisa dibandingkan. Baris-baris inilah input klasik untuk linear classifier seperti logistic regression dan metode clustering seperti k-means.

Langkah 5 dari 6: Kemiripan Dokumen

Mencari dokumen terkait dengan cosine similarity

Cosine similarity D1: Antariksa dengan setiap dokumen:
D1: Antariksa (query)1.000
D3: Antariksa 0.548
term yang sama: rocket, space
D2: Laut 0.000
tidak ada term TF-IDF yang sama → kemiripan = 0
D4: Makanan 0.000
tidak ada term TF-IDF yang sama → kemiripan = 0
Query
D1 Antariksa
Paling mirip
D3 Antariksa
Cos sim
0.548

D1: Antariksa paling mirip dengan D3: Antariksa (cosine = 0.548) karena keduanya punya dimensi TF-IDF yang sama: rocket, space. Dokumen tanpa term yang sama mendapat skor 0, karena vector-nya ortogonal.

Klik setiap dokumen untuk menjadikannya query, lalu baca urutan kemiripannya. Cosine similarity adalah dot product dibagi kedua panjang vector, cos θ = a · b / (|a| |b|), dan karena weight TF-IDF tidak pernah negatif, rentangnya 0 sampai 1. D1 dan D3 mendapat skor 0,548 lewat "rocket" dan "space". D2 dan D4 mendapat skor 0,073 lewat "deep", hubungan yang lemah dan juga keliru: "deep ocean" dan "deep pan" berbeda maknanya. TF-IDF mencocokkan string persis, jadi tidak bisa memisahkan makna kata atau menghubungkan sinonim seperti "ship" dan "vessel".

Langkah 6 dari 6: TF-IDF dalam Praktik

Peringkat pencarian dan retrieval

Vector query (1 × IDF untuk setiap term dalam query):
rocket=0.69space=0.00whale=0.00ocean=0.00deep=0.00astronaut=0.00chef=0.00fish=0.00the=0.00
Klik sebuah hasil untuk melihat hitungan cosine similarity:
Cosine similarity: Query × D1: Antariksa
termquery×dokumen=hasil kali
rocket0.693×0.154=0.1068
space0.000×0.077=0.0000
dot product = 0.1068
|query| = 0.6931 |doc| = 0.1722
cosine = 0.1068 / (0.6931 × 0.1722) = 0.894

Query satu term "rocket": hanya dokumen yang memuatnya yang mendapat dot product bukan nol. Peringkatnya lalu bergantung pada seberapa besar porsi vector tiap dokumen yang dipegang term itu.

Klik kata-kata query untuk menambah query dari "rocket" sampai "chef", lalu klik sebuah hasil untuk melihat rincian dot product-nya. Dengan "rocket" saja, D1 mendapat skor 0,894 dan D3 0,408. Mengklik "whale" membuat query menjadi "rocket, space, deep, whale", dan D2 melompat ke posisi pertama dengan 0,742. Query diperlakukan sebagai dokumen kecil dan diberi peringkat dengan rumus cosine yang sama. Inilah vector space model yang dijadikan standar oleh sistem retrieval SMART milik Gerard Salton pada 1970-an. Inverted index membuatnya cepat: hanya dokumen yang memuat term dari query yang dihitung skornya.

Apa itu TF-IDF?

TF-IDF (term frequency dikali inverse document frequency) adalah skor yang mengukur seberapa penting sebuah kata bagi satu dokumen dalam sebuah koleksi. Skornya naik ketika kata itu sering muncul di dokumen tersebut dan turun ketika kata itu muncul di banyak dokumen. Kata seperti "the" berakhir mendekati nol, sedangkan kata topik seperti "whale" atau "rocket" menonjol.

TF-IDF mengubah setiap dokumen menjadi vector berisi weight kata, sehingga teks bisa dipakai oleh metode apa pun yang bekerja dengan angka. Selama puluhan tahun, TF-IDF menggerakkan mesin pencari berbasis kata kunci, dan turunannya, BM25, masih menjadi fungsi peringkat bawaan di Lucene dan Elasticsearch. TF-IDF juga menjadi baseline yang kuat untuk penyaringan spam, klasifikasi topik, clustering dokumen, dan ekstraksi kata kunci, serta menangani sisi kata kunci pada hybrid search dalam retrieval-augmented generation (RAG).

Ide utama

  • TF mengukur seberapa sering sebuah term muncul di satu dokumen, biasanya dibagi panjang dokumen.
  • IDF = log(N / df) tinggi untuk term yang ada di sedikit dokumen dan nol untuk term yang ada di semua dokumen.
  • TF-IDF mengalikan keduanya, jadi skor tinggi butuh term yang sering muncul secara lokal dan jarang secara global.
  • Setiap dokumen menjadi sparse vector dengan satu dimensi per term kosakata.
  • Cosine similarity antar-vector TF-IDF memberi peringkat pada dokumen terkait dan hasil pencarian.
  • TF-IDF hanya mencocokkan kata yang persis sama, jadi sinonim terlewat dan makna berbeda dari satu kata tercampur.

Pertanyaan umum

Apa bedanya TF-IDF dan word embedding?

TF-IDF memberi setiap kata dimensinya sendiri dan menentukan weight dari jumlah kemunculan, jadi "car" dan "automobile" sama tidak berhubungannya seperti "car" dan "banana". Word embedding seperti word2vec mempelajari dense vector yang menempatkan kata-kata terkait berdekatan. TF-IDF tidak butuh training dan mudah ditafsirkan; embedding menangkap makna tetapi butuh model yang sudah dilatih.

Apakah TF-IDF masih dipakai?

Ya. TF-IDF adalah baseline yang cepat dan kuat untuk klasifikasi teks dan clustering, dan BM25, bentuk yang lebih matang, masih menjalankan retrieval tahap pertama di banyak sistem pencarian. Hybrid search sering menggabungkan skor BM25 dengan skor dense embedding, karena pencocokan kata kunci menangkap nama, kode, dan term langka yang bisa dikaburkan embedding.

Bagaimana cara menghitung TF-IDF di Python?

TfidfVectorizer dari scikit-learn melakukan tokenization pada teks, membangun kosakata, menghitung weight IDF yang dihaluskan, dan mengembalikan matriks sparse yang sudah L2-normalized dengan satu baris per dokumen. Memanggil fit_transform pada dokumen training dan transform pada dokumen baru menjaga nilai IDF tetap mengikuti korpus training.

Bisakah TF-IDF memakai frasa, bukan hanya satu kata?

Bisa. Memperlakukan n-gram seperti "new york" atau "not good" sebagai term tambahan membuat TF-IDF bisa mempertahankan sebagian urutan kata dan negasi. Kosakatanya cepat membesar, jadi feature n-gram biasanya dibatasi dengan document frequency minimum atau jumlah feature maksimum.

Penjelasan terkait

  • Bag of Words · Mengubah teks menjadi angka: hitung kemunculan kata untuk membuat representasi dokumen paling sederhana di NLP
  • Tokenization & BPE · Cara teks menjadi angka, dari karakter sampai subword token lewat byte-pair encoding
  • Text Classification & Sentiment · Latih model untuk memberi label pada teks, dari deteksi spam sampai sentiment analysis
  • Norm dan Metrik Jarak · L1, L2, cosine similarity: cara mengukur kedekatan di ruang vector
  • Word2Vec & Word Embedding · Mempelajari representasi dense vector, dengan kata yang mirip saling berdekatan di dalam ruang
  • Retrieval-Augmented Generation · Mendasarkan output model bahasa pada dokumen yang diambil untuk mengurangi halusinasi

Referensi

  1. Spärck Jones (1972), "A Statistical Interpretation of Term Specificity and Its Application in Retrieval", Journal of Documentation
  2. Salton, Wong & Yang (1975), "A Vector Space Model for Automatic Indexing", Communications of the ACM
  3. Robertson & Zaragoza (2009), "The Probabilistic Relevance Framework: BM25 and Beyond"
  4. Jurafsky & Martin, "Speech and Language Processing" (3rd ed. draft)

Terakhir diperbarui