10
Temu Kembali Informasi: Rekonstruksi Inverted Index dan Implementasi Stopwords Wayan Sriyasa/G651080154 Departemen Ilmu Komputer, FMIPA, IPB 1 Rekonstruksi Inverted Index dan Implementasi Stopwords 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 menghampiri 1 apartemen 1 Maria 1 Untuk 1 …. Dst 1 Selama 2 Membantu 2 Menyusun 2 …. Dst 2 Setelah dilakukan pemisahan kata perkata dari setiap dokumen, kemudian dibuat tabel frekuensi seperti terlihat pada ilustrasi diatas. Tabel tersebut disebut sebagai term document matrix. Proses ini dikenal sebagai forward indexing dan proses pencarian dengan menggunakan metode indexing ini memerlukan waktu yang berbanding lurus dengan jumlah datanya (O(n)), dimana ukuran matrix akan sangat besar. Inverted index adalah salah satu solusi yang dapat digunakan untuk mengatasi permasalahan ini. Dimana ide yang dipakai adalah dengan menggabungkan term yang sama pada satu dokumen dengan dokumen yang lainnya dan untuk mengetahui kemunculan suatu term ditiap dokumen maka digunakanlah frekuensi dari kemunculan term tersebut. Berikut contoh tabel yang baru: Term Doc#Frek Apartemen 1 1 Cintanya 2 1 Fahri 1 1 Fahri 2 1 DOC#1 Fahri menghampiri apartemen Maria untuk minta bantuan karena komputer yang digunakan untuk menyusun tesis mengalami Error. DOC#2 Selama membantu menyusun tesis, timbul perasaan cintanya Maria kepada Fahri Gambar 1. Proses pengelompokan kata/term dan frekuensinya pada tiap dokumen.

Konstruksi Inverted Index

Embed Size (px)

DESCRIPTION

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. 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.

Citation preview

Page 1: Konstruksi Inverted Index

Temu Kembali Informasi: Rekonstruksi Inverted Index dan Implementasi Stopwords

Wayan Sriyasa/G651080154

Departemen Ilmu Komputer, FMIPA, IPB

1

Rekonstruksi Inverted Index dan Implementasi Stopwords

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

menghampiri 1 apartemen 1

Maria 1

Untuk 1 …. Dst 1 Selama 2

Membantu 2 Menyusun 2 …. Dst 2

Setelah dilakukan pemisahan kata perkata dari setiap dokumen, kemudian dibuat tabel frekuensi seperti terlihat pada ilustrasi diatas. Tabel tersebut disebut sebagai term document matrix. Proses ini dikenal sebagai forward indexing dan proses pencarian dengan menggunakan metode indexing ini memerlukan waktu yang berbanding lurus dengan jumlah datanya (O(n)), dimana ukuran matrix akan sangat besar. Inverted index adalah salah satu solusi yang dapat digunakan untuk mengatasi permasalahan ini. Dimana ide yang dipakai adalah dengan menggabungkan term yang sama pada satu dokumen dengan dokumen yang lainnya dan untuk mengetahui kemunculan suatu term ditiap dokumen maka digunakanlah frekuensi dari kemunculan term tersebut. Berikut contoh tabel yang baru:

Term Doc# Frek Apartemen 1 1 Cintanya 2 1 Fahri 1 1 Fahri 2 1

DOC#1 Fahri menghampiri apartemen Maria untuk minta bantuan karena komputer yang digunakan untuk menyusun tesis mengalami Error.

DOC#2 Selama membantu menyusun tesis, timbul perasaan cintanya Maria kepada Fahri

Gambar 1. Proses pengelompokan kata/term dan frekuensinya pada tiap dokumen.

Page 2: Konstruksi Inverted Index

Temu Kembali Informasi: Rekonstruksi Inverted Index dan Implementasi Stopwords

Wayan Sriyasa/G651080154

Departemen Ilmu Komputer, FMIPA, IPB

2

Tabel Dictionary dan Posting 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. Rekonstruksi Inverted Index Untuk menambah kecepatan indexing pada waktu retrieval, kita perlu membangun index ini lebih lanjut. Langkah utama adalah:

1. Mengumpulkan & membaca dokumen yang akan di-index. 2. Melakukan tokenisasi/pemisahan kata/term yang terdapat pada dokumen. 3. Melakukan standarisasi kata/term yang nantinya digunakan pada index. 4. Melakukan indexing dokumen dengan kata/term yang muncul didalamnya

kedalam tabel dictionary dan posting. Index dibangun dengan melakukan pengurutandan pengelompokan. Urutan setiap kata/term didalam dokumen ditandai dengan IdDokumen-nya masing-masing. Instance yang mengandung kata/term yang sama dikelompokkan menjadi satu berdasarkan kata/term tersebut dan kemudian berdasarkan IdDokumen-nya. Kemudian kata/term dan IdDokumen kemudian dipisahkan sehingga dihasilkan tabel dictionary dan posting list.

Tabel dictionary menyimpan kata/term dan memiliki pointer yang berfungsi sebagai penunjuk ke daftar posting untuk tiap-tiap kata/term. Setiap posting list menyimpan daftar dokumen dimana kata/term muncul dan juga menyimpan informasi seperti frekuensi kata/term atau posisi kata/term tersebut didalam dokumen. Ilustrasi dibawah menunjukkan bagaima dictionary dan posting list dibentuk.

T erm nDoc tF rekapartemen 1 1bantuan 1 1cintanya 1 1digunakan 1 1error 1 1fahri 2 2karena 1 1kepada 1 1komputer 1 1maria 2 2membantu 1 1mengalami 1 1menghampiri 1 1menyus un 2 2minta 1 1peras aan 1 1s elama 1 1tes is 2 2timbul 1 1untuk 1 2yang 1 1

T erm nDoc tF rekapartemen 1 1bantuan 1 1cintanya 1 1digunakan 1 1error 1 1fahri 2 2karena 1 1kepada 1 1komputer 1 1maria 2 2membantu 1 1mengalami 1 1menghampiri 1 1menyus un 2 2minta 1 1peras aan 1 1s elama 1 1tes is 2 2timbul 1 1untuk 1 2yang 1 1

Doc# F rek1 11 12 11 11 11 12 11 12 11 11 12 12 11 11 12 11 11 12 12 11 12 12 11 21 1

Doc# F rek1 11 12 11 11 11 12 11 12 11 11 12 12 11 11 12 11 11 12 12 11 12 12 11 21 1Pointer

Terms

Gambar 2. Tabel Dictionary & Posting serta pointer.

Page 3: Konstruksi Inverted Index

Temu Kembali Informasi: Rekonstruksi Inverted Index dan Implementasi Stopwords

Wayan Sriyasa/G651080154

Departemen Ilmu Komputer, FMIPA, IPB

3

Inverse Documen Frequency (idft) Pada dasarnya, tidak semua kata/term yang muncul pada sebuah dokumen dapat dijadikan sebagai penciri dokumen itu. Berdasarkan hal ini diperlukan sebuah cara untuk mengurangi efek dari kata/term yang muncul terlalu sering pada suatu korpus sehingga dihasilkan kata/term yang dapat mencirikan masing-masing dokumen tersebut. Salah satu ide yang cukup relevan untuk itu adalah dengn menghitung document frequency (dft), yang didefiniskan sebagai jumlah dokumen dalam korpus yang megandung kata/term t. Karena untuk jumlah dokumen yang cukup banyak akan lebih efektif jika dilihat dari statistik pada level dokumennya.

Gambar 3. Proses pembentukan dictionary & posting list pada inverted index. Sumber: Manning, et.al. 2008

Page 4: Konstruksi Inverted Index

Temu Kembali Informasi: Rekonstruksi Inverted Index dan Implementasi Stopwords

Wayan Sriyasa/G651080154

Departemen Ilmu Komputer, FMIPA, IPB

4

Inverse Document Frequency (idft) dapat kita tentukan dengan melakukan pembandingan jumlah dokumen (N) pada suatu korpus terhadap dft-nya, sebagai berikut:

tt df

Nidf log ........................(1)

idft menunjukkan bagaimana distribusi kata/term diantara koleksi dokumen didalam korpus. Tabel berikut merupakan ilustrasi dari frekuensi kata/term dan nilai idft-nya:

Kata/term freq dft idft

yang 245 21 Log(21/21) = 0 di 214 21 Log(21/21) = 0

dan 211 21 Log(21/21) = 0 itu 125 21 Log(21/21) = 0

dari 100 21 Log(21/21) = 0

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:

tf-idft,d = tft,d x idft ........................(2)

dari persamaan ini terlihat bahwa: Nilai tertinggi akan muncul bilamana t muncul berulang kali didalam korpus

dengan jumlah dokumen yang sedikit (sehingga kata/term tersebut sangat berperan sebagai penciri dokumen).

Nilai rendah terjadi ketika kata/term muncul didalam dokumen lebih jarang, atau muncul dibanyak dokumen (sehingga kata/term yang demikian kurang baik sebagai penciri sebuah dokumen).

Nilai terrendah akan terjadi jika kata/term muncul hampir disemua dokumen. 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.

Page 5: Konstruksi Inverted Index

Temu Kembali Informasi: Rekonstruksi Inverted Index dan Implementasi Stopwords

Wayan Sriyasa/G651080154

Departemen Ilmu Komputer, FMIPA, IPB

5

Langkah 1. Pembuatan Inverted Index Cuplikan script berikut merupakan langkah pembentukan inverted index: Langkah 2. Perhitungan dft, idft dan tf x idft

################################################# ## 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); } } }

Page 6: Konstruksi Inverted Index

Temu Kembali Informasi: Rekonstruksi Inverted Index dan Implementasi Stopwords

Wayan Sriyasa/G651080154

Departemen Ilmu Komputer, FMIPA, IPB

6

Gambar 5. Hasil run script

Langkah 3. Pemilihan Stopwords Pada korpus ini stopwords dipilih dengan kriteria kata yang memiliki nilai 1 < dft dan dft > 10, kriteria ini dipilih berdasarkan karakteristik korpus serta pertimbangan nilai idft. Berikut cuplikan script yang melakukan fungsi ini:

Hasil dan Pembahasan Berikut hasil run dari script yang telah dibuat:

## Step3 . Bikin index dengan dan tanpa stopwords ################################################# ##Bikin index dengan 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"; }

Page 7: Konstruksi Inverted Index

Temu Kembali Informasi: Rekonstruksi Inverted Index dan Implementasi Stopwords

Wayan Sriyasa/G651080154

Departemen Ilmu Komputer, FMIPA, IPB

7

Sebaran Kata Dalam Korpus

0

50

100

150

200

250

300

yang

besarrus

ak

sebany

ak

meningka

tkan

jepang

antisip

asiarea

l

instansi

serika

t

hong

kong

sukim

anmulu

t

keadaan asli

sosialisa

si

perlind

ungan

menurun

kan

macaminf

eksi

diband

ingka

n

akhirny

a

trinwuth

ipong

tenaga

sodik

unseirin

grawa

pesta

penggun

aanpaul

mudah

menumbuh

kembang

kan

mencapi

maunya ks

kepoli

sianjiw

a

hidropon

ikelit

e

diperta

hanka

n

diberla

kuka

n

chiang

berkep

anjang

an

bakteri

Kata

Frek

uens

i

Tanpa Stopwords

Sebaran Kata Setelah Digunakan Stopwords

0

10

20

30

40

50

60

70

80

flu

oleh

kabu

pat

en

mere

ka

bea

seda

ng

mas

uk

doku

men

apab

ila

sapi

dise

lund

upk

tapi

dosis

peja

bat

ata

s

indo

siarc

om

pasa

ran

terte

ntu

buah

buaha

kam

is

men

dap

at

pela

ku

sum

ber

apb

d

diba

ndin

gk

eksp

ortir

kete

rkai

tan

men

der

ita

paha

m

seba

ikny

a

tani

Kata

Frek

uens

i

Dengan Stopwords

Gambar 6. Sebaran kata didalam korpus tanpa dan dengan stopwords.

Implementasi stopwords berhasil mengurangi ukuran index cukup signifikan yakni dari sebanyak 2194 buah kata unik dengan jumlah kata mencapai 9243 buah kata dapat dikurangi hingga 5010 buah kata dengan perbendaharaan kata unik sebanyak 766 kata, efisiensi jumlah kata yang dihasilkan mencapai hingga 45,8% dan efisiensi jumlah kata unik hingga 65%. Berikut tabel perbandingan index dengan dan tanpa stopwords:

Stopwords Kata/Term Tanpa Dengan Efisiensi

(%) 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.

Page 8: Konstruksi Inverted Index

Temu Kembali Informasi: Rekonstruksi Inverted Index dan Implementasi Stopwords

Wayan Sriyasa/G651080154

Departemen Ilmu Komputer, FMIPA, IPB

8

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.

Page 9: Konstruksi Inverted Index

Temu Kembali Informasi: Rekonstruksi Inverted Index dan Implementasi Stopwords

Wayan Sriyasa/G651080154

Departemen Ilmu Komputer, FMIPA, IPB

9

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);

Page 10: Konstruksi Inverted Index

Temu Kembali Informasi: Rekonstruksi Inverted Index dan Implementasi Stopwords

Wayan Sriyasa/G651080154

Departemen Ilmu Komputer, FMIPA, IPB

10

} } } ################################################## ## 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"; ####################################################