Decomposition
Contents
Decomposition#
This tutorial is available as an IPython notebook at Malaya/example/topic-modeling-decomposition.
[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 https://github.com/huseinzol05/malaya/blob/master/tests/02032018.csv . This csv already stemmed.
Load vectorizer object#
You can use TfidfVectorizer
, CountVectorizer
, or any vectorizer as long fit_transform
method exists.
[3]:
from malaya.text.vectorizer import SkipGramCountVectorizer
stopwords = malaya.text.function.get_stopwords()
vectorizer = SkipGramCountVectorizer(
max_df = 0.95,
min_df = 1,
ngram_range = (1, 3),
stop_words = stopwords,
skip = 2
)
Train SKLearn LDA model#
def fit(
corpus: List[str],
model,
vectorizer,
n_topics: int,
cleaning=simple_textcleaning,
stopwords=get_stopwords,
**kwargs,
):
"""
Train a SKlearn model to do topic modelling based on corpus given.
Parameters
----------
corpus: list
model : object
Should have `fit_transform` method. Commonly:
* ``sklearn.decomposition.TruncatedSVD`` - LSA algorithm.
* ``sklearn.decomposition.LatentDirichletAllocation`` - LDA algorithm.
* ``sklearn.decomposition.NMF`` - NMF algorithm.
vectorizer : object
Should have `fit_transform` method. Commonly:
* ``sklearn.feature_extraction.text.TfidfVectorizer`` - TFIDF algorithm.
* ``sklearn.feature_extraction.text.CountVectorizer`` - Bag-of-Word algorithm.
* ``malaya.text.vectorizer.SkipGramCountVectorizer`` - Skip Gram Bag-of-Word algorithm.
* ``malaya.text.vectorizer.SkipGramTfidfVectorizer`` - Skip Gram TFIDF algorithm.
n_topics: int, (default=10)
size of decomposition column.
cleaning: function, (default=malaya.text.function.simple_textcleaning)
function to clean the corpus.
stopwords: List[str], (default=malaya.texts.function.get_stopwords)
A callable that returned a List[str], or a List[str], or a Tuple[str]
Returns
-------
result: malaya.topic_model.decomposition.Topic class
"""
[4]:
from sklearn.decomposition import LatentDirichletAllocation
lda = malaya.topic_model.decomposition.fit(
corpus,
LatentDirichletAllocation,
vectorizer = vectorizer,
n_topics = 10,
)
Print topics#
def top_topics(
self, len_topic: int, top_n: int = 10, return_df: bool = True
):
"""
Print important topics based on decomposition.
Parameters
----------
len_topic: int
size of topics.
top_n: int, optional (default=10)
top n of each topic.
return_df: bool, optional (default=True)
return as pandas.DataFrame, else JSON.
"""
[5]:
lda.top_topics(5, top_n = 10, return_df = True)
[5]:
topic 0 | topic 1 | topic 2 | topic 3 | topic 4 | |
---|---|---|---|---|---|
0 | kerajaan | negara selatan | parti | malaysia | bahasa |
1 | hutang | pembangunannya negara selatan | pilihan raya | menteri | pertumbuhan |
2 | negara | negara | raya | rakyat | negara |
3 | subjek | projek | pilihan | perdana | malaysia |
4 | mdb | malaysia | perniagaan digital santan | negara | ilmu |
5 | menerima | pengalaman | berjalan lancar | asli | parti |
6 | islam | berkongsi | lancar | kerajaan | bersatu |
7 | kemudahan | berkongsi pengalaman | perlembagaan | perdana menteri | kerajaan |
8 | menjual | selatan | berjalan | rumah | mdb |
9 | takut | negara negara selatan | umno | rakyat malaysia | pelbagai |
Important sentences based on topics#
def get_sentences(self, len_sentence: int, k: int = 0):
"""
Return important sentences related to selected column based on decomposition.
Parameters
----------
len_sentence: int
k: int, (default=0)
index of decomposition matrix.
Returns
-------
result: List[str]
"""
[6]:
lda.get_sentences(5)
[6]:
['saya fikir berucaplah sekuat mana sekali pun tulislah sebanyak mana kertas cadangan tapi sekiranya rejim yang sama terus mentadbir negara perubahan tuntas yang kita mahukan mustahil akan terlaksana kerana political will itu tidak wujud',
'kami telah menerima permohonan untuk menjadikan flat perumahan sedia ada menjadi bilik darjah tingkatan enam dan kementerian telah meluluskan peruntukan rm juta bagi projek tersebut',
'kami menjual syarikat pajakan kami pagi ini dan wang yang diterima akan meningkatkan ringgit jadi ia akan mencerminkan dengan lebih baik lagi kekuatan sebenar dan daya tahan ekonomi malaysia',
'kerajaan dan rakan sekerja saya menteri pengangkutan datuk seri liow tiong lai akan memastikan anda berkembang dan berjaya melampaui imaginasi kami',
'kami menolak sebarang percubaan untuk merosak atau memusnahkan tanah suci dan akan menjaga tempat itu sebaik baiknya serta memberi tumpuan kepada kepentingan islam']
Get topics#
def get_topics(self, len_topic: int):
"""
Return important topics based on decomposition.
Parameters
----------
len_topic: int
Returns
-------
result: List[str]
"""
[7]:
lda.get_topics(10)
[7]:
[(0,
'kerajaan hutang negara subjek mdb menerima islam kemudahan menjual takut'),
(1,
'negara selatan pembangunannya negara selatan negara projek malaysia pengalaman berkongsi berkongsi pengalaman selatan negara negara selatan'),
(2,
'parti pilihan raya raya pilihan perniagaan digital santan berjalan lancar lancar perlembagaan berjalan umno'),
(3,
'malaysia menteri rakyat perdana negara asli kerajaan perdana menteri rumah rakyat malaysia'),
(4,
'bahasa pertumbuhan negara malaysia ilmu parti bersatu kerajaan mdb pelbagai'),
(5,
'parti rakyat keputusan ahli mengambil awam masyarakat pru pendapatan kerajaan'),
(6,
'malaysia kerajaan rakyat masyarakat rakyat malaysia cina strategi kenyataan dasar hilang'),
(7,
'undi kerajaan dakwaan dana kenyataan bidang kementerian syarikat sebarang doj'),
(8,
'negara mdb kewangan syarikat negara bidang negara bidang perancangan negara maju negara maju perancangan membantu negara membantu negara bidang'),
(9, 'malaysia harga ambil rm air usaha sabah anti dasar dijual')]
[ ]: