Professional Documents
Culture Documents
Wayan Sriyasa/G651080154
Departemen Ilmu Komputer, FMIPA, IPB
Pendahuluan
Proses pencarian informasi dalam suatu dokumen ada beberapa cara yang dapat
dilakukan antara lain dengan membaca seluruh isi dokumen tersebut, namun cara yang
demikian tentunya akan sangat tidak efektif apabila informasi yang akan kita cari cukup
banyak dalam korpus yang berukuran besar secara berulang. Untuk itu diperlukan
metode yang lebih efisien dimana pembacaan dilakukan hanya sekali kemudian data
yang berupa daftar kata yang mengarah ke suatu dokumen disimpan untuk digunakan
pada proses pencarian selanjutnya.
Salah satu cara yang bisa digunakan untuk tujuan ini adalah dengan membangun
index untuk setiap kata yang ada didalam dokumen. Proses indexing dapat kita lakukan
dengan membuat daftar frekuensi kemunculan kata disetiap dokumen kedalam sebuah
tabel seperti berikut:
Term Doc#
fahri 1
DOC#1 menghampiri 1 DOC#2
apartemen 1
Fahri menghampiri Selama membantu
apartemen Maria Maria 1 menyusun tesis,
untuk minta bantuan Untuk 1 timbul perasaan
karena komputer cintanya Maria
…. Dst 1
yang digunakan kepada Fahri
untuk menyusun Selama 2
tesis mengalami Membantu 2
Error.
Menyusun 2
…. Dst 2
1
Temu Kembali Informasi:
Rekonstruksi Inverted Index dan Implementasi Stopwords
Wayan Sriyasa/G651080154
Departemen Ilmu Komputer, FMIPA, IPB
Dua bagian dari inverted index, yaitu dictionary & posting. Dictionary biasanya disimpan
didalam memori dengan pointer yang mengarah ke setiap posting list yang disimpam
didalam disk.
2
Temu Kembali Informasi:
Rekonstruksi Inverted Index dan Implementasi Stopwords
Wayan Sriyasa/G651080154
Departemen Ilmu Komputer, FMIPA, IPB
Gambar 3. Proses pembentukan dictionary & posting list pada inverted index.
Sumber: Manning, et.al. 2008
3
Temu Kembali Informasi:
Rekonstruksi Inverted Index dan Implementasi Stopwords
Wayan Sriyasa/G651080154
Departemen Ilmu Komputer, FMIPA, IPB
Pada ilustrasi diatas, kata/term dengan frekuensi yang rendah akan memiliki idft
yang tinggi, hal ini menunjukkan bahwa relevansi kata/term tersebut berbanding lurus
dengan idft-nya. Ketika ukuran Nt semakin membesar, nilai idft akan semakin mengecil,
dan jika dft = N, maka nilai idft = 0, sehingga kata/term yang demikian tidak memberikan
ciri apapun terhadap sebuah dokumen. Kata/term yang demikian dapat kita abaikan
dan nantinya dapat kita pakai sebagai stopwords.
Seperti korpus yang dipakai, kata-kata "yang, di, dan, itu, dari" merupakan
beberapa kata yang dapat dijadikan sebagai stopwords pada korpus tersebut.
Pembobotan tf-idf
Dengan mengkombinasikan frekuensi kata/term dengan idft akan diperoleh bobot
komposit dari setiap kata/term disetiap dokumen. Skema pembobotan tf-idft , dimana
pembobotan kata/term t pada suatu dokumen d dapat dihitung sebagai:
Persamaan (2), terlihat bahwa setiap dokumen diperlakukan sebagai vektor dengan satu
komponen yang berhubungan dengan setiap kata/term didalam dictionary.
Implementasi
Implementasi dari tulisan ini adalah mencoba melakukan konstruksi inverted index,
melakukan pembobotan dan penentuan stopwords. Inverted index dibuat dengan
menyimpan kata/term kedalam hash setelah proses tokenisasi selesai dan akan
dibandingkan ukuran indeks dengan dan tanpa stopwords.
4
Temu Kembali Informasi:
Rekonstruksi Inverted Index dan Implementasi Stopwords
Wayan Sriyasa/G651080154
Departemen Ilmu Komputer, FMIPA, IPB
#################################################
## Step 1: Buat inverted index ##
#################################################
while (<IN>) {
$JumDok++;
$JumDok1++;
chomp;
## baca judul dokumen
if ($_=~ /<TITLE>(.*)<\/TITLE>/)
{
$judul[$JumDok] = $1;
print "Judul ke-$JumDok1 = $judul[$JumDok]\n";
}
## Baca isi dokumen disetiap judul
while (m/<(TITLE|TEXT)>(.+)<\/\1>/gs) {
## Buang tanda baca standar Perl
(my $text = $2) =~ s/[[:punct:]]+//gs;
## parsing kata ditiap dokumen
while ($text =~ m/\b([[:alpha:]]+)\b/gs) {
## convert jd huruf kecil
$kata = lc $1;
## simpan frekuensi kata ditiiap dokumen ke variabel tf (posting)
++$tf[$JumDok]{$kata};
## simpan frekuensi kata diseluruh dokumen (dicitionary)
++$dictio{$kata};
## tulis ke file tf.csv
print OUT "Dokumen ke: $JumDok1, $kata,$tf[$JumDok]{$kata}\n";
}
}
}
##########################################################
## Step 2. hitung frekeunsi kemunculan kata ditiap dokumen dalam korpus --> df ##
##########################################################
$n = $#tf + 1;
foreach $x (sort keys %dictio){
$Jum = 0;
for $i (0..$#tf) {
if ($tf[$i]{$x} > 0 ) {
$Jum++;
}
if ($Jum > 0 ) {
$df{$x} = $Jum;
$bobot[$i]{$x} = log($n/$df{$x})/log(2);
}
}
}
5
Temu Kembali Informasi:
Rekonstruksi Inverted Index dan Implementasi Stopwords
Wayan Sriyasa/G651080154
Departemen Ilmu Komputer, FMIPA, IPB
6
Temu Kembali Informasi:
Rekonstruksi Inverted Index dan Implementasi Stopwords
Wayan Sriyasa/G651080154
Departemen Ilmu Komputer, FMIPA, IPB
Stopwords Efisiensi
Kata/Term
Tanpa Dengan (%)
Total jumlah kata 9243 5010 45.80
Total kata unik 2194 766 65.09
Berikut grafik distribusi frekuensi kata pada korpus, grafik 1 merupakan sebaran
kata tanpa stopwords dan grafik 2 sebaran kata setelah menggunakan stopwords.
250
200
Frekuensi
150
100
50
0
r k k i l i t t n i i n n i n n l n i k n n n i
ang esa sa ya tkan ang pas rea ans rika ong an ulu aa asl lisas ga ka am feks ka nyaong aga ikun iring wa esta aa au dah gka ap nya ks isian iwa oni lite ka ka ang ga kter
y b ru an ka ep tisi a nst se gk kim m ad n n c g ir a n p u n nc au ol j p e an ku hi an a
sia u ru a in din kh thip ten sod se r p gu m ba e m o j b
b
se ning
j
an
i n su ke so rlind enu m a u m ep dr ah erla c an
ho ba
n ng m k hi rt
ep
pe m nw pe e pe di
b
m
e di tri hk di rk
bu be
num
e
m
Kata
70
60
50
Frekuensi
40
30
20
10
0
indosiarcom
paham
menderita
mereka
dokumen
apabila
buahbuaha
apbd
sebaiknya
bea
kabupaten
keterkaitan
pasaran
oleh
tertentu
mendapat
pelaku
flu
sedang
masuk
kamis
diselundupk
sumber
dibandingk
dosis
atas
pejabat
eksportir
sapi
tapi
tani
Kata
7
Temu Kembali Informasi:
Rekonstruksi Inverted Index dan Implementasi Stopwords
Wayan Sriyasa/G651080154
Departemen Ilmu Komputer, FMIPA, IPB
Pada grafik sebaran frekuensi kata diatas, terlihat bahwa sebaran tersebut
memenuhi hukum Zipf, dimana kata-kata yang menjadi stopwords kurang lebih
berkumpul pada bagian kiri dan kanan. Bagian inilah yang dapat kita abaikan karena
tidak memberikan ciri terhadap dokumen yang bersangkutan.
Kesimpulan
Untuk mempercepat proses pencarian informasi, perlu dilakukan indexing
terhadap masing-masing dokumen tersebut. Inverted index adalah salah satu teknik
indexing yang cukup efektif dalam IR. Bagian penting dari inverted indexing adalah
dictionary yang berisi pointer mengarah ke list posting.
Tidak semua kata/term dapat menjadi penciri sebuah dokumen. Kata/term yang
bukan merupakan penciri sebuah dokumen disebut sebagai stopwords. Peranan
kata/term sebagai penciri sebuah dokumen dapat ditentukan dengan menghitung idft
dimana semakin tinggi nilai-nya menunjukkan semakin penting kata tersebut dalam
mencirikan swebuah dokumen. Selain idft , faktor lain yang juga berperan dalam
penentuan ciri adalah dengan menentukan bobot dari suatu dokumen yaitu dengan
menghitung bobot komposit dari setiap kata/term di setiap dokumen.
Referensi
----------------. http://nlp.stanford.edu/IR-book/html/htmledition/irbook.html
----------------. http://en.wikipedia.org/wiki/Natural_language_processing
Adisantoso, J; dan Ridha, A. 2009. Materi Kuliah: Sistem Temu Kembali Informasi. Istitut
Pertanian Bogor. Indonesia.
Feldman, R; Sanger, J. 2007. THE TEXT MINING HANDBOOK: Advanced Approaches in
Analyzing Unstructured Data. Cambridge University Press. USA.
Manning, C.D; Raghavan, P Dan Schutze, H. 2008. Introduction To Information Retrieval.
Cambridge University Press. USA.
Rijsbergen, C.J. 2008. Information Retrieval. Department Of Computing Science,
University Of Glasgow. USA.
8
Temu Kembali Informasi:
Rekonstruksi Inverted Index dan Implementasi Stopwords
Wayan Sriyasa/G651080154
Departemen Ilmu Komputer, FMIPA, IPB
Lampiran script:
##################################################
## variable file yang akan dipakai: ##
## OUT => simpan frekuensi kata ditiap dokumen ##
## OUT2 => simpan dictionary tanpa stopwords ##
## OUT3 => simpan dicitonary dengan stopwords ##
##################################################
open(IN, "korpus.txt") or die("File not found...");
open(OUT, ">tf.csv");
open(OUT2,">nostopwords.csv");
open(OUT3, ">stopwords.csv");
#################################################
## Variable untuk hitung jumlah dokumen ##
#################################################
$JumDok = -1; $JumDok1 = 0;
$/ = "</DOC>\n";
#################################################
## Step 1: Buat inverted index ##
#################################################
while (<IN>) {
$JumDok++; $JumDok1++;
chomp;
## baca judul dokumen
if ($_=~ /<TITLE>(.*)<\/TITLE>/)
{
$judul[$JumDok] = $1;
print "Judul ke-$JumDok1 = $judul[$JumDok]\n";
}
## Baca isi dokumen disetiap judul
while (m/<(TITLE|TEXT)>(.+)<\/\1>/gs) {
## Buang tanda baca standar Perl
(my $text = $2) =~ s/[[:punct:]]+//gs;
## parsing kata ditiap dokumen
while ($text =~ m/\b([[:alpha:]]+)\b/gs) {
## convert jd huruf kecil
$kata = lc $1;
## simpan frekuensi kata ditiiap dokumen ke variabel tf (posting)
++$tf[$JumDok]{$kata};
## simpan frekuensi kata diseluruh dokumen (dicitionary)
++$dictio{$kata};
## tulis ke file tf.csv
print OUT "Dokumen ke: $JumDok1, $kata,$tf[$JumDok]{$kata}\n";
}
}
}
#################################################
## Step 2. hitung frekeunsi kemunculan kata ##
## ditiap dokumen dalam korpus --> df ##
## hitung idf = LOG(N/df) dan tf*idf ##
#################################################
$n = $#tf + 1;
foreach $x (sort keys %dictio){
$Jum = 0;
for $i (0..$#tf) {
if ($tf[$i]{$x} > 0 ) {
$Jum++;
}
if ($Jum > 0 ) {
$df{$x} = $Jum;
$bobot[$i]{$x} = log($n/$df{$x})/log(2);
9
Temu Kembali Informasi:
Rekonstruksi Inverted Index dan Implementasi Stopwords
Wayan Sriyasa/G651080154
Departemen Ilmu Komputer, FMIPA, IPB
}
}
}
##################################################
## Step3. Bikin index dengan dan tanpa stopwords##
## stopwords dipilih dengan kategori ##
## kata yang memiliki 1<df<=10 ##
##################################################
print "\n";
foreach $x (sort keys %dictio)
{
if ($df{$x} <=10 && $df{$x} > 1) {
print OUT3 "$x, $dictio{$x}, $df{$x}.\n";
}
}
#################################################
##Bikin index tanpa stopwords ##
#################################################
foreach $x (sort keys %dictio)
{
print OUT2 "$x,$dictio{$x},$df{$x}\n";
}
####################################################
## Cetak ke layar informasi ##
## jumlah dokumen yang di-index ##
####################################################
print "Sebanyak $JumDok1 dokumen telah di-index.\n";
####################################################
10