Topic Modelling

Note

This tutorial is available as an IPython notebook here.

import pandas as pd
import malaya
df = pd.read_csv('tests/02032018.csv',sep=';')
df = df.iloc[3:,1:]
df.columns = ['text','label']
corpus = df.text.tolist()

Load attention model

We can use BERT or XLNET model to build topic modeling for corpus we have, the power of attention!

xlnet = malaya.xlnet.xlnet(model = 'small')
attention = malaya.topic_model.attention(corpus, n_topics = 10, vectorizer = xlnet)
INFO:tensorflow:memory input None
INFO:tensorflow:Use float type <dtype: 'float32'>
INFO:tensorflow:Restoring parameters from /Users/huseinzol/Malaya/xlnet-model/small/xlnet-bahasa-small/model.ckpt

Get topics

attention.top_topics(5, top_n = 10, return_df = True)
topic 0 topic 1 topic 2 topic 3 topic 4
0 kapal jalan tumbuh negara rana
1 raja undi nyata malaysia islam
2 pilih ros putus rakyat hadap
3 tangguh rakyat malaysia projek program
4 jerman bayar parti asli laksana
5 kapal tahan sokong mdb masyarakat terima
6 malaysia laku terima bangun lihat
7 rakyat jalan lancar tutup raja ahli
8 ros lancar mca rakyat malaysia hidup
9 laku teknikal wajar kembang dana

Get topics as string

attention.get_topics(10)
[(0, 'kapal raja pilih tangguh jerman kapal tahan malaysia rakyat ros laku'),
 (1, 'jalan undi ros rakyat bayar sokong laku jalan lancar lancar teknikal'),
 (2, 'tumbuh nyata putus malaysia parti mdb terima tutup mca wajar'),
 (3,
  'negara malaysia rakyat projek asli masyarakat bangun raja rakyat malaysia kembang'),
 (4, 'rana islam hadap program laksana terima lihat ahli hidup dana'),
 (5,
  'menteri perdana perdana menteri isu kena cakap serah malaysia rakyat gembira'),
 (6, 'parti negara politik idea bangun tindak faktor rakyat main umno'),
 (7, 'ambil rana umno putus positif dasar dar raja undi daftar'),
 (8, 'negara wang mdb hutang doj tempoh ekonomi dakwa urus syarikat'),
 (9, 'selesai jppm pilih ambil ppsmi laksana ajar projek pilih raya raya')]

Train LDA2Vec model

lda2vec = malaya.topic_model.lda2vec(corpus, 10, vectorizer = 'skip-gram', skip = 4)
minibatch loop: 100%|██████████| 287/287 [00:02<00:00, 135.60it/s, cost=-7.4e+3, epoch=1]
minibatch loop: 100%|██████████| 287/287 [00:01<00:00, 145.11it/s, cost=-8.01e+3, epoch=2]
minibatch loop: 100%|██████████| 287/287 [00:02<00:00, 143.11it/s, cost=-8.62e+3, epoch=3]
minibatch loop: 100%|██████████| 287/287 [00:01<00:00, 144.70it/s, cost=-9.24e+3, epoch=4]
minibatch loop: 100%|██████████| 287/287 [00:01<00:00, 147.26it/s, cost=-9894.22, epoch=5]
minibatch loop: 100%|██████████| 287/287 [00:01<00:00, 145.32it/s, cost=-1.06e+4, epoch=6]
minibatch loop: 100%|██████████| 287/287 [00:01<00:00, 139.67it/s, cost=-1.13e+4, epoch=7]
minibatch loop: 100%|██████████| 287/287 [00:01<00:00, 148.40it/s, cost=-1.2e+4, epoch=8]
minibatch loop: 100%|██████████| 287/287 [00:01<00:00, 149.87it/s, cost=-1.27e+4, epoch=9]
minibatch loop: 100%|██████████| 287/287 [00:01<00:00, 150.03it/s, cost=-1.33e+4, epoch=10]

Get topics

You able to set to return as Pandas Dataframe or not by using return_df parameter

lda2vec.top_topics(5, top_n = 10, return_df = True)
topic 0 topic 1 topic 2 topic 3 topic 4
0 bidang didik proses bahagian dagang didik latih guru takut
1 kandung gagal projek jalan lancar muda dagang didik latih
2 wang dagang tani alam negara april program kerjasama malaysia tatakelakuan
3 langkah sokong tanding terima tumbuh bahagian
4 laku raja tingkat mahkamah awam ubah program teknikal
5 negara maju ancang alam ekonomi main peran kongsi tatakelakuan pindah kampung baharu
6 dagang didik latih bekal bersih rasmi serang nama
7 kaya negara negara maju gagal awam gagal
8 sivil doj ajar ajar alam ekonomi bahagian ikan
9 raja tingkat maju tani didik teknikal ikan jho low kapal ekonomi dagang

Important sentences based on topics

lda2vec.get_sentences(5)
['teknikal',
 'konon fokus pilih raya',
 'sedia kongsi alam bangun ekonomi sosial negara bangun rangka program kerjasama teknikal malaysia mtcp sedia malaysia kongsi alam bangun negara negara selatan selatan',
 'kerja diploma kerja jawat kerani',
 'niaga masuk niaga digital santan santan terima minat asia hubung aktiviti francais restoran makan asia']

Get topics as string

lda2vec.get_topics(10)
[(0,
  'bidang didik proses kandung wang dagang tani langkah laku raja tingkat negara maju ancang dagang didik latih kaya sivil doj raja tingkat maju'),
 (1,
  'bahagian gagal alam negara sokong mahkamah alam ekonomi bekal bersih negara negara maju ajar ajar tani didik teknikal'),
 (2,
  'dagang didik latih projek jalan lancar april tanding awam main peran kongsi rasmi gagal alam ekonomi ikan'),
 (3,
  'guru muda program kerjasama malaysia terima tumbuh ubah tatakelakuan serang awam bahagian jho low kapal'),
 (4,
  'takut dagang didik latih tatakelakuan bahagian program teknikal pindah kampung baharu nama gagal ikan ekonomi dagang'),
 (5,
  'demokrasi kongsi maklumat main peran tatakelakuan bank seri razak pendek laku raja tingkat alam bangun nama'),
 (6,
  'melayu cina atur teknikal mtcp sedia serang aabar latih teknikal diplomasi ekonomi wajar nyata pengaruh suasana'),
 (7,
  'industri diplomasi kongsi alam bangun rangka sumber baca ekonomi sosial bangun pelopor jppm kukuh bantu teknikal industri diplomasi'),
 (8,
  'berita aabar main peran kongsi sesuai huni menteri najib dagang tani maju bidang fasal alam negara'),
 (9,
  'sebahagian alam ekonomi program teknikal huni takut saudi bahagian bawa nama generasi')]

Visualize topics

lda2vec.visualize_topics(notebook_mode = True)

Train LDA model

lda = malaya.topic_model.lda(corpus,10,stemming=None,vectorizer='skip-gram',ngram=(1,4),skip=3)
/usr/local/lib/python3.6/site-packages/sklearn/decomposition/online_lda.py:536: DeprecationWarning: The default value for 'learning_method' will be changed from 'online' to 'batch' in the release 0.20. This warning was introduced in 0.18.
  DeprecationWarning)

Important sentences based on topics

lda.get_sentences(5)
['bantu negara negara maju bidang ancang ekonomi wang dagang tani didik latih teknikal industri diplomasi',
 'bantu negara negara maju bidang ancang ekonomi wang dagang tani didik latih teknikal industri diplomasi',
 'laku raja tingkat maju bidang didik proses ajar ajar',
 'laku raja tingkat maju bidang didik proses ajar ajar',
 'tolak sebarang percubaan merosak musnah tanah suci jaga tumpu islam']

Get topics

lda.get_topics(10)
[(0,
  'maju bidang ajar ajar maju bidang proses ajar maju proses ajar didik ajar maju bidang didik ajar maju didik ajar tingkat didik proses ajar didik proses ajar bidang proses ajar'),
 (1, 'parti tangguh ros jppm rana nyata pilih daftar umno kelulus'),
 (2,
  'bangun negara selatan alam negara selatan negara selatan alam bangun negara selatan kongsi bangun negara selatan kongsi alam negara selatan bangun kongsi negara alam negara'),
 (3, 'awam terima pilih putus bayar ambil menteri isu politik tindak'),
 (4, 'projek laku asli mdb hutang wang raja selesai malaysia masyarakat'),
 (5,
  'terjemah ambil ilmu bahasa bahasa ilmu kaji ambil langkah langkah bahasa bahasa tunggu'),
 (6,
  'malaysia bangun negara negara malaysia pesawat nyata kawasan bandar kawasan bandar dakwa'),
 (7, 'duduk urus takut giat hidup arab saudi bidang arab saudi pekan nilai'),
 (8,
  'rakyat bahasa rakyat malaysia malaysia niaga negara bahasa ilmu inggeris bahasa inggeris jual'),
 (9,
  'tanggung hutang capai matlamat dunia main negara teknikal silap individu')]

Visualize topics

lda.visualize_topics(notebook_mode = True)

Train NMF model

nmf = malaya.topic_model.nmf(corpus,10)
nmf.top_topics(5, top_n = 10, return_df = True)
topic 0 topic 1 topic 2 topic 3 topic 4
0 negara negara menteri mdb projek
1 bangun wang perdana niaga jual
2 sedia ancang perdana menteri doj syarikat
3 kongsi maju seri urus sewa
4 alam bidang najib low jual syarikat
5 malaysia ekonomi najib razak jho swasta
6 kongsi alam industri razak urus niaga indonesia
7 selatan latih menteri seri jho low tanah
8 kongsi alam bangun dagang menteri seri najib tuntut rana
9 alam bangun didik seri najib razak sivil kena
nmf.get_sentences(5)
['sedia kongsi alam bangun ekonomi sosial negara bangun rangka program kerjasama teknikal malaysia mtcp sedia malaysia kongsi alam bangun negara negara selatan selatan',
 'sedia kongsi alam bangun ekonomi sosial negara bangun rangka program kerjasama teknikal malaysia mtcp sedia malaysia kongsi alam bangun negara negara selatan selatan',
 'kali kongsi maklumat kena pelbagai khidmat biaya program sedia usahawan wanita iks sabah kongsi idea alam aspirasi promosi produk peringkat luas',
 'mou memorandum persefahaman arab saudi bidang selamat kongsi alam pakar malaysia deradikalisasi ganas khusus daesh',
 'terusi bentang bajet raja sedia promosi tingkat mudah lancong negara']
nmf.get_topics(10)
[(0,
  'negara bangun sedia kongsi alam malaysia kongsi alam selatan kongsi alam bangun alam bangun'),
 (1, 'negara wang ancang maju bidang ekonomi industri latih dagang didik'),
 (2,
  'menteri perdana perdana menteri seri najib najib razak razak menteri seri menteri seri najib seri najib razak'),
 (3, 'mdb niaga doj urus low jho urus niaga jho low tuntut sivil'),
 (4,
  'projek jual syarikat sewa jual syarikat swasta indonesia tanah rana kena'),
 (5,
  'rakyat malaysia negara rakyat malaysia pimpin pimpin negara maklumat kait asas pandang'),
 (6,
  'parti umno tangguh pilih lembaga putus jalan tangguh pilih pilih parti tangguh pilih parti'),
 (7, 'ajar raja tingkat laku ajar ajar proses didik bidang maju didik proses'),
 (8,
  'bangun malaysia kawasan alam bangun kawasan main bandar kongsi kongsi alam peran'),
 (9,
  'asli masyarakat jakoa bangun perdana bangun arus perdana pelopor arus arus perdana ganti')]

Train LSA model

lsa = malaya.topic_model.lsa(corpus,10)
lsa.top_topics(5, top_n = 10, return_df = True)
topic 0 topic 1 topic 2 topic 3 topic 4
0 negara negara negara mdb projek
1 bangun wang maju niaga jual
2 malaysia menteri maju bidang doj malaysia
3 kongsi mdb bidang urus raja
4 alam raja teknikal jho syarikat
5 kongsi alam didik didik urus niaga tingkat
6 sedia maju negara negara low ajar
7 selatan bidang tani jho low sewa
8 alam bangun maju bidang negara maju bidang tuntut jual syarikat
9 kongsi alam bangun rakyat tani didik latih tuntut sivil rakyat
lsa.get_sentences(5)
['sedia kongsi alam bangun ekonomi sosial negara bangun rangka program kerjasama teknikal malaysia mtcp sedia malaysia kongsi alam bangun negara negara selatan selatan',
 'sedia kongsi alam bangun ekonomi sosial negara bangun rangka program kerjasama teknikal malaysia mtcp sedia malaysia kongsi alam bangun negara negara selatan selatan',
 'negara bangun malaysia main peran kongsi alam mahir bangun kawasan bandar',
 'negara bangun malaysia main peran kongsi alam mahir bangun kawasan bandar',
 'bantu negara negara maju bidang ancang ekonomi wang dagang tani didik latih teknikal industri diplomasi']
lsa.get_topics(10)
[(0,
  'negara bangun malaysia kongsi alam kongsi alam sedia selatan alam bangun kongsi alam bangun'),
 (1, 'negara wang menteri mdb raja didik maju bidang maju bidang rakyat'),
 (2,
  'negara maju maju bidang bidang teknikal didik negara negara tani negara maju bidang tani didik latih'),
 (3, 'mdb niaga doj urus jho urus niaga low jho low tuntut tuntut sivil'),
 (4,
  'projek jual malaysia raja syarikat tingkat ajar sewa jual syarikat rakyat'),
 (5,
  'parti pilih rakyat tangguh umno pimpin negara malaysia rakyat malaysia tangguh pilih'),
 (6,
  'rakyat malaysia menteri bangun asli perdana kawasan negara bangun kawasan main'),
 (7,
  'ajar tingkat ajar ajar proses raja bidang didik tingkat maju raja tingkat maju laku raja tingkat didik proses'),
 (8,
  'bangun projek bandar kawasan bangun kawasan main mahir peran kongsi alam peran kongsi kawasan bandar'),
 (9,
  'asli masyarakat jakoa bangun arus perdana pelopor ganti arus arus perdana bangun arus masyarakat asli')]