• Home
  • About
  • Archives
  • Contact
  • Projects
Logo

  • Data Science
  • Machine Learning
  • Research
  • Tutorial

Membuat Model Word2Vec Menggunakan Library Python Gensim | Catatan Penelitian #6

3 December 2020
Rifqi Fauzi Rahmadzani
1 Comment
  • Email
  • Facebook
  • Twitter
  • Pinterest
  • LinkedIn
3 December 2020
1 Comment

Model deep learning tidak dapat langsung melakukan pemrosesan data dalam bentuk teks. Oleh karena itu data perlu diolah ke dalam bentuk integer (berupa matriks ataupun vektor), proses ini bisa disebut word embedding. Apa yang dilakukan word embedding adalah memproyeksikan setiap kata ke suatu ruang dan membuat kata-kata dengan makna yang mirip akan berdekatan satu sama lain dalam ruang tersebut.

Terdapat beberapa teknik pembuatan pre-trained word embedding salah satunya adalah menggunakan metode Word2Vec. Sebelumnya juga sudah saya jelaskan bagaimana prinsip kerja Word2Vec. Kali ini saya ingin melakukan ekperimen pembuatan Word2Vec dengan memanfaatkan data korpus Wikipedia Bahasa Indonesia.

Kalian dapat mengunduh data korpus Wikipedia Bahasa Indonesia melalui link berikut https://dumps.wikimedia.org/idwiki/latest/. Cari file dengan nama “idwiki-latest-pages-articles.xml.bz2”. Data korpus tersebut setiap waktunya mengalami peningkatan. Sekitar satu tahun lalu (Agustus 2019) terdapat 406855 kosa kata dengan ukuran 512 MB.

Data korpus tersebut masih menggunakan format XML sehingga perlu di olah ke dalam bentuk teks. Untungnya library Gensim sudah menyediakan teknik pra poses ini. Untuk mengkonversi format tersebut kalian dapat melakukannya dengan menggunakan kode berikut.

from __future__ import print_function
 
# Ignore warnings dari gensim
import warnings
warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim')
 
import logging
import os.path
import sys
 
from gensim.corpora import WikiCorpus
 
program = os.path.basename(sys.argv[0])
logger = logging.getLogger(program)
 
logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
logging.root.setLevel(level=logging.INFO)
logger.info("running %s" % ' '.join(sys.argv))
 
namaFileInput = "idwiki-latest-pages-articles.xml.bz2"
namaFileOutput = "wiki.id.text"
 
space = " "
i = 0
 
# Write file ke variabel namaFileOutput encoder utf-8
output = open(namaFileOutput, 'w', encoding='utf-8')
 
# lower=False: huruf kecil dan besar dibedakan
wiki = WikiCorpus(namaFileInput, lemmatize=False, dictionary={}, lower=False)
for text in wiki.get_texts():
    output.write(' '.join(text) + '\n')
    i = i + 1
    if i % 10000 == 0:
        logger.info("Saved " + str(i) + " articles")
 
output.close()
logger.info("Finished Saved " + str(i) + " articles")

Terlihat dari kode di atas line 13-18 menampilkan output proses pada setiap iterasi, output ini nanti akan menampilkan berapa jumlah artikel yang ada dalam data korpus. Line 20-21 nama file input dan ouput. Pada line 30-35 inilah proses konversi data dilakukan. Dari kode di atas akan menghasilkan output file dari rangkaian beberapa artikel, di mana satu barisnya mewakili satu artikel.

Setelah data berhasil terkonversi, selanjutnya dilakukan training Word2Vec menggunakan kode berikut.

import multiprocessing
import logging
import os.path
import sys
import multiprocessing
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
 
program = os.path.basename(sys.argv[0])
logger = logging.getLogger(program)
 
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s')
logging.root.setLevel(level=logging.INFO)
logger.info("running %s" % ' '.join(sys.argv))
 
namaFileInput = "wiki.id.text"
namaFileOutput = "w2vec_wiki_id300_0.txt"
 
 
# size 300 = 300 dimensi vektor, window 10 = 10 pengaruh kata disekitarnya, min_count 5 = kata-kata yang muncul < 5 kali akan dikeluarkan dari kosakata dan diabaikan selama pelatihan, sg 0 = cbow / sg 1 = skip gram 
model = Word2Vec(LineSentence(namaFileInput), size=300, window=10, min_count=5, sg=0, workers=multiprocessing.cpu_count())
 
# trim unneeded model memory = use (much) less RAM
model.init_sims(replace=True)
model.wv.save_word2vec_format(namaFileOutput, binary=False)

Line 21 merupakan variabel yang digunakan untuk melakukan proses training model Word2Vec. Terdapat beberapa parameter diantaranya:

size: Ukuran dimensi vector yang mewakili setiap token atau kata. Jika kalian memiliki data yang terbatas, nilai size yang digunakan sebaiknya lebih kecil karena akan mempengaruhi kata unik di sekitarnya. Namun, jika memiliki banyak data kalian dapat bereksperimen dengan berbagai ukuran.

window: Jarak maksimum antara kata target dengan kata di sekitarnya. Jika nilai window yang kalian gunakan besar, maka terdapat banyak kata terkait disekitarnya (baik di posisi kiri dan kanan dari kata konteks). Secara teori, jika window lebih kecil akan memberikan istilah yang lebih spesifik terhadap suatu konteks kata.

min_count: Frekuensi minimal jumlah kata. Model akan mengabaikan kata-kata yang tidak memenuhi nilai min_count. Kata yang jarang muncul biasanya tidak terlalu penting, jadi lebih baik untuk dihilangkan. Parameter ini mungkin lebih berpengaruh pada effisiensi penggunaan memory dan ukuran file model.

sg: 0 untuk arsitektur Word2Vec CBOW dan 1 untuk arsitektur Word2Vec Skip-gram.

workers: Berapa banyak threads yang digunakan untuk melakukan multiprocessing.

Model yang sudah disimpan dapat dilakukan skenario penggunaannya sebagaimana pada kode di bawah ini untuk melihat kedekatan hubungan antara kata.

import gensim
 
namaFileModel = "w2vec_wiki_id300_0.txt"
model = gensim.models.Word2Vec.load(namaFileModel)
sim = model.wv.most_similar("Jakarta")
print("10 kata terdekat dari Jakarta:{}".format(sim))
sim = model.wv.most_similar("Bandung")
print("10 kata terdekat dari Bandung:{}".format(sim))
 
sim = model.wv.similarity("Yogyakarta", "Surakarta")
print("Kedekatan Yogyakarta-Surakarta: {}".format(sim))
sim = model.wv.similarity("Yogyakarta", "Semarang")
print("Kedekatan Yogyakarta-Semarang: {}".format(sim))
 
sim = model.wv.most_similar_cosmul(positive=['minuman', 'rendang'], negative=['makanan'])
print("makanan-rendang, minuman-?: {}".format(sim))
sim = model.wv.most_similar_cosmul(positive=['mobil', 'honda'], negative=['motor'])
print("motor-honda, mobil-?: {}".format(sim))

Hasil

10 kata terdekat dari Jakarta:[('Warteg', 0.6514910459518433), ('JAKARTA', 0.5866261720657349), ('Ciputat', 0.5817912817001343), ('Surabaya', 0.5806328058242798), ('Cilandak', 0.5583517551422119), ('Palmerah', 0.556037425994873), ('Bekasi', 0.5506299734115601), ('jakarta', 0.5488458275794983), ('Cikini', 0.5444321036338806), ('Menteng', 0.5390129685401917)]
10 kata terdekat dari Bandung:[('Bogor', 0.6902531385421753), ('Cimahi', 0.6482627987861633), ('Tasikmalaya', 0.6106495261192322), ('Cianjur', 0.5842227935791016), ('Sukabumi', 0.5713083744049072), ('Jatinangor', 0.5694148540496826), ('Garut', 0.567562460899353), ('Purwakarta', 0.5668126940727234), ('Lembang', 0.5627188682556152), ('UPI', 0.5550675988197327)]
Kedekatan Yogyakarta-Surakarta: 0.7874032258987427
Kedekatan Yogyakarta-Semarang: 0.6559081673622131
makanan-rendang, minuman-?: [('Minuman', 0.9032918810844421), ('Saus', 0.8687810897827148), ('nipis', 0.865699827671051), ('jenever', 0.864349901676178), ('berkarbonasi', 0.8580542206764221), ('gin', 0.8572733402252197), ('martabak', 0.8570858836174011), ('lemon', 0.8567835688591003), ('kari', 0.8559882044792175), ('Resep', 0.8556948900222778)]
mobil-toyota, motor-?: [('touring', 0.8371444940567017), ('coupe', 0.8366193771362305), ('Impreza', 0.8290123343467712), ('sedan', 0.8275156617164612), ('SUV', 0.8263775110244751), ('MPV', 0.8219144344329834), ('VW', 0.8196789026260376), ('sport', 0.8190094828605652), ('Chevrolet', 0.8185854554176331), ('Subaru', 0.8164924383163452)]
  • Email
  • Facebook
  • Twitter
  • Pinterest
  • LinkedIn
Previous

Cara Kerja Word Embedding Word2Vec | Catatan Penelitian #5

Next

Cara Kerja Word Embedding GloVe | Catatan Penelitian #7

The Author

Rifqi Fauzi Rahmadzani

Being someone who is able to contend with my interest and to learn new imaginative, intuitive, and communicative things. The greatest hope of my ability can be beneficial to others.

  • facebook
  • twitter
  • instagram
  • linkedin

1 Comment

  • Rizki Aditia
    2 years ago
    Reply

    buat yg menggunakan gensim 4 bisa disesuaikan kodenya, bisa lihat di: https://github.com/RaRe-Technologies/gensim/wiki/Migrating-from-Gensim-3.x-to-4

Leave A Comment Cancel reply

author image

The Author

Rifqi Fauzi Rahmadzani

  • facebook
  • twitter
  • instagram

Being someone who is able to contend with my interest and to learn new imaginative, intuitive, and communicative things. The greatest hope of my ability can be beneficial to others.

Logo

© 2021 Rifqifai.com. Developed by Rifqi Fauzi Rahmadzani