Dalam postingan ini saya akan membahas mengenai sebuah teknik yang digunakan untuk merepresentasikan sebuah dokumen dalam sebuah vector (Vector Space Model). Namun, sebelum membahas lebih lanjut saya ingin bertanya, kira-kira mengapa sebuah dokumen harus direpresentasikan menjadi sebuah vector?
Saya rasa bagi pengguna internet, hampir setiap hari kita menggunakan Google. Dengan Google, kita dapat melakukan pencarian halaman web yang sesuai dengan kata kunci yang kita inginkan, namun bagaimana untuk menentukan kemiripan sebuah laman web dengan kata kunci yang kita masukan pada Google. Bagi manusia saya rasa sangat mudah untuk menentukan hal tersebut, namun bagaimana dengan sebuah komputer?
Dari empat kalimat dibawah ini, kita dapat menentukan bahwa kalimat yang sesuai dengan kata kunci “kehidupan mahasiswa dikampus” adalah kalimat 1, 2, dan 4. Namun bagaimana dengan komputer, bagaimana sebuah komputer dapat mengetahui bahwa kalimat 1, 2, dan 4 adalah kalimat yang sesuai dengan kata kunci “kehidupan mahasiswa dikampus”?
- Hari ini dikampus, saya makan bersama teman-teman saya di kantin kampus, dan kami bertemu dengan mahasiswa senior yang jutek abis.
- Duh hari ini hujan, padahal mau berangkat kekampus karena ada ujian dari dosen favoritku.
- Malam minggu dan hujan, saatnya cari duit.
- Waktu saya menjadi mahasiswa saya sering bekerja paruh waktu.
Ok perhatikan baik-baik, kita dapat mengetahui bahwa pada kalimat 1 dan 4 terdapat kata mahasiswa, dan pada kalimat 1, dan 2 terdapat kata kampus. Kemampuan dasar dari komputer itu adalah melakukan perhitungan, oleh karena itu pada kasus ini kita dapat menentukan kemiripan sebuah dokumen terhadap kata kunci dengan melakukan perhitungan frekuensi kehadiran kata kunci pada sebuah kalimat.
Kata kunci: kehidupan, mahasiswa, kampus
Kalimat1: kehidupan: 0, mahasiswa: 1, kampus: 2 Kalimat2: kehidupan: 0, mahasiswa: 0, kampus: 1 Kalimat4: kehidupan: 0, mahasiswa: 1, kampus: 0
Nah dari hasil diatas, dapat ditentukan bahwa dokumen atau kalimat yang paling mirip dengan kata-kunci adalah dokumen ke-1. Mungkin dari sini rekan-rekan dapat membayangkan VSM itu apa atau bagaimana sebuah dokumen dapat dicocokan satu sama lain, atau tambah bingun (karena saya tambah bingung sebenarnya).
Ok jadi, ……..
Vector Space Model (Vector Space Model) adalah model aljabar yang merepresentasikan kumpulan dokumen sebagai vetctor. VSM dapat diaplikasikan dalam klasifikasi dokumen, clustering dokumen, dan scoring dokumen terhadap sebuah query. Dalam VSM setiap dokumen direpresentasikan sebagai sebuah vector, dimana nilai dari setiap nilai dari vector tersebut mewakili weight sebuah term. Dalam menghitung term-weight dapat digunakan beberapa teknik seperti frequency, binary-document vector, atau tf-idf. Dalam postingan ini saya akan menggunakan tf-idf dalam menghitung term-weighting sebuah dokumen.
Definition
- dokumen (d): dapat berupa tweet, kalimat, atau berita.
- term (t): dapat berupa kata tungga (contoh: teman), keywords, atau phrase (contoh: teman sekolah yang baik)
TF-IDF
Apa sih TF itu?
TF atau term frequency adalah weighting scheme yang digunakan untuk menentukan relevansi dokumen dengan sebuah query (term). TF menentukan bobot relevansi sebuah dokumen dan term berdasarkan frekuensi kemunculan term pada dokumen terkait. Untuk menghitung TF terdapat beberapa jenis fungsi yang dapat digunakan [1]:
- Natural atau Raw-term frequency
- Logarithm
- Augmented
- Boolean
Contoh TF
kasus: hitungan weight kata “anak” pada kalimat “anak ini bukan anak kamu”
dokumen: anak ini bukan anak kamu
term: anak
weight t pada d: 2
Note: pada kasus ini digunakan raw-frequency term weighting.
DF
Jika TF adalah frekuensi kemunculan suatu term pada sebuah dokumen, DF merupakan jumlah dokumen dimana terdapat term yang bersangkutan. Konsep DF sendiri dilatarbelakangin oleh masalah pada TF, dimana semua term dianggap sama penting, sehingga term yang memiliki sedikit atau tidak memiliki discrimination power dapat mempengaruhi akurasi dalam menentukan relevansi antara term dan dokumen. Ide dari DF adalah dengan mengurangi bobot TF suatu term dengan membaginya dengan frekuensi term terhadap koleksi dokumen (DF). Jadi sebuah term yang memiliki bobot TF yang besar namun dengan bobot DF yang besar pula tidak akan memiliki pengaruh yang besar dalam menentukan sebuah relevansi [1].
\[df(t, doc collection) = df_t\]*Contoh DF
Koleksi dokumen:
- Yang domisili di Cibinong & sekitarnya siang ini kita olahraga bareng
- Tau belum bogor jadi kandidat the most loveable city in the world?
- Salam olahraga Minggu semangat..!!! @ Taman Bogor
Term: olahraga, taman
DF:
- DF (olahraga, d) = 3 (dokumen 1, 2, dan 3)
- DF (taman, d) = 1 (dokumen 1)
IDF
IDF adalah inverse dari DF, IDF akan melakukan proses scaling pada TF. Term yang memiliki DF yang rendah akan memiliki IDF yang tinggi. Dengan kata lain, sebuah term yang jarang ditemui pada koleksi dokumen atau bisa dikatakan sebagai term khusus akan memiliki nilai IDF yang tinggi. Untuk menghitung IDF pada sebuah term pada sebuah koleksi dokumen dapat menggunakan fungsi dibawah ini,
\[idf_t = log (\frac{N}{df_t})\]dimana N adalah jumlah dokumen pada koleksi.
Contoh IDF
Koleksi dokumen:
- Yang domisili di Cibinong & sekitarnya siang ini kita olahraga bareng
- Tau belum bogor jadi kandidat the most loveable city in the world?
- Salam olahraga Minggu semangat..!!! @ Taman Bogor
Term: olahraga, taman
IDF:
- Diketahui:
- N = 3
- DF (olahraga, d) = 3 (dokumen 1, 2, dan 3)
- DF (taman, d) = 1 (dokumen 1)
Maka IDF dari term “olahraga” dan “taman”
Term | DF | IDF |
---|---|---|
olahraga | 3 | 0 |
taman | 1 | 0.477121 |
Jadi VSM itu seperti apa?
Nah setelah beberapa penjelasan singkat tentang term-weighting diatas. Langsung saja pada bagian ini saya jelaskan contoh perhitungan VSM sebuah dokumen. Pada VSM sebuah dokumen akan direpresentasikan dalam sebuah vektor, dimana setiap nilai pada vektor tersebut mewakili bobot term yang bersangkutan.
Contoh VSM
dokumen: sudah duah tahun kami tinggal di desa ini, pendidikan anak kami di desa ini cukup terjamin, jadi kami rasa kami akan tetap tinggal di desa ini, hingga pendidikan anak kami selesai
vocabulary / word bank: anak, desa, pendidikan, sekolah, guru,buku, terbatas.
term-weighting: Raw-Frekuensi
\[(t, d) = \frac {f_t}{max \{t \in d \}}\]Keterangan:
- jumlah kata pada dokumen: 31
Word | Bank | Frekuensi | VSM |
---|---|---|---|
anak | 2 | 0.064516129 | |
desa | 3 | 0.096774194 | |
pendidikan | 1 | 0.032258065 | |
sekolah | 0 | 0 | |
guru | 0 | 0 | |
buku | 0 | 0 | |
terbatas | 0 | 0 |
Maka VSM untuk kalimat :
“sudah duah tahun kami tinggal di desa ini, pendidikan anak kami di desa ini cukup terjamin, jadi kami rasa kami akan tetap tinggal di desa ini, hingga pendidikan anak kami selesai”
\[[0.0645, 0.0968, 0.0322, 0, 0, 0, 0]\]Implementasi TF-IDF VSM Menggunakan Phyton
Keterangan:
- Dalam implementasi ini, saya menggunakan 10 docs (kalimat) yang diambil secara acak dengan topik “penggunaan vaksi palsu”
- Wordbank (kata yang dianggap berkaitan topik diatas)
- vaksin
- posko
- kesehatan
- penumpang
- kereta
- kemanan
- Term-weighting yang digunakan adalah Tf-Idf
- Tf weighting scheme: log normalization
- Idf weighting scheme: inverse document frequency smooth
- Log base yang saya gunakan adalah base 10
#import library pandas dan inisialisasikan menjadi pd
import pandas as pd
#import library numpy dan inisialisasikan menjadi np
import numpy as np
#dari library math import function log
from math import log
#hapus seluruh tanda baca dan angka
def removeNonWord(doc):
#hapus seluruh kata yang mengandung angka, contoh: perempuan2
result = doc.replace({'\w*\d\w*': ''}, regex=True)
#hapus seluruh karakter yang tidak termasuk alphabet
result = result.replace({'[\W_]+': ' '}, regex=True)
#remove null dari hasil final
return result[result.notnull()]
def idf(doc, wordBank):
#hitung jumlah doc
N = len(doc.index)
#buat dataframe dengan header word dan idf
result = pd.DataFrame(columns=['word', 'idf'])
#untuk setiap kata pada wordBank lakukan.....
for index, word in wordBank.iterrows():
#hitung jumlah doc yang mengandung kata word['words']
dft = np.sum(doc.str.contains(word['words']))
#hitung inverse document frequency smooth
idft = log(N / (dft + 1), 10)
#tambahkan idf untuk setiap kata pada data frame
result = result.append(pd.Series([word['words'], idft], index=['word', 'idf']), ignore_index=True)
#return variable result
return result
#funtion to calculate tf
def tf(doc, wordBank):
#split kata berdasarkan spasi
wordList = doc.str.split(' ')
#hitung jumlah kata pada setiap doc
maxFt = [len(s) for s in wordList]
#buat DataFrame kosong untuk menyimpan hasil perhitungan Tf
result = pd.DataFrame()
#untuk setiap word dalam wordbank lakukan ....
for index, word in wordBank.iterrows():
#hitung frekuensi kata untuk setiap doc
ft = np.add([s.count(word['words']) for s in wordList], 0)
#tf log normalization
ftd = 1 + np.log10(ft)
#tambahkan hasil perhitungan tf kedalam DataFrame
result = result.append(pd.Series(ftd), ignore_index=True)
#replace -inf with zero
result = result.replace(-np.inf, 0)
#return variable result
return result
def tfIdf(tf, idf):
#buat DataFrame kosong untuk menyimpan hasil perhitungan Tf-Idf
result = pd.DataFrame()
#untuk setiap tf
for i in tf:
#tf idf untuk document term weighting tf * idf
tfIdf = tf[i] * idf['idf']
#tambahkan hasil perhitungan tf idf kedalam DataFrame
result = result.append(pd.Series(tfIdf), ignore_index=True)
#return variable result
return result
# membaca file doc.csv menggunakan pandas
# doc.csv berisi 10 kalimat
doc = pd.read_csv('data/doc.csv', encoding='utf-8')
# membaca file wordBank.csv
# wordBank.csv berisi kata-kata penting atau keywords yang dianggap relevan dengan topik dalam sebuah kasus
vocabulary = pd.read_csv('data/wordBank.csv', encoding='utf-8')
#ubah seluruh huruf menjadi huruf kecil
doc = doc['sentences'].str.lower()
#panggil fungsi removeNonWord
doc = removeNonWord(doc)
#hitung nilai IDF
resultIDF = idf(doc, vocabulary)
#hitung nilai TF
resultTF = tf(doc, vocabulary)
#hitung nilai Tf-Idf
resultTfIdf = tfIdf(resultTF, resultIDF)
print(resultTfIdf)
Nah sekian pembahasan mengenai TF-IDF VSM menggunakan Python, mohon komentar dan masukan ya.
Download disini bro…
Daftar Pustaka:
[1] Manning, C. D.; Raghavan, P.; Schutze, H. (2008). “Scoring, term weighting, and the vector space model”. Introduction to Information Retrieval. p. 100.