Implementasi Parsing Data Teks dan Data Gambar Implementasi Indexing

CREATE TABLE IR.INDEKS ID_DOC VARCHAR220 BYTE, ID_TERMS VARCHAR220 BYTE, TF NUMBER, NTF NUMBER, W NUMBER CREATE TABLE IR.TERMS ID_TERMS VARCHAR220 BYTE NOT NULL ENABLE, TERMS VARCHAR230 BYTE, DF NUMBER DEFAULT 0, IDF NUMBER DEFAULT 0, NIDF NUMBER DEFAULT 0, CONSTRAINT TERMS_PK PRIMARY KEY ID_TERMS USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGEINITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT TABLESPACE USERS ENABLE Code 4.1 Implementasi Table untuk Dokumen

4.2 Implementasi Parsing Data Teks dan Data Gambar

Dokumen fotografi memiliki dua elemen, yaitu data gambar dan data teks. Kedua elemen tersebut harus dapat dipisahkan untuk melengkapi proses indexing. Parsing pada kedua data tersebut menggunakan source code yang sudah dipublikasikan oleh www.itext.com . Hasil dari parsing data gambar akan menjadi .jpg untuk setiap gambarnya dan data teks akan menjadi .txt , Code 4.2. public void extractImagesString filename, String result, Images images throws IOException, DocumentException { PdfReader reader = new PdfReaderfilename; PdfReaderContentParser parser = new PdfReaderContentParserreader; MyImageRenderListener listener = new MyImageRenderListenerresult, images; for int i = 1; i = reader.getNumberOfPages; i++ { parser.processContenti, listener; } reader.close; } public void parsePdfString pdf, String c_pdf throws IOException { PdfReader reader = new PdfReaderpdf; PdfReaderContentParser parser = new PdfReaderContentParserreader; PrintWriter out = new PrintWriternew FileOutputStreamc_pdf; result TextExtractionStrategy strategy; for int i = 1; i = reader.getNumberOfPages; i++ { strategy = parser.processContenti, new SimpleTextExtractionStrategy; out.printlnstrategy.getResultantText; } out.flush; out.close; reader.close; } Code 4.2 . Implementasi Parsing Data Teks dan Data Gambar

4.3 Implementasi Text Operations

Sistem ini menggunakan proses Text Operations yang didukung oleh kamus untuk mencari akar kata dan kata umum. Dalam sistem ini akar kata disimpan pada basis data dengan tabel dictionary dan daftar kata umum disimpan pada tabel stopword. Berikut adalah implementasi kamus untuk tabel stopwords dan dictionary, Code 4.3. CREATE TABLE IR.DICTIONARY ID_DICTIONARY NUMBER,0, ROOT_WORD VARCHAR220 BYTE CREATE TABLE IR.STOPWORDS ID_STOPWORD NUMBER,0, STOPWORD VARCHAR220 BYTE Code 4.3 Implementasi table STOPWORDS dan DICTIONARY Text Operations memiliki tiga tahap yaitu tokenizing, penghapusan stopword dan stemming. Setiap masukan yang dilakukan oleh pengguna akan melalui proses ini untuk mendapatkan full text yang dimiliki. Hasil full text tersebut disimpan dalam bentuk ListString. Pada Gambar 4.1 adalah gambaran bagaimana proses Text Operations dilakukan. Seluruh rangkaian proses Text Operations ini akan diimplementasikan pada class Tokenizer, Code 4.4. → → → Gambar 4.1 Rangkain Proses Text Operations public class Tokenizer { private ListString token; private String fileLocation; private ListString daftarKata; public TokenizerString fileLocation { this.fileLocation = fileLocation; } public Tokenizer { } public ListString getToken throws FileNotFoundException, IOException, SQLException { String words = null; String line; BufferedReader bufferedReader = new BufferedReadernew FileReaderfileLocation; while line = bufferedReader.readLine = null { words = words + line + \n; } StringTokenizer stringTokenizer = new StringTokenizerwords; token = new ArrayListString; int j = 0; while stringTokenizer.hasMoreTokens { String t = stringTokenizer.nextToken; token.addj, t.replaceAll[?_.�,], .toLowerCase; j++; } RemoveStopword removeStopword = new RemoveStopword; IndonesianStemmer indonesianStemmer = new IndonesianStemmer; removeStopword.setListWordtoken; token = removeStopword.getRemovedList; ListString listToRemove = new ArrayListString; for int i = 0; i token.size; i++ { indonesianStemmer.setWordtoken.geti.replaceAll[.�,], .toLowerCase; String rootword = indonesianStemmer.getWord; if rootword = null { token.seti, rootword; } else { listToRemove.addtoken.geti; } } token.removeAlllistToRemove; Collections.sorttoken; return token; } public ListString getTokenString keyword throws SQLException { String words = keyword; StringTokenizer stringTokenizer = new StringTokenizerwords; token = new ArrayListString; int j = 0; while stringTokenizer.hasMoreTokens { String t = stringTokenizer.nextToken; token.addj, t; j++; } RemoveStopword removeStopword = new RemoveStopword; IndonesianStemmer indonesianStemmer = new IndonesianStemmer; removeStopword.setListWordtoken; token = removeStopword.getRemovedList; ListString listToRemove = new ArrayListString; for int i = 0; i token.size; i++ { indonesianStemmer.setWordtoken.geti.replaceAll[.�,], .toLowerCase; String rootword = indonesianStemmer.getWord; if rootword = null { token.seti, rootword; } else { listToRemove.addtoken.geti; } } token.removeAlllistToRemove; HashSet hs = new HashSet; hs.addAlltoken; token.clear; token.addAllhs; Collections.sorttoken; Collections.sorttoken; return token; } public void setTokenListString token { this.token = token; } public String getFileLocation { return fileLocation; } public void setFileLocationString fileLocation { this.fileLocation = fileLocation; } public List getResultToken throws SQLException, FileNotFoundException, IOException { ListString tokens = getToken; HashSet hs = new HashSet; hs.addAlltokens; tokens.clear; tokens.addAllhs; Collections.sorttokens; return tokens; } } Code 4.4 Text Operations

4.3.1 Pemisahan Kata

Proses ini memisahkan data teks menjadi daftar istilah yang disimpan sementara dalam bentuk ListString. Proses ini juga menghapus karakter khusus dan mentransformasikan setiap istilah ke dalam huruf kecil, Code 4.5 BufferedReader bufferedReader = new BufferedReadernew FileReaderfileLocation; while line = bufferedReader.readLine = null { words = words + line + \n; } StringTokenizer stringTokenizer = new StringTokenizerwords; token = new ArrayListString; int j = 0; while stringTokenizer.hasMoreTokens { String t = stringTokenizer.nextToken; token.addj, t.replaceAll[?_.�,], .toLowerCase; j++; } Code 4.5 Implementasi Teks Operations, Pemisahan Kata

4.3.2 Penghapusan Kata Umum

Proses penghapusan kata umum adalah proses yang melengkapi proses pemisahan kata sebelumnya. Proses ini memeriksa apakah pada daftar istilah sebelumnya terdapat kata umum atau tidak, jika terdapat maka akan dihapus. Hasil dari penghapusan kata ini disimpan sementara dalam bentuk ListString Code 4.6. public class RemoveStopword { private ListString listWord; private ListStopword stopwords; public RemoveStopword throws SQLException { stopwords = DatabaseController.getDatabaseController.get_stopwords; } public ListString getRemovedList throws SQLException { ListString helpers = new ArrayListString; for int i = 0; i stopwords.size; i++ { if listWord.containsstopwords.geti.getStopwords { helpers.addstopwords.geti.getStopwords; } } listWord.removeAllhelpers; return listWord; } public void setListWordListString removedList throws SQLException { this.listWord = removedList; } } Code 4.6 Implementasi Text Operations, Penghapusan Kata Umum

4.3.3 Stemming

Berikut adalah implementasi yang mentransformasikan istilah menjadi akar katanya. Algoritma stemming yang digunakan pada sistem ini adalah algoritma stemming menurut Nazief, Code 4.7. public class IndonesianStemmer { private String word; private ListString dictionaries; public IndonesianStemmer throws SQLException { dictionaries = DatabaseController.getDatabaseController.get_dictionaries; } public String getWord { delReduplikasi; delSuffiks; delPrefiks; if dictionaries.containsword { return word; } else { return null; } } public void setWordString word { this.word = word; } public String delSuffiks { Pertama cari kata yang akan diistem dalam kamus kata dasar. Jika ditemukan maka diasumsikan kata adalah root word. Maka algoritma berhenti. if dictionaries.containsword { Inflection Suffixes “-lah”, “-kah”, “-ku”, “-mu”, atau “-nya” dibuang. Jika berupa particles “-lah”, “-kah”, “-tah” atau “-pun” maka langkah ini diulangi lagi untuk menghapus Possesive Pronouns “-ku”, “-mu”, atau “-nya”, jika ada. if word.endsWithlah { word = word.substring0, word.length - 3; } else if word.endsWithkah { word = word.substring0, word.length - 3; } else if word.endsWithku { word = word.substring0, word.length - 2; } else if word.endsWithmu { word = word.substring0, word.length - 2; } else if word.endsWithnya { word = word.substring0, word.length - 3; } } if dictionaries.containsword { langkah 3 Hapus Derivation Suffixes “-i”, “-an” atau “-kan”. Jika kata ditemukan di kamus, maka algoritma berhenti. Jika tidak maka ke langkah 3a 3a. Jika “-an” telah dihapus dan huruf terakhir dari kata tersebut adalah “-k”, maka “- k” juga ikut dihapus. Jika kata tersebut ditemukan dalam kamus maka algoritma berhenti. Jika tidak ditemukan maka lakukan langkah. 3b. Akhiran yang dihapus “-i”, “-an” atau “-kan” dikembalikan, lanjut ke langkah 4. if word.endsWithi { word = word.substring0, word.length - 1; } else if word.endsWithkan { word = word.substring0, word.length - 3; } else if word.endsWithan { word = word.substring0, word.length - 2; } } return word; } public String delPrefiks { try { if dictionaries.containsword { if word.startsWithdi { word = word.substring2; } else if word.startsWithke { word = word.substring2; } else if word.startsWithse { word = word.substring2; } } if dictionaries.containsword { if word.startsWithme { if word.startsWithmeng { if dictionaries.containsk + word.substring4 { word = k + word.substring4; } else if word.substring4, 5.matches[gh] { word = word.substring4; } } else if word.startsWithmeny { if dictionaries.containss + word.substring4 { word = k + word.substring4; } } else if word.startsWithmem { if word.substring3, 4.matches[bpf] { word = word.substring3; } } else if word.startsWithmen { if word.substring3, 4.matches[cdj] { word = word.substring3; } else if dictionaries.containst + word.substring3 { word = k + word.substring3; } } else { word = word.substring2; } } else if word.startsWithte { if word.startsWithter { if dictionaries.containsr + word.substring3 { word = r + word.substring3; } else { word = word.substring3; } } } else if word.startsWithbe { if word.substring3, 5.matcheser { word = word.substring2; } else if dictionaries.containsword.substring2 { word = word.substring2; } else { word = word.substring3; } } } if dictionaries.containsword { if word.startsWithpe { if dictionaries.containsword.substring2 { word = word.substring2; } else if word.startsWithper { word = word.substring3; } else if word.startsWithpem { if word.substring3, 4.matches[bfv] { word = word.substring3; } else if dictionaries.containsp + word.substring3 { word = p + word.substring3; } } else if word.startsWithpeny { if dictionaries.containss + word.substring4 { word = s + word.substring4; } } else if word.startsWithpen { if dictionaries.containst + word.substring3 { word = t + word.substring3; } else if word.substring3, 4.matches[jdcz] { word = word.substring3; } } } } } catch StringIndexOutOfBoundsException e { return word; } return word; } public void delReduplikasi { String firstWord = null; String secondWord = null; if word.contains- { firstWord = word.substring0, word.indexOf-; secondWord = word.substringword.indexOf- + 1; if dictionaries.containssecondWord { word = secondWord; } else if dictionaries.containsfirstWord { word = firstWord; } else { word = secondWord; } } } Code 4.7 Implementasi Teks Operations, Stemming

4.4 Implementasi Indexing

Proses indexing pada sistem ini menggunakan daftar istilah yang didapat dari proses Text Operations. Setiap istilah akan ditambahkan pada basis data, Code 4.8. public class Indexing { DatabaseController databaseController = DatabaseController.getDatabaseController; public void indek_termTokenizer tokenizer, String id_doc throws SQLException, FileNotFoundException, IOException { Indek indek = new Indektokenizer.getToken; Terms terms = new Terms; ListString list = tokenizer.getResultToken; for int i = 0; i list.size; i++ { Terms bantu = terms.seacrh_byIDlist.geti; if bantu.getId_terms == null { indek.setId_termsdatabaseController.check_terms; indek.setTfbantu.getTerm; indek.setId_docid_doc; databaseController.insertTermsbantu; databaseController.add_indeksindek; } else { indek.setId_termsbantu.getId_terms; indek.setTfbantu.getTerm; indek.setId_docid_doc; databaseController.updateTermbantu; databaseController.add_indeksindek; } } databaseController.updateAllTerm; databaseController.updateAllIndeks; } } Code 4.8 Implementasi Indexing

4.5 Implementasi Inverted Index