Teknik Text Mining dengan Matlab

Hari ini adalah hari penghakiman untuk tugas project mata kuliah Decision Support Technology (DST). Kasus yang kami pilih adalah menentukan dari puluhan juta record berisi pengarang dan tulisannya dan kita diminta mencari nama-nama yang seharusnya digabung berdasarkan field-field yang ada yaitu affiliation, konference, judul, dan kata kunci.

Kami sekelompok sepakat menggunakan tools Java dengan postgresql, sementara saya tetap setia menggunakan Matlab dengan Microsoft Access sebagai sistem basis datanya. Rekan saya yang berasal dari Thailand dan Uzbekistan cukup mahir dalam memainkan Java. Untuk tahap pertama mereka sudah berhasil melakukan cleaning data. Pengarang yang namanya sama jika affiliation-nya sama maka dikategorikan dalam satu pengarang yang sama.

Saya bertugas mensuplai data similarity dari pengarang-pengarang itu. Teknik pertama dengan mencari nama yang sama persih, menghasilkan akurasi 60%. Jika nama sama dan dicek affiliation-nya mirip, akurasi meningkat menjadi 70%. Berikutnya teknik-teknik lain digunakan mulai dari nama singkatan dan nama belakang, misalnya rahmadya trias handayanto, dicari apakah ada yang mirip r. t. handayanto? Diperoleh akurasi 80%. Rekan saya menganjurkan teknik switching nama pertama dengan nama terakhir, jadi dicari rahmadya handayanto dengan handayanto rahmadya, apakah ditemukan? Namun akurasinya hanya naik 1 persen menjadi 81%.

Selepas kuliah ISDM, saya berkumpul kembali dan saya menunjukkan bahwa saya menemukan nama-nama yang sama dengan menanggalkan nama tengah. Jadi misalnya rahmadya trias handayanto, akan saya cari dengan r. handayanto, apakah ada atau tidak. Mereka langsung mengecek satu sample data yang saya berikan, dan mereka terkejut ternyata ada beberapa nama yang tidak ditulis nama tengahnya dan memiliki affiliasi yang sama. Dan kami terkejut ketika akurasi naik 3 persen jadi 84%.

Sebenarnya masih banyak cara lain, seperti yang disarankan oleh Dr. Paul, dosen kami, misalnya missing word, spelling of word (france and germany), serta nama cina yang bermarga di depan. Untuk melihat contoh bagaimana Matlab mendeteksi dapat dilihat di youtube ini:

Iklan

Looking for a Similar Name in Text Mining with Matlab

Some names has first name, middle name, and last name. The last name is a family name, except some country like Chine. Many literatures for simplicity only show the last name with abbreviation to the first and middle ones. For example Rahmadya Trias Handayanto will be written as R. T. Handayanto or Handayanto, R. T. (see e.g in IEEE: http://ieeexplore.ieee.org/search/searchresult.jsp?newsearch=true&queryText=handayanto) so we want to predict that R. T. Handayanto is similar to Rahmadya Trias Handayanto. For experiment try to type in Matlab:

As usual, I use ‘{‘ instead of ‘(‘ because I made a cell type that fit the record on database. We want to collect other name that has similar to it like r. t. handayanto. For collecting the last name you can see my other post using regular expression: https://rahmadya.com/2014/04/18/how-to-search-last-name-using-matlab/. Therefore, we just add the first and middle, or only the last name if only a single name.

The logic is we find first the index of space that indicate the first or middle name with last name. After we count the total number of name we represent only first character with point for first name and middle name. I use if-else to detect whether the name only has one name (last name).

Try using a command window to convert the name become short name. You see that now rahmadya trias handayanto became r. t. handayanto that will compare to other that similar to it using format character (see the bottom line).

For example, we have 10 data:

You can see that Ahmed Abdul-hamid and A. Abdul-hamid that has similar name, but A. Cain may be different from A. J. Cain.

The result state that there is two names with similarity of last name and abbreviation of firs name that id=3 and id=10. With function lower we change all author name into lower case in order to easily compare. Of course, to get this code we have to understand how to manipulate matrices in Matlab.

 

How to Search Last Name using Matlab

It is a hard day, because I always sleep over the mid night. Ok, it’s about text mining. We want search from the data that has a particular family name, for example, may name, rahmadya trias handayanto. Ok, because our data usually cell type (for database), use this kind of data type:

name={‘rahmadya trias handayanto’}

We use symbol { for creating a cell type that we always find in table format. The logic for searching my lastname is by finding the last space. Try using the regular expression.

index=regexp(name,’ ‘)

Don’t forget to type space between ‘ because we want to search the index of space for name. Type celldisp(index) to see the content of index, because it is cell type. Many people have more than two names, with middle name. So we have to choose the biggest index using function max.

bigindex=max(index{1})

We have to convert the name into character if we want to present the last name using char function.

charname=char(name);

key=charname(bigindex+1:end)

We use ‘+1’ because we don’t include space to our last name. You can see the instruction below, it is very easy.

Parallel Processing on Matlab

Untuk memproses 2000-an record terhadap 2 juta record jika dijalankan dengan satu proses akan memakan waktu cukup lama karena karakternya yang serial. Untuk menjalankan proses yang parallel secara bersama maka kita dapat menjalankan lebih dari satu matlab dalam satu computer. Biasanya ini dilakukan jika kita ingin memproses data berukuran besar (big data).

First, you have to change current directory of your first matlab. If we want to create with two machines, you can open your Matlab again form start menu or from your shortcut wall. For example I want to use three Matlab for computing my algorithm at the same time for faster result.

Second, things that we have to consider is the location of the result, if you have the similar name to the output, you have to separate current directory because of the conflict of output (the last output will replace the previous one).

Last, you have to count the power of your machine. I use i5 processor, and sometimes I use four processing. The picture below show my Matlab that process 3 text processing of 2 thousand of author to other 2 million author.

Parallel Processing dengan Matlab

Melanjutkan tulisan yang lalu (https://rahmadya.com/2014/04/04/mengimpor-big-data-ke-matlab/) tentang import big data ke Matlab, saya akan sharring suka dukanya mengolah big data dengan Matlab. Setelah berhasil meramu kode untuk mencari data dan mengumpulkannya dalam satu tabel untuk data kecil, ketika diterapkan ke data besar muncul masalah besar juga. Mencari 2 juta nama yang memiliki kemiripan harus saya hentikan karena 14 jam baru selesai pengarang ke 16442 yang sedang dibandingkan ke pengarang ke 1.352.700. Tobat.

Algoritmanya sederhana, misalnya kita punya 4 nama A,B,C dan D. Akan kita cek apakah di antara 4 nama itu ada sama nama belakangnya. Alurnya adalah A dibandingkan dengan B, C, dan D. Berikutnya B dibandingkan dengan C, dan D. Terakhir C dibandingkan dengan D. Jika prosesnya memakan waktu sehari maka dapat saja kita pecah jadi misalnya dua proses. Proses pertama membandingkan A,B dengan B,C, D dan proses kedua membandingkan C,D dengan B,C,D. Maka waktu prosesnya diperkirakan jadi setengah hari. Jika dibagi menjadi empat proses, jauh lebih cepat lagi. Setelah diperoleh hasil, perlu satu kode untuk menggabungkan tabel-tabel hasil pencarian yang terpisah tersebut.

Apakah memerlukan komputer yang berbeda? Ternyata tidak, Matlab dapat dijalankan lebih dari satu jendela. Coba Anda buka Matlab Anda, kemudian Anda buka lagi Matlabnya, maka Anda telah menjalankan dua mesin Matlab. Hanya saja Anda harus membedakan variabel pada proses 1 dengan proses 2 karena akan bentrok nantinya, minimal membedakan current directory jika Anda malas merubah listing programnya. Oke, kita buat data baru ujicoba:

Berikutnya jalankan kode untuk mencari nama yang sama seperti tulisan yang lalu dengan bantuan fungsi strfind Matlab (https://rahmadya.com/2014/04/07/mencari-kata-dalam-text-dengan-matlab/). Misal saya memecah menjadi 2 maka dari total 20 nama, maka proses pertama i=1 sampai 10, proses kedua i=11 sampai 20.

Perhatikan untuk proses 1 diperoleh hasil yang banyak karena memang data cenderung terbagi dua karena sementara proses 2 hanya diperoleh satu yang sam yang kebetulan sudah diperoleh juga di proses 1. Seandainya data memang terbagi dua, maka proses 2 tidak menemukan kesamaan.

Pemilihan Umum 2014

Berbagai caruk maruk permasalah negara Indonesia dari kasus-kasus korupsi para politisi-politisi yang bukan hanya dari partai umum, bahkan partai yang mengatasnamakan agama pun ikut terlibat. Walaupun menurut informasi bahwa jumlah pemilih golput meningkat dari pemilu tahun 2009, tetapi pelaksanaan pemilihan umum hari ini cukup berjalan dengan baik.

Yang membuat saya berhasrat untuk menulis di blog tentang pemilu ini adalah karena saat ini saya sedang menjalani tugas belajar di negeri gadjah Thailand. Berbeda karena pemilu luar negeri hanya memilih DPR pusat saja, juga tarik menarik kepentingan partai sangat terasa di sini.

Hegomoni PKS terhadap mahasiswa-mahasiswa Indonesia yang sedang tugas belajar sepertinya mulai meredup, mungkin karena berita buruk yang belakangan tersiar di berbagai media masa yang menurut mereka tidak adil terhadap partainya. Di Thailand sendiri, PKS merupakan partai pemenang pemilu tahun 2009 yang lalu. Tetapi kenyataan saat ini berbeda, di tanah air sendiri hasil quick count PKS tidak memperoleh target 3 besar yang diharapkannya, bahkan kalah oleh PKB yang meningkat hampir dua kali lipat dari pemilu yang lalu. Lebih sial lagi adalah Partai Demokrat yang cukup drastis turunnya akibat kasus-kasus yang menimpa ketua partainya yang dulu, Anas Urbaningrum. Untung saja strategi SBY untuk menggalang kekuatan dari capres-capres potensialnya sebagai pendongkrak suara sepertinya cukup berhasil. Gerindra sepertinya tertawa lebar karena kenaikannya hampir tiga kali lipat, karena memang mesin politiknya yang bekerja cukup baik dari kader-kadernya yang terus dilatih, baik real maupun lewat media internet. PDIP sendiri walaupun peringkat pertama, tetapi prosentasenya di bawah target (27%) yang mungkin akibat selain banyak kasus yang menimpanya, magnet Jokowi kurang berhasil mendongkrak suara, karena banyak pemilih yang belum tahu bahwa Jokowi capres dari PDIP. Tentu saja dampak dari lainnya seperti citra negatif oleh lawan-lawan politiknya di media, cukup mengganggu kenaikan hasil pemilu, walaupun dibanding tahun 2009, PDIP tetap naik sekitar 1 persen.

Untuk pemilu presiden 91 hari lagi, sepertinya akan terjadi pertarungan sengit antara Jokowi dengan Prabowo. Isu adanya poros tengah dari partai-partai Islam yang akan menyokong Mahfud MD juga perlu diwaspadai oleh capres PDIP dan Gerindra itu. Golkar diperkirakan akan bergabung dengan capres yang akan unggul karena partai ini dikenal sebagai partai yang selalu berkoalisi dengan pemerintahan. Bagaimana dengan PKS? Ini merupakan pertanyaan yang unik mengingat perseteruannya dengan PDIP sangat tajam. Jika PDIP menang di pilpres, PKS sepertinya akan menjadi partai oposisi, walaupun tentu bisa saja berkoalisi dengan PDIP di pemerintahan walaupun koalisi yang dilakukan oleh PKS cukup unik, dan tidak dapat saya beberkan di sini karena bisa menyinggung perasaan kader2nya. Salah satunya adalah PKS kerap keluar dari kebijakan koalisi yang sempat membuat ketua partai koalisi, SBY, sedikit geram dengan sikap partai yang dua muka tersebut.

Apapun hasilnya harus kita terima dengan lapang dada. Saya ucapkan Alhamdulillah karena berjalan dengan lancar dan memenuhi perundang-undangan. Gambar di atas foto bareng dengan panitia pemilu Bangkok yang datang menjemput bola para pemilih di kampus Asian Institute of Technology (AIT) Thailand (Saya kebetulan pake kaos warna kebangsaan he he). Coba kita perhatikan negara lain, seperti Afganistan yang untuk memilih saja rakyatnya kesulitan karena ancaman dari pihak pengacau keamanan. Di tempat saya belajar pun, Thailand, pemilu bulan februari lalu dibatalkan oleh pengadilan Thailand karena tingkat partisipasinya yang jauh dari persyaratan, baik jumlah pemilih, maupun jumlah wilayah yang mengadakan pemilihan umum.

Mencari Kesamaan Text dengan Matlab

Kalau pada tulisan yang dulu (https://rahmadya.com/2014/04/07/mencari-kata-dalam-text-dengan-matlab/) ketika mencari kata kita terlebih dahulu menentukan keyword (atau diistilahkan dengan term), untuk mencari nama yang sama mau tidak mau Matlab harus menentukan sendiri term yang akan dicari kesamaan dengan kata pada record yang lain. Sebagai contoh di sini saya menentukan 13 nama yang memiliki 6 orang dengan nama yang sama.

Cara kerjanya adalah pertama-tama Matlab mengambil kata kunci record pertama yaitu “ayman kaheel” sebagai term yang akan dibandingkan dengan record kedua, ketiga, dan seterusnya hingga panjang maksimal record (dalam hal ini 13 record). Jika ditemukan nama yang sama, dengan instruksi isempty, baik record term maupun yang mirip dengannya dipisahkan dalam satu tabel result. Ceritanya panjang, lebih baik langsung saya tampilkan saja kode program:

Seperti biasa, fungsi strfind bermaksud membandingkan suatu string pada vektor. Cellstr berfungsi merubah string menjadi cell karena kalau tidak dirubah, tidak bisa digabungkan menjadi satu matriks karena string berbeda-beda ukurannya, sedangkan cell selalu tetap, berapapun panjang string, tetap dianggap satu sel. Pindahkan script itu ke command window, anda akan memperoleh hasil berikut ini:

Ketika hasil diketik (result) akan memunculkan deretan nama yang sama dengan no urutnya. Berikutnya adalah bagaimana cara untuk mencari nama yang nama keluarganya sama, karena terkadang dalam literatur ilmiah, misalnya ayman kaheel, terkadang ditulis a. kaheel, sehingga jika digunakan cara di atas akan tidak berhasil. Selamat mencoba !

Mencari Kata dalam Text dengan Matlab

Matlab selain digunakan untuk perhitungan angka ternyata dapat juga digunakan untuk mengolah kata dalam Text Data Mining (TDM). Singkat saja, di sini kita buat data yang berisi sepuluh nama orang yang akan kita searching.

Kita akan mencari beberapa nama yang ada unsur “abdul”, misalnya, terlebih dahulu, konversi menjadi huruf kecil semua dengan fungsi lower.

Perhatikan, seluruh record menjadi huruf kecil semua, berikutnya kita membuat script yang akan digunakan untuk mencari orang yang ada unsur nama ‘abdul’-nya, kemudian memunculkan kode author beserta nama lengkapnya dalam satu matriks.

Sebelumnya Anda harus memasukkan terlebih dahulu vektor kode author (di sini dengan nama auth1) yang sesuai dengan nama author. Perhatikan cara penggunaan fungsi regular expression yang tersedia di Matlab (regexp).Copy kode tersebut kemudian jalankan di command window:

Berikutnya tugas berat menanti, di sini keywoard untuk mencari sudah tersedia, yakni contohnya ‘abdul’. Bagaimana jika kata kuncinya berdasarkan tiap record. Misalnya kita akan mencari dari sekumpulan nama-nama yang bernama belakang ada yang sama.

Mengimpor Big Data ke Matlab

Jika data berukuran kecil dan sedang, dengan mudah kita mengimport suatu data dari excel, notepad, dan sejenisnya. Tetapi jika berukuran besar akan menjadi masalah jika kita mengimport data dari kedua text editor tersebut. Hal ini terjadi ketika saya akan membuat vektor dan matriks data ke dalam vormat Matlab agar bisa dilakukan text mining. Excel cenderung akan memotong data menjadi 65 ribuan record saja. Sementara notepad memiliki masalah ketika akan dieksport ke Matlab (Mat).

Langkah yang cukup akurat adalah menggunakan sistem manajemen basis data, misalnya Microsoft Access. Langkah pertama adalah membuka file data tersebut (misalnya berformat xls, atau csv) ke microsoft access untuk dilakukan pemilahan menjadi kolom-kolom yang sesuai jika data yang ada berbeda jenisnya. Jangan lupa menghilangkan Field Name dengan mengisi check pada kotak isian seperti gambar di bawah ini.

Berikutnya setelah dipilah-pilah, data kita eksport ke format text yang ada di menu Micorosft Access. Tunggu hingga selesai karena jika datanya berukuran besar (sekitar 1 giga) akan memakan waktu yang lama.

Jika selesai maka secara otomatis akan berganti menjadi pesan yang ada di access.

Berikutnya tinggal kita tarik data tersebut dengan Matlab. Buka matlab anda, dan tekan tombol impor yang ada di jendela Workspace (mudah2an tidak tersembunyi). Cari datanya, lalu lakukan proses impor dengan mudah.

Tekan tombol yang bertanda panah ke bawah dilanjutkan dengan mencari file txt yang telah disimpan sebelumnya. Untuk gampangnya, simpanlah di current directory Anda.

 

Berikutnya tinggal mengklik tombol Next hingga tombol finish muncul. Tampak di workspace variabel yang telah Anda masukan. Coba iseng jalankan, jangan semua record dilihat, takutnya matlab Anda hang.

Baru kali ini saya mengalami mengolah file matlab (MAT) hingga kehabisan sumber daya RAM.