Anda di halaman 1dari 31

3 Kamus dan Pengambilan yang bisa diterima

Pada bab 1 dan 2, kami mengembangkan pokok pikiran yang mendasari index terbalik untuk menyelesaikan pertanyaan Boolean dan kedekatan query. Sedangkan pada chapter ini, kami mengembangkan teknik yang kuat untuk kesalahan pengetikan pada query yang juga perupakan palefalan alternatif. Pada sesi 3.1, kami mengembangkan struktur data yang membantu pencarian dalam kontex kosa kata dan index terbalik. Pada sesi 3.2, kami mempelajari ide dari wildcard query; query seperti aeIou, yang akan mencari dukumen dengan ucapan yang memiliki kelima huruf hidup itu secara berurutan. Simbol * mengindikasikan adanya (kemungkinan kosong) rangkaian pada simbol ketikan. Pengguna memakai mesin pencari ketika pengguna tidak yakin tentang ejaan query, atau dokumen yang berisikan istilah query yang lain; contohnya, query automat* akan mencari dokumen yang memiliki kata automatic, automation, dan automed. Kami lalu beralih ke bentuk lain penggunaan query yang tidak tepat, dengan berfokus pada kesalahan ejaan disesi 3.3. Pengguna juga membuat kesalahan ejaan secara tidak disengaja, atau karena istilah yang mereka cari untuk (contoh herman) tidak memiliki bentuk ejaan yan sama artinya pada kumpulan data. Kami merinci beberapa teknik untuk memperbaiki kesalahan ejaan pada query, satu istilah diwaktu yang sama dengan seluruh rangkaian istilah query. Untuk yang terakhir, pada sesi 3.4 kami mempelajari sebuah metode dalam pencarian kosa kata yang memiliki kemiripan bunyi dengan istilah query. Hal ini akan sangat berguna terutama pada kasus seperti yang diutarakan Herman, dimana pengguna mungkin tidak mengetahui ejaan nama yang benar pada kumpulan data di dokumen. Karena kita mengembangkan banyak jenis index terbalik pada bab ini, kami kadang menggunakan kata index terbalik standar untuk mengartikan index terbalik yang dikembangkan pada bab 1 dan 2, dimana setiap kosa kata istilah memiliki daftar postingan dengan kompulan data pada dokumen. 3.1 Struktur pencaharian untuk kamus Dengan diberikannya index terbalik dan query, tugas pertama kita adalah untuk menentukan apakah setiap istilah query ada pada kosa kata atau, bila ada mengidentifikasi petunjuk pada postingan terkait. Sistem identifikasi kosa kata ini menggunakan struktur data klasik yang bernama kamus dan memiliki dua penyelesaian permasalahan yang besar yaitu pencampuran dan bagan pencarian. Pada pustaka struktur data, pemasukan data pada kosa kata (dalam kasus kita, istilah) kadang mengacu pada kunci. Pilihan solusi (pencamouran dan bagan pencarian) diatur oleh beberapa pertanyaan: (1) berapa banyak kunci yang sepertinya kita miliki? (2) apakah jumlah banyaknya kunci akan tetap atau berubah drastisdan pada kasus berubahnya jumlah, apakah kita sepertinya kita akan mempunyai kunci baru yang dimasukan, atau juga mendapati beberapa kunci terhapus dari kamus. (3) apa hubungan frekuensi yang tidak tentu dengan banyaknya kunci yang akan diakses? Pencampuran telah digunakan sebagai sistem indentifikasi kamus pada beberapa mesin pencari. Setiap istilah kosa kata (kunci) dicampur menjadi bilangan bulat pada tempat kosong yang menmungkinkan tidak terjadi crash. Crash dipecahkan dengan struktur bantuan yang dapat menuntut perbaikan. Diwaktu query, kita mencampur setiap istilah query secara terpisah dan mengikuti penunjuk untuk menyesuaikan postingan, memasukannya pada perhitungan logis apa saja untuk memecahkan crash pada

pencampuran. Tidak ada cara lain yang lebih mudah untuk menemukan varian kecil dari istilah query (seperti versi kata beraksen atau tidak), karena hal ini menyebabkan pencampuran menjadi sangat sulit untuk bilangan bulat. Tentunya kita tidak dapat mencari (secara cepat) semua istilah yang dimulai dengan automat, sebuah operasi yang kita butuhkan pada sesi 3.2. pada akhirnya dlam setting (seperti web), dimana jumlah kosakata terus bertambah, sebuah fungsi campuran dirancang untuk keperluan saat ini yang mungkin tidak tepat untuk beberapa tahun kedepan. Bagan pencarian mengatasi permasalahan-permasalahan ini. Sebagai contoh, bagan ini memungkinkan kita untuk menghitung semua istilah kosa kata yang dimulai dengan automat. Bagan pencarian yang paling dikenal adalah binary tree dimana setiap penghubung internal memiliki dua peranakan. Pencarian dari istilah dimulai dari akar bagan. Setiap penghubung internal (termasuk akar) mewakili sebuat binary test, berdasarkan pada keluaran yang mana pencarian memproses satu dari dua subbagan dibawah simpul. Gambar 3.1 adalah conttoh dari pencarian binary tree yang digunakan pada kamus. Efisiensi pencarian ( dengan beberapa perbandingan yang merupakan O(log M)) yang menyambung pada bagan di seimbangkan: jumlah dari istilah dibawah sub-bagan dari penyambung yang mana saja yang juga sejajar atau berbeda dengan 1. Permasalahan prisnsip disini adalah mensejajarkan kembali; saat istilah dimasukan atau dihapus dari pencarian binary tree, dibutuhkan pensejajaran kembalisehingga keseimbangan bagan akan tetap terjaga. Untuk mengurangi pensejajaran kembali, salah satu pendekatan adalah dengan membiarkan beberapa sub-bagan divawah penghubung internal untuk berbeda dengan ketetapan interval. Bagan pencari yang biasanya dipergunakan adalah B-tree sebuah bagan pencari yangmana setiap penghubung internal memiliki beberapa peranakan pada interval [a,b], dimana a dan b adalah bilangan bulat positif yang tepat; gambar 3.2 senunjukan contoh dimana a=2 dan b=4. Setiap cabang dibawah penghubung internal mewakili kembali test untuk jarak urutan simbol ketikan, seperti binary tree pada contoh digambar 3.1.

Sebuah B-tree mungkin dapat dilihat sebagai peruntuhan banyak jenjang dari binary tree menjadi satu; hal ini terutama sangat menguntungkan ketika beberapa kamus adalah tempat disk, pada kasus dimana peruntuhan ini berfungsi sebagai pengambilan terdekat test binary. Pada kasus seperti, bilangan bulat a dan b ditentukan oleh besar blok-blok disk. Sesi 3.5 berisi penunjuk latar belakang yang lebih jauh pada pencarian bagan dan B-tree. Harus dicatat bahwa, tidak seperti pencampuran, bagan pencarian menuntut simbol ketikan pada kumpulan dokumen memiliki urutan yang ditentukan; sebagai contoh, ke-26 abjad dari alphabet selalu terdaftar pada urutan tertentu mulai dari A sampai Z. Beberapa bahasa asia seperti cina tidak selalu memilik urutan yang unik, walaupun hingga kini semua bahasa (termasuk cina dan jepang) sudah mengadopsi sebuat standar urutan sistem untuk simbol ketikannya.

Gambar 3.2 A B-tree. Pada contoh berikut setiap penghubung internal memiliki 2 dan 4 peranakan. 3.2 Wildcard query Wildcard query digunakan pada situasi sebagai berikut; (1) pengguna tidak yakin ejaan dari istilah query (contoh, Sydney vs Sidney, yang berujung pada wildcard query S*dney); (2) pengguna sadar banyaknya jenis-jenis ejaan pada istilah (secara sadar) mencari dokumen yang berisi jenis-jenis apa saja (contoh; color vs colour); (3) pengguna mencari dokumen yang berisikan jenis-jenis istilah yang mungkin akan tertangkap oleh stemming, tapi tidak yakin apakah mesin pencari menggunakan stemming (contoh, judicial vs judiciary, yang berujung pada wildcard qery judicia*); atau (4) pengguna tidak yakin cara membawakan yang benar dari frase atau kata bahasa asing (contoh, query university* Stuttgart). Query seperti mon* dikenal sebagai trailing wildcard query, karena simbol * muncul hanya sekali pada akhir pangkaian pencarian. Bagan pencari pada kamus adalah cara yang nyaman untuk menangani trailing wildcard querys: kami menyebutkan sekilas generalisasi dari trailing wildcard query. Pertama, mempertimbangkan wildcard query utama, atau query dalam bentuk *mon. Mempertimbangkan pembalik B-tree pada kamus diamana satu pada masing-masing jalan akar-menuju-daun dari penulisan

B-tree untuk istilah pada kamus yang ditulis secara terbalik; dengan demikian istilah lemon akan, pada B-tree, diwakilkan dengan cara root-n-o-m-e-l. Pengerjaan B-tre terbalik kemudian memberikan nomor semua istilah R dalam kamus dengan pemberian imbuhan. Kenyataannya, penggunaan B-tree biasa dengan B-tree terbalik, kita dapat menangani masalah yang lebih umum: wildcard query dimana terdapat sebuah * simbol, seperti se*mon. Untuk melakukan hal ini kami menggunakan B-tree biasa untuk memberikan nomor pada set W dari istilah kamus dimulai dengan imbuhan se dan sebuah non-empty akhiran, kemudian B-tree pembalik memberikan nomor set R dari istilah diakhiri dengan akhiran mon. Selanjutnya, kami melakukan persimpangan W n E dari kedua set ini, untuk tiba pada set dari istilah yang dimulai dengan awalanse dan diakhiri dengan akhiran mon. Yang terakhir, kami menggunakan standar index terbalik untuk mendapatkan kembali semua dokumen yang berisi istilah apa saja pada persimpangan ini. Kita dapat dengan demikian menangani wildcard query yang berisi satu simbol * menggunakan dua B-trees yaitu, B-tree biasa dan B-tree terbalik.

3.2.1 wildcard query umum Kita sekarang mempelajari dua teknik untung menangani wildcard query umum. Kedua teknik memiliki strategi yang sama: mengutarakan qw sebagai sebuah Boolean query Q pada index yang terkonstruksi khusus, seperti jawaban untuk Q adalah set besar dari set perbendaharaan kata istilah yang cocok dengan qw. Kemudian, kami memeriksa setiap istilah pada jawaban untuk Q melawan qw.

Gambar 3.3 Sebuah bagian dari permuterm index

Mengesampingkan istilah perbendaharaan kata tersebut yang cocok dengan qw. Pada poin ini, kami mendapati kecocokan perbendaharaan kata Qw dan dapat menggunakan untuk intex standar terbalik. Permuterm Index

Index khusus pertama kita untuk wildcard query umum adalah permuterm index, sebuah bentuk dari index pembalik. Pertama, kami memperkenalkan simbol khusus $ pada set simbol ketikan, untuk menandai akhir dari istilah. Dengan demikian, istilah hello ditunjukan disini sebagai argumen istilah hello$. Selanjutnya kami menyusun permuterm index dimana setiap jenis-jenis pertukaran pada setiap istilah (diargumenkan dengan $) semua tautan ke istilah kosa kata yang asli. Gambar 3.3 memberikan sebuah contoh sebuah masukan permuterm index untuk istilah hello. Kami mengacu pada set istilah yang bertukar dalam permuterm index sebagai permuterm kosa kata. Bagaimana index ini membantu kita dalam wildcard query? Mempertimbangkan wildcard query m*n. Kuncinya adalah menukar sebuah wildcard query sehingga simbol * muncul pada akhir jaringan; dengan demikian, wildcard query yang telah ditukar menjadi n$m*. Selanjutnya, kami mengamati istilah-istilah jaringan ini dalam permuterm index, dimana pencarian n$m* (via bagan pencari) menuntun untuk pertukaran (diantara yang lainnya) istilah man dan moron. Sekarang permuterm index memungkinkan kita untuk mengidentifikasi kosa kata asli istilah untuk yang cocok dengan wildcard query, kami mengamati istilah ini dalam index terbalik standar untuk mendapatkan kembali dokumen yang cocok. Akan tetapi bagaimana dengan query seperti fi*mo*er? Pada kasus ini, kami memulai dengan penomoran istilah pada kamus yang ada pada permuterm index dari er$fi*. Tidak semua jenis istilah pada kamus memiliki jaringan mo ditengah kami menyerikng jaringan ini dengan melengkapi penomeran, memeriksa setiap calon untuk melihat apakah jaringan ini memiliki mo.

Pada contoh ini, istilah fishmonger akan bertahan dalam penyaringan tetapi tidak dengan filibuster. Kami kemudian menjalankan istilah yang bertahan dengan menggunakan standar inverted index untuk pengambilan dokumen. Salah satu kekurangan dari pemuterm index adalah kamus menjadi cukup besar, termasuk seluruh perputaran dari setiap istilah. Menyadari kedekatan interplay antara B-tree dan permuterm index diatas. Dianjurkan agar struktur mungkin harus delihat sebagai permuterm B-tree. Akan tetapi, kami mengikuti termunologi yang biasa dipakai disini untuk mnggambarkan permuterm index sejelas mungkin dari B-tee yang memingkinkan kita untuk memilih pertukaran dengan awalan yang diberikan.

3.2.2 K-gram index untuk wildcard query

Dimanapun permuterm index sederhana, hal tersebut akan menuntun pada cetusan yang dapat dipertimbangkan dari jumlah pertukaran peristilah; untuk kamus dengan istilah bahasa inggris dapat mewakili sepuluh kali lipat bagian yang bertambah. Kami sekarang akan memberikan teknik kedua yang dikenal sebagai K gram Index, untuk memproses wildcard query. Kami juga menggunakan K-gram index pada sesi 3.3.4. K-gram adalah urutan dari k simbol ketikan. Dengan demikian cas, ast, dan stl adalah semua 3-grams yang muncul pada istilah castle. Kami menggunakan karakter special $ untuk menymbangkan awal dan akhir dari istilah, jadi set penuh dari 3-grams digeneralisasi untuk castle adalah: $ca, cas, ast, stl, tle, le$. Pada K-gram index, kamus berisikan semua K-grams yang muncul pada istilah apa saja di kosakata. Setiap daftar poin postingan dari K-gram untuk semua kosa kata berisikan K-gram. Sebagai contoh, 3gram etr akan memberikan poin pada kosa kata seperti metric dan retrival. Sebuah contoh diberikan pada gambar 3.4. Bagaimana index yang demikian dapat membantu kita dengan wildcard query? Mempertimbangkan wildcard query yang kita miliki. Kami mencari dokumen dokumen yang berisikan istilah apa saja yang dimulai dengan re dan diakhiri dengan ve. Kami menjalankan Boolean query $re dan ve$. Hal ini dapat dilihat pada 3-gram index dan menghasilkan daftar istilah yang cocok seperti relive, remove, dan retrieve. Setiap istilah-istilah yang cocok ini kemudian dilihat pada index terbalik standar untuk menghasilkan dokumen yang cocok dengan query. Akan tetapi ada kesulitan dengan penggunaan K-gram index yang menuntut proses selangkah lebih jauh dalam pemprosesan. Mempertimbangkan penggunaan 3-gram index yang digambarkan untuk query red*. Mengikuti proses yang dipaparkan, kami pertama memunculkan Boolean query $re dan RED untuk 3-gram index. Proses ini kemudian ditujukan untuk mencocokan istilah seperti retired, yang bersikan penghubung dari dua 3-gram $re dan red, yang tidak cocok dengan query wildcard red* yang asli. Untuk dapat memahami ini, kami memperkenalkan step yang disebut postfiltering dimana istilah dinomorkan dengan Boolean query pada 3-gram index dengan dicek satu per satu berlawanan dengan query red*. Ini adalah contoh sederhana oprasi mencocokan jaringan sederhana dan penyebaran istilah seperti retired yang tidak cocok dengan query asli. Istilah yang bertahan kemudian dicari pada index terbalik standar seperti biasa. Kami telah melihat bahwa wildcard query dapat menghasilkan pada banyak istilah yang sedang dinomorkan, setiap istilah itu kemudian menjadi istilah tunggal query pada index terbalik standar. Mesin pencarian juga memungkinkan kombinasi wildcard query menggunakan pengoprasi bolean, sebagai contoh, re* AND fe*ri. Apakah arti yang tepat untuk query tersebut? Karena setiap query dari wildcard query berubah menjadi query dengan istilah tunggal tanpa imbuhan, penterjemahan yang tepat dari contoh yang telah kami hilangkan imbuhan dari imbuhannya; kami mencari semua dokumen yang berisikan istilah apa saja dengan re*d dan term apa saja yang cocok dengan fe*ri. Bahkan tanpa kombinasi Boolean dari wildcard query, proses dari wildcard query dapat menjadi cukup mahal, karena penambahan identifikasi pada index special, penyaringan, dan yang terakhir adalah index terbalik standar. Sebuah mesin pencari mungkin dapat mendukung secara fungsional, tapi kebanyakan kemampuannya tersembunyi dibelakang interface (interface query yang sudah berkembang) yang kebanyakan tidak pernah digunakan oleh pengguna. Memperlihatkan secara fungsional hal tersebut

pada interface pencarian kadang membuat pengguna memintanya walaupun mereka tidak membutuhkannya (dikatakan, dengan mengetik imbuhan query mereka dengan a*), menaikan muatan proses pada mesin pencari.

Latihan 3.1 Pada permuterm index, setiap poin istilah kosakata permuterm pada istilah kosakata asli dari tempat asalnya. Berapa banyak istilah kosakata asli yang bisa masuk ke daftar postingan istilah kosa kata permuterm? Latihan 3.2 Tulislah pemasukan pada kamus index permuterm yang dapat digeneralisasi dengan istilah mama. Latihan 3.3 Bila kalian ingin mencari s*ng pada index wildcard permuterm, kunci apa yang dapat dipakai? Latihan 3.4 Mengacu pada gambar 3.4; ditunjukan pada keterangan yang istilah kosakata pada postingan yang secara leksikografi diurut. Mengapa pengurutan ini berguna? Latihan 3.5 Membpertimbangkan kembali query fi*mo*er dari sesi 3.2.1 apa yang query Boolean pada index bigram akan digeneralisasi untuk query ini? Dapatkah kalian pikirkan sebuah istilah yang cocok dengan query permuterm pada sesi 3.2.1, tetapi apakah query Boolean ini memuaskan? Latihan 3.6 berikan sebuah contoh dari kalimat yang cocok secara palsudengan query wildcard mon*h bila pencarian digunakan secara sederhana untuk penghubung bigram. 3.3 Koreksi Ejaan Kami kemudian melihat permasalahan koreksi pada query yang salah. Secara cepat, kami mungkin menginginkan untuk mendapatkan kembali dokumen yang berisikan istilah carrot ketika pengguna mengetik query carrot. Google melaporkan (www.google.com/jobs/britney.html) bahwa hal ini dianggap sebagai ejaan yang salah dari query Britney spears: britian spears, britneys spears, brandy spears, dan prittany spears. Kami melihat dua langkah untuk menyelesaikan permsalahan ni: yang pertama berdasarkan dari edit distance dan yang kedua berdasarkan k-gram overlap. Sebelum sampai pada detail algoritmik dari metode-metode ini, kami pertama meninjau bagaimana mesin pencari menyediakan pilihan ejaan sebagai bagian dari pengalaman pengguna. 3.3.1 Pelaksanaan perbaikan ejaan Ada dua prinsip dasar yang mendasari kebanyakan perbaikan ejaan algoritmik. 1. Dari kebanyakan perbaikan ejaan alternative untuk kesalahan ejaan query, pilih yang paling dekat. Permintaan ini yang kita miliki gagasan dari kedekatan andara kedua pasang query. Kami mengembangkan pengukuran kedekatan ini di sesi 3.3.3.

2. Ketika dua query yang telah dieja dengan benar terhubung (atau hamper terhubung), pilihlah satu yang lebih umum. Sebagai contoh, kedua grunt dan grant sepertinya sama-sama masuk akal sebagai perbaikan untuk grnt. Lalu algoritma seharusnya memilih grun dang rant sebagai perbaikan yang lebih umum. Gagasan paling sederhana dari yang lebih umum adalah dengan mempertimbangkan jumlah kemunculan dari istilah dalam kumpulan; dengan demikian bila grunt muncul lebuh sering dari grant, maka grunt akan dipilih sebagai perbaikannya. Sebuah perbedaan gagasan dari yang lebih umum digunakan pada banyak mesin pencari terutama pada web. Idenya adalah untuk menggunakan perbaikan yang paling umum diantara query yang lebih umum diketik dari pengguna yang lain. Idenya disini adalah bila grunt diketik sebagai query lebih sering dari grant, maka sepertinya pengguna yang mengetik grnt ingin mengetik lebih kepada query grunt. Dimulai pada sesi 3.3.3, kami menggambarkan gagasan dari kedekatan diantara query dan juga keefisienannya dalam komputerisasi. Perbaikan ejaan algoritma dibangun dari kedekatan komputerisasi ini; fungsinya adalah untuk menyampaikan kepada perngguna satu dari cara-cara berikut:

1. Pada query carot selalu mendapatkan dokumen yang berisi carot dan ejaan yang diperbaiki verso carot, termasuk carrot dan tarot. 2. Seperti pada nomor 1 diatas, tetapi hanya query dengan istilah carot yang tidak pada kamus. 3. Seperti nomor 1 diatas, tetapi hanya ketika query asli kembali lebih sedikit dari jumlah dokumen saat ini (katakanlah kurang dari 5 dokumen) 4. Ketika query asli kembali lebih sedikit dari jumlah dokumen saat ini, interface pencari akan menampilkan usulan ejaan kepada pengguna terakhir; usulan ini berisi query ejaan yang telah diperbaiki. Dengan demikian mesin pencari mungkin merespon kepada pengguna: maksud anda carrot?

3.2 Bentuk dari perbaikan ejaan Kami berfokus pada dua bentuk perbaikan spesifik yang mungkin mengacu pada perbaikan isolatedterm dan perbaikan context-sensitive. Pada perbaikan isolated-term, kita berusaha untuk memperbaiki query tunggal pada saat itu walaupun ketika kami memiliki multiple-term query. Contoh carrot menunjukan jenis perbaikan ini. Seperti kegagalan perbaikan isolated-term untuk mendeteksi, secara cepat query flew from heathrow berisi kesalahan eja pada istilah from karena setiap term pada query diejakan dengan benar pada isolasi. Kita memulai dengan memeriksa dua teknik untuk menunjukan perbaikan isolated-term: jarang perbaikan dan tumpang tindih K-gram. Kami kemudian mengolah untuk mengkontekskan perbaikan sensitif. 3.3 Jarak edit

Telah diberikan dua jaringan simbol ketikan s1 dan s2, jarak edit antara istilah adalah jumlah minimum dari operasi perbaikan yang dibutuhkan untuk mengubah s1 menjadi s2. Kebanyakan biasanya, oprasi perbaikan diperbolehkan untuk tujuan ini adalah (i) masukan simbol ketikan kedalam jaring, (ii) hapus semua simbol ketikan dari jaring, dan (iii) gantikan sebuah simbol ketikan dengan simbol ketikan yang lain; untuk pengerjaan ini, jarak edit kadang dikenal sebagai Levenshtein distance. Sebagai contoh, jarak edit antara cat dan dog adalah tiga. Kenyataannya, gagasan jarak perbaikan dapat digeneralisasi untuk memperbolehkan berat yang berbeda untuk oprasi perbaikan yang berbeda; secara cepat berat yang lebih tinggi mungkin bisa saja ditempatkan pada penempatan kembali simbol ketikan s dengan simbol ketikan p, daripada menempatkan kembali itu dengan simbol ketikan a 9huruf yang lebih dekat dengan s pada keyboard). Pengaturan berat dengan cara ini berganting pada kemiripan huruf yang mengganti satu dengan lainnya yang sangan efektif pada latihan (lihat sesi 3.4 untuk masalah terpisah dari persamaan simbol bunyi). Akan tetapi pengingat dari perlakuan disini terfokus pada masalah dimana semua oprasi perbaikan memiliki berat yang sama. Sudah diketahui dengan baik bagaimana mengkomputerisasi (pemberat) perbaikan jarak antara dua jaring dalam waktu O(|s1| |s2|), dimana |si | menunjikan panjang dari jaring si. Idenya adalah menggunakan program algoritme dinamis pada gambar 3.5, dimana simbol bunyi dari s1 dan s2 diberikan pada bentuk susunan. Algoritme mengisi (penghubung) masukan pada matriks m yang kedua dimensinya sama dengan panjang dari dua jaring yang jarak perbaikannya sedang dihitung; (I, J) masukan dari matriks memegang (setelah algoritm di laksanakan) jarak edit antara jaring yang berisi i simbol ketikan pertama dan j simbol ketikan dari s2. Langkah pusat pemprograman dinamis digambarkan pada baris 8-10 dari gambar 3.5, dimana ketiga kuantitas yang kecil ditulis untuk menggantikan simbol ketikan a pada s1, memasukan simbol ketikan pada s, dan memasukan simbol ketikan pada s2.
Jarak perbaikan (s1, s2) 1 int m[|s1|, |s2|] = 0 2 untuk i 1 menjadi |s1| 3 dilakukan m[i, 0] = i 4 untuk j 1 menjadi |s2| 5 dilakukann m[0, j] = j 6 untuk i 1 to |s1| 7 dilakukan agar j 1 menjadi |s2| 8 dilakukan m[i, j] = min{m[i 1, j 1] + if (s1[i] = s2[ j]) then 0 else 1fi, 9 m[i 1, j] + 1, 10 m[i, j 1] + 1} 11 kembali m[|s1|, |s2|]
gambar 3.5 algoritma pemprograman dinamis dari perhitungan jarak perbaikan antara rentetan-rentetan s1

Gambar 3.6 senunjukan sebuah contoh perhitungan jarak Levensthein dari gambar 3.5. Bentuk tanda kurung [I, j] memiliki 4 format masukan sebagai a 2 x 2 tanta kurung. Masukan sebelah kanan yang lebih bawah adalah min dari ketiga lainnya, penulisan untuk langkah pemprograman dinamis utama pada gambar 3.5. Ketiga masukan yang lainnya adalah ketiga masukan m[i 1, j 1] + 0 atau 1 tergantung dari
apakah s1[i] = s2[ j], m[i 1, j] +1 dan m[i, j 1] + 1. Kurungan dengan nomor pada cetak miring menggambarkan langkah dengan yang kami tentukan dengan jarak Levenshtein.

Gambar 3.6 Contoh perhitungan jarak Levenshtein. Kurung 2 x 2 pada masukan [i, j] dari tabel menunjukan tiga nomor minimum yang mengkasilkan keempat. Kurungan yang dicetak miring menentukan jarak edit pada contoh ini. Permasalahan perbaikan ejaan bagaimanapun juga menuntut lebih dari apa yang jarak perbaikan hitung; diberikan a set S dari jaring (penulisan untuk istilah kosa kata) dan jaring query q, kami mencari jaring pada V atau setidaknya jarak edit dari q. Kami mungin melihat hal ini sebagai permasalahan decoding, dimana codewords (jaring pada V) diberikan didepan. Cara terjelas untuk melakukan hal ini adalah dengan menghitung jarak perbaikan dari q ke setiap string V, sebelum mencari jaring dari jarak edit minimum. Pencarian yang melelahkan ini sulit secara ordinat. Ditunjukan, beberapa heuristik digunakan pada latihan untuk pengembalian istilah kosakata secara efisien sepertinya untuk mendapatkan jarak edit pendek dengan istilah query. Yang paling sederhana seperti heuristic adalah untuk menutup pencarian pada istilah kamus dimulai dengan huruf yang sama sebagai jaring query; Harapannya adalah kesalahan ejaan tersebut tidak muncul pada simbol ketikan pertama dari query. Varian yang lebih rumit dari heuristic ini adalah dengan menggunakan sebuah versi dari permuterm index, dimana kita menghilangkan kata terakhir dari simbol $. Mempertimbangkan set dari semua pertukaran dari jaring query q. Untuk setiap perputaran r dari set ini, kami melewati B-tree ke index permuterm, dengan pengembalian dari semua istilah kamus yang tidak mengalami pertukaran dimulai dengan r. Secara cepat, jika q adalah mase dan kami mempertimbangkan perputaran r=sema, kami akan mengembalikan istilah kamus seperti semantic dan semaphore, yang tidak memiliki jarak kecil untuk q. Sayangnya, kami akan kehilangan istilah pada kamus yang bersangkutan seperti mare dan mane. Untuk menunjukan hal ini, kami memperbaiki skelma pertukaran ini; untuk setiap pertukaran kami menghilangkan imbuhan dari simbol ketikan l sebelum menghasilkan B-tree traversal. Hal ini untuk memastikan setiap istilah pada set R dari istilah yang dikembalikan dari kamus termasuk sebuah subjaring panjang biasa dengan q. Nilai dari l dapat saja bergantung pada panjang dari q. kita mungkin dapat memasangnya pada konstan yang ditentukan seperti 2.

3.3.4 k-Gram indeks untuk koreksi ejaan Untuk lebih membatasi set istilah kosakata yang kita hitung jarak editnya pada istilah query. kami sekarang menunjukkan bagaimana untuk memanggil indeks k-gram dari sesi 3.2.2 (halaman 50) untuk membantu dengan mengambil istilah kosakata dengan jarak perbaikan pendek pada query q. Sekali kami mengambil istilah tersebut, kami kemudian akan dapat menemukan satu atao setidaknya jarak perbaikan dari q. Faktanya, kami menggunakan indeks K-gram untuk mengembalikan kosakata yamn memiliki K-gram secara umum dengan query. Kami berargumen bahwa, untuk definisi yang masuk akal dari banyak kgram yang sering proses pengembalian adalah esensial sehingga dari postingan pemindaian tunggal untuk k-gram dalam jaring query q. 2-gram (atau bigram) index pada gambar 3.7 menunjukan (sejumlah) posting untuk tiga bigram pada query bord. Semestinya kami ingin mengembalikan istilah kosakata yang berisikan setidaknya dua dari tiga bigram ini. Pemindaian tunggal dari postingan (yang lebih banyak pada bab1) akan memperbolehkan kita menomorkan semua seperti istilah; pada contoh digambar 3.7, kami akan menomorkan abroad,boardroom, dan border.

Aplikasi yang langsung ini dari pemindai posting intersesi linier sesegera mungkin mengungkapkan kelemahan dari kebutuhan kecocokan istilah kosa kata secara sederhana untuk mengisi nomor k-gram yang telah ditetapkan dari query q: istilah seperti boardroom, perbaikan yang tidak masuk akal dari bord, yang disebutkan. Hasilnya, kami membutuhkan pengukuran yang lebih bernuansa dari tumpang tindih pada k-gram antara istilah kosakata dan q. Pemindaian intersesi linier dapat diadaptasi ketika pengukuran yang tumpang tindih adalah koefisien jaccard untuk mengukur tumpang tindih antara dua set A dan B, diartikan untuk menjadi |A B|/|A B|. Kedua set yang kami pertimbangkan adalah set dari k-gram pada query q, dan set dari k-gram pada istilah kosakata. Ketika pemindaian terproses, kami memprosesnya dari dari satu istilah kosakata t ke yang berikutnya, perhitungan pada lajur koefisien jaccard antara q dan t. Bila koefisien melebihi ambang batas yang sekarang, kami menambah t pada keluaran; bila tidak, kami berpindah pada istilah berikutnya pada postingan. Untuk menghitung Koefisien Jaccard, kami butuh set dari k-gram dalam q dan t. Krena kami memindai postingan untuk semua K-gram pada q, kami langsung mendapatkan k-gram ini. Bagaimana dengan k-gram dari t? secara prinsip, cami dapat menyebutkan satu demi satupda lajur dari t. Praktisnya, ini tidak hanya lamban tapi juga tidak layak; pada semua kemungkinan, masukan postingan

itu sendiri tidak hanya terdiri dari jaring utuh t melainkan juga beberapa encoing dari t. Obervasi yang penting adalah bahwa untuk menghitung koefisien jaccard, kami hanya membutuhkan panjang dari rentetan t. untuk melihat hal ini, mari melihat kembali contoh pada gambar 3.7 dan pertimbangan poin ketika pemindai postingan untuk query q = bord mencapai istilah t = boardroom. Kami tahu bahwa dua bigram cocok. Bila postingan disimpan pada bigram perhitungan (prahitungan) dalam boardroom (yaotu, 8), kami memiliki semua informasi yang dibutuhkan untuk menghitung koefisien jaccard menjadi 2/(8+3-2); pengurut ini didapatkan dari sejumlah hit postingan (2, dari bo dan rd); penamaan adalah jumlah dari bigram pada bord dan boardroom, lebih sedikit dari jumlah hit postingan. Kami dapat mengganti koefisien jaccard dengan perhitungan lain yang memungkinkan efisiensi pada lajur erhitungan pada pemindai postingan. Bagaimana kami menggunakan hal ini untuk perbaikan ejaan? Salah satu metode yang memiliki beberapa dukungan empiris adalah dengan pertama menggunakan indeks k-gram untuk mengurutkan sejumlah calon istilah kosakata yang memiliki potensi koreksi dari q. Kami kemudian menghitung jarak perbaikan dari q ketiap istilah pada set ini, memilih istilah dari set dengan jarak perbaikan kecil untuk q. 3.3.3 Konteks-sensitif koreksi ejaan

Perbaikan isolated-term akan gagal dalam perbaikan kesalahan ketikan seperti flew pada hearthrow, dimana semua tiga istilah query dieja dengan benar. Ketika sebuah frasa seperti pengambilan beberapa dokumen ini. Mesin pencari mungkin akan menawarkan query yang benar dari flew pada heathrow. Cara yang paling mudah untuk melakukan hal ini untuk mengurut perbaikan dari tiap tiga istilah query itu (dengan menggunakan metode yang diberikan pada sesi 3.3.4) walaupun setiap query dieja dengan benar, lalu mencoba pensubtitusian dari setiap perbaikan pada frase. Sebagai contoh flew dari heathrow, kami mengurutkan frasa seperti fled dari heathrow dan flew fore heathrow. Untuk setiap frasa pengganti, mesin pencari menjalankan query dan menentukan urutan hasil yang cocok. Pengurutan ini dapat menjadi sulit bila kita menemukan banyak perbaikan dari istilah sendiri; kami dapat mengurutkan banyak kombinasi dari alternative. Beberapa heuristis digunakan untuk memangkas ruang ini. Pada contoh ini, seperti yang dijabarkan alternative untuk flew dan form, kita hanya menahan kombinasi yang paling seringpada kumpulan atau pada log query yang mana berisikan query sebelumnya oleh pengguna. Sebagai contoh, kami dapat menahan flew sebagai alternative untuk mencoba dan memperluasnya menjadi koreksi query three-term, akan tetapi mungkin bukan fled fore atau frea from. Pada contoh ini, biword fled fore sepertinya jarang bila dibandingkan dengan biword flew from. Lalu, kami hanya mencoba untuk memperluas daftar dari biword terbanyak (seperti flew from), untuk perbaikan dari heathrow. Sebagai alternative untuk penggunaan statistik byword pada kumpulan data, kami mungkin menggunakan log dari query yang dikeluarkan oleh pengguna; hal ini tentu saja termasuk query dengan ejaan yang salah. Latihan 3.7 Bila [si] menunjukan panjang rangkaian si, tunjukan bila jarak perbaikan antara s1 dan s2 tidak pernah melebihi {[s1], [s2]}. Latihan 3.8 Hitunglah jarak perbaikan antara paris dan alice. Tulislah susunan 5 x 5 dari jarak antara semua awalan sebagai perhitungan dengan algoritma pada gambar 3.5.

Latihan 3.9 Tulislah pseudocode yang menunjukan rincian dari perhitungan pada koefisien lajur jaccard sambil memindai postingan dari k-gram index, seperti yang telah disebutkan pada halaman 56. Latihan 3.10 hitung koefisien jaccard antara query bord dan tiap istilah pada gambar 3.7 yang berisi bigram or. Latihan 3.11 pertimbangkan query four-term catched in the rye dan misalkan setiap query memiliki lima istilah alternative yang diusulkan dengan koreksi isolated-term. Berapa banyak frase perbaikan yang mungkin harus kami pertimbangkan bila tidak kami pangkas ruang dari frase koreksinya, tetapi malah mencoba keenam jenis untuk masing-masing istilah? Latihan 3.12 untuk setiap awalan query- catched, catched in, dan catchet in the kami memiliki beberapa imbuhan pengganti yang muncul dari tiap istilah dan alternatifnya. Apabila kami menyisihkan hanya sepuluh saja dari imbuhan pengganti ini, seperti yang telah diukur dengan banyaknya kemunculannya pada kumpulan data. Kami menghilangkan sisanya dari pertimbangan untuk pemanjangan pada imbukhan yang lebih panjang: dengan demikian, bila batched in tidak merupakan satu dari kesepuluh yang dari yang kedua paling sering muncul pada istilah di kumpulan data, kami tidak mempertimbangkan adanya pemanjangan dari batched in sebagai kemungkinan utama untuk perbaikan dari catched in the rye. Berapa banyak imbuhan pengganti yang harus kita hilangkan pada setiap fase? Latihan 3.13 Apakah kita dijamin bahwa penyisaan dan pemanjangan hanya sepuluh dari awalan pengganti yang paling sering muncul dari catched in akan mengantarkan kita kepada satu dari sepuluh awalan pengganti yang paling umum dari catched in the?

3.4 Perbaikan Fonetis Teknik terakhir kita untuk pengambilan yang dapat ditoleransi berkaitan dengan perbaikan fonetis: kesalahan eja yang muncul karena pengguna mengetik query yang terdengar sama tengan istilah target. Alogrima yang seperti ini bisa digunakan terutama untuk mencari nama orang. Ide utamanya disini adalah menimbulkan, pada setiap istilah , sebuah campuran fonetis sehingga istilah yang tedengar mirip bercampur pada nilai yang sama. Idenya berutang pada yang asli untuk bekerja di departemen polisi internasional dari abat ke-20, mencari nama yang cocok dari buronan walaupun namanya dieja secara berbeda negara yang berbeda. Hal ini terutama digunakan untuk memperbaiki kesalahan eja secara fonetis pada benda yang tepat. Algoritma untuk percampuran fonetis biasanya banyak dikenal sebagai soundex algoritma. Akan tetapi, ada soundex alogaritma asli dengan varian yang banyak terbentuk pada skema berikut. 1. Ubah setiap istilah menjadi terindeks atas empat simbol ketikan yang telah dikurangi. Bangun sebuah indeks terbalik dari bentuk yang mengalami pengurangan menjadi intilah asli; sebut ini sebagai indeks soundex. 2. Lakukan hal yang sama dengan istilah query. 3. Ketika query memangil soundex yang cocok, carilah indeks soundeks ini/ Variasi pada soundex algoritma yang berbeda harus dilakukan dengan pengkonversian dari istilah untuk empat bentuk simbol ketikan. Konversi yang paling sering digunakan dihasilkan pada empat kode simbol

ketikan, dengan simbol ketikan pertama sebagai sebuah huruf dari alphabet dan ketiga lainnya menjadi digit antara 0 dan 9. 1. Sisakan huruf pertama pada istilah 2. Ubah smua kemunculan dengan kata berikut menjadi 0 (nol): A,E,I,O,U,H,W, dan Y. 3. Ubahlah huruf berikut ini menjadi digit: B,F,P,V menjadi 1; C,G,J,K,Q,S,X,Z menjadi 2; D,T menjadi 3; L menjadi 4; M,N menjadi 5; dan R menjadi 6. 4. Hilangkan secara berulang satu dari setiap pasang digit berurut yang sama. 5. Hilangkan semua nol dari hasil rangkaian. Isi hasil rangkaian dengan nol yang mengikuti dan kembalikan satu dari empat posisi, yang akan terdiri dari huruf dimulai dengan tiga digit. Sebagai contoh dari pemetaan soundex, pemetaan Hermann untuk H655. Diberikan sebuah query (katakanlah herman), kami menghitung soundex kodenya dari indeks soundex, sebelum menjalankan hasil query pada indeks stantar terbalik. Algoritma ini menyisakan beberapa observasi: (1) huruf hidup dilihat sebagai persimpangan pada nama yang disalin; (2) huruf mati dengan suara yang mirip (contoh D dan T) ditempatkan pada kelas yang sama derajatnya. Hal ini menuntun pada nama-nama terkait yang kadang memiliki kode soundex yang sama. Walaupun aturan ini bekerja untuk beberapa kasus, terutama pada bahasa di eropa, aturan ini cenderung menjadi sistem penulisan yang dipenden. Sebagai contoh, Nama orang cina dapat ditulis di Wade-Giles atau transkripsi Pinyin. Walaupun soundex bekerja pada beberapaperbedaan dari dua transkripsi misalnya, pemetaan kedua Wade-Gileshs dan Pinyin x menjadi 2 hal ini gagal pada beberapa kasus sebagai contoh, Wade giles j dan Pinyin r dipetakan secara berbeda. Latihan 3.14 temukan dua kata benda yang tepat dengan ejaan yang berbeda yang kode soundexnya sama. Latihan 3.15 temukan dua kata benda yang tepat dengan kemiripan fonetis yang kode soundexnya berbeda. 3.5 Pustaka dan Bacaan lebih lanjut Knuth (1997) adalah sumber yang dapat diandalkan pada bagan pencarian, termasuk B-tree dan penggunaannya pada pencarian melalui kamus. Garfield (1976) memberikan satu dari kompetensi pertama dengan gambaran lengkap dari indeks permuterm. Ferragina dan Venturini (2007) memberikan pendekatan untuk menyampaikan kemunculan ruang pada indeks permuterm. Satu dari perlakuan formal awal atas hubungan ejaan dijelaskan pada Damerau (1964). Gagasan dari jarak edit yang tadi kta gunakan dari Levenshtein (1964) dan algoritma gambar 3.5 oleh Wagner dan Fischer (1974). Peterson (1980) dan Kukich (1992) mengembangkan varian dari metode berdasarkan pada jarak perbaikan, berujung pada penelitian detail empiris beberapa metode oleh Zobel dan Dart (1995), dimana menunjukan bahwa pengindeksan k-gram sangat efektif untuk menemukan calon ketidakcocokan, tetapi harus dikombinasikan dengan teknik yang lebih terurai dengan baikseperti jarak perbaikan untuk menentukan kesalahan eja terbanyak. Gusfield (1997) adalah referensi standar untuk rangkaian algoritma seperti jarak edit.

Model kemungkinan (model saluran bising) untuk koreksi ejaan dimulai oleh Kernighan dan kawan (1990) dan dikembangkan lebih lanjut oleh Brill dan Moore (2000) dan Toutanova dan Moore (2002). Pada model ini, query yang mengalami kesalahan eja dilihat sebagai kemungkinan rusak dari quey yang benar. Mereka memiliki dasar matematis yang mirip dengan metode model bahasa yang dibawakan pada bab 12, dan juga menyediakan jalan untuk penggabungan kemiripan fonetis, kedekatan dengan keyboard, dan data dari kesalahan ejaan pengguna terkini. Banyak yang menghubungkan mereka dengan pendekatan state-of-the-art. Cucerzan dan Brill (2004) menunjukan bagaimana pekerjaan ini dapat diperluas untuk mempelajari model perbaikan ejaan berdasarkan reformulasi query pada log mesin pencari. Soundeks algoritma dilengkapi untuk Margaret K. Odell dan Robert C. Russelli (dari hak paten U.S pada tahun 1918 dan 1922); versi yang digambarkan disini digambar oleh Bourne dan Ford (1961). Zobel dan Dart (1996) pemeriksaan variasi fonetis yang cocok dengan algoritma, Temuan bahwa varian dari soundex algoritma bekerja dengan buruk pada koreksi ejaan biasa, tetapi algoritma lainya yang didasari oleh kemiripan fonetis dari pengucapan istilah bekerja dengan baik.

4 Konstruksi Indeks
Pada bab ini kami mengamati bagaimana mengkonstruksi indeks terbalik. Wami menyebut proses ini dengan konstruksi indeks atau indexing; sebuah proses atau mesin yang menjalankanya sebagai indexer. Rancangan indexing algoritma diatur oleh kendala hardware. Kami olehkarena itu memulai bab ini dengan tinjauan kembali dari dasar hardware computer yang relevan untuk indexing. Kami kemudian memperkenalkan indexing hambatan berdasarkan jenis (sesi 4.2), sebuah mesin tunggal algoritma yang dirancang untuk pengmpulan statis yang bisa dilihat sebagai versi yang lebih berskala dari indexing hambatan berdasarkan jenis yang kami sampaikan pada bab 1. Sesi 4.3 menggambarkan jalan masuk tunggal pada memori indexing, sebuah algoritma yang bahkan memiliki penskalaan properti yang lebih baik karena tidak memiliki kosakata di memori. Untuk kumpulan yang sangat besar seperti web, indexing harus disebarkan pada kelompok dengan ratusan atau ribuan mesin. Kami membahas hal ini pada sesi 4.4. Kumpulan dengan perubahan frekuensi membutuhkan dynamic indexing yang telah diperkenalkan pada sesi 4.5 sehingga perubahannya pada kumpulan akan segera ditunjukan pada indeks. Akhirnya, kami mengulas beberapa permasalahan rumit yang dapat muncul pada indexing seperti masalah keamanan dan indeks untuk pengambilan yang diperingkat pada sesi 4.6. Konstruksi indeks berhubungan dengan beberapa topic yang dicakup dalam beberapa bab. Pengindeks membutuhkan text mentah, namun dokumen disandi dengan beberapa cara (lihat bab 2). Pengideks memadatkan dan mengurai file menengah dan indeks akhir (lihat bab 5). Pada web pencari, dokumen tidak pada sistem file lokal, akan tetapi harus dijelajahi atau dirangkak (lihat bab 20). Pada perusahaan pencari, kebanyakan dokumen dienkapsulasi dalam sistem manajemen konten yang verlainan, aplikasi e-mail, dan database. Kami memberikan bebeerapa contoh di sesi 4.7. Walaupun kebanyakan dari aplikasi ini dapat diakses via http, native Application Program Interfaces (APIs) biasanya lebih efisien. Pembaca seharusnya lebih waspada bahwa membangun subsistem yang menyediakan tekt mentah untuk proses indexing dapat masuk sendiri sebagai permasalahan yang menantang. Tabel 4.1 tipikal sistem parameter pada tahun 2007. Waktu pencarian adalah waktu yang dibutuhkan untuk posisi disk head pada posisi yang baru. Transfer waktu per nyte adalah kecepatan dari transfer dari disk pada memori ketika headnya ada pada posisi yang tepat.

4.1 Dasar-dasar hardware

Ketika membangun sebuah sistem pengenbalian informasi (IR), banyak keputusan didasarkan pada karakteristik dari hardware computer yang sistemnya berjalan. Kami dengan demikian memulai bab ini dengan tinjauan yang jelas dari hardware computer. Tipikal karakteristik performa dari sistem pada 2007 diperlihatkan pada tabel 4.1. Sebuah daftar dasar hardware yang kita butuhkan pada buku ini untuk mendorong rancangan sistem IR berikut. Akses ke data pada memori lebih cepat daripada akses ke data pada disk. Dibutuhkan beberapa siklus waktu (mungkin 5 x 10-9 detik) untuk mengakses sebuah byte pada memori, akan tetapi jauh lebih lama untuk mentransfernya dari disk (sekitar 5 x 10-8 detik). Karenanya, kami ingin untuk menyimpan sebanyak mungkin data pada memori, terutama datayang kami buthkan untuk terus kami akses. Kami menyebut teknik penyimpanan data yang sudah diakses pada disk di memori untama dengan sebutan caching. Ketika melakukan disk read atau write, dibutuhkan sejenak untuk disk head berpindah ke bagian disk dimana data terletak. Kali ini disebut sebagai seek time dan hal ini sekitar 5ms untuk tipikal disk. Tidak ada data yang ditransfer ketika pencarian. Untuk memaksimalkan kecepatan transfer, potongan dari data yang akan dibaca bersama harus disimpan secara terus-menerus pada disk. Sebagai contoh, Menggunakan nomor pada tabel 4.1 mungkin akan menyita 0.2 detik untuk mentransfer 10 megabytes (MB) dari disk ke memori bila diatur sebagai satu potongan, namun akan lebih dari 0.2 +100 x (5 x 10-3) = 0.7 detik bila disimpan pada 100 potongan yang tidak berdekatan karena kami butuh memindahkan disk head sebanyak lebih dari 100 kali. Sistem operasi biasanya membaca dan menulis seluruh blok. Dengan edmikian, membaca sebuah byte dari disk dapat menyita waktu sebanyak membaca seluruh blok. Besar Blok dari 8, 16, 32, dan 64 kilobytes (KB) adalah biasa. Kami menyebut bagian dari memori utama dimana blok sedang dibaca atau ditulis disimpan dengan sebutan buffer. Transfer data dari disk ke memori dilakukan oleh sistem bus, buakan oleh prosessor. Hal ini berarti bahwa prossesor tersedia untuk memproses data ketika disk I/O. Kami memanfaatkan hal ini untuk mempercepat transfer data dengan menyimpan data yang dipadatkan pada disk. Asumsikan sebuah penguraian algoritma yang efektif, total waktu waktu yang digunakan untuk membaca dan kemudian penguraikan data yang telah dipadatkan biasanya kurang dari membaca data yang belum dipadatkan. Melayani penggunaan sistem IR khususnya memiliki beberapa gigabytes (GB) dari memori utama, kadang sepuluh dari GB. Ruang disk yang tersedia adalah beberapa perintah dari besaran yang diperluas.

4.2 Indexing terhambat sort-based Langkah dasar pada pembuatan nonposisional index digambarkan pada gambar 1.4 (halaman 8). Kami pertama membuat jalan menuju perakitan kumpulan semua pasang istilah-docID. Kami kemudian menyusun pasangan itu dengan istilah seperti kunci dominan dan docID sebagai kunci kedua. Akhirnya, kami menyusun docID untuk setiap istilah kedalam daftar postingan dan perhitungan statistic seperti istilah dan drekuensi dokumen. Untuk kumpulan kecil, semua ini depat

dilakukan pada memori. Pada bab ini, kami menggambarkan metode untuk koleksi luas yang membutuhkan penggunaan penyimpanan kedua. Unjtuk membuat konstruksi indeks lebih efisien, kami mewakili istilah sebagai termIDs (bukan rangkaian yang kita lakukan pada gambar 1.4), dimana setiap termed adalah serial nomor yang unik. Kami dapat membuat pemetaanya dari istilah untuk termed pada lajur ketika kita memproses kumpulan; atau, pada pendekatan dua jalan, kami menyusun kosakata dalam jalan pertama dan membentuk indeks terbalik pada jalan kedua. Konstruksi algoritma indeks yang dijelaskan pada bab ini semuanya menggunakan jalan tunggal ke data. Sesi 4.7 memberikan acuan untuk banyak jalan algoritma yang lebih baik pada beberapa aplikasi, seperti ketika ruang disk terhalau. Kami bekerja dengan kumpulan reuters-RCV1 sebagai kumpulan model pada bab ini, sebuah kumpulan dengan kasarnya 1 GB text. Terdiri dari 800.000 dokumen yang dikirim pada Reuters newswire pada periode 1 tahun antara 20 agustus 1996 dan 19 Agustus 1997. Sebuah dokumen khas yang diperlihatkan pada gambar 4.1, tapi emncatat bahwa kami tidak mempedulikan informasi multimedia seperti gambar pada buku ini dan hanya mempertimbangkan teks. Reuters-RCV1 mencakup topik internasional yang luas, termasuk politik, bisnis, olahraga, dan (seperti pada contoh ini) sains. Beberapa kunci statistic dari koleksi ditunjukan pada tabel 4.2 Reuters-RCV1 memiliki 100 juta token. Kumpulan semua pasang termed-docID dari kumpulan menggunakan 4 byte setiap dari termed dan doc ID oleh karenanya dibutuhkan 0,8 GB penyimpanan. Kumpulan khusus masa kini kadang satu atau dua perintah dari besaran yang lebih besar dari Reuters-RCV1. Kalian dapat dengan mudah melihat bagaimana kumpulan seperti itu membanjiri perhitungan yang bahkan lebih besar jika kami mencoba menyusun pasangan termeddocID mereka pada memori. Jika ukuran dari memori yang tersedia dari file sedang selama konstruksi indeks dalam faktor kecil dari memori yang tersedia, maka teknik pemadatan yang diperkenalkan pada bab 5 dapat membantu; akan tetapi file postingan dari kumpulan yang banyak tidak muat pada memori bahkan setelah kompresi.

Dengan kekurangan memori utama, kami menggunakan external sorting algoritma, yang digunakan pada disk. Untuk kecepatan yang bisa diterima, hal utama yang dibutuhkan dari algoritma adalah apakah itu dapat diperkecil jumlahnya atau disk apa saja mencari ketika menyusun disk berikutnya yang bertugas untuk membaca lebih cepat dari mencari seperti yang telah dijelaskan pada sesi 4.1. salah satu solusinya adalah dengan algoritma Indexing terhambat sort-based atau BSBI pada gambar 4.2 BSBI (i) bagi kumpulan menjadi bagian dengan besar yangs ama, (ii) atur pasangan termed-docID dari tiap bagian di memori, (iii) simpan hasil menengah yang telah disusun pada disk, dan (iv) satukan semua hasil menengah pada indeks final. algoritma memparsing dokumen menjadi pasangan termID-docID dan mengakumulasinya pada memuri sampai sebuah blok dari ukuran yang ditentukan penuh (PARSENEXTBLOCK pada gambar 4.2) kami memilih ukuran blok agar cocok pada memori untuk mengizinkan sortir memori yang cepat. Blok kemudian dibalik dan ditulis pada disk. Pembalikan melibatkan dua langkah. Pertama, kami mensortir pasangan termed-docID. Kemudian kami mengumpulkan semua istilah pasangan termID-docID. Hasilnya, sebuah indeks terbalik untuk blok yang baru saja kit abaca, kemudian ditulis pada disk. Tabel 4.2 Kumpulan statistic untuk Reuters-RCV1. Nilai dibulatkan untuk perhitungan pada buku ini. Nilai yang tidak dibulatkan adalah 806,791 dokumen, 222 token per dokumen, 391,523 (jelas) istilah, 6.04 byte per tanda baca, 7,5 byte per istilah, dan 96,969,056 token. Jumlah dari tabel Koresponden untuk baris ketiga (case folding) pada tabel 5.1 (halaman 80)

BSBIndexConstruction() 1 n 0 2 while (semua dokumen belum diproses) 3 do n n + 1 4 block ParseNextBlock() 5 BSBI-Invert(block) 6 WriteBlockToDisk(block, fn) 7 MergeBlocks( f1, . . ., fn; f merged)

Gambar 4.2 Indexing terhambat sort-based. Algoritma menyimpan blok terbalik pada file f1, . . ., fn
Dan indeks baur pada f merged.

Dengan asumsi kita dapat meletakan 10 juta pasangan termID-docID pada memori, kami berakhir dengan sepulu blok, setiap indeks terbalik dari satu part dari kumpulan. Pda tahap terakhir, algoritma secara berkesinambungan membaur sepuluh blok menjadi satu indeks besar gabungan. Sebagai contoh seperti dua blok yang diperlihatkan pada gambar 4.3, dimana kami menggunakan dokumen di untuk menunjukan ith pada kumpulan. Untuk melakukan penggabungan kami membuka semua blok file secara berkesinambungan, dan mempertahankan buffer read kecil untuk kesepuluh blok yang kit abaca dan sebuah buffer tulis untuk indeks penggabungan akhir yang kami tulis. Pada setiap perulangan, kami memilih termID yang paling rendah yang belum diproses dengan antrian utama atau struktur data yang mirip. Semua daftar postingan untuk termID ini dibaja dan digabung, dan daftar gabungan ditulus kembali pada disk. Setiap read buffer diisi kembali dari filenya saat dibutuhkan. Seberapa mahalkah BSBI? Waktu kompleksitasnya adalah _(T log T) karena langkah dengan kompleksitas waktu tertinggi disortir dan T adalah ikatan atas untuk beberapa item yang karus kami susun (sebagai contok jumlah dari pasangan termID-docID). Akan tetapi waktu indexing actual biasanya didominasi oleh waktu yang digunakan untuk mengurai dokumen dan melakukan penggabungan akhir.

Gambar 4.3 penggabungan Indexing terhambat sort-based. Dua blok ditampung dari dik ke memori dan ditulis kembali ke disk. Kami menunjukan istilah daripada termIDs agar lebih mudah dibaca. Latihan 4.6 mengajak kalian untuk menghitung konstruksi waktu indeks total dari RCV1 yang termasuk langkah ini sebagai pembalok blok dan menulisnya untuk disk. diketahui bila reuters-RCV1 tidak besar pada masa ketika 1 atau lebih GB dari memori distandarkan pada komputer. Dengan kompresi yang tepat (bab 5), kami dapat menciptakan indeks pembalik untuk RCV1 pada memori yang tidak pada server yang tebal. Teknik yang telah kami jelaskan dibutuhkan akan tetapi

untuk kumpulan perintah yang beberapa kali lebih besar.

Latihan 4.1 bila kami membutuhkan perbandingan T log2 T (dimana T adalah jumlah dari pasangan termID-docID) dan dua disk mencari setiap perbandingan , berapa banyak waktu yang dihabiskan oleh konstruksi indeks untuk Reuters-RCV1 bila kami memilih menggunakan disk daripada memori untuk penyimpanan dan sorting algoritma yang tidak dioptimalkan (bukan sorting algoritma luar)/ gunakan parameter sistem pada tabel 4.1 Latihan 4.2 [*] bagaimana kalian membuat kamus pada Indexing terhambat sort-based dilajur untuk menghindari pss ekstra yang melalui data? 4.3 Pass tunggal dalam indexing memori Indexing terhambat sort-based memiliki property skala yang bagus, namun masih butuh dtruktur data untuk pemetaan istilah untuk termID. Untuk kumpulan yang sangat besar struktur data ini tidak dapat masuk pada memori. Alternatif yang lebig berskala adalah pass tunggal dalam indexing memori atau SPIMI. SPIMI menggunakan istilah dan bukannya termID yang ditulis di tiap blok kamus untuk disk, dan lalu memulai kamus yang baru untuk blok selanjutnya. SPIMI dapat mengindeks kumpulan dari size apa saja selama masih ada ruang disk yang cukup tersedia. Algoritma SPIMI ditunjukan pada gambar 4.4. bagian dari algoritma yang memparsing dokumen dan mengubahnya menjadi stream dari pasangan term-docID yang dapat kami sebut token disini, telah dihilangkan. SPIMI-INVERT disebut secara terus menerus pada stram token sampai semua kumpulan telah terproses. Token dibuat satu demi satu (baris 4). Ketika sebuah istilah muncul untuk pertama kali yang ditambahkan pada kamus (diimplementasikan terbaik sebagai hash), dan postingan baru dibuat (baris 6). Baris 7 mengembalikan daftar postingan untuk banyaknya kemunculan dari istilah. Perbedaan antara BSBI dan SPIMI adalah SPIMI menambah postingan secara langsung untuk daftar postingnya (baris 10). Alih-alih pertama mengumpulkan semua pasangan termID-docID dan menyusunnya (seperti yang telah kami lakukan di BSBI) setiap daftar postingan adalah dinamis dan tersedia secara cepat untuk mengumpulkan postingan. Hal ini memiliki dua kelebihan; lebih cepat karena tidak ada sortir yang dibutuhkan,
SPIMI-Invert(token stream) 1 output f ile = NewFile() 2 dictionary = NewHash() 3 while (free memory available) 4 do token next(token stream) 5 if term(token) / dictionary 6 then postings list = AddToDictionary(dictionary, term(token)) 7 else postings list = GetPostingsList(dictionary, term(token)) 8 if f ull(postings list) 9 then postings list = DoublePostingsList(dictionary, term(token)) 10 AddToPostingsList(postings list, doc ID(token)) 11 sorted terms SortTerms(dictionary) 12 WriteBlockToDisk(sorted terms, dictionary, output f ile) 13 return output f ile
Gambar 4.4 inversi dari sebuah block pada single-pass pada memory indexing

Dan aman karena kami tetap dari mana daftar istilah berasal, jadi termID dari posting tidak disimpan. Sebagai hasilnya blok indifidu yang disebut SPIMI-INVERT dapat memproses lebih banyak konstruksi index sebagai sesatuan yang lebih efisien. Karena kami tidak tahu berapa besar daftar postingan dari sebuah istilah yang akan jadi ketika mencoba pertama kali. Kami menempatkan ruang untuk diawali daftar postingan singkat dan menggandakan ruang tiap kali penuh (baris 8-9). Hal ini berarti bahwa beberapa memori terbuang, yang beraksi pada penyimpanan memori dari omisi termID pada struktur data menengah. Walaupun semua memori yang dibutuhkan untuk indeks konstruksi dinamis dari blok pada SPIMI masih lebih rendah dari BSBI. Ketika memori sudah kelelahan, kami menulis blok dari indekx (yang terdiri dari kamus dan dan daftar postingan) pada disk (baris 12). Kami harus mengingkat istilah (baris 11) sebelum melakukan hal ini karena kami ingin menulis daftar postingan yang ditulis pada runtutan yang tidak disortir. Penggabungan blok yang tidak bisa diselesaikan dengan pemindaian linier sederhana dari tiap blok. Setiap panggilan pada SPIMI-INVERT menulis blok untuk disk, seperti pada BSBI. Langkah terakhir dari SPIMI (penulisan untuk baris 7 pada gambar 4.2 tidak ditunjukan pada gambar 4.4) yang lalu menggabungkan blok menjadi indeks terbalik yang terakhir. Sebagai tambahan untuk membangun struktur kamus baru untuk tiap bok dan menghilagkan langkah sortiran yang menyita banyak ruang. SPIMI memiliki tiga elemen penting: pemadatan. Kedua istilah dari postingan dan kamus dapat disimpan dengan pas pada disk bila kami menggunakan pemadatan. Pemadatan meningkatkan efisiensi dari algoritma yang lebih jauh karena kami dapat memproses blok yang lebih besar, dank arena blok indifidu membutuhkan ruang yang lebih sedikit pada disk. Kami mengajak pembaca mengacu pada pustaka untuk aspek algoritpa (sesi 4.7). Kompleksitas dari SPIMI adalah (_) (T) karena tidak ada sortiran token yang dibutuhkan dan semua operasi paling banyak linier pada besarnya kumpulan. 4.4 Indexing terdistribusi Kumpulan kadang sangat besar sehingga kita kita menjalankan konstruksi indeks secara efisien pada mesin tunggal. Hal ini benar adanya pada Word Wide Web yangmana dibutuhkan cluster computer yang lebih besar untuk membentuk ukuran web indeks yang masuk akal. Mesim pencari web oleh karena itu menggunakan algoritma indeks terdistribusi untuk konstruksi indeks. Hasil dari proses konstruksi adalah indeks terdistribusi yang terpartisi pada beberapa mesin juga mengacu pada istilah atau mengacu pada dokumen. Pada sesi ini, kami menggambarkan indexing terdistribusi untuk intilah dari indeks terpartisi. Kebanyakan mesin pencari menggunakan indeks dokumen terpartisi (yang bisa dengan mudah dihasilkan dari indeks istilah terpartisi). Kami mendiskusikan topic ini lebih jauh pada sesi 20.3 (halaman 415) Metode konstruksi indeks terdistribusi kami deskripsikan pada sesi ini sebagai aplikasi untuk MapReduce, arsitektur biasa untuk perhitungan terdistrinusi. MapReducing didisain untuk rumpun computer yang besar. Pokok dari sebuah rumpun adalah untuk memecahkan problem perhitungan yang besar pada komoditas mesin yang murah atau simpul yang dibangun dari suku cadang standar

(prosessor, memori, disk) sebagai lawan untuk supercomputer dengan hardware yangspesial. Walaupun ratusan atau ribuan dari mesin tersedia pada rumpun seperti itu, mesin yang berdiri sendiri bisa gagal kapan saja. Satu syarat untuk indeksi terdistribusi yang kuat adalah dengan demikian kita membagi pekerjaan menjadi potongan yang dapat dengan mudah ditetapkan pada kasus kegagalan ditugaskan kembali. Sebuah master node (simpul) mengarahkan masalah penetapan dan penetapan kembali tugas untuk simpul pekerja yang sendiri. Peta dan pengurangan frasa dari MapReduce membagi tugas perhitungan menjadi potongan yang dapat dengan mudah diproses mesin standar dengan waktu yang singkat. Langkah yang banyak dari MapReduce ditunjukan pada gambar 4.5 dan sebuah contoh pada koleksi dari halaman wed, dibagi menjadi tumpahan n dimana besar tumpahan dipilih untuk memastikan bahwa pekerjaan dapa didistribusikan secara merata (tumpahan seharusnya tidak terlalu besar) dan secara efisien (jumlah total dari tumpahan yang dibutuhkan untuk mengelola seharusnya tidak terlalu besar); 16 atau 64 MB adalah ukuran yang bagus pada indexing terdistribusi. Pembagian tidak dipratugaskan untuk mesin melainkan untuk master node pada basis yang sedang berlangsung, Saat mesin selesai memproses satu pembagian, mesin ditugaskan ke yang berikutnya. Bila mesin mati atau macet karena permasalahan hardware, bagian yang bekerja secara sederhana ditugaskan untuk mesin berikutnya. Secara umum MapReduce menyelesaikan problem perhitungan yang besar menjadi bagian-bagian yang kecil dengan membentuknya kembalipada istilah dari manipulasi key-value-pairs. Bagi indexing, sebuah pasangan key-value memiliki bentuk (termID, docID). Pada indexing distribusi, pemetaan dari term menuju termID juga didistribusikan dan olehkarena itu lebih kompleks dari mesin indexing tunggal

Gambar 4.5 contoh dari indexing terdistribusi dengan MapReduce, Diadaptasi dari Dean dan Ghemawat (2004) Solusi sederhana untuk mempertahankan pemetaan untuk istilah yang lebish sering yang dicopy pada semua nodes dan menggunakan istilah secara langsung (alih-alih termID) untuk term yang tidak muncul berkali-kali. Kami tidak menunjukan permasalahan disini dan berasumsi bahwa semua node bernagi term yang konsisten - Pemetaan termID. Fase pemetaan dari MapRedue berisi bagian-bagian dari pemetaan input data untuk key-value pairs. Ini adalah tugas penguraian yang sama yang kami juga hadapi pada BSBI dan SPIMI, dan kami dengan demikian menyebut mesin yang melaksanakan parser fase pemetaan. Setiap parser menulis keluarannya pada file menengah lokal, bagian segmen file (ditunjukan atas a-f|g-p|q-z| pada gambar 4.5 Untuk fase pengurangan, kami ingin semua nilai yang diberikan pada key untuk disimpan bersama-sama, jadi mereka dapat dibaca dan diproses secara cepat. Hal ini didapatkan dengan pempartisian key menuju j partisi term dan mendapati parser tulisan pasangan nilai kunci untuk tiap term partisi menuju segmen file terpisah. Pada gambar 4.5, partisi istilah didasakan pada huruf pertama; a-f, g-p, q-z, dan j =3 (kami memilih jarak kunci ini untuk menghilangkan eksposisi. Secara umum, jarang key tidak membutuhkan penulisan untuk mempengaruhi term atau termID). Partisi term diartikan oleh orang yang mengoprasikan sistem indexing (latihan 4.10). Parser kemudian menulis penulisan segmen file, dimana r adalah nomor dari parser. Misalnya, gambar 4.5 menunjukan tiga file segmen a-f dari partisi af, penulisan pada ketiga parser dapat dilihat pada gambar. mengumpulkan semua nilai (disini: docID) untuk kunci yang diberikan (disini: termID) yang menjadi satu daftar adalah tugas dari penginverter dalam fase pengurangan. Master menugaskan tiap partisi term untuk inverter yanbg berbeda dan, seperti pada kasus dari parser, penugasan kembali partisi term pada kasus kegagalan atau interver yang lambat.
Skema dari pemetaan fungsi reduce map: input list(k,v) reduce: (k,list(v)) output instalasi dari skema untuk indeks konstruksi map: web collection list(termID, docID) reduce: ( termID1 , list(docID) , termID 2 , list(docID) , . . . ) (postings list1, postings list2, . . . ) contoh untuk indeks konstruksi map: d2 : C died. d1 : C came, C ced. ( C, d2 , died,d2 , C,d1 , came,d1 , C,d1 , ced,d1) reduce: ( C,(d2,d1,d1) , died,(d2) , came,(d1) , ced,(d1) ) (C,(d1:2,d2:1), died,(d2:1), came,(d1:1), ced,(d1:1))

gambar 4.6 pemetaan dan fungsi reduce pada MapReduce. Secara umum fungsi pemetaan menghasilkan sebuah daftar dari pasangan key-value. Semua value untuk key dikumpulkan pada satu daftar pada fase reduce. Daftar ini kemudian diolah lebih lanjut. Instalasi dari dua fungsi dan sebuah contoh diperlihatkan pada konstruksi indeks, Karena fase pemetaan mengolah dokumen dalam cara terdistribusi, pasangan termID dan docID tidak membutuhkan penyusunan dengan benar secara inisial seperti pada contoh ini. Contohnya menunjukan term dan bukannya termID agar lebih mudah dibaca. Kami mempersingkat Caesar sebagai C dan conquered sebagai ced. Setiap partisi term (penulisan untuk r file segmen, satu pada setiap parser) diproses oleh satu inverter. Kami berasumsi disini bahwa file dengan besar yang mesin tunggal dapat atasi (latihan 4.9). Akhirnya,

daftar dari value diseortir untuk setiap key dan ditulis pada akhir daftar postingan yang disortir (postingan pada gambar). (catat bahwa postingan pada gambar 4.6 termasuk term frekuensi, dimana setiap postingan pada sesi lain di bab ini hanya sebuah docID tanpa informasi frekuensi term). Aliran data ditunjukan untuk a-f gambar 4.5. Hal ini menyelesaikan konstruksi dari indeks terbali. parser dan inverter bukanlah set mesin terpisah. Master mengidentifikasi mesin yang menyimpang dan menetapkan tugas untuk mereka. Mesin yang sama dapat menjadi parser pada fase pemetaan dan inverter pada fase reduce. Dan kebanyakan pekerjaan lain yang berjalan secara parallel dengan konstruksi indeks, jadi antara sebagai parser dan sebagai interver mesin mungkin melakukan bergerak atau melakukan tugas yang tidak berkaitan. Untuk memperkecil banyaknya penulisan sebelum inverter mengurangi data, setiap parser menulis file segmennya pada local disk. Pda fase reduce, Master berkomunikasi dengan inverter dari lokasi segmen file yang relevan (contoh dari segmen file r dari partisi a-f) . Tiap file segmen hanya membutuhkan satu bacaan logis karena semua data yang relevan untuk inverter tertentu ditulis pada sebuah file segmen oleh parser. Pengaturan ini mengurangi jumlah lalulintas jaringan uang dibutuhkan selama indexing. Gambar 4.6 menunjukan skema utama dari fungsi MapReproduce. Masukan dan Keluaran kadang didaftarkan dari pasangan key-value itu sendiri, sehingga beberapa pekerjaan MapReduce dapat berjalan berurutan. Kenyataannya, ini adalah rancangan dari sistem indexing google pada tahun 2004. Yang kami paparkan pada sesi penulisan ini untuk hanya satu dari lima sampai sepuluh fungsi MapReduce pada indexing sistem tersebut. Operasi MapReduce lainya mengubah indeks partisi term yang tadi kita buat menjadi partisi dokumen satu. Map reduce menawarkan kerangka yang sederhanya secara konseptual dan kuat untuk implementasi construksi index pada lingkungan yang terdistribusi. Dengan menyediakan metode yang semi otomatis untuk pembagian indeks menjadi tugas-tugas yang lebih kecil, hal ini dapat menskala hampir semua kumpulan besar apa saja, dengan diberikan pengelompokan perhitungan dari besar yang dapat diterima. Exercise 4.3 untuk n = 15 bagian, r = 10 segmen, dan j= 3 partisi term, berapa banyak indeks terdistribusi yang akan diambil oleh Reuters-RCV1 pada arsitektur MapReduce? Berdasarkan asumsi kalian tentang pengelompokan pada mesin di tabel 4.1 4.5 Indexing Dinamis Sejauh ini, kami telah berasumsi bahwa koleksi dokumen tidak berubah. Hal ini tidak masalah untuk kumpulan yang secara frekueintif berubah atau tidak (contoh Kitab suci atau Shakespeare). Tetapi kebanyakan koleksi dimodifikasi secara terus menerus dengan dokumen yang ditambahkan, dihapus, dan diupdate. Hal ini berarti bahwa term baru membutuhkan penambahan untuk kamus, dan daftar postingan dibutuhkan update untuk term yang ada. Cara temudah untuk mendapatkan hal ini adalah dengan mengkonstruksi kembali secara periodik indeksnya dari yang belum jadi. Hal ini adalah solusi yang baik bila jumlah perubahan setiap waktu adalah kecil dan pada membuatan dokumen baru yang dapat dicari adalah dapat diterima dan bila sumber yang cukup tersedia untuk membentuk indeks baru sambil yang lama masih tersedia untuk pengquery.

Bila ada syarat bahwa dokumen yang tersedia untuk dokumen baru yang dimasukan secara cepat, salah satu solusinya adalah dengan mempertahankan dua indeks: indeks utama yang besar dan auxiliary index yang kecil yang disimpan pada dokumen baru. Auxiliary index disimpan pada memori. Pencarian dijalankan melalui dua index dan hasil yang telah digabung. Penghapusan disimpan pada bit vector yang tidak valid. Kami lalu dapat menyaring dokumen yang terhapus sebelum pengembalian hasil pencarian. Dokumen di update dengan menghapus dan memasukan kembali mereka. Setiap kali auxiliary index menjadi terlalu besar, kami mnggabungkannya menjadi indeks utama. Harga dari oprasi penggabungan ini tergantung pada berapa banyak kami menyimpan gabungan yang dengan sederhana berisi perpanjangan tiap daftar posting dari indeks utama dengan daftar penulisan postingan dari auxiliary indeks. Pada skema ini, alasan yang membuat kita menyimpan auxiliary indeks adalah dengan mengurangi jumlah dari disk yang dibutuhkan dari waktu ke waktu. Memperbaharui setiap dokumen secara terpisah membutuhkan lebih dari Mave disk cari, dimana Mave adalah besar rata-rata dari kosakata pada dokumen dalam koleksi. Dengan index auxiliary, kami hanya meletakan beban tambahan pada disk ketika kami menggabungkan indeks utama dan auxiliary. Sayangnya, skema daftar file per posting tidak layak karena kebanyakan sistem file tidak dapat menangani secara efisien jumlah yang sangat besar dari file.
LMergeAddToken(indexes, Z0, token) 1 Z0 Merge(Z0, {token}) 2 bila |Z0| = n 3 jadi untuk i 0 to 4 lakukan bila Ii indexes 5 lalu Zi+1 Merge(Ii, Zi ) 6 (Zi+1 is a temporary index on disk.) 7 indexes indexes {Ii } 8 lainya Ii Zi (Zi becomes the permanent index Ii .) 9 indexes indexes {Ii } 10 Break 11 Z0 LogarithmicMerge() 1 Z0 (Z0 is the in-memory index.) 2 indexes 3 sambil true 4 lakukan LMergeAddToken(indexes, Z0, getNextToken()) Gambar 4.7 penggabungan logarilma, setiap token (termID, docID) awalnya ditambahkan pada indeks memori Zo dengan LMERGEADDTOKEN. LOGARITHMICMERGE dimulai dengan Zo dan indeks.

Alternatif yang paling mudah adalah dengan menyimpan indeks sebagai datu file besar, sebagai konsentrasi atas semua daftar postingan. Pada kenyataannya, kami kadang memilih perbandingan antara dua perbedaan besar (sesi 4.7). Untuk mempermudah pembahasan, kami memilih opsi yang paling sederhana dari penyimpanan indeks sebagai satu file yang besar disini. Pada skema ini, kami memproses setiap postingan [T/n] kali karena kami berhubungan dengannya pada tiap dari gabungan [T/n] dimana n adalah besar dari auxiliary indeks dan T adalah jumpah total

postingan. Oleh karenanya, seluruh kompleksitas waktu adalah (-)(T2/n). (kami mengabaikan pengganti dari
term disini dan mempertimbangkan hanya docID untuk kegunaan kompleksitas waktu, daftar postingan secara sederhana adalah docID) Kami dapat melakukandengan lebih baik daripada (-)(T2/n) dengan memperkenalkan indeks log2 (T/n) I0,I1,I2, dari besar 20 x n, 21 x n, 22 x n postingan meresap indeks urutan ini dan diproses hanya sekali setiap level. Skema ini disebut logarithmic merging (gambar 4.7). Seperti sebelumnya, lebuh dari postingan n telah dicapai, postingan 20 x n pada Z0 dipindah ke indeks baru I0 yang dibuat pada disk. Saat Z0 selanjutnya penuh digabung dengan I0 untuk membuat sebuah indeks Z1 dari besar 21 x n. Lalu Z1 (bila I1 tersedia); dan selanjutnya. Kami menyediakan permintaan pencarian dengan query pada memori Z0 dan semua indeks yang valid saat ini Ii pada disk dan penggabungan hasil. Pembaca akrab dengan tumpukan suku dua struktur data yang akan mengenali kemiripannya dengan struktur dari indeks terbalik pada penggabungan logaritmik. Semua waktu indeks konstruksi adala (-)(T log(T/n)) karena setiap posting diproses hanya sekali pada masingmasing level log (T/n). Kami bertukar efisiensi ini untuk mendapatkan proses query yang lamban. Sekarang kami menggabungkan dari indeks (T/n) sebagai lawan dari hanya dua (indeks utama dan auxiliary). Seperti pada skema auxiliary indeks, kami masih memerlukan penggabungan indeks yang sangan besar kadang-kadang (yang memperlambat sistem pencarian selama penggabungan), namun hal ini terjadi lebih jarang dan indeks yang ikut serta pada penggabungan sedang adaah lebih kecil. Dengan adanya Indeks yang banyak yang memperumit pemeliharaan dari kumpulan statistic besar. Sebagai contoh, Hal ini mempengarushi perbaikan ejaan algoritma pada sesi 3.3 (halaman 52) yang memilih alternative yang tepat dengan hit terbanyak. Dengan indeks yang banyak dan bit vector yang tidak valid, jumlah hit yang benar untuk term bukanlah lagi hanya sekedar penambahan sederhana. Faktanya semua aspek dari sistem IR perawatan indeks, pemprosesan query, distribusi , dan yang lainya lebih rumit pada penggabungan logaritmik. Karena kerumitan dari indexing dinamis ini, beberapa mesin pencari mengadopsi rekonstruksi dari strategi awal. Mereka tidak mengkonstruksi indeks secara dinamis. Alih-alih, sebuah indeks baru dibangun darri awal secara periodic. Proses query lalu diubah dari indeks baru dan indeks yang lama dihapus. Latihan 4.4 untuk n=2 dan 1 T 30, melakukan langkah demi langkah simulasi untuk alogritma pada gambar 4.7. Buatlah sebuah tabel yang menunjukan, setiap poin pada waktu dimana T=2*k token yang telah diproses (1 k 15), yang dari ketiga indeks I0, . . . , I3 sedang digunakan. Yang pertama dari tiga baris tabel diberikan dibawah ini

4.6 Tipe indeks yang lain Bab ini hanya menjelaskan konstruksi dari indeks yang nonposisional. Kecuali untuk volume data yang lebih banyak yang kami butuhkan untuk ditampung, perbedaan utama dari posisi indeks adalah (termID,

docID, (posisi1, posisi2, )) tiga kali lipat, sedangkan pasangan dari (termID, docID) harus diproses dan token serta postingan terdiri dari informasi posisional sebagai tambahan untuk docID. Dengan perubahan ini, algoritma yang telah didiskusikan disini dapat diaplikasikan pada indeks posisional. pada indeks yang telah kami pertimbangkan sejauh ini, daftar postingan diatur dengan melihat docID. Seperti yang kita lihat pada Chapter 5, Hal ini sangat menguntungkan untuk pemadatan walaupun gap kecil antara ID docID dapat kita padatkan, karenanya mengurangi ruang yang dibutuhkan untuk indeks.

Gambar 4.8 matriks sebuah dokumen pengguna untuk akses daftar kontrol, Elemen (I, j) adalah 1 jika pengguna I telah mengakses pada dokumen j dan 0 sebaliknya. Selama proses query, akses dari pengguna daftar postingan berpotongan dengan daftar gabungan uang dikembalikan oleh bagian text dari indeks Akan tetapi, struktur untuk indeksnya tidak optimal ketika kami membangun ranked (bab 6 dan 7) seperti yang telah ditentang oleh Boolean- pengembalian sistem. Pada pengembalian yang terpangkat postingan kadang disusun berdasarkan berat atau dampak. Dengan berat postingan yang paling tinggi muncul pertama. Dengan pengaturan ini, pemindaian panjang daftar postingan selama query terproses biasanya dapat dimatikan lebih awal dengan berat yang menjadi sangat kecil daripada dokumen yang lebih jauh yang bisa diramalkan menjadi kurang mirip dengan query (lihat bab 6). Pada docID indeks tersortir, dokumen yang baru selalu dimasukan pada akhir daftar postingan. Pada dampak indeks tersortir (sesi 7.15, halaman 129), pemasukan dapat muncul dimana saja, oleh karenanya menyebabkan update indeks terbalik menjadi rumit. Sistem keamanan adalah pertimbangan yang penting untuk sistem pengembalian pada perusahaan. Pegawai dengan level yang rendah seharusnya tidak akan dapat menemukan daftar gaji dari perusahaan, akan tetapi manajer yang berwenang harus bisa mencarinya. Daftar hasil pengguna harus tidak berisikan dokumen yang dilarang untuk dibuka; Keberadaan dokumen besa menjadi informasi yang sensitif. Kelegalan pengguna kadang dilakukan melalui daftar acces control list atau ACL. ACL bisa saja berkaitan dengan sistem pengembalian informasi dengan mewakilkan setiap dokumen sebagai set dari pengguna yang dapan mengakses dokumen-dokumen tersebut (gambar 4.8) selanjutnya membalik matriks hasil dokumen pengguna. Indeks ACL terbalik telah, untuk setiap pengguna, sebuah daftar postingan dari

dokumen yang bisa mereka akses daftar akses pengguna. Hasil pencarian kemudia berpotongan dengan daftar ini. Akan tetapi, Indeks yang seperti itu sulit untuk dipertahankan ketika izin akses berubah kami membahas kesulitan ini pada konteks dari incremental indexing untuk daftar postingan regular pada sesi 4.5. Hal ini juga membutuhkan proses dari daftar postingan yang panjang untuk pengguna dengan mengakses subset dokumen yang besar. Oleh karenanya keanggotaan pengguna kadang diverivikasi sebagai pengembalian akses informasi secara langsung dari sistem file pada waktu query walaupun hal ini memperlambat pengembalian. Kami membahas indeks untuk penyusunan dan pengembalian term (seperti yangditentang untuk dokumen) pada bab 3. Latihan 4.5 dapatkah koreksi ejaan menyelesaikan keamanan level dokumen? Pertimbangkan kasus dimana sebuah perbaikan ejaan didasari pada dokumen yang tidak dapat diakses oleh pengguna Tabel 4.3 lima langkah pada pembentukan indeks untuk Reuters-RCV1 pada indexing sort-based terblok. Nomor baris mengacu pada gambar 4.2
Langkah Waktu 1 pembacaan kumpulan/koleksi (baris 4) 2 10 sortir inisial dari 107 tiap rekaman (baris 5) 3 penulisan 10 blok (baris 6) 4 waktu total transfer disk untuk penggabungan (baris 7) 5 waktu dari penggabungan sesungguhnya (baris 7) total

Latihan 4.6 total waktu konstruksi indeks pada indexing sort-blok terblok dipecah pada tabel 4.3. Isilah kolom waktu dari tabel untuk Reuters-RCV1 dengan asumsi sebuah sistem dengan parameter yang diberikan pada tabel 4.1 Latihan 4.7 ulangi latihan 4.6 untuk koleksi yang lebih besar pada tabel 4.4. pilihlah sebuah ukuran blok yang realistis untuk teknologi masa ini (ingatlah bahwa sebuah blok harus dengan mudah cocok pada memori utama) Berapa blok yang kamu butuhkan? Latihan 4.8 asumsikan bahwa kami memiliki ukuran koleksi yang sedang dengan indeks yang dapat dibangun dengan sederhana pada memori indexing algoritma pada gambar 1.4 (halaman 8). Pada koleksi ini, bandingkan memori, disk dan waktu yang dibutuhkan dari algoritma sederhana pada gambar 1.4 dan indexing sort-based terblok. Latihan 4.9 Asumsikan bahwa mesin di MapReduce memiliki 100GB dari tiap ruang disk. Asumsi lebih jauhyang daftar postingan dari term memiliki ukuran sebesar 200 GB. Lalu algoritma MapReduce yang telah dijelaskan tidak dapat dijalankan untuk membuat indeks. Bagaimana kalian akan memodifikasi MapReduce sehingga dapat diatasi pada kasus ini? Latihan 4.10 untuk optimalisasi penyeimbangan beban, pembalik pada MapReduce harus dibagi postingan file dari ukuran yang mirip. Untuk koleksi yang baru, penyaluran dari pasangan key-value mungkin tidak diketahui diawal. Nagaimana kalian memecahkan masalah ini?

Latihan 4.11 gunakan MapReduce pada permasalahan bagaimana menghitung seberapa sering tiap term muncul pada sejumlah file. Tentukan pemetaan dan pengurangan oprasi untuk tugas ini. Tulislah sebuah contoh bersamaan dengan baris pada gambar 4.6

Latihan 4.12 kami mengklaim (pada halaman 73) bahwa sebuah auxiliary indeks dapat mengganggu kualitas dari koleksi statistic. Contohnya adalah metode term weighting idf, yang diartikan sebagai log(N/dfi ) dimana N adalah jumlah total dari dokumen dan dfi adalah jumlah dokumen yang term I muncul pada
(sesi 6.2.1, halaman 108). Tunjukan bahwa sekalipun indeks auxiliary kecil dapat menyebabkan kesalahan yang berarti pada idf ketika dihitung pada indeks utama saja. Pertimbangkan term langka yang muncul seketika secara terus menerus (contoh, Flossie pada Tropical Storm Flossie) 4.7 Pustaka dan bacaan lebih jauh Witten dan kawan. (1999, chapter 5) membawakan perlakuan luas dari konstruksi indeks subjek dan algoritma indexing tambahan dengan pertukaran dari memori, ruang disk, dan waktu. Secara umum indexing sort-based terblok yang bekerja cukup baik pada tiga perhitungan. Akan tetapi , Bila memori yang disisakan atau ruang disk adalah criteria utama, lalu algoritma yang lain mungkin pilihan yang lebih baik. Lihat Witten dan kawan. (1999), tabel 54 dan 5.5; BSBI adalah yang terdekat dengan sort-based multiway merge, akan tetapi dua dari algoritma berbeda dengan struktur kamus dan penggunaan kompresi/pemadatan. Moffat dan Bell (1995) menunjukan bagaimana membangun sebuah indeks in situ yang dengan ruang penggunaan disk mendekati apa yang dibutuhkan untuk indeks final dan dengan file tambahan sederhana minimum (diutarakan juga oleh Harman dan Candela (1990)). Mereka memberikan Lesk (1998) dan somogyi (1990) pujian karena telah menjadi satudari yang memperkerjakan sorting pada konstruksi indeks. Metode SPIMI pada sesi 4.3 adalah dari (Heinz dan Zobel 2003). Kami telah menyederhanakan beberapa aspek dari algoritma, termasuk kompresi dan fakta bahwa tiap struktur data yang dimiliki term/istilah yang juga berisikan, tambahan pada daftar postingan, frekuensi dokumennya dan penyimpanan informasi rumahan. Kami merekomendasikan Heinz dan Zobel (2003) dan Zobel dan Moffat (2006) sebagai update, pada perlakuan yang lebih dalam dari konstruksi indeks. Algoritma lain dengan properti penskalaan yang bagus dengan memperhatikan ukuran kosakata yang membutuhkan beberapa jalan untuk menuju data, sebagai cotoh FAST-INV (fox dan Lee 1991, Harman dan kawan 1992). Arsitektur MapReduce diperkenalkan oleh dean dan Ghemawat (2004). Implementasi sumber terbuka dari MapReduce tersedia pada http://lucene.apache.org/hadoop/. Ribeiro-Neto dan kawan. (1999) dan Melnik beserta kawan. (2001) menjabarkan pendekatan lain untuk mendistribusikan indexing. Bab perkenalan pada IR terdistribusi adalah (Baeza-Yates dan Ribeiro-Neto 1999, bab 9) dan (Grossman dan frieder 2004, bab8). Lihat juga Callan (2000).

Lester dan kawan (2005) dan Buttcher dan Clarke (2005a) menganalisa property dari pembauran logaritmik dan membandingkannya dengan metode konstruksi yang lain. Satu dari pengguna pertama pada metode ini dibahas oleh Buttcher dan kawan (2006) dan Lester beserta kawan (2006). Tulisan yang terakhir juga membahas strategi penggantian indeks lama dengan satu pembangun dari awal. Heinz dan kawan (2002) membandingkan struktur data untuk mengakumulasi kosa kata pada memori. Buttcher dan Clarke (2005b) membahas model keamanan untuk indeks terbalik yang biasa pada beberapa pengguna. Karakterisasi yang rinci dari koleksi Reuters-RCV1 dapat ditemukan pada (lewis dan kawan 2004). NIST mendistribusikan koleksi (lihat http://trec.nist.gov/data/reuters/reuters.html). Garcia-Molina dan kawan (1999, bab 2) mengulas hardware computer yang cocok untuk disain sistem secara mendalam. Pengindeks yang efektif untuk pada firma mencari kebutuhan untuk bisa berkomunikasi secara efisien dengan beberapa aplikasi yang membawa data text pada perusahaan, termasuk Microsoft outlock, softwar IBMs Lotus, database seperti Oracle dan MySQL, sistem manajemen isi seperti Open Text, dan software firma perencanaan sumber daya seperti SAP.

Anda mungkin juga menyukai