Word2Vec Wikipedia Bahasa Indonesia dengan Python Gensim

Update: posting tentang Glove (dalam beberapa task Glove lebih baik kinerjanya)

Sebelumnya saya sudah mengaplikasikan word2vec untuk wikipedia Bahasa Indonesia dengan lib DeepLearning4J.  Sekarang saya mau mencoba dengan  Python Gensim   untuk eksperimen NER yang saya lakukan sebelumnya dan nanti untuk task-task lain.

Download versi terakhir data Wikipedia Bahasa Indonesia di https://dumps.wikimedia.org/idwiki/latest/. Cari yang bernama “idwiki-latest-pages-articles.xml.bz2” Ternyata setelah dua tahun, sudah naik ukurannya dari 300anMB ke 450MB.

Data wiki tersebut berbentuk XML, untungnya, Gensim sudah menyediakan  fasilitas untuk mentrain data wikipedia 🙂 Tidak perlu lagi repot-repot melakukan praproses. Berikut code-nya (diambil dari http://textminingonline.com/training-word2vec-model-on-english-wikipedia-by-gensim dengan sedikit modifikasi, soalnya error saat saya coba)

from __future__ import print_function

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.case.text"

space = " "
i = 0

output = open(namaFileOutput, 'w')

# 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")

Hasil dari program di atas adalah satu file besar yang berisi gabungan dari seluruh artikel. Satu artikel menjadi satu baris.

Setelah itu pembuatan model:

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.case.text"
namaFileOutput = "w2vec_wiki_id_case"

model = Word2Vec(LineSentence(namaFileInput), size=400, window=5, min_count=5, workers=multiprocessing.cpu_count())

# trim unneeded model memory = use (much) less RAM
model.init_sims(replace=True)
model.save(namaFileOutput)

Total praproses dan training hanya memerlukan waktu sekitar 20 menit. Model berbentuk 3 file dengan ukuran total 3GB.

Berikut contoh penggunaannya, saya lihat sekilas lebih bagus daripada model yang saya buat sebelumnya.

namaFileModel = "w2vec_wiki_id_case"
model = gensim.models.Word2Vec.load(namaFileModel)
hasil = model.most_similar("Bandung")
print("Bandung:{}".format(hasil))

hasil = model.most_similar("tempo")
print("tempo:{}".format(hasil))
hasil = model.most_similar("Tempo")
print("Tempo:{}".format(hasil))
hasil = model.most_similar("Soekarno")
print("Soekarno:{}".format(hasil))

sim = model.similarity("bakso", "nasi")
print("Kedekatan bakso-nasi: {}".format(sim))
sim = model.similarity("bakso", "pecel")
print("Kedekatan bakso-pecel: {}".format(sim))
sim = model.similarity("bakso", "mobil")
print("Kedekatan bakso-mobil: {}".format(sim))

hasil = model.most_similar_cosmul(positive=['perempuan', 'raja'], negative=['pria'])
print("pria-raja, perempuan-?: {}".format(hasil))

hasil = model.most_similar_cosmul(positive=['perempuan', 'raja'], negative=['lelaki'])
print("lelaki-raja, perempuan-?:{}".format(hasil))

hasil = model.most_similar_cosmul(positive=['minuman', 'mangga'], negative=['buah'])
print("buah-mangga, minuman-?:{}".format(hasil))

Hasilnya seperti ini:

Bandung:[('Bogor', 0.7126705646514893), ('Cimahi', 0.6414915323257446), ('Malang', 0.6207837462425232), ('Tasikmalaya', 0.613646924495697), ('Sukabumi', 0.6094871163368225), ('Cianjur', 0.5948120355606079), ('Purwakarta', 0.5937869548797607), ('Surabaya', 0.5675963759422302), ('Semarang', 0.5648865699768066), ('Garut', 0.5606454014778137)]
tempo:[('temponya', 0.5657634735107422), ('ketukan', 0.5246042609214783), ('irama', 0.4841456115245819), ('bertempo', 0.48334914445877075), ('beat', 0.4792878329753876), ('hitungan', 0.4732634723186493), ('nadanya', 0.4489333927631378), ('durasi', 0.4449218511581421), ('melodi', 0.44300010800361633), ('birama', 0.4420506954193115)]
Tempo:[('Gatra', 0.6947425603866577), ('Republika', 0.6929212212562561), ('TEMPO', 0.6797916293144226), ('KOMPAS', 0.6778919100761414), ('DeTik', 0.6597755551338196), ('Doeloe', 0.6481266617774963), ('Interaktif', 0.6416338682174683), ('Tabloid', 0.6330038905143738), ('Sindo', 0.6202648282051086), ('Galamedia', 0.6029475927352905)]
Soekarno:[('Sukarno', 0.813288152217865), ('Soeharto', 0.7391608953475952), ('Megawati', 0.6650642156600952), ('Suharto', 0.6611993908882141), ('Hatta', 0.6327983736991882), ('SBY', 0.6301325559616089), ('Bung', 0.6262293457984924), ('Jokowi', 0.6140671968460083), ('Yudhoyono', 0.5906702876091003), ('Karno', 0.5696855187416077)]
Kedekatan bakso-nasi: 0.7018489840251805
Kedekatan bakso-pecel: 0.8051109496938957
Kedekatan bakso-mobil: 0.23248957716849333
pria-raja, perempuan-?: [('Firaun', 0.8730435967445374), ('Ahas', 0.8643887639045715), ('Yerobeam', 0.8635646104812622), ('menantu', 0.8627196550369263), ('Uruk', 0.8598164319992065), ('Ahasyweros', 0.8586885929107666), ('kerajaan', 0.8582508563995361), ('Yoas', 0.8566167950630188), ('penguasa', 0.8554568290710449), ('rajanya', 0.8552286624908447)]
lelaki-raja, perempuan-?:[('ratu', 0.8525097966194153), ('kerajaan', 0.8269591927528381), ('Firaun', 0.8241982460021973), ('kaisar', 0.8102306723594666), ('firaun', 0.8079080581665039), ('penguasa', 0.8032354116439819), ('Asyur', 0.7912278771400452), ('rajanya', 0.7909599542617798), ('kerajaannya', 0.7896854281425476), ('Salomo', 0.787830650806427)]
buah-mangga, minuman-?:[('Minuman', 0.9949955344200134), ('yoghurt', 0.9938222169876099), ('bir', 0.953018069267273), ('beralkohol', 0.9518982768058777), ('penganan', 0.9509921073913574), ('jahe', 0.9492940306663513), ('camilan', 0.9480324983596802), ('kola', 0.9406602382659912), ('yogurt', 0.9402189254760742), ('soju', 0.9373763203620911)]

Menariknya, Jakarta tidak masuk ke 10 kata yang terdekat dengan Bandung. Tempo dan tempo memperlihatkan pentingnya membedakan huruf besar dan kecil. Kata “bakso” paling dekat dengan “pecel” dibandingkan dengan “nasi” apalagi “mobil”. Untuk analogi klasik man-king;woman-?, ternyata penggunaan kata “pria” dan “lelaki” menghasilkan hasil berbeda.

Iklan

17 tanggapan untuk “Word2Vec Wikipedia Bahasa Indonesia dengan Python Gensim”

  1. Bagaimana word2vec digunakan pada analisis sentimen ya pak? Dan untuk analisis sentimen, sebaiknya menggunakan word2vec atau doc2vec ya pak? Terima kasih pak.

  2. pak, untuk analisis untuk word2vec apakah kita mengetik semua yang mau diuji kedekatan dan kesamaan nya di coding?
    atau kita bisa menggunakan test set?
    jika bapak punya test set untuk analisis word2vec, minta tolong pak bagi link nya.
    terima kasih

  3. dan saya tidak bisa bisa train datanya. selalu
    TypeError: sequence item 0: expected a bytes-like object, str found
    itu kenapa ya pak?

  4. Saya sudah mencoba melakukan training wiki sebagaimana yang sudah dijelaskan pada artikel bapak di atas. Namun apakah model tersebut dapat di load menggunakan ‘Keyedvectors’.

    Saya coba load model tersebut menggunakan ‘Keyedvectors’ sebagaimana pada kasus di stackoverflow.com/questions/49710537/pytorch-gensim-how-to-load-pre-trained-word-embeddings namun selalu gagal.

    Ataukah mungkin dari bapak ada rujukan untuk implementasi sebagai pretrained model dalam pytorch.
    Terima kasih.

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout /  Ubah )

Foto Google

You are commenting using your Google account. Logout /  Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout /  Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout /  Ubah )

Connecting to %s