[Text Analytics </TES>®] |
- Sumber Data: Data dalam berbagai format (istilahnya variety di Big Data) diterima oleh sistem/user. Contohnya berformat HTML, XML, pdf, csv, xls, atau data dari API media sosial yang sekarang seringnya berformat JSON.
- Parser:Formatted teks data seperti yang disebutkan di (1) biasanya memuat perintah "tags", misal <b>, {var:"text}, dsb. Parser merubah teks data menjadi plain information yang siap diolah ke bentuk selanjutnya. Contoh: Tips: Hati-hati walau di Pyhton tanda ' dan " interchangeable untuk string, tapi tidak untuk JSON. Di contoh di atas sebuah string T (misal berasal dari data berformat JSON) di load ke variabel data yang bertipe dictionary.
- Cleansing:Setelah proses Parser barulah text cleansing dilakukan. Pada proses ini akan dilakukan beberapa proses, sebagai contoh tokenization, filtering (e.g. stopwords removal), stemming/lemmatization, dsb. Nah di post ini mari kita fokus ke Tokenization terlebih dahulu.
Symbols
Di output code diatas, hasil split ndak murni sebuah kata. "hi," dan "Mukidi." mengandung tanda koma dan titik. Kalau tidak ditangani maka kita akan mengolah "hi" dan "hi," sebagai 2 entitas yang berbeda. Stop, stop Gan ... kalau cuma masalah itu, ane tau solusinye: Gimane? sip kan? #Sedakep #PalaMenengadah #MulutMangap #MintaDiFotoInefficiency
Hati-hati dengan perintah "T = T.replace(s,' ')" dengan cara diatas. Python akan membuat memory baru untuk hasil replace di setiap iterasi-nya. Bayangkan di setiap iterasi ada "copy of T" di memory. Dan sayangnya setau saya (please CMIIW) tidak ada parameter untuk merubahnya menjadi "inplace" untuk perintah "replace" [Link]. Mengapa? Karena string di Python object immutable (tidak bisa dirubah), sama seperti tipe data Tuple. Ini ilustrasinya: Sehingga kalau T besar (misal mengolah banyak dokumen dengan ukuran masing² beberapa MBs) maka iterasi diatas akan berjalan lambat karena di memory akan melakukan create & destroy T pada setiap iterasi. Intinya komputer panas Gan ... kerjanya juga ndak efisien. Tapi ok untuk string yang kecil dan replace yang sederhana (misal status twitter). Kalau keperluan replace-nya rumit, biasanya pakai regular expression (dibahas di post lain). Tapi kalau replace-nya sederhana maka perintah standard "replace" lebih cepat ketimbang reguler expression [baca disini]."Don't Reinvent The Wheel"
Daripada susah², mending pakai module saja. Kalau kata orang Eropa: "mbok ya ora sah neko-neko to mas" ??. Salah satu module untuk pengolahan bahasa yang paling tersohor adalah NLTK. Menggunakan NLTK tokenization diatas dilakukan dengan cara sebagai berikut: Ntar dulu Gan ... itu di Word_Tokens masih ada symbol²-nya!... :( Tenang Boss .... Setelah dapet tokens-nya baru kita lakukan cleansing, misal: Notes di contoh di atas "symbols" di rubah dari list ke set, karena di python "x in set" jauh lebih cepat ketimbang "x in list" [Keterangan lebih lanjut disini]. O iya ... best practice-nya ... sebaiknya sebelum di tokenize sebaiknya Text dirubah ke lowercase dulu. Perintahnya mudah (T = T.lower()). Namun kita akan bahas normalisasi tokens/words lebih lanjut di lain waktu. Last but not least, alternatif cara dengan isalnum diatas akan gagal jika di token-nya terdapat spasi, " ' ", "-", atau symbol lain selain A-Z,a-z, dan 0-9.Tokenization tidak hanya language dependent, tapi juga environment dependent
Tokenization sebenarnya tidak sesederhana memisahkan berdasarkan spasi dan removing symbol. Sebagai contoh dalam bahasa Jepang/Cina/Arab suatu kata bisa terdiri dari beberapa karakter. Lalu seperti yang sudah dijabarkan sebelumnya ada kata² majemuk (2 atau lebih kata yang bermakna tunggal) seperti : "terima kasih", "rumah sakit", "tanggung jawab", dsb. Tidak mungkin untuk membahas semua Tokenization di post ini. Pembahasan akademis tentang Tokenizer ini-pun tidak sederhana, berikut saya contohkan beberapa paper akademis terkait tokenizer (pembahasan detailnya nanti di buku yang saya tulis saja ya, terlalu berat untuk blog post) [J.Jiang 2007][Jirí Maršík 2012][Horsmann 2015]. Di atas sudah dibahas tokenization bahasa Inggris, berikutnya kita akan bahas special tokenization (misal twitter) dan tokenization dalam bahasa Indonesia. Tokenization data twitter (Alay): NLTK memiliki tokenization khusus untuk twitter. Berikut contohnya: Perhatikan bagaimana Tokenizer-nya tetap menjaga tanda hashtag (#). Bahkan kita bisa mencoba untuk menangani status alay sebagai berikut: Parameter "strip_handles" akan menghilangkan mention, dan "reduce_len" akan mengurangi character repetition >3 ke 3. Untuk alayers yang menggunakan character² aneh, NLTK punya moses tokenizer. Atau kombinasi antara modul unidecode dan-atau word correction seperti pyenchant (Py 3.4<), module autocorrect, atau generic spell_checker seperti Norvig Spell Checker. Berikut contohnya: Tokenizer Bahasa Indonesia: Alayers ga penting banget sih, mari kita tinggalkan saja mereka dan bahas sesuatu yang lebih penting: Tokenizer bahasa Indonesia. First thing first, sayangnya NLTK setau saya tidak support Bahasa Indonesia, bahkan module NLP Python yang support bahasa Indonesia secara umum sangat langka (ehm ehm ehm ... #KodeKeras #ParaPenelitiNLPIndonesia #AtauSastraIndonesia). Kalaupun ada, dengan berbagai keterbatasan saja. Misal yang saya tau ini (Kalau tau more than this please comment di bawah ya, thanks ??):- Sastrawi 1.0.1 untuk stemming & stopwords bahasa Indonesia.
- Indonesian stopwords only
- Daftar Kata Dasar Indonesia (Saya punya yang dengan part-of-speech nya cuma lupa sumbernya ????)
- Wiktionary:ProyekWiki bahasa Indonesia [termasuk Lexicon]
- Daftar Kata Baku-Tidak Baku
- Last, but not least my favourite: Spacy.
Kita akan lakukan tokenisasi Bahasa Indonesia dengan Module Python Spacy. Saya pribadi lebih suka Spacy ketimbang Gensim, TextBlob, atau bahkan NLTK. Mengapa? Spacy cocok untuk level produksi (License-nya MIT !!!... ??). Spacy sangat (sangat) cepat (me love fast/efficient modules ??), ini perbandingan yang saya ambil dari websitenya:
[Spacy Benchmarks]
Sebelum kita mulai Tokenisasi Bahasa Indonesia dengan Spacy, pertama-tama saya perlu menyebutkan bahwa support untuk Bahasa Indonesia masih dalam tahap Alpha. Tapi development dan system-nya promising banget. Lagipula modifikasinya cukup mudah (kita bahas kalau kopi darat saja, lewat blog post riweuh ??). Ok, cukup pengantarnya, here goes (probably) the most important code snippets of this post:
Tidak ada komentar:
Posting Komentar
Relevant & Respectful Comments Only.