Topic Modeling

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

[1]:
import pandas as pd
import malaya
[2]:
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!

[3]:
electra = malaya.transformer.load(model = 'electra')
attention = malaya.topic_model.transformer(corpus, n_topics = 10, vectorizer = electra)
WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/electra/__init__.py:56: The name tf.placeholder is deprecated. Please use tf.compat.v1.placeholder instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/electra/modeling.py:240: dense (from tensorflow.python.layers.core) is deprecated and will be removed in a future version.
Instructions for updating:
Use keras.layers.Dense instead.
WARNING:tensorflow:From /usr/local/lib/python3.7/site-packages/tensorflow_core/python/layers/core.py:187: Layer.apply (from tensorflow.python.keras.engine.base_layer) is deprecated and will be removed in a future version.
Instructions for updating:
Please use `layer.__call__` method instead.
WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/electra/__init__.py:79: The name tf.variable_scope is deprecated. Please use tf.compat.v1.variable_scope instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/electra/__init__.py:93: The name tf.get_variable is deprecated. Please use tf.compat.v1.get_variable instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/sampling.py:26: where (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.where in 2.0, which has the same broadcast rule as np.where
WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/electra/__init__.py:114: multinomial (from tensorflow.python.ops.random_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use `tf.random.categorical` instead.
WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/electra/__init__.py:117: The name tf.InteractiveSession is deprecated. Please use tf.compat.v1.InteractiveSession instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/electra/__init__.py:118: The name tf.global_variables_initializer is deprecated. Please use tf.compat.v1.global_variables_initializer instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/electra/__init__.py:120: The name tf.get_collection is deprecated. Please use tf.compat.v1.get_collection instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/electra/__init__.py:121: The name tf.GraphKeys is deprecated. Please use tf.compat.v1.GraphKeys instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/electra/__init__.py:127: The name tf.train.Saver is deprecated. Please use tf.compat.v1.train.Saver instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/transformers/electra/__init__.py:129: The name tf.get_default_graph is deprecated. Please use tf.compat.v1.get_default_graph instead.

INFO:tensorflow:Restoring parameters from /Users/huseinzolkepli/Malaya/electra-model/base/electra-base/model.ckpt

Get topics

[4]:
attention.top_topics(5, top_n = 10, return_df = True)
[4]:
topic 0 topic 1 topic 2 topic 3 topic 4
0 bayar putus raja nyata parti
1 hutang bahasa undi dakwa menteri
2 jual pilih ros kwsp pas
3 sewa raya rakyat syarikat islam
4 wang pilih raya raja duit dana putus
5 projek ambil kena rakyat bayar umno
6 rumah parti kena undang perdana
7 harga baca duit bon amanah
8 produk ilmu ppsmi wajar seri
9 duduk laku rana urus perdana menteri

Get topics as string

[5]:
attention.get_topics(10)
[5]:
[(0, 'bayar hutang jual sewa wang projek rumah harga produk duduk'),
 (1, 'putus bahasa pilih raya pilih raya ambil parti baca ilmu laku'),
 (2, 'raja undi ros rakyat raja duit kena rakyat kena duit ppsmi rana'),
 (3, 'nyata dakwa kwsp syarikat dana bayar undang bon wajar urus'),
 (4, 'parti menteri pas islam putus umno perdana amanah seri perdana menteri'),
 (5,
  'rakyat undi malaysia parti raja negara umno menteri isu rakyat malaysia'),
 (6,
  'jppm ambil selesai langkah teknikal ambil langkah rujuk ros rujuk ros ros rujuk lembaga'),
 (7, 'negara malaysia kapal rana cina raja tindak islam anti berita'),
 (8, 'negara bangun malaysia tingkat raja alam ajar didik sasar kembang'),
 (9, 'jalan laku lancar jalan lancar lihat mudah jual kerja terima hutang')]
[6]:
attention = malaya.topic_model.transformer(corpus, n_topics = 10, vectorizer = electra, stemming = None)
[7]:
attention.top_topics(5, top_n = 10, return_df = True)
[7]:
topic 0 topic 1 topic 2 topic 3 topic 4
0 bayar putus raja nyata parti
1 hutang bahasa undi dakwa menteri
2 jual pilih ros kwsp pas
3 sewa raya rakyat syarikat islam
4 wang pilih raya raja duit dana putus
5 projek ambil kena rakyat bayar umno
6 rumah parti kena undang perdana
7 harga baca duit bon amanah
8 produk ilmu ppsmi wajar seri
9 duduk laku rana urus perdana menteri
[8]:
attention.get_topics(10)
[8]:
[(0, 'bayar hutang jual sewa wang projek rumah harga produk duduk'),
 (1, 'putus bahasa pilih raya pilih raya ambil parti baca ilmu laku'),
 (2, 'raja undi ros rakyat raja duit kena rakyat kena duit ppsmi rana'),
 (3, 'nyata dakwa kwsp syarikat dana bayar undang bon wajar urus'),
 (4, 'parti menteri pas islam putus umno perdana amanah seri perdana menteri'),
 (5,
  'rakyat undi malaysia parti raja negara umno menteri isu rakyat malaysia'),
 (6,
  'jppm ambil selesai langkah teknikal ambil langkah rujuk ros rujuk ros ros rujuk lembaga'),
 (7, 'negara malaysia kapal rana cina raja tindak islam anti berita'),
 (8, 'negara bangun malaysia tingkat raja alam ajar didik sasar kembang'),
 (9, 'jalan laku lancar jalan lancar lihat mudah jual kerja terima hutang')]

Train LDA2Vec model

[9]:
lda2vec = malaya.topic_model.lda2vec(corpus, 10, vectorizer = 'skip-gram', skip = 4)
WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/model/lda2vec.py:44: The name tf.random_uniform is deprecated. Please use tf.random.uniform instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/model/lda2vec.py:47: The name tf.truncated_normal is deprecated. Please use tf.random.truncated_normal instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/model/lda2vec.py:55: The name tf.random_normal is deprecated. Please use tf.random.normal instead.

WARNING:tensorflow:
The TensorFlow contrib module will not be included in TensorFlow 2.0.
For more information, please see:
  * https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md
  * https://github.com/tensorflow/addons
  * https://github.com/tensorflow/io (for I/O related ops)
If you depend on functionality not listed there, please file an issue.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/model/lda2vec.py:104: The name tf.train.get_global_step is deprecated. Please use tf.compat.v1.train.get_global_step instead.

WARNING:tensorflow:From /Users/huseinzolkepli/Documents/Malaya/malaya/model/lda2vec.py:117: The name tf.assign is deprecated. Please use tf.compat.v1.assign instead.

minibatch loop: 100%|██████████| 287/287 [00:00<00:00, 361.49it/s, cost=-7.4e+3, epoch=1]
minibatch loop: 100%|██████████| 287/287 [00:00<00:00, 389.66it/s, cost=-8.04e+3, epoch=2]
minibatch loop: 100%|██████████| 287/287 [00:00<00:00, 402.95it/s, cost=-8.66e+3, epoch=3]
minibatch loop: 100%|██████████| 287/287 [00:00<00:00, 392.62it/s, cost=-9.29e+3, epoch=4]
minibatch loop: 100%|██████████| 287/287 [00:00<00:00, 411.54it/s, cost=-9.94e+3, epoch=5]
minibatch loop: 100%|██████████| 287/287 [00:00<00:00, 407.45it/s, cost=-1.06e+4, epoch=6]
minibatch loop: 100%|██████████| 287/287 [00:00<00:00, 400.09it/s, cost=-1.13e+4, epoch=7]
minibatch loop: 100%|██████████| 287/287 [00:00<00:00, 412.64it/s, cost=-1.2e+4, epoch=8]
minibatch loop: 100%|██████████| 287/287 [00:00<00:00, 391.48it/s, cost=-1.27e+4, epoch=9]
minibatch loop: 100%|██████████| 287/287 [00:00<00:00, 402.63it/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

[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

[3]:
lda = malaya.topic_model.lda(
    corpus,
    10,
    stemming = None,
    vectorizer = 'skip-gram',
    ngram = (1, 4),
    skip = 3,
)
[4]:
lda.top_topics(5, top_n = 10, return_df = True)
[4]:
topic 0 topic 1 topic 2 topic 3 topic 4
0 kelulusan meningkatkan berkongsi pembangunannya negara selatan projek negara
1 ros parti negara selatan hutang bidang
2 kebenaran harga pengalaman pembangunannya negara selatan undi bahasa
3 parti tindakan pengalaman negara selatan parti negara bidang
4 pengurusan asli berkongsi pengalaman negara selatan mdb pendidikan
5 mca ph pembangunannya negara selatan diselesaikan negara maju
6 membolehkan mengambil negara kewangan negara bidang ekonomi kewangan
7 perlembagaan harapan malaysia tempoh hutang negara perancangan ekonomi kewangan
8 anak catatan pengalaman projek projek negara perancangan ekonomi
9 masyarakat cina berkongsi hutang hutang negara perancangan

Important sentences based on topics

[5]:
lda.get_sentences(5)
[5]:
['ros kebenaran tangguhkan pemilihan parti melebihi tempoh dibenarkan perlembagaan parti',
 'pertimbangan sewajarnya menulis kenyataan',
 'pertimbangan sewajarnya menulis kenyataan',
 'anak anak bahan uji kaji tubuh bongkok usia beban dibawa beban pemikiran beban buku membongkokkan',
 'tn hala tuju membolehkan melonjak arah mencapai matlamat top nations dunia']

Get topics

[6]:
lda.get_topics(10)
[6]:
[(0,
  'kelulusan ros kebenaran parti pengurusan mca membolehkan perlembagaan anak masyarakat'),
 (1,
  'meningkatkan parti harga tindakan asli ph mengambil harapan catatan cina'),
 (2,
  'berkongsi pembangunannya negara selatan negara selatan pengalaman pembangunannya negara selatan pengalaman negara selatan berkongsi pengalaman negara selatan pembangunannya negara selatan negara malaysia pengalaman berkongsi'),
 (3,
  'projek hutang undi parti mdb diselesaikan kewangan tempoh hutang projek projek hutang hutang'),
 (4,
  'negara bidang bahasa negara bidang pendidikan negara maju negara bidang ekonomi kewangan negara perancangan ekonomi kewangan negara perancangan ekonomi negara perancangan'),
 (5,
  'rakyat perniagaan malaysia mdb rakyat malaysia kerajaan negara low jho jho low'),
 (6,
  'malaysia pengalaman pertumbuhan kawasan kepentingan pelbagai asli berkongsi bandar kawasan bandar'),
 (7,
  'pilihan raya pilihan raya seri menteri seri menteri kerajaan awam kuok sukan'),
 (8, 'lihat politik wang pas dana mengundi negara nilai masyarakat kenyataan'),
 (9,
  'umno keputusan menteri malaysia perdana perdana menteri parti dasar bersatu pemilihan')]

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

[8]:
nmf = malaya.topic_model.nmf(corpus,10)
nmf.top_topics(5, top_n = 10, return_df = True)
[8]:
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 menteri seri jho swasta
6 kongsi alam industri menteri seri najib urus niaga indonesia
7 alam bangun latih perdana menteri seri jho low tanah
8 selatan dagang razak tuntut rana
9 kongsi alam bangun didik najib razak sivil kena
[9]:
nmf.get_sentences(5)
[9]:
['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']
[10]:
nmf.get_topics(10)
[10]:
[(0,
  'negara bangun sedia kongsi alam malaysia kongsi alam alam bangun selatan kongsi alam bangun'),
 (1, 'negara wang ancang maju bidang ekonomi industri latih dagang didik'),
 (2,
  'menteri perdana perdana menteri seri najib menteri seri menteri seri najib perdana menteri seri razak 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 laku raja'),
 (8,
  'bangun malaysia kawasan alam bangun kawasan main bandar kongsi kongsi alam peran'),
 (9,
  'asli masyarakat jakoa bangun perdana ganti arus arus perdana pelopor bangun arus perdana')]

Train LSA model

[11]:
lsa = malaya.topic_model.lsa(corpus,10)
lsa.top_topics(5, top_n = 10, return_df = True)
[11]:
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 ajar
6 sedia maju negara negara low tingkat
7 selatan bidang tani didik latih jho low sewa
8 alam bangun maju bidang teknikal industri tuntut rakyat
9 kongsi alam bangun rakyat industri diplomasi tuntut sivil jual syarikat
[12]:
lsa.get_sentences(5)
[12]:
['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']
[13]:
lsa.get_topics(10)
[13]:
[(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 didik latih teknikal industri industri diplomasi'),
 (3, 'mdb niaga doj urus jho urus niaga low jho low tuntut tuntut sivil'),
 (4,
  'projek jual malaysia raja syarikat ajar tingkat sewa rakyat jual syarikat'),
 (5,
  'parti pilih rakyat tangguh umno pimpin negara malaysia tangguh pilih rakyat malaysia'),
 (6,
  'rakyat malaysia menteri bangun asli perdana kawasan bangun kawasan main peran'),
 (7,
  'ajar tingkat ajar ajar proses raja tingkat maju bidang maju bidang didik raja tingkat tingkat maju didik proses'),
 (8,
  'bangun projek bandar kawasan bangun kawasan main parti peran peran kongsi alam bangun malaysia main'),
 (9,
  'asli masyarakat jakoa tingkat ganti arus pelopor arus perdana bangun arus bangun arus perdana')]