Topic Modeling

This tutorial is available as an IPython notebook at Malaya/example/topic-modeling.

[ ]:
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()

You can get this file Malaya/tests. This csv already stemmed.

Load Transformer

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

[4]:
electra = malaya.transformer.load(model = 'electra')
attention = malaya.topic_model.transformer(corpus, n_topics = 10, vectorizer = electra)
INFO:tensorflow:Restoring parameters from /Users/huseinzolkepli/Malaya/electra-model/base/electra-base/model.ckpt

Get topics

[5]:
attention.top_topics(5, top_n = 10, return_df = True)
[5]:
topic 0 topic 1 topic 2 topic 3 topic 4
0 kwsp negara umno menteri projek
1 mahkamah malaysia parti perdana hutang
2 dana rakyat pas bahasa malaysia
3 syarikat pengalaman kerajaan perdana menteri mdb
4 bon berkongsi ros kerajaan kementerian
5 dakwaan kerajaan perlembagaan laporan rumah
6 kelulusan berkembang keputusan isu kerajaan
7 bank parti menteri pelan gembira
8 jppm kemudahan bersatu pemilihan pendekatan
9 kenyataan rakyat malaysia isu penjelasan gembira projek

Get topics as string

[6]:
attention.get_topics(10)
[6]:
[(0, 'kwsp mahkamah dana syarikat bon dakwaan kelulusan bank jppm kenyataan'),
 (1,
  'negara malaysia rakyat pengalaman berkongsi kerajaan berkembang parti kemudahan rakyat malaysia'),
 (2, 'umno parti pas kerajaan ros perlembagaan keputusan menteri bersatu isu'),
 (3,
  'menteri perdana bahasa perdana menteri kerajaan laporan isu pelan pemilihan penjelasan'),
 (4,
  'projek hutang malaysia mdb kementerian rumah kerajaan gembira pendekatan gembira projek'),
 (5,
  'bayar rakyat selesaikan raya pilihan raya ppsmi bincang bayar tutup mca jppm'),
 (6, 'kapal malaysia asli low jho jho low negara wang berita islam'),
 (7,
  'undi parti pimpinan pakatan sokong pucuk suara pucuk suara bertanding suara pucuk pimpinan'),
 (8,
  'pertumbuhan hutang harga pendapatan produk malaysia kaya kenaikan kumpulan peningkatan'),
 (9,
  'lancar rakyat teknikal berjalan lancar kerja buku bahasa berjalan catatan berlaku')]
[7]:
attention = malaya.topic_model.transformer(corpus, n_topics = 10, vectorizer = electra)
[8]:
attention.top_topics(5, top_n = 10, return_df = True)
[8]:
topic 0 topic 1 topic 2 topic 3 topic 4
0 kwsp negara umno menteri projek
1 mahkamah malaysia parti perdana hutang
2 dana rakyat pas bahasa malaysia
3 syarikat pengalaman kerajaan perdana menteri mdb
4 bon berkongsi ros kerajaan kementerian
5 dakwaan kerajaan perlembagaan laporan rumah
6 kelulusan berkembang keputusan isu kerajaan
7 bank parti menteri pelan gembira
8 jppm kemudahan bersatu pemilihan pendekatan
9 kenyataan rakyat malaysia isu penjelasan gembira projek
[9]:
attention.get_topics(10)
[9]:
[(0, 'kwsp mahkamah dana syarikat bon dakwaan kelulusan bank jppm kenyataan'),
 (1,
  'negara malaysia rakyat pengalaman berkongsi kerajaan berkembang parti kemudahan rakyat malaysia'),
 (2, 'umno parti pas kerajaan ros perlembagaan keputusan menteri bersatu isu'),
 (3,
  'menteri perdana bahasa perdana menteri kerajaan laporan isu pelan pemilihan penjelasan'),
 (4,
  'projek hutang malaysia mdb kementerian rumah kerajaan gembira pendekatan gembira projek'),
 (5,
  'bayar rakyat selesaikan raya pilihan raya ppsmi bincang bayar tutup mca jppm'),
 (6, 'kapal malaysia asli low jho jho low negara wang berita islam'),
 (7,
  'undi parti pimpinan pakatan sokong pucuk suara pucuk suara bertanding suara pucuk pimpinan'),
 (8,
  'pertumbuhan hutang harga pendapatan produk malaysia kaya kenaikan kumpulan peningkatan'),
 (9,
  'lancar rakyat teknikal berjalan lancar kerja buku bahasa berjalan catatan berlaku')]

Train LDA2Vec model

[10]:
lda2vec = malaya.topic_model.lda2vec(corpus, 10, vectorizer = 'skip-gram', skip = 4)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-10-66f0b8594b03> in <module>
----> 1 lda2vec = malaya.topic_model.lda2vec(corpus, 10, vectorizer = 'skip-gram', skip = 4)

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/herpetologist/__init__.py in check(*args, **kwargs)
     98                 nested_check(v, p)
     99
--> 100         return func(*args, **kwargs)
    101
    102     return check

~/Documents/Malaya/malaya/topic_model.py in lda2vec(corpus, n_topics, max_df, min_df, ngram, cleaning, vectorizer, stopwords, window_size, embedding_size, epoch, switch_loss, skip, **kwargs)
    706     for text in corpus:
    707         text_clean.append(
--> 708             ' '.join([word for word in text.split() if word not in stop_words])
    709         )
    710     tf_vectorizer.fit(text_clean)

~/Documents/Malaya/malaya/topic_model.py in <listcomp>(.0)
    706     for text in corpus:
    707         text_clean.append(
--> 708             ' '.join([word for word in text.split() if word not in stop_words])
    709         )
    710     tf_vectorizer.fit(text_clean)

NameError: name 'stop_words' is not defined

Get topics

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

[10]:
lda2vec.top_topics(5, top_n = 10, return_df = True)
[10]:
topic 0 topic 1 topic 2 topic 3 topic 4
0 alat uji ekonomi negara bangun jangka pendek
1 hak asasi manusia pilih umno sebarang allahyarham nik seni
2 hakim indonesia malaysia kongsi timbang wajar nyata teknikal industri
3 rangka program teknikal alat menteri perdana didik latih teknikal individu
4 umno tangguh pilih kwsp syarikat terbang sedia kongsi sedia kongsi
5 sedia malaysia alam tawar daftar ph bidang ancang ekonomi milik
6 sosial negara bangun mab bawa laku tingkat selamat
7 hutang hutang hakim ekonomi wang tani timbang wajar bantu negara negara
8 menang jawat ahli parti perdana seri najib malaysia alam bangun
9 bank malaysia kongsi swasta ancang ekonomi global

Important sentences based on topics

[11]:
lda2vec.get_sentences(5)
[11]:
['mab mahukan bukti transaksi laku black and white',
 'insya bawa guru allahyarham nik abdul aziz nik mat nampak',
 'beim bekerjasama promosi pelihara bina komuniti niaga rakyat malaysia utuh tatakelakuan etika niaga contoh sihat',
 'jho low anak kapal tahan air indonesia',
 'menang kacau']

Get topics as string

[12]:
lda2vec.get_topics(10)
[12]:
[(0,
  'alat hak asasi manusia hakim rangka program teknikal umno tangguh pilih sedia malaysia alam sosial negara bangun hutang hutang menang bank'),
 (1,
  'uji pilih umno indonesia alat kwsp tawar mab hakim jawat malaysia kongsi'),
 (2,
  'ekonomi negara bangun sebarang malaysia kongsi menteri perdana syarikat terbang daftar ph bawa ekonomi wang tani ahli parti swasta'),
 (3,
  'jangka allahyarham nik timbang wajar nyata didik latih teknikal sedia kongsi bidang ancang ekonomi laku tingkat timbang wajar perdana seri najib ancang ekonomi'),
 (4,
  'pendek seni teknikal industri individu sedia kongsi milik selamat bantu negara negara malaysia alam bangun global'),
 (5,
  'maklum malaysia sedia muka alat ekonomi sosial bangun sedia alam bangun sedia malaysia alam pindah kampung kongsi bangun kongsi bangun ekonomi'),
 (6,
  'hakim malaysia kongsi bidang ancang ekonomi awam mab wang dagang didik rasmi sedia malaysia ekonomi sosial didik proses ajar'),
 (7,
  'pilih umno maklum ekonomi sosial bangun bersih gaji hakim indonesia kongsi alam negara mab suasana'),
 (8,
  'hak asasi manusia latih teknikal malaysia kongsi syarikat swasta mca malaysia sedia nik muka negara bangun lantik'),
 (9,
  'laksana nhrap pilih umno malaysia sedia pimpin negara bersih fasal lembaga khidmat wajar tulis alam bangun negara maklum')]

Visualize topics

This will initiate pyLDAvis object, to understand pyLDAvis more, read at https://github.com/bmabey/pyLDAvis.

[13]:
lda2vec.visualize_topics(notebook_mode = True)
/usr/local/lib/python3.7/site-packages/past/types/oldstr.py:5: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will stop working
  from collections import Iterable
[13]:

Train LDA model

[8]:
lda = malaya.topic_model.lda(
    corpus,
    10,
    vectorizer = 'skip-gram',
    ngram = (1, 4),
    skip = 3,
)
[9]:
lda.top_topics(5, top_n = 10, return_df = True)
[9]:
topic 0 topic 1 topic 2 topic 3 topic 4
0 malaysia projek negara pembangunannya negara selatan ahli
1 asli menteri negara bidang berkongsi pengalaman negara selatan bersatu
2 berita negara membantu negara perancangan pengalaman negara selatan sumber
3 kementerian pilihan negara bidang perancangan ekonomi pengalaman pembangunannya negara selatan politik
4 nilai pilihan raya negara bidang ekonomi negara selatan awam
5 kapal raya negara bidang ekonomi kewangan berkongsi pembangunannya negara selatan ros
6 rakyat kerajaan negara perancangan ekonomi kewangan negara umno
7 low perdana menteri negara perancangan ekonomi bahasa kegiatan
8 jho perdana negara perancangan malaysia kegiatan kehidupan penduduk
9 jho low najib negara bidang perancangan pengalaman kegiatan penduduk

Important sentences based on topics

[10]:
lda.get_sentences(5)
[10]:
['berjaya tawan putrajaya pru cadangkan ph melantik asli timbalan menteri asli ketua lembaga baharu menggantikan jakoa bertanggungjawab pelopor meningkatkan pembangunan arus perdana masyarakat asli',
 'menyokong penuh permintaan menghapuskan jakoa menggantikannya badan diketuai asli pelopor usaha penambahbaikan kehidupan asli pembangunan arus perdana malaysia',
 'rakyat malaysia berfikiran waras mahathir memulakan serangan berita palsu mdb salah bilion hilang dibuktikan berulang kali kenyataan salah',
 'teras kewajiban antarabangsa menyenaraikan komitmen malaysia instrumen instrumen antarabangsa berkaitan hak asasi manusia',
 'beim bekerjasama mempromosi memelihara membina komuniti perniagaan rakyat malaysia utuh mengikut tatakelakuan etika perniagaan contoh sihat']

Get topics

[11]:
lda.get_topics(10)
[11]:
[(0, 'malaysia asli berita kementerian nilai kapal rakyat low jho jho low'),
 (1,
  'projek menteri negara pilihan pilihan raya raya kerajaan perdana menteri perdana najib'),
 (2,
  'negara negara bidang membantu negara perancangan negara bidang perancangan ekonomi negara bidang ekonomi negara bidang ekonomi kewangan negara perancangan ekonomi kewangan negara perancangan ekonomi negara perancangan negara bidang perancangan'),
 (3,
  'pembangunannya negara selatan berkongsi pengalaman negara selatan pengalaman negara selatan pengalaman pembangunannya negara selatan negara selatan berkongsi pembangunannya negara selatan negara bahasa malaysia pengalaman'),
 (4,
  'ahli bersatu sumber politik awam ros umno kegiatan kegiatan kehidupan penduduk kegiatan penduduk'),
 (5,
  'undi doj tuntutan sivil doj sivil doj mdb meningkatkan sukan tuntutan tuntutan doj tuntutan sivil'),
 (6,
  'parti rakyat keputusan negara malaysia dasar kepimpinan ros kelulusan rakyat malaysia'),
 (7,
  'pertumbuhan kerajaan malaysia pendapatan harga masyarakat perniagaan peningkatan kerja berjalan'),
 (8, 'isu umno kerajaan wang status pimpinan negara ahli mdb tindakan'),
 (9,
  'hutang negara malaysia tempoh pengalaman tempoh hutang hutang hutang berkongsi membangunkan strategi')]

Visualize topics

[7]:
lda.visualize_topics(notebook_mode = True)
/usr/local/lib/python3.7/site-packages/past/types/oldstr.py:5: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will stop working
  from collections import Iterable
[7]:

Train NMF model

[12]:
nmf = malaya.topic_model.nmf(corpus,10)
nmf.top_topics(5, top_n = 10, return_df = True)
[12]:
topic 0 topic 1 topic 2 topic 3 topic 4
0 negara negara mdb menteri rakyat
1 malaysia kewangan perniagaan perdana malaysia
2 pengalaman perancangan doj perdana menteri negara
3 berkongsi maju low seri rakyat malaysia
4 berkongsi pengalaman bidang jho najib kepimpinan
5 selatan latihan urusan razak kepimpinan negara
6 program industri urusan perniagaan seri najib maklumat
7 kerjasama membantu jho low seri najib razak berkaitan
8 sosial pendidikan tuntutan najib razak berkongsi maklumat
9 ekonomi ekonomi sivil menteri seri pandangan
[13]:
nmf.get_sentences(5)
[13]:
['bersedia berkongsi pengalaman pengetahuan pembangunan ekonomi sosial negara membangun rangka program kerjasama teknikal malaysia mtcp kesediaan malaysia berkongsi pengalaman pembangunannya negara negara selatan selatan',
 'bersedia berkongsi pengalaman pengetahuan pembangunan ekonomi sosial negara membangun rangka program kerjasama teknikal malaysia mtcp kesediaan malaysia berkongsi pengalaman pembangunannya negara negara selatan selatan',
 'mou memorandum persefahaman arab saudi bidang keselamatan berkongsi pengalaman kepakaran malaysia deradikalisasi pengganas daesh',
 'negara perjanjian kerjasama bidang keselamatan lawatan mengukuhkan hubungan hala malaysia arab saudi',
 'kali berkongsi maklumat pelbagai perkhidmatan pembiayaan program tersedia usahawan wanita iks sabah perkongsian idea pengalaman aspirasi mempromosi produk peringkat luas']
[14]:
nmf.get_topics(10)
[14]:
[(0,
  'negara malaysia pengalaman berkongsi berkongsi pengalaman selatan program kerjasama sosial ekonomi'),
 (1,
  'negara kewangan perancangan maju bidang latihan industri membantu pendidikan ekonomi'),
 (2,
  'mdb perniagaan doj low jho urusan urusan perniagaan jho low tuntutan sivil'),
 (3,
  'menteri perdana perdana menteri seri najib razak seri najib seri najib razak najib razak menteri seri'),
 (4,
  'rakyat malaysia negara rakyat malaysia kepimpinan kepimpinan negara maklumat berkaitan berkongsi maklumat pandangan'),
 (5,
  'parti umno pemilihan perlembagaan keputusan pemilihan parti melebihi perlembagaan umno fasal perlembagaan umno fasal perlembagaan'),
 (6,
  'malaysia pengalaman bandar kawasan kawasan bandar berkongsi negara berkongsi pengalaman membangunkan peranan berkongsi'),
 (7,
  'projek hutang syarikat swasta indonesia sewa kewangan mdb diselesaikan projek projek'),
 (8,
  'kerajaan meningkatkan bidang pendidikan proses pembelajaran kemajuan pendidikan proses pembelajaran bidang pendidikan bidang pendidikan proses'),
 (9,
  'asli masyarakat jakoa pembangunan pembangunan arus pembangunan arus perdana pelopor arus arus perdana perdana')]

Train LSA model

[15]:
lsa = malaya.topic_model.lsa(corpus,10)
lsa.top_topics(5, top_n = 10, return_df = True)
[15]:
topic 0 topic 1 topic 2 topic 3 topic 4
0 negara negara mdb mdb rakyat
1 malaysia kewangan perniagaan doj malaysia
2 berkongsi pendidikan menteri perniagaan rakyat malaysia
3 pengalaman bidang doj jho kepimpinan
4 berkongsi pengalaman perancangan malaysia urusan negara
5 selatan maju low urusan perniagaan kepimpinan negara
6 ekonomi latihan jho jho low bandar
7 negara membangun membantu urusan tuntutan kawasan
8 membangun industri urusan perniagaan tuntutan sivil kawasan bandar
9 teknikal pertanian pendidikan latihan tuntutan low membangunkan
[16]:
lsa.get_sentences(5)
[16]:
['bersedia berkongsi pengalaman pengetahuan pembangunan ekonomi sosial negara membangun rangka program kerjasama teknikal malaysia mtcp kesediaan malaysia berkongsi pengalaman pembangunannya negara negara selatan selatan',
 'bersedia berkongsi pengalaman pengetahuan pembangunan ekonomi sosial negara membangun rangka program kerjasama teknikal malaysia mtcp kesediaan malaysia berkongsi pengalaman pembangunannya negara negara selatan selatan',
 'negara membangun malaysia memainkan peranan berkongsi pengalaman kemahirannya membangunkan kawasan bandar',
 'negara membangun malaysia memainkan peranan berkongsi pengalaman kemahirannya membangunkan kawasan bandar',
 'membantu negara negara maju bidang perancangan ekonomi kewangan perdagangan pertanian pendidikan latihan teknikal industri diplomasi']
[17]:
lsa.get_topics(10)
[17]:
[(0,
  'negara malaysia berkongsi pengalaman berkongsi pengalaman selatan ekonomi negara membangun membangun teknikal'),
 (1,
  'negara kewangan pendidikan bidang perancangan maju latihan membantu industri pertanian pendidikan latihan'),
 (2,
  'mdb perniagaan menteri doj malaysia low jho urusan urusan perniagaan tuntutan'),
 (3,
  'mdb doj perniagaan jho urusan urusan perniagaan jho low tuntutan tuntutan sivil low'),
 (4,
  'rakyat malaysia rakyat malaysia kepimpinan negara kepimpinan negara bandar kawasan kawasan bandar membangunkan'),
 (5,
  'parti umno pemilihan perlembagaan pemilihan parti melebihi keputusan fasal perlembagaan fasal fasal perlembagaan umno'),
 (6,
  'parti kawasan bandar kawasan bandar umno pengalaman kemahirannya memainkan peranan berkongsi kemahirannya membangunkan membangunkan kawasan bandar membangunkan kawasan'),
 (7,
  'projek hutang syarikat kerajaan swasta indonesia sewa projek projek kewangan diselesaikan'),
 (8,
  'kerajaan asli meningkatkan proses bidang pembelajaran pendidikan kemajuan proses pembelajaran pendidikan proses pembelajaran'),
 (9,
  'asli masyarakat jakoa pembangunan arus pelopor pembangunan arus pembangunan arus perdana arus perdana masyarakat asli')]
[ ]: