diff --git a/.gitignore b/.gitignore index 106ad4a3..c3aa318b 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,5 @@ malaya/__pycache__ docs/_build docs/_static docs/_templates +siamese +skipthought diff --git a/docs/Api.rst b/docs/Api.rst index 1fc7be36..509c4ba1 100644 --- a/docs/Api.rst +++ b/docs/Api.rst @@ -103,19 +103,19 @@ malaya.summarize .. automodule:: malaya.summarize :members: -malaya.topics_influencer +malaya.similarity ------------------------- -.. automodule:: malaya.topic_influencer +.. automodule:: malaya.similarity :members: -.. autoclass:: malaya.topic_influencer._DEEP_SIAMESE_SIMILARITY() +.. autoclass:: malaya.similarity._DEEP_SIAMESE_SIMILARITY() :members: -.. autoclass:: malaya.topic_influencer._DEEP_SIMILARITY() +.. autoclass:: malaya.similarity._DEEP_SIMILARITY() :members: -.. autoclass:: malaya.topic_influencer._FAST_SIMILARITY() +.. autoclass:: malaya.similarity._FAST_SIMILARITY() :members: malaya.topic_model diff --git a/docs/Dataset.rst b/docs/Dataset.rst index e04e03cb..f0b373dd 100644 --- a/docs/Dataset.rst +++ b/docs/Dataset.rst @@ -40,6 +40,8 @@ Total size: 8.5 MB `Gender `__ ----------------------------------------------------------------------------- +Total size: 2.2 MB + 1. Unknown 2. Male 3. Female @@ -153,7 +155,7 @@ Total size: 496 KB `Sentiment Twitter `__ --------------------------------------------------------------------------------------------------- -Total size: 27.4 MB +Total size: 50.6 MB 1. Positive 2. Negative @@ -226,6 +228,20 @@ Total size: 1.4 MB 1. Positive 2. Negative +`Toxicity `__ +----------------------------------------------------------------------------------------- + +Total size: 70 MB + +Toxicity is multilabel, prefer to use sigmoid based. + +1. toxic +2. severe toxic +3. obscene +4. threat +5. insult +6. identity hate + `Subtitle `__ --------------------------------------------------------------------------------- diff --git a/docs/Topics.rst b/docs/Mover.rst similarity index 62% rename from docs/Topics.rst rename to docs/Mover.rst index e14ae6a7..9d23bad3 100644 --- a/docs/Topics.rst +++ b/docs/Mover.rst @@ -1,9 +1,9 @@ -Topics & Influencers Analysis +Word-Mover Distance ============================== .. note:: This tutorial is available as an IPython notebook - `here `_. + `here `_. -.. include:: load-topics-influencers.rst +.. include:: load-word-mover-distance.rst diff --git a/docs/Similarity.rst b/docs/Similarity.rst new file mode 100644 index 00000000..a4c3898b --- /dev/null +++ b/docs/Similarity.rst @@ -0,0 +1,9 @@ +Text Similarity +============================== + +.. note:: + + This tutorial is available as an IPython notebook + `here `_. + +.. include:: load-similarity.rst diff --git a/docs/index.rst b/docs/index.rst index ac6355b6..34e99f8b 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -31,15 +31,16 @@ Contents: Num2word Pos Sentiment + Similarity Spell Stack Stemmer Subjective Summarization Topic - Topics Toxic Word2vec + Mover Cluster Api Reference diff --git a/docs/load-emotion.rst b/docs/load-emotion.rst index d167c5d3..d4b7cc28 100644 --- a/docs/load-emotion.rst +++ b/docs/load-emotion.rst @@ -7,8 +7,8 @@ .. parsed-literal:: - CPU times: user 10.4 s, sys: 640 ms, total: 11 s - Wall time: 11 s + CPU times: user 12 s, sys: 1.41 s, total: 13.4 s + Wall time: 17.1 s .. code:: python @@ -43,7 +43,7 @@ Load multinomial model .. parsed-literal:: anger - {'anger': 0.27993946463423486, 'fear': 0.1482931513658756, 'joy': 0.1880009584798728, 'love': 0.21711876657658918, 'sadness': 0.1296730712078804, 'surprise': 0.03697458773554805} + {'anger': 0.30367763926253094, 'fear': 0.16709964152193366, 'joy': 0.17026521921403184, 'love': 0.18405977732934192, 'sadness': 0.1388341895665479, 'surprise': 0.03606353310561458} @@ -73,31 +73,31 @@ Load xgb model .. parsed-literal:: love - {'anger': 0.21755809, 'fear': 0.090371706, 'joy': 0.13347618, 'love': 0.47302967, 'sadness': 0.0770047, 'surprise': 0.008559667} + {'anger': 0.22918181, 'fear': 0.089252785, 'joy': 0.1318236, 'love': 0.46476611, 'sadness': 0.07200217, 'surprise': 0.012973559} .. parsed-literal:: - [{'anger': 0.21755809, - 'fear': 0.090371706, - 'joy': 0.13347618, - 'love': 0.47302967, - 'sadness': 0.0770047, - 'surprise': 0.008559667}, + [{'anger': 0.22918181, + 'fear': 0.089252785, + 'joy': 0.1318236, + 'love': 0.46476611, + 'sadness': 0.07200217, + 'surprise': 0.012973559}, {'anger': 0.013483193, 'fear': 0.939588, 'joy': 0.01674833, 'love': 0.003220023, 'sadness': 0.022906518, 'surprise': 0.0040539484}, - {'anger': 0.09142393, - 'fear': 0.029400537, - 'joy': 0.78257465, - 'love': 0.02881839, - 'sadness': 0.058004435, - 'surprise': 0.009778041}, + {'anger': 0.10506946, + 'fear': 0.025150253, + 'joy': 0.725915, + 'love': 0.05211037, + 'sadness': 0.078554265, + 'surprise': 0.013200594}, {'anger': 0.11640434, 'fear': 0.097485565, 'joy': 0.24893147, @@ -110,12 +110,12 @@ Load xgb model 'love': 0.022184724, 'sadness': 0.41255626, 'surprise': 0.006135965}, - {'anger': 0.0714585, - 'fear': 0.19790031, - 'joy': 0.037659157, - 'love': 0.0025473926, - 'sadness': 0.00772799, - 'surprise': 0.6827066}] + {'anger': 0.07513438, + 'fear': 0.2525073, + 'joy': 0.024355419, + 'love': 0.002638406, + 'sadness': 0.0059716892, + 'surprise': 0.6393928}] @@ -167,27 +167,27 @@ List available deep learning models Testing fast-text model love ['love', 'fear', 'joy', 'love', 'sadness', 'surprise'] - [{'anger': 2.978304e-06, 'fear': 1.8461518e-10, 'joy': 1.0204276e-09, 'love': 0.999997, 'sadness': 1.3693535e-09, 'surprise': 2.6386826e-09}, {'anger': 1.2210384e-18, 'fear': 1.0, 'joy': 1.0015556e-19, 'love': 1.8750202e-24, 'sadness': 6.976661e-21, 'surprise': 3.2600536e-15}, {'anger': 2.47199e-19, 'fear': 2.3032567e-22, 'joy': 1.0, 'love': 5.1478095e-14, 'sadness': 4.464682e-20, 'surprise': 1.588908e-15}, {'anger': 4.1249185e-11, 'fear': 1.7474476e-10, 'joy': 0.00022258118, 'love': 0.9997774, 'sadness': 1.6592432e-11, 'surprise': 4.1854236e-09}, {'anger': 4.3972154e-08, 'fear': 2.1118221e-06, 'joy': 3.4898858e-07, 'love': 4.5489975e-12, 'sadness': 0.9999975, 'surprise': 4.8414757e-09}, {'anger': 1.1130476e-23, 'fear': 0.0003273876, 'joy': 5.694222e-17, 'love': 1.9363045e-25, 'sadness': 1.4252974e-26, 'surprise': 0.99967265}] + [{'anger': 2.538603e-07, 'fear': 4.1372344e-13, 'joy': 1.0892472e-08, 'love': 0.99999976, 'sadness': 3.8994935e-16, 'surprise': 2.439655e-08}, {'anger': 4.4489467e-24, 'fear': 1.0, 'joy': 1.3903143e-28, 'love': 1.7920514e-33, 'sadness': 1.01771616e-26, 'surprise': 6.799581e-18}, {'anger': 9.583714e-26, 'fear': 1.5029816e-24, 'joy': 1.0, 'love': 3.7527533e-13, 'sadness': 8.348174e-24, 'surprise': 2.080897e-16}, {'anger': 1.7409228e-13, 'fear': 3.2279754e-12, 'joy': 0.0005876841, 'love': 0.9994123, 'sadness': 1.8902605e-11, 'surprise': 9.9256076e-11}, {'anger': 1.2737708e-11, 'fear': 5.882562e-10, 'joy': 9.112171e-13, 'love': 7.7659496e-20, 'sadness': 1.0, 'surprise': 1.6035637e-16}, {'anger': 5.5730725e-37, 'fear': 0.16033638, 'joy': 1.2999706e-30, 'love': 0.0, 'sadness': 0.0, 'surprise': 0.8396636}] Testing hierarchical model - joy + anger ['anger', 'fear', 'joy', 'joy', 'sadness', 'joy'] - [{'anger': 0.39431405, 'fear': 0.13933083, 'joy': 0.17727984, 'love': 0.042310942, 'sadness': 0.22523886, 'surprise': 0.021525377}, {'anger': 0.004958992, 'fear': 0.9853917, 'joy': 0.006676573, 'love': 0.00023657709, 'sadness': 0.0017484307, 'surprise': 0.0009877522}, {'anger': 0.0013627211, 'fear': 0.0017271177, 'joy': 0.986464, 'love': 0.0039458317, 'sadness': 0.0021411367, 'surprise': 0.0043591294}, {'anger': 0.028909639, 'fear': 0.09853578, 'joy': 0.50412154, 'love': 0.26376858, 'sadness': 0.084195614, 'surprise': 0.02046885}, {'anger': 0.022849305, 'fear': 0.011993612, 'joy': 0.008679014, 'love': 0.002472554, 'sadness': 0.9502534, 'surprise': 0.003752149}, {'anger': 0.015510161, 'fear': 0.0571924, 'joy': 0.5819401, 'love': 0.21683867, 'sadness': 0.006425157, 'surprise': 0.12209346}] + [{'anger': 0.22394963, 'fear': 0.35022292, 'joy': 0.19895941, 'love': 0.013231089, 'sadness': 0.20033234, 'surprise': 0.013304558}, {'anger': 0.0056565125, 'fear': 0.9885886, 'joy': 0.0034398232, 'love': 0.00018917819, 'sadness': 0.0012037805, 'surprise': 0.00092218135}, {'anger': 0.01764421, 'fear': 0.01951682, 'joy': 0.8797468, 'love': 0.041130837, 'sadness': 0.013527576, 'surprise': 0.028433735}, {'anger': 0.028772388, 'fear': 0.07343067, 'joy': 0.48502314, 'love': 0.28668693, 'sadness': 0.10576224, 'surprise': 0.020324599}, {'anger': 0.021873059, 'fear': 0.014633018, 'joy': 0.01073073, 'love': 0.0012993184, 'sadness': 0.94936466, 'surprise': 0.0020992015}, {'anger': 0.020028168, 'fear': 0.17150529, 'joy': 0.3734562, 'love': 0.19241562, 'sadness': 0.008164915, 'surprise': 0.23442967}] Testing bahdanau model love - ['love', 'fear', 'joy', 'love', 'sadness', 'surprise'] - [{'anger': 0.44805261, 'fear': 0.18378404, 'joy': 0.02516251, 'love': 0.30925235, 'sadness': 0.027497768, 'surprise': 0.0062507084}, {'anger': 0.0010828926, 'fear': 0.9789995, 'joy': 0.0027138714, 'love': 0.00061593985, 'sadness': 0.0048968275, 'surprise': 0.011690898}, {'anger': 0.012288661, 'fear': 0.0025563037, 'joy': 0.85003525, 'love': 0.12451392, 'sadness': 0.0008497203, 'surprise': 0.009756153}, {'anger': 0.02319879, 'fear': 0.031080244, 'joy': 0.14820175, 'love': 0.7294624, 'sadness': 0.021997027, 'surprise': 0.046059813}, {'anger': 0.031083692, 'fear': 0.035790402, 'joy': 0.01741525, 'love': 0.00062268815, 'sadness': 0.9130492, 'surprise': 0.0020387478}, {'anger': 0.00159852, 'fear': 0.34762463, 'joy': 0.04318491, 'love': 0.0028805388, 'sadness': 0.00093575486, 'surprise': 0.6037757}] + ['anger', 'fear', 'joy', 'love', 'sadness', 'surprise'] + [{'anger': 0.53818357, 'fear': 0.14104106, 'joy': 0.010708541, 'love': 0.2570674, 'sadness': 0.047102023, 'surprise': 0.005897305}, {'anger': 0.0005677081, 'fear': 0.9770825, 'joy': 0.005677423, 'love': 0.0007302013, 'sadness': 0.0017472907, 'surprise': 0.014194911}, {'anger': 0.06975506, 'fear': 0.0069800974, 'joy': 0.5717373, 'love': 0.30618504, 'sadness': 0.011454151, 'surprise': 0.033888407}, {'anger': 0.0038130684, 'fear': 0.0053994465, 'joy': 0.10317592, 'love': 0.8656706, 'sadness': 0.0056833136, 'surprise': 0.016257582}, {'anger': 0.01122868, 'fear': 0.019208057, 'joy': 0.0024597098, 'love': 0.0002851458, 'sadness': 0.965973, 'surprise': 0.00084543176}, {'anger': 0.00083102344, 'fear': 0.23240082, 'joy': 0.033536877, 'love': 0.0011026214, 'sadness': 0.00037630452, 'surprise': 0.7317524}] Testing luong model love - ['love', 'fear', 'joy', 'love', 'sadness', 'fear'] - [{'anger': 0.044591118, 'fear': 0.063305356, 'joy': 0.33247164, 'love': 0.5347649, 'sadness': 0.0068765697, 'surprise': 0.017990304}, {'anger': 0.0064159264, 'fear': 0.9606779, 'joy': 0.012426791, 'love': 0.0013584964, 'sadness': 0.008015306, 'surprise': 0.011105636}, {'anger': 0.0036163705, 'fear': 5.7273093e-05, 'joy': 0.98739016, 'love': 0.0076421387, 'sadness': 0.00028883366, 'surprise': 0.0010052109}, {'anger': 0.017377134, 'fear': 0.0073309895, 'joy': 0.07374035, 'love': 0.3433876, 'sadness': 0.5455663, 'surprise': 0.012597541}, {'anger': 0.0007876828, 'fear': 0.0009606754, 'joy': 9.633098e-05, 'love': 0.00014691186, 'sadness': 0.9978861, 'surprise': 0.00012229013}, {'anger': 0.00045764598, 'fear': 0.37070635, 'joy': 0.0005788357, 'love': 0.00027592952, 'sadness': 0.00033797708, 'surprise': 0.6276433}] + ['joy', 'fear', 'joy', 'sadness', 'sadness', 'surprise'] + [{'anger': 0.057855386, 'fear': 0.040447887, 'joy': 0.29915547, 'love': 0.5720974, 'sadness': 0.00927453, 'surprise': 0.02116932}, {'anger': 0.0063275485, 'fear': 0.9673098, 'joy': 0.0065225014, 'love': 0.0008387138, 'sadness': 0.00706696, 'surprise': 0.011934649}, {'anger': 0.0014677589, 'fear': 0.0020899512, 'joy': 0.88741183, 'love': 0.076111265, 'sadness': 0.0038936164, 'surprise': 0.029025558}, {'anger': 0.013268307, 'fear': 0.0035831807, 'joy': 0.056010414, 'love': 0.21701123, 'sadness': 0.69225526, 'surprise': 0.017871574}, {'anger': 0.0018013288, 'fear': 0.0012173079, 'joy': 5.611221e-05, 'love': 9.00831e-05, 'sadness': 0.9967213, 'surprise': 0.000113809925}, {'anger': 0.00015200193, 'fear': 0.36670414, 'joy': 0.0003732592, 'love': 0.00011813393, 'sadness': 0.000118975, 'surprise': 0.63253355}] Testing bidirectional model - surprise - ['anger', 'anger', 'anger', 'anger', 'anger', 'fear'] - [{'anger': 0.613231, 'fear': 0.21215951, 'joy': 0.00012107872, 'love': 0.007714424, 'sadness': 0.0029091935, 'surprise': 0.16386479}, {'anger': 0.7650685, 'fear': 0.12844206, 'joy': 0.00046135965, 'love': 0.0025065169, 'sadness': 0.012999088, 'surprise': 0.09052232}, {'anger': 0.7017255, 'fear': 0.12622964, 'joy': 0.00019186054, 'love': 0.0041279723, 'sadness': 0.0051922314, 'surprise': 0.16253278}, {'anger': 0.83330584, 'fear': 0.099247426, 'joy': 0.0007255099, 'love': 0.0023077168, 'sadness': 0.016625375, 'surprise': 0.047788195}, {'anger': 0.77445495, 'fear': 0.11811776, 'joy': 0.00019311535, 'love': 0.002333317, 'sadness': 0.004926041, 'surprise': 0.09997472}, {'anger': 0.28467438, 'fear': 0.3107746, 'joy': 0.0009574863, 'love': 0.039786864, 'sadness': 0.0549624, 'surprise': 0.3088443}] + love + ['fear', 'fear', 'anger', 'joy', 'sadness', 'surprise'] + [{'anger': 0.031539902, 'fear': 0.44634053, 'joy': 0.0022038615, 'love': 0.24390388, 'sadness': 0.00030186496, 'surprise': 0.27570996}, {'anger': 0.0028205896, 'fear': 0.9787958, 'joy': 0.016622344, 'love': 0.00041048063, 'sadness': 0.0004424488, 'surprise': 0.00090834824}, {'anger': 0.4523394, 'fear': 0.32489082, 'joy': 0.04712723, 'love': 0.01679146, 'sadness': 0.039135754, 'surprise': 0.1197153}, {'anger': 0.04196525, 'fear': 0.08604635, 'joy': 0.65291435, 'love': 0.049389884, 'sadness': 0.077201255, 'surprise': 0.09248292}, {'anger': 0.06327597, 'fear': 0.058998022, 'joy': 0.041568566, 'love': 0.002343863, 'sadness': 0.8224733, 'surprise': 0.011340328}, {'anger': 1.5136379e-05, 'fear': 0.002162331, 'joy': 3.5301118e-06, 'love': 0.006482973, 'sadness': 2.4173462e-06, 'surprise': 0.99133366}] Testing bert model anger @@ -367,39 +367,39 @@ will try to evolve it. .. parsed-literal:: - [{'anger': 0.055561937, - 'fear': 0.034661848, - 'joy': 0.20765074, - 'love': 0.65774184, - 'sadness': 0.0210206, - 'surprise': 0.023363067}, - {'anger': 1.5065236e-05, - 'fear': 0.9998666, - 'joy': 6.3056427e-06, - 'love': 2.9068442e-06, - 'sadness': 3.6798014e-05, - 'surprise': 7.235542e-05}, - {'anger': 0.00097060547, - 'fear': 5.1922354e-05, - 'joy': 0.99052715, - 'love': 0.0024538564, - 'sadness': 0.0005109437, - 'surprise': 0.005485538}, - {'anger': 0.00014133049, - 'fear': 0.0004463539, - 'joy': 0.12486383, - 'love': 0.87307847, - 'sadness': 0.0013382707, - 'surprise': 0.0001317923}, - {'anger': 0.0077239843, - 'fear': 0.014800851, - 'joy': 0.008525367, - 'love': 0.0013007816, - 'sadness': 0.9655128, - 'surprise': 0.0021361646}, - {'anger': 0.0003960413, - 'fear': 0.6634573, - 'joy': 0.0014801685, - 'love': 0.00056572456, - 'sadness': 0.000516784, - 'surprise': 0.33358407}] + [{'anger': 0.07479232, + 'fear': 0.012134718, + 'joy': 0.034137156, + 'love': 0.85221285, + 'sadness': 0.006336733, + 'surprise': 0.020386234}, + {'anger': 1.6892743e-08, + 'fear': 0.99999964, + 'joy': 6.260633e-08, + 'love': 3.2111713e-10, + 'sadness': 3.542872e-08, + 'surprise': 2.2207877e-07}, + {'anger': 0.00012469916, + 'fear': 9.6892345e-06, + 'joy': 0.9917463, + 'love': 0.006561422, + 'sadness': 0.00040069615, + 'surprise': 0.0011572224}, + {'anger': 5.0021445e-05, + 'fear': 0.0010109642, + 'joy': 0.049688663, + 'love': 0.94577587, + 'sadness': 0.0032941191, + 'surprise': 0.00018034693}, + {'anger': 0.0010146926, + 'fear': 0.00020020001, + 'joy': 5.2909185e-05, + 'love': 2.640257e-06, + 'sadness': 0.99870074, + 'surprise': 2.8823646e-05}, + {'anger': 0.0057854424, + 'fear': 0.8317998, + 'joy': 0.017287944, + 'love': 0.008883897, + 'sadness': 0.0070799366, + 'surprise': 0.12916291}] diff --git a/docs/load-emotion_files/load-emotion_14_0.png b/docs/load-emotion_files/load-emotion_14_0.png index b7737f2d..d84b2b03 100644 Binary files a/docs/load-emotion_files/load-emotion_14_0.png and b/docs/load-emotion_files/load-emotion_14_0.png differ diff --git a/docs/load-emotion_files/load-emotion_18_0.png b/docs/load-emotion_files/load-emotion_18_0.png index dbe33b71..fd10ba17 100644 Binary files a/docs/load-emotion_files/load-emotion_18_0.png and b/docs/load-emotion_files/load-emotion_18_0.png differ diff --git a/docs/load-normalizer.rst b/docs/load-normalizer.rst index 10c05375..021a5209 100644 --- a/docs/load-normalizer.rst +++ b/docs/load-normalizer.rst @@ -7,14 +7,14 @@ .. parsed-literal:: - CPU times: user 13.2 s, sys: 1.41 s, total: 14.6 s - Wall time: 18.2 s + CPU times: user 13.6 s, sys: 1.56 s, total: 15.2 s + Wall time: 20.3 s .. code:: python - string = 'y u xsuka makan HUSEIN kt situ tmpt' - another = 'i mmg xska mknn HUSEIN kampng tempt' + string = 'y u xsuke makan HUSEIN kt situ tmpt' + another = 'i mmg xske mknn HUSEIN kampng tempt' Load basic normalizer --------------------- @@ -28,7 +28,7 @@ Load basic normalizer .. parsed-literal:: - 'kenapa awak xsuka makan Husein kt situ tmpt' + 'kenapa awak xsuke makan Husein kt situ tmpt' @@ -66,220 +66,6 @@ Load fuzzy normalizer -Load deep expander ------------------- - -.. code:: python - - wiki, ngrams = malaya.fast_text.load_wiki() - fast_text_embed = malaya.fast_text.fast_text(wiki['embed_weights'],wiki['dictionary'],ngrams) - normalizer = malaya.normalize.deep_expander(malays, fast_text_embed) - -.. code:: python - - normalizer.normalize(string) - - - - -.. parsed-literal:: - - [[('tmpt', - 'kenapa awak tak suka makan Husein kat situ tut', - 0.8088938253521919), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tuit', - 0.863929785296917), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tat', - 0.8680638003787995), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ top', - 0.8688952446055412), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tip', - 0.8978437346220016), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ taat', - 0.936883625289917), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ topi', - 0.9442774548711776), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tumit', - 0.9495834815340042), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tempe', - 0.9758907731723786), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ ampe', - 0.9821926467533112), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tempo', - 0.9836614096956253), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tepet', - 0.994007917971611), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ amit', - 0.9999424153804779), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tuat', - 1.0002889167022706), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ mat', - 1.0071370331926346), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ temut', - 1.011553812426567), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ ampit', - 1.022653616695404), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ ampo', - 1.0231078831071854), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tipu', - 1.0246861065587998), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tepi', - 1.0285266551542283), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ umut', - 1.0287358275117875), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ emat', - 1.0357482937116622), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ empat', - 1.0431590774860382), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tapi', - 1.0562509994459153), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tepu', - 1.0601519473543166), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tumpat', - 1.074669928882599), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ impi', - 1.078846170501709), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ umat', - 1.0791117155513763), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tampi', - 1.0883281208925248), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tumpu', - 1.091578345676422), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ umpat', - 1.092372225769043), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tepat', - 1.0979607516746521), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tampa', - 1.1118229238204955), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ amput', - 1.1226389572820663), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tapa', - 1.129335333744049), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ timpa', - 1.1353471846590042), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ empu', - 1.1459274488725661), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tempa', - 1.164648480837822), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tampu', - 1.1812463180065156), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tempat', - 1.1856716803007126), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tamat', - 1.2068403679332733), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ amat', - 1.2214121790246963), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ ampu', - 1.2350379461402894), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ taut', - 1.2796957146606445)]] - - - -.. code:: python - - normalizer.normalize(another) - - - - -.. parsed-literal:: - - [[('ska', 'saya memang tak soka mknn Husein kampng tempt', 0.7199365496635437), - ('ska', 'saya memang tak suka mknn Husein kampng tempt', 0.8050327301025391), - ('ska', 'saya memang tak sika mknn Husein kampng tempt', 0.8729341626167297), - ('ska', 'saya memang tak saka mknn Husein kampng tempt', 0.875930666923523), - ('ska', 'saya memang tak spa mknn Husein kampng tempt', 0.8995948433876038), - ('ska', 'saya memang tak sua mknn Husein kampng tempt', 0.9496822357177734), - ('ska', 'saya memang tak seka mknn Husein kampng tempt', 0.9891390204429626), - ('ska', 'saya memang tak ski mknn Husein kampng tempt', 1.1318669319152832), - ('ska', 'saya memang tak sia mknn Husein kampng tempt', 1.1666431427001953)], - [('mknn', 'saya memang tak ska min Husein kampng tempt', 0.8653836846351624), - ('mknn', 'saya memang tak ska maun Husein kampng tempt', 1.045318603515625), - ('mknn', 'saya memang tak ska kun Husein kampng tempt', 1.0710314512252808), - ('mknn', 'saya memang tak ska ken Husein kampng tempt', 1.0728274583816528), - ('mknn', 'saya memang tak ska kon Husein kampng tempt', 1.0992072820663452), - ('mknn', 'saya memang tak ska ikon Husein kampng tempt', 1.1365187168121338), - ('mknn', 'saya memang tak ska makin Husein kampng tempt', 1.180336833000183), - ('mknn', 'saya memang tak ska main Husein kampng tempt', 1.182568907737732), - ('mknn', 'saya memang tak ska makan Husein kampng tempt', 1.183489203453064), - ('mknn', 'saya memang tak ska makna Husein kampng tempt', 1.184565544128418), - ('mknn', 'saya memang tak ska kan Husein kampng tempt', 1.2368937730789185), - ('mknn', 'saya memang tak ska akan Husein kampng tempt', 1.2527291774749756), - ('mknn', 'saya memang tak ska mani Husein kampng tempt', 1.266147494316101), - ('mknn', 'saya memang tak ska ikan Husein kampng tempt', 1.2773109674453735), - ('mknn', 'saya memang tak ska mini Husein kampng tempt', 1.3020210266113281), - ('mknn', 'saya memang tak ska mana Husein kampng tempt', 1.3099677562713623), - ('mknn', 'saya memang tak ska menu Husein kampng tempt', 1.3974181413650513), - ('mknn', 'saya memang tak ska mena Husein kampng tempt', 1.404064655303955), - ('mknn', - 'saya memang tak ska makanan Husein kampng tempt', - 1.4473483562469482)], - [('kampng', - 'saya memang tak ska mknn Husein kampung tempt', - 0.9272603988647461)], - [('tempt', - 'saya memang tak ska mknn Husein kampng tempo', - 0.7405402660369873), - ('tempt', - 'saya memang tak ska mknn Husein kampng tempe', - 0.7510019540786743), - ('tempt', 'saya memang tak ska mknn Husein kampng tempa', 0.885798454284668), - ('tempt', - 'saya memang tak ska mknn Husein kampng temut', - 0.9036741256713867), - ('tempt', - 'saya memang tak ska mknn Husein kampng tempat', - 0.9161624312400818)]] - - - -``deep_expander`` will suggest nearest distance based on Word Mover -distance. This distance algorithm really depends on vector definition. - Load spell normalizer --------------------- @@ -297,7 +83,7 @@ To list all selected words during normalize .. parsed-literal:: - [(('tepu', False), 10), (('tuat', False), 15), (('taut', False), 15), (('tapa', False), 10), (('timpa', False), 20), (('tampi', True), 15), (('tumpat', True), 24), (('temut', False), 15), (('tut', False), 16), (('umpat', True), 20), (('amat', False), 21), (('top', False), 11), (('ampit', False), 20), (('tampa', False), 15), (('tipu', False), 15), (('tat', False), 11), (('tepi', False), 10), (('ampu', False), 15), (('impi', False), 15), (('umut', False), 21), (('umat', False), 21), (('amit', False), 21), (('tampu', False), 15), (('tumit', False), 20), (('tempa', False), 15), (('tempat', False), 20), (('empu', False), 10), (('tapi', False), 10), (('topi', False), 10), (('tempo', False), 15), (('tuit', False), 15), (('tip', False), 16), (('tamat', False), 20), (('tepet', False), 15), (('tepat', False), 15), (('amput', False), 20), (('mat', False), 16), (('tumpu', False), 20), (('tempe', False), 15), (('emat', False), 15), (('ampo', False), 15), (('empat', True), 15), (('ampe', False), 15), (('taat', False), 15)] + [(('umut', False), 50), (('amit', False), 50), (('tepi', False), 50), (('tuit', False), 50), (('tempat', False), 80), (('tampa', False), 67), (('umpat', True), 67), (('taut', False), 50), (('amput', False), 67), (('tipu', False), 50), (('tapa', False), 50), (('temut', False), 67), (('mat', False), 57), (('empu', False), 50), (('tuat', False), 50), (('tempo', False), 67), (('tampi', True), 67), (('tepu', False), 50), (('tempe', False), 67), (('tampu', False), 67), (('ampo', False), 50), (('tut', False), 57), (('impi', False), 50), (('ampit', False), 67), (('tapi', False), 50), (('ampe', False), 50), (('tepat', False), 67), (('tumit', False), 67), (('ampu', False), 50), (('tumpu', False), 67), (('tamat', False), 67), (('tepet', False), 67), (('tempa', False), 67), (('tat', False), 57), (('amat', False), 50), (('emat', False), 50), (('umat', False), 50), (('tumpat', True), 80), (('tip', False), 57), (('empat', True), 67), (('taat', False), 50), (('timpa', False), 67), (('top', False), 57), (('topi', False), 50)] @@ -305,15 +91,15 @@ To list all selected words during normalize .. parsed-literal:: - 'kenapa awak tak suka makan Husein kat situ amit' + 'kenapa awak tak suka makan Husein kat situ tempat' Load deep learning ------------------ -This model is not perfect, really suggest you to use other models. -Husein needs to read more! +**This model is not perfect, really suggest you to use other models. +Husein needs to read more!** .. code:: python @@ -325,4 +111,4 @@ Husein needs to read more! .. parsed-literal:: - 'eye uau tak suka makan unsein kati situ tumpat' + 'eye uau tak suke makan unsein kati situ tumpat' diff --git a/docs/load-sentiment.rst b/docs/load-sentiment.rst index bc79233b..daf55023 100644 --- a/docs/load-sentiment.rst +++ b/docs/load-sentiment.rst @@ -7,7 +7,7 @@ .. parsed-literal:: - CPU times: user 11.7 s, sys: 1.34 s, total: 13.1 s + CPU times: user 12.1 s, sys: 1.33 s, total: 13.5 s Wall time: 16.7 s @@ -33,16 +33,16 @@ Load multinomial model .. parsed-literal:: - {'negative': 0.27780816431771815, 'positive': 0.7221918356822792} - {'negative': 0.4230539695981826, 'positive': 0.5769460304018175} + {'negative': 0.2422829560944563, 'positive': 0.7577170439055456} + {'negative': 0.7385102541701198, 'positive': 0.26148974582987783} .. parsed-literal:: - [{'negative': 0.4230539695981826, 'positive': 0.5769460304018175}, - {'negative': 0.4230539695981826, 'positive': 0.5769460304018175}] + [{'negative': 0.7385102541701198, 'positive': 0.26148974582987783}, + {'negative': 0.7385102541701198, 'positive': 0.26148974582987783}] @@ -59,16 +59,16 @@ Load xgb model .. parsed-literal:: - {'negative': 0.44467238, 'positive': 0.5553276} - {'negative': 0.47532737, 'positive': 0.5246726} + {'negative': 0.24086821, 'positive': 0.7591318} + {'negative': 0.844284, 'positive': 0.15571605} .. parsed-literal:: - [{'negative': 0.47532737, 'positive': 0.5246726}, - {'negative': 0.47532737, 'positive': 0.5246726}] + [{'negative': 0.844284, 'positive': 0.15571605}, + {'negative': 0.844284, 'positive': 0.15571605}] @@ -113,37 +113,37 @@ Load deep learning models Testing fast-text model negative ['negative', 'positive'] - [{'negative': 0.8494132, 'positive': 0.15058675}, {'negative': 0.04582213, 'positive': 0.95417786}] + [{'negative': 0.8405276, 'positive': 0.15947239}, {'negative': 1.8619101e-05, 'positive': 0.9999814}] Testing hierarchical model - positive - ['positive', 'positive'] - [{'negative': 0.11536069, 'positive': 0.88463926}, {'negative': 0.10003439, 'positive': 0.8999656}] + negative + ['negative', 'positive'] + [{'negative': 0.9479493, 'positive': 0.052050766}, {'negative': 0.027757995, 'positive': 0.972242}] Testing bahdanau model - positive + negative ['negative', 'positive'] - [{'negative': 0.60403764, 'positive': 0.3959623}, {'negative': 0.5672228, 'positive': 0.43277723}] + [{'negative': 0.9993224, 'positive': 0.00067757705}, {'negative': 0.11770468, 'positive': 0.8822953}] Testing luong model negative ['negative', 'positive'] - [{'negative': 0.96496046, 'positive': 0.035039473}, {'negative': 0.08448372, 'positive': 0.91551626}] + [{'negative': 0.9428673, 'positive': 0.057132788}, {'negative': 0.009072777, 'positive': 0.9909272}] Testing bidirectional model - positive - ['positive', 'positive'] - [{'negative': 0.17688204, 'positive': 0.82311803}, {'negative': 0.13394275, 'positive': 0.8660573}] + negative + ['negative', 'positive'] + [{'negative': 0.993769, 'positive': 0.006230943}, {'negative': 0.0032205353, 'positive': 0.9967795}] Testing bert model - negative - ['negative', 'negative'] - [{'negative': 0.992415, 'positive': 0.007585059}, {'negative': 0.9923813, 'positive': 0.0076187113}] + positive + ['positive', 'negative'] + [{'negative': 0.37042966, 'positive': 0.62957036}, {'negative': 0.84760416, 'positive': 0.15239581}] Testing entity-network model - negative - ['negative', 'negative'] - [{'negative': 0.5229405, 'positive': 0.4770595}, {'negative': 0.6998231, 'positive': 0.3001769}] + positive + ['positive', 'positive'] + [{'negative': 0.44306344, 'positive': 0.55693656}, {'negative': 0.32117522, 'positive': 0.6788247}] @@ -303,8 +303,8 @@ will try to evolve it. .. parsed-literal:: - [{'negative': 0.38546535, 'positive': 0.6145346}, - {'negative': 0.50480145, 'positive': 0.49519858}] + [{'negative': 0.41368636, 'positive': 0.58631366}, + {'negative': 0.6855174, 'positive': 0.31448266}] @@ -334,11 +334,11 @@ corpus should be [(text, label)] precision recall f1-score support - Negative 0.00 0.00 0.00 12 - Neutral 0.75 0.16 0.26 19 - Positive 0.53 1.00 0.69 30 + Negative 0.00 0.00 0.00 11 + Neutral 1.00 0.10 0.18 20 + Positive 0.51 1.00 0.67 30 - avg / total 0.49 0.54 0.42 61 + avg / total 0.58 0.52 0.39 61 @@ -362,14 +362,14 @@ You also able to feed directory location precision recall f1-score support - adidas 0.97 0.60 0.74 303 - apple 0.99 0.57 0.73 477 - hungry 0.79 0.93 0.86 1051 - kerajaan 0.85 0.81 0.83 1403 - nike 0.96 0.53 0.68 329 - pembangkang 0.71 0.87 0.78 1496 + adidas 0.94 0.61 0.74 313 + apple 0.98 0.62 0.76 416 + hungry 0.82 0.92 0.87 1082 + kerajaan 0.85 0.82 0.83 1392 + nike 0.95 0.55 0.70 351 + pembangkang 0.71 0.86 0.78 1505 - avg / total 0.82 0.80 0.79 5059 + avg / total 0.82 0.80 0.80 5059 @@ -382,12 +382,12 @@ You also able to feed directory location .. parsed-literal:: - {'adidas': 0.0005529039473579767, - 'apple': 0.0006348307032386134, - 'hungry': 0.010374347097919939, - 'kerajaan': 0.07250377012308745, - 'nike': 0.00058477543567546, - 'pembangkang': 0.9153493726927218} + {'adidas': 0.000975603010411438, + 'apple': 0.0016314798511805502, + 'hungry': 0.012531351707188306, + 'kerajaan': 0.05689689670169819, + 'nike': 0.001125104249853524, + 'pembangkang': 0.9268395644796663} @@ -405,14 +405,14 @@ Train a multinomial using skip-gram vectorization precision recall f1-score support - adidas 0.36 0.86 0.51 301 - apple 0.50 0.87 0.63 482 - hungry 0.83 0.93 0.88 1046 - kerajaan 0.88 0.59 0.70 1358 - nike 0.56 0.81 0.66 321 - pembangkang 0.89 0.55 0.68 1551 + adidas 0.39 0.84 0.53 317 + apple 0.53 0.93 0.67 480 + hungry 0.83 0.94 0.88 1048 + kerajaan 0.90 0.60 0.72 1345 + nike 0.58 0.83 0.68 334 + pembangkang 0.88 0.56 0.69 1535 - avg / total 0.78 0.70 0.71 5059 + avg / total 0.79 0.72 0.72 5059 @@ -425,9 +425,9 @@ Train a multinomial using skip-gram vectorization .. parsed-literal:: - {'adidas': 2.2801686476133734e-13, - 'apple': 7.228512692567908e-14, - 'hungry': 1.2286365803998912e-09, - 'kerajaan': 2.285014011490273e-06, - 'nike': 2.223604221487894e-13, - 'pembangkang': 0.9999977137568394} + {'adidas': 1.5075646514607906e-12, + 'apple': 3.3125444042691963e-12, + 'hungry': 7.508118534366736e-10, + 'kerajaan': 4.03710500865345e-07, + 'nike': 2.5065260905002984e-12, + 'pembangkang': 0.9999995955313602} diff --git a/docs/load-sentiment_files/load-sentiment_15_0.png b/docs/load-sentiment_files/load-sentiment_15_0.png index ea10c9be..ffd79442 100644 Binary files a/docs/load-sentiment_files/load-sentiment_15_0.png and b/docs/load-sentiment_files/load-sentiment_15_0.png differ diff --git a/docs/load-sentiment_files/load-sentiment_17_0.png b/docs/load-sentiment_files/load-sentiment_17_0.png index d4f31825..20b0cc62 100644 Binary files a/docs/load-sentiment_files/load-sentiment_17_0.png and b/docs/load-sentiment_files/load-sentiment_17_0.png differ diff --git a/docs/load-sentiment_files/load-sentiment_19_0.png b/docs/load-sentiment_files/load-sentiment_19_0.png index 97c209e6..9a77eb66 100644 Binary files a/docs/load-sentiment_files/load-sentiment_19_0.png and b/docs/load-sentiment_files/load-sentiment_19_0.png differ diff --git a/docs/load-similarity.rst b/docs/load-similarity.rst new file mode 100644 index 00000000..47e637c6 --- /dev/null +++ b/docs/load-similarity.rst @@ -0,0 +1,585 @@ + +.. code:: python + + %%time + import malaya + + +.. parsed-literal:: + + CPU times: user 13.8 s, sys: 1.58 s, total: 15.4 s + Wall time: 19.6 s + + +.. code:: python + + news = 'najib razak dan mahathir mengalami masalah air di kemamam terengganu' + second_news = 'ikat penyedia perkhidmatan jalur lebar Telekom Malaysia (TM) perlu mencari jalan penyelesaian bagi meningkatkan akses capaian Internet ke seluruh negara, kata Menteri Komunikasi dan Multimedia, Gobind Singh Deo. Beliau berkata menjadi dasar kerajaan untuk membekalkan akses Internet jalur lebar kepada semua dan memberi penekanan kepada kualiti perkhidmatan yang terbaik. "Dasar kerajaan untuk bekalkan akses kepada semua bukan sekadar pembekalan sahaja tetapi beri penekanan kepada kualiti perkhidmatan yang baik dan dapat bersaing dengan negara lain pada tahap antarabangsa," kata Gobind Singh menerusi catatan di laman rasmi Twitter beliau, malam tadi. Beliau berkata demikian sebagai respons terhadap aduan beberapa pengguna Twitter berhubung akses Internet yang masih tidak stabil serta harga yang tidak berpatutan di beberapa lokasi di seluruh negara.' + +Topics provided by malaya +------------------------- + +Topics +^^^^^^ + +.. code:: python + + malaya.topic.topic['sosial'] + + + + +.. parsed-literal:: + + ['sosial', 'kehidupan', 'taraf hidup', 'sosiologi', 'keusahawan', 'masyarakat'] + + + +Influencer +^^^^^^^^^^ + +.. code:: python + + malaya.topic.influencer['mahathir'] + + + + +.. parsed-literal:: + + ['tun mahathir', + 'madey', + 'dr mahathir', + 'tun m', + 'mahathir', + 'madir', + 'dr m', + 'mahathir muhamad'] + + + +location +^^^^^^^^ + +.. code:: python + + malaya.topic.location[0] + + + + +.. parsed-literal:: + + {'negeri': 'JOHOR', 'parlimen': 'SEGAMAT', 'dun': 'BULOH KASAP'} + + + +wakil rakyat +^^^^^^^^^^^^ + +.. code:: python + + malaya.topic.calon[0] + + + + +.. parsed-literal:: + + {'KodN': 1, + 'KodParlimen': 1, + 'KodKawasan': 1, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DATUK ZAHIDI BIN ZAINUL ABIDIN', + 'parti': 'BN'} + + + +Train fuzzy text similarity +--------------------------- + +I want to train topics related when given a string. You can give any +corpus, the format is, + +.. code:: python + + {'left':['right1','right2']} + +.. code:: python + + fuzzy = malaya.similarity.fuzzy(malaya.topic.topic) + +.. code:: python + + fuzzy.get_similarity(news,fuzzy_ratio = 60) + + + + +.. parsed-literal:: + + ['najib razak', 'masalah air', 'mahathir', 'tan sri mokhzani mahathir'] + + + +.. code:: python + + fuzzy.get_similarity(second_news,fuzzy_ratio = 90) + + + + +.. parsed-literal:: + + ['telekom malaysia', + 'kerajaan', + 'internet', + 'twitter', + 'teknologi', + 'politik', + 'pendidikan', + 'sosial media'] + + + +Train bag-of-word text similarity +--------------------------------- + +I want to train topics related when given a string. You can give any +corpus, the format is, + +.. code:: python + + {'left':['right1','right2']} + +bag-of-word text similarity fitted by using character wised n-gram. + +``vectorizer`` supported ``['tfidf','count','skip-gram']``. + +.. code:: python + + tfidf = malaya.similarity.bow(malaya.topic.topic,vectorizer = 'tfidf') + +.. code:: python + + tfidf.get_similarity(second_news) + + + + +.. parsed-literal:: + + ['kkmm', 'universiti islam antarabangsa', 'perkhidmatan awam', 'twitter'] + + + +.. code:: python + + count = malaya.similarity.bow(malaya.topic.topic,vectorizer = 'count') + +.. code:: python + + count.get_similarity(second_news) + + + + +.. parsed-literal:: + + ['mic', + 'kerajaan', + 'majlis pakatan harapan', + 'jabatan bubar', + '1malaysia', + 'kemelangan penumpang cedera', + 'pendidikan', + 'malaysian chinese association', + 'ppbm', + 'menyiasat skandal', + 'tentera malaysia', + 'pakatan harapan', + 'parti islam semalaysia', + 'jabatan agama islam wilayah persekutuan', + 'bursa malaysia', + 'rela', + 'undi pos', + 'twitter', + 'parti pribumi bersatu malaysia', + 'perkhidmatan awam', + 'hutang negara', + 'politik', + 'timbalan perdana menteri', + 'kkmm', + 'perdana menteri', + 'ptptn', + 'menteri pertahanan', + 'universiti islam antarabangsa', + 'gaji menteri', + 'teknologi', + 'bebas tahanan', + 'infrastruktur', + 'menteri kewangan'] + + + +.. code:: python + + skip = malaya.similarity.bow(malaya.topic.topic,vectorizer = 'skip-gram') + +.. code:: python + + skip.get_similarity(second_news) + + + + +.. parsed-literal:: + + [] + + + +Train siamese network text similarity +------------------------------------- + +All parameters supported, + +.. code:: python + + """ + Train a deep siamese network for text similarity + + Parameters + ---------- + dictionary: dict + format {'left':['right']} + epoch: int, (default=5) + iteration numbers + batch_size: int, (default=32) + batch size for every feed, batch size must <= size of corpus + embedding_size: int, (default=256) + vector size representation for a word + output_size: int, (default=100) + encoder output size, bigger means more vector definition + maxlen: int, (default=100) + max length of a string to be train + ngram: tuple, (default=(1,4)) + n-grams size to train a corpus + num_layers: int, (default=100) + number of bidirectional rnn layers + + Returns + ------- + _DEEP_SIAMESE_SIMILARITY: malaya.similarity._DEEP_SIAMESE_SIMILARITY class + """ + +.. code:: python + + siamese = malaya.similarity.deep_siamese(malaya.topic.topic,epoch=3) + siamese.get_similarity(news) + + +.. parsed-literal:: + + minibatch loop: 100%|██████████| 137/137 [02:04<00:00, 1.35it/s, accuracy=0.5, cost=0.128] + minibatch loop: 100%|██████████| 137/137 [01:58<00:00, 1.45it/s, accuracy=0.75, cost=0.11] + minibatch loop: 100%|██████████| 137/137 [02:02<00:00, 1.38it/s, accuracy=1, cost=0.0455] + + + + +.. parsed-literal:: + + ['isytihar darurat', + 'mic', + 'dewan rakyat', + 'agama', + 'majlis pakatan harapan', + 'cambridge analytica', + 'tabung haji', + 'ganja', + 'universiti', + 'isu kerugian', + 'isu dadah', + 'tun daim zainuddin', + 'menteri dalam negeri', + 'perkasa', + 'pengedar dadah', + 'anwar ibrahim', + 'sst', + 'saham dan komoditi', + 'amanah', + 'astro awani', + 'recep tayyip erdogan', + 'kementerian dalam negeri', + 'pakatan harapan', + 'parti islam semalaysia', + 'jabatan agama islam wilayah persekutuan', + 'undi pos', + 'pusat daerah mangundi', + 'programming language', + 'wan azizah', + 'rumah mampu milik', + 'kkmm', + 'menteri pertahanan', + 'universiti islam antarabangsa', + 'datuk seri abdul hadi awang', + 'donald trump', + 'gaji menteri', + 'bebas tahanan', + 'ask me a question', + 'ahli dewan undangan negeri'] + + + +You can speed up your training iteration by using +`malaya-gpu `__ + +After you trained, actually you save that model by using method +``save_model``. Just provide directory you want to save. + +.. code:: python + + siamese.save_model('siamese') + +.. code:: python + + !ls siamese + + +.. parsed-literal:: + + checkpoint model.ckpt.meta + model.ckpt.data-00000-of-00001 model.json + model.ckpt.index + + +You can load your model but need to use interface provided by malaya, +``malaya.similarity.load_siamese`` + +.. code:: python + + siamese = malaya.similarity.load_siamese('siamese') + + +.. parsed-literal:: + + INFO:tensorflow:Restoring parameters from siamese/model.ckpt + + +.. code:: python + + siamese.get_similarity(news) + + + + +.. parsed-literal:: + + ['isytihar darurat', + 'mic', + 'majlis pakatan harapan', + 'cambridge analytica', + 'ask me a question', + 'tabung harapan', + 'tabung haji', + 'ganja', + 'universiti', + 'isu kerugian', + 'isu dadah', + 'tun daim zainuddin', + 'menteri dalam negeri', + 'perkasa', + 'pengedar dadah', + 'anwar ibrahim', + 'sst', + 'saham dan komoditi', + 'amanah', + 'astro awani', + 'recep tayyip erdogan', + 'kementerian dalam negeri', + 'parti islam semalaysia', + 'jabatan agama islam wilayah persekutuan', + 'isu ecrl', + 'parti keadilan rakyat', + 'pusat daerah mangundi', + 'programming language', + 'wan azizah', + 'timbalan perdana menteri', + 'kkmm', + 'perdana menteri', + 'masalah air', + 'menteri pertahanan', + 'universiti islam antarabangsa', + 'datuk seri abdul hadi awang', + 'donald trump', + 'gaji menteri', + 'bebas tahanan', + 'datuk seri azmin ali', + 'ahli dewan undangan negeri'] + + + +Train skipthought text similarity +--------------------------------- + +All parameters supported, + +.. code:: python + + """ + Train a deep skip-thought network for text similarity + + Parameters + ---------- + dictionary: dict + format {'left':['right']} + epoch: int, (default=5) + iteration numbers + batch_size: int, (default=32) + batch size for every feed, batch size must <= size of corpus + embedding_size: int, (default=256) + vector size representation for a word + maxlen: int, (default=100) + max length of a string to be train + ngram: tuple, (default=(1,4)) + n-grams size to train a corpus + + Returns + ------- + _DEEP_SIMILARITY: malaya.similarity._DEEP_SIMILARITY class + """ + +.. code:: python + + skipthought = malaya.similarity.deep_skipthought(malaya.topic.topic,epoch=3) + skipthought.get_similarity(news) + + +.. parsed-literal:: + + minibatch loop: 100%|██████████| 137/137 [01:35<00:00, 1.83it/s, cost=3.05] + minibatch loop: 100%|██████████| 137/137 [01:31<00:00, 1.69it/s, cost=0.428] + minibatch loop: 100%|██████████| 137/137 [01:38<00:00, 1.71it/s, cost=0.164] + + + + +.. parsed-literal:: + + ['malaysia-indonesia', + 'tunku ismail idris', + 'mikro-ekonomi', + 'tengku razaleigh hamzah', + 'k-pop', + 'kkmm', + 'pusat transformasi bandar', + 'hari raya', + '#fakenews', + 'makro-ekonomi', + 'lee kuan yew', + 'pilihan raya umum ke-14', + 'undi rosak', + 'datuk seri azmin ali', + 'ahli dewan undangan negeri', + 'recep tayyip erdogan', + 'inisiatif peduli rakyat', + 'nga kor ming'] + + + +You can speed up your training iteration by using +`malaya-gpu `__ + +After you trained, actually you save that model by using method +``save_model``. Just provide directory you want to save. + +.. code:: python + + skipthought.save_model('skipthought') + +.. code:: python + + !ls skipthought + + +.. parsed-literal:: + + checkpoint model.ckpt.meta + model.ckpt.data-00000-of-00001 model.json + model.ckpt.index + + +You can load your model but need to use interface provided by malaya, +``malaya.similarity.load_skipthought`` + +.. code:: python + + skipthought = malaya.similarity.load_skipthought('skipthought') + + +.. parsed-literal:: + + INFO:tensorflow:Restoring parameters from skipthought/model.ckpt + + +.. code:: python + + skipthought.get_similarity(news) + + + + +.. parsed-literal:: + + ['malaysia-indonesia', + 'tunku ismail idris', + 'mikro-ekonomi', + 'tengku razaleigh hamzah', + 'k-pop', + 'kkmm', + 'pusat transformasi bandar', + 'hari raya', + '#fakenews', + 'makro-ekonomi', + 'lee kuan yew', + 'pilihan raya umum ke-14', + 'undi rosak', + 'datuk seri azmin ali', + 'ahli dewan undangan negeri', + 'recep tayyip erdogan', + 'inisiatif peduli rakyat', + 'nga kor ming'] + + + +Using fuzzy for location +------------------------ + +.. code:: python + + malaya.similarity.fuzzy_location('saya suka makan sate di sungai petani') + + + + +.. parsed-literal:: + + {'negeri': [], 'parlimen': ['sungai petani'], 'dun': []} + + + +Check location from a string +---------------------------- + +.. code:: python + + malaya.similarity.is_location('sungai petani') + + + + +.. parsed-literal:: + + True diff --git a/docs/load-subjectivity.rst b/docs/load-subjectivity.rst index cbdc467b..f695c5ab 100644 --- a/docs/load-subjectivity.rst +++ b/docs/load-subjectivity.rst @@ -7,8 +7,8 @@ .. parsed-literal:: - CPU times: user 10.4 s, sys: 630 ms, total: 11 s - Wall time: 11 s + CPU times: user 12.4 s, sys: 1.4 s, total: 13.8 s + Wall time: 17.2 s Explanation @@ -43,15 +43,15 @@ Load multinomial model .. parsed-literal:: {'negative': 0.46203835811002486, 'positive': 0.5379616418899767} - {'negative': 0.8698758314042119, 'positive': 0.13012416859579023} + {'negative': 0.8607294776614423, 'positive': 0.13927052233855727} .. parsed-literal:: - [{'negative': 0.8698758314042119, 'positive': 0.13012416859579023}, - {'negative': 0.8698758314042119, 'positive': 0.13012416859579023}] + [{'negative': 0.8607294776614423, 'positive': 0.13927052233855727}, + {'negative': 0.8607294776614423, 'positive': 0.13927052233855727}] @@ -118,28 +118,28 @@ List available deep learning models Testing fast-text model negative - ['negative', 'negative'] - [{'negative': 0.99998176, 'positive': 1.8284805e-05}, {'negative': 0.6197021, 'positive': 0.3802979}] + ['negative', 'positive'] + [{'negative': 1.0, 'positive': 5.600171e-08}, {'negative': 0.25236478, 'positive': 0.74763525}] Testing hierarchical model negative ['negative', 'positive'] - [{'negative': 0.9999926, 'positive': 7.3815904e-06}, {'negative': 0.17152506, 'positive': 0.82847494}] + [{'negative': 0.99999225, 'positive': 7.692454e-06}, {'negative': 0.29224393, 'positive': 0.70775604}] Testing bahdanau model negative - ['negative', 'negative'] - [{'negative': 0.99988747, 'positive': 0.000112509806}, {'negative': 0.41513687, 'positive': 0.5848631}] + ['negative', 'positive'] + [{'negative': 0.99998605, 'positive': 1.3971644e-05}, {'negative': 0.41739935, 'positive': 0.5826007}] Testing luong model positive ['positive', 'negative'] - [{'negative': 0.03757865, 'positive': 0.96242136}, {'negative': 0.3540184, 'positive': 0.64598167}] + [{'negative': 0.07556655, 'positive': 0.92443347}, {'negative': 0.96075815, 'positive': 0.039241895}] Testing bidirectional model negative - ['negative', 'negative'] - [{'negative': 0.99999166, 'positive': 8.3508085e-06}, {'negative': 0.9939621, 'positive': 0.0060379254}] + ['negative', 'positive'] + [{'negative': 0.9999918, 'positive': 8.21179e-06}, {'negative': 0.046924926, 'positive': 0.95307505}] Testing bert model negative @@ -309,5 +309,5 @@ will try to evolve it. .. parsed-literal:: - [{'negative': 0.06594214, 'positive': 0.93405783}, - {'negative': 0.9535811, 'positive': 0.046418883}] + [{'negative': 0.054842573, 'positive': 0.94515747}, + {'negative': 0.95071983, 'positive': 0.04928014}] diff --git a/docs/load-subjectivity_files/load-subjectivity_15_0.png b/docs/load-subjectivity_files/load-subjectivity_15_0.png index 7bb40348..330351aa 100644 Binary files a/docs/load-subjectivity_files/load-subjectivity_15_0.png and b/docs/load-subjectivity_files/load-subjectivity_15_0.png differ diff --git a/docs/load-subjectivity_files/load-subjectivity_17_0.png b/docs/load-subjectivity_files/load-subjectivity_17_0.png index f467d0d5..b0a0f454 100644 Binary files a/docs/load-subjectivity_files/load-subjectivity_17_0.png and b/docs/load-subjectivity_files/load-subjectivity_17_0.png differ diff --git a/docs/load-subjectivity_files/load-subjectivity_19_0.png b/docs/load-subjectivity_files/load-subjectivity_19_0.png index fcdee996..4be85309 100644 Binary files a/docs/load-subjectivity_files/load-subjectivity_19_0.png and b/docs/load-subjectivity_files/load-subjectivity_19_0.png differ diff --git a/docs/load-topics-influencers.rst b/docs/load-topics-influencers.rst deleted file mode 100644 index e55fdf24..00000000 --- a/docs/load-topics-influencers.rst +++ /dev/null @@ -1,361 +0,0 @@ - -.. code:: python - - import malaya - -.. code:: python - - news = 'najib razak dan mahathir mengalami masalah air di kemamam terengganu' - second_news = 'ikat penyedia perkhidmatan jalur lebar Telekom Malaysia (TM) perlu mencari jalan penyelesaian bagi meningkatkan akses capaian Internet ke seluruh negara, kata Menteri Komunikasi dan Multimedia, Gobind Singh Deo. Beliau berkata menjadi dasar kerajaan untuk membekalkan akses Internet jalur lebar kepada semua dan memberi penekanan kepada kualiti perkhidmatan yang terbaik. "Dasar kerajaan untuk bekalkan akses kepada semua bukan sekadar pembekalan sahaja tetapi beri penekanan kepada kualiti perkhidmatan yang baik dan dapat bersaing dengan negara lain pada tahap antarabangsa," kata Gobind Singh menerusi catatan di laman rasmi Twitter beliau, malam tadi. Beliau berkata demikian sebagai respons terhadap aduan beberapa pengguna Twitter berhubung akses Internet yang masih tidak stabil serta harga yang tidak berpatutan di beberapa lokasi di seluruh negara.' - -Using fuzzy for topics ----------------------- - -.. code:: python - - malaya.topic_influencer.fuzzy_topic(news) - - - - -.. parsed-literal:: - - ['najib razak', 'mahathir', 'masalah air'] - - - -.. code:: python - - malaya.topic_influencer.fuzzy_topic(second_news) - - - - -.. parsed-literal:: - - ['politik', - 'kkmm', - 'telekom malaysia', - 'internet', - 'pendidikan', - 'perkhidmatan awam', - 'teknologi', - 'twitter', - 'kerajaan', - 'sosial media'] - - - -Using fuzzy for influencers ---------------------------- - -.. code:: python - - malaya.topic_influencer.fuzzy_influencer(news) - - - - -.. parsed-literal:: - - ['najib razak', 'mahathir'] - - - -.. code:: python - - malaya.topic_influencer.fuzzy_influencer(second_news) - - - - -.. parsed-literal:: - - ['gobind singh deo'] - - - -Using fuzzy for location ------------------------- - -.. code:: python - - malaya.topic_influencer.fuzzy_location('saya suka makan sate di sungai petani') - - - - -.. parsed-literal:: - - {'negeri': [], 'parlimen': ['sungai petani'], 'dun': []} - - - -Check location from a string ----------------------------- - -.. code:: python - - malaya.topic_influencer.is_location('sungai petani') - - - - -.. parsed-literal:: - - True - - - -Train TF-IDF for topics analysis --------------------------------- - -.. code:: python - - topics_similarity = malaya.topic_influencer.fast_topic() - -.. code:: python - - topics_similarity.get_similarity(news) - - - - -.. parsed-literal:: - - ['najib razak', - 'mahathir', - 'tan sri mokhzani mahathir', - 'tengku razaleigh hamzah'] - - - -Train TF-IDF for influencers analysis -------------------------------------- - -.. code:: python - - influencers_similarity = malaya.topic_influencer.fast_influencer() - -.. code:: python - - influencers_similarity.get_similarity(news) - - - - -.. parsed-literal:: - - ['najib razak', - 'mahathir', - 'tan sri mokhzani mahathir', - 'tengku razaleigh hamzah'] - - - -.. code:: python - - influencers_similarity.get_similarity(second_news) - - - - -.. parsed-literal:: - - ['mic', - 'jabatan perancangan bandar dan desa', - 'pakatan harapan', - 'parti pribumi bersatu malaysia', - 'gobind singh deo', - 'ppbm', - 'parti islam semalaysia', - 'perkasa'] - - - -Train skip-thought model for topics analysis --------------------------------------------- - -.. code:: python - - deep_topic = malaya.topic_influencer.skipthought_topic() - - -.. parsed-literal:: - - minibatch loop: 100%|██████████| 157/157 [01:47<00:00, 1.67it/s, cost=0.447] - minibatch loop: 100%|██████████| 157/157 [01:45<00:00, 1.71it/s, cost=0.00799] - minibatch loop: 100%|██████████| 157/157 [01:45<00:00, 1.68it/s, cost=0.00315] - minibatch loop: 100%|██████████| 157/157 [01:44<00:00, 1.60it/s, cost=0.00197] - minibatch loop: 100%|██████████| 157/157 [01:44<00:00, 1.70it/s, cost=0.00152] - - -.. code:: python - - deep_topic.get_similarity(news, anchor = 0.5) - - - - -.. parsed-literal:: - - ['kkmm', - 'k-pop', - 'mikro-ekonomi', - 'malaysia-indonesia', - 'makro-ekonomi', - 'pilihan raya umum ke-14', - 'programming language', - '#fakenews', - 'undi rosak'] - - - -.. code:: python - - deep_topic.get_similarity(second_news, anchor = 0.5) - - - - -.. parsed-literal:: - - ['datuk seri abdul hadi awang', - 'kkmm', - 'k-pop', - 'mikro-ekonomi', - 'malaysia-indonesia', - 'makro-ekonomi', - 'pilihan raya umum ke-14', - 'programming language', - '#fakenews', - 'new straits times', - 'undi rosak'] - - - -Train skip-thought model for influencers analysis -------------------------------------------------- - -.. code:: python - - deep_influencer = malaya.topic_influencer.skipthought_influencer() - - -.. parsed-literal:: - - minibatch loop: 100%|██████████| 20/20 [00:13<00:00, 1.70it/s, cost=3.46] - minibatch loop: 100%|██████████| 20/20 [00:13<00:00, 1.33it/s, cost=1.08] - minibatch loop: 100%|██████████| 20/20 [00:13<00:00, 1.66it/s, cost=0.547] - minibatch loop: 100%|██████████| 20/20 [00:12<00:00, 1.74it/s, cost=0.275] - minibatch loop: 100%|██████████| 20/20 [00:12<00:00, 1.59it/s, cost=0.253] - minibatch loop: 100%|██████████| 20/20 [00:12<00:00, 1.69it/s, cost=0.281] - minibatch loop: 100%|██████████| 20/20 [00:12<00:00, 1.71it/s, cost=0.209] - minibatch loop: 100%|██████████| 20/20 [00:12<00:00, 1.66it/s, cost=0.259] - minibatch loop: 100%|██████████| 20/20 [00:12<00:00, 1.67it/s, cost=0.232] - minibatch loop: 100%|██████████| 20/20 [00:12<00:00, 1.62it/s, cost=0.219] - - -.. code:: python - - deep_influencer.get_similarity(news, anchor = 0.5) - - - - -.. parsed-literal:: - - ['najib razak', 'mahathir'] - - - -.. code:: python - - deep_influencer.get_similarity(second_news, anchor = 0.5) - - - - -.. parsed-literal:: - - ['gobind singh deo'] - - - -Train siamese network for topics analysis ------------------------------------------ - -.. code:: python - - deep_topic = malaya.topic_influencer.siamese_topic() - print(deep_topic.get_similarity(news, anchor = 0.5)) - print(deep_topic.get_similarity(second_news, anchor = 0.5)) - - -.. parsed-literal:: - - minibatch loop: 100%|██████████| 157/157 [01:50<00:00, 1.67it/s, accuracy=1, cost=0.114] - minibatch loop: 100%|██████████| 157/157 [01:49<00:00, 1.69it/s, accuracy=1, cost=0.0739] - minibatch loop: 100%|██████████| 157/157 [01:49<00:00, 1.66it/s, accuracy=1, cost=0.0686] - minibatch loop: 100%|██████████| 157/157 [01:50<00:00, 1.68it/s, accuracy=1, cost=0.0279] - minibatch loop: 100%|██████████| 157/157 [01:49<00:00, 1.70it/s, accuracy=1, cost=0.0193] - - -.. parsed-literal:: - - ['kesihatan', 'politik', 'wan azizah', 'kaum cina', 'tiga penjuru', 'pusat transformasi bandar', 'bumiputra', 'jabatan perancangan bandar dan desa', 'pusat daerah mangundi', 'menteri pertahanan', 'kewangan', 'gaza', 'kaum melayu', 'programming language', 'lgbt', 'infrastruktur', 'sinar harian', 'singapura', 'real madrid cf', 'anwar ibrahim'] - ['politik', 'kkmm', 'bumiputra', 'malaysia-indonesia', 'menteri pertahanan', 'motogp', 'programming language', 'twitter', 'lgbt', 'gaji menteri', 'singapura'] - - -.. code:: python - - print(deep_topic.get_similarity(news, anchor = 0.7)) - print(deep_topic.get_similarity(second_news, anchor = 0.7)) - - -.. parsed-literal:: - - [] - [] - - -Train siamese network for influencers analysis ----------------------------------------------- - -.. code:: python - - deep_influencer = malaya.topic_influencer.siamese_influencer() - - -.. parsed-literal:: - - minibatch loop: 100%|██████████| 20/20 [00:14<00:00, 1.46it/s, accuracy=0.583, cost=0.129] - minibatch loop: 100%|██████████| 20/20 [00:13<00:00, 1.48it/s, accuracy=0.542, cost=0.124] - minibatch loop: 100%|██████████| 20/20 [00:13<00:00, 1.49it/s, accuracy=0.542, cost=0.121] - minibatch loop: 100%|██████████| 20/20 [00:14<00:00, 1.49it/s, accuracy=0.833, cost=0.0885] - minibatch loop: 100%|██████████| 20/20 [00:14<00:00, 1.47it/s, accuracy=0.875, cost=0.0637] - - -.. code:: python - - deep_influencer.get_similarity(news, anchor = 0.5) - - - - -.. parsed-literal:: - - ['najib razak', 'mahathir'] - - - -.. code:: python - - deep_influencer.get_similarity(second_news, anchor = 0.5) - - - - -.. parsed-literal:: - - ['gobind singh deo'] diff --git a/docs/load-word-mover-distance.rst b/docs/load-word-mover-distance.rst new file mode 100644 index 00000000..eb4bf5e3 --- /dev/null +++ b/docs/load-word-mover-distance.rst @@ -0,0 +1,325 @@ + +.. code:: python + + %%time + import malaya + + +.. parsed-literal:: + + CPU times: user 12.6 s, sys: 1.43 s, total: 14 s + Wall time: 17.6 s + + +What is word mover distance? +---------------------------- + +between two documents in a meaningful way, even when they have no words +in common. It uses vector embeddings of words. It been shown to +outperform many of the state-of-the-art methods in k-nearest neighbors +classification. + +You can read more about word mover distance from `Word Distance between +Word +Embeddings `__. + +**Closest to 0 is better**. + +.. code:: python + + left_sentence = 'saya suka makan ayam' + right_sentence = 'saya suka makan ikan' + left_token = left_sentence.split() + right_token = right_sentence.split() + +.. code:: python + + w2v_wiki = malaya.word2vec.load_wiki() + w2v_wiki = malaya.word2vec.word2vec(w2v_wiki['nce_weights'],w2v_wiki['dictionary']) + +.. code:: python + + fasttext_wiki, ngrams = malaya.fast_text.load_wiki() + fasttext_wiki = malaya.fast_text.fast_text(fasttext_wiki['embed_weights'],fasttext_wiki['dictionary'], ngrams) + +Using word2vec +-------------- + +.. code:: python + + malaya.word_mover.distance(left_token, right_token, w2v_wiki) + + + + +.. parsed-literal:: + + 0.8225146532058716 + + + +.. code:: python + + malaya.word_mover.distance(left_token, left_token, w2v_wiki) + + + + +.. parsed-literal:: + + 0.0 + + + +Using fast-text +--------------- + +.. code:: python + + malaya.word_mover.distance(left_token, right_token, fasttext_wiki) + + + + +.. parsed-literal:: + + 2.82466983795166 + + + +.. code:: python + + malaya.word_mover.distance(left_token, left_token, fasttext_wiki) + + + + +.. parsed-literal:: + + 0.0 + + + +Load expander +------------- + +We want to expand shortforms based on ``malaya.normalize.spell`` by +using word mover distance. If our vector knows that ``mkn`` semantically +similar to ``makan`` based on ``saya suka mkn ayam`` sentence, word +mover distance will become closer. + +It is really depends on our vector, and word2vec may not able to +understand shortform, so we will use fast-text to fix ``OUT-OF-VOCAB`` +problem. + +.. code:: python + + malays = malaya.load_malay_dictionary() + wiki, ngrams = malaya.fast_text.load_wiki() + fast_text_embed = malaya.fast_text.fast_text(wiki['embed_weights'],wiki['dictionary'],ngrams) + expander = malaya.word_mover.expander(malays, fast_text_embed) + +.. code:: python + + string = 'y u xsuka makan HUSEIN kt situ tmpt' + another = 'i mmg xska mknn HUSEIN kampng tempt' + +.. code:: python + + expander.expand(string) + + + + +.. parsed-literal:: + + [[('tmpt', + 'kenapa awak tak suka makan Husein kat situ tut', + 0.8088938253521919), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tuit', + 0.863929785296917), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tat', + 0.8680638003787995), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ top', + 0.8688952446055412), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tip', + 0.8978437346220016), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ taat', + 0.936883625289917), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ topi', + 0.9442774548711776), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tumit', + 0.9495834815340042), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tempe', + 0.9758907731723786), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ ampe', + 0.9821926467533112), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tempo', + 0.9836614096956253), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tepet', + 0.994007917971611), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ amit', + 0.9999424153804779), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tuat', + 1.0002889167022706), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ mat', + 1.0071370331926346), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ temut', + 1.011553812426567), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ ampit', + 1.022653616695404), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ ampo', + 1.0231078831071854), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tipu', + 1.0246861065587998), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tepi', + 1.0285266551542283), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ umut', + 1.0287358275117875), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ emat', + 1.0357482937116622), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ empat', + 1.0431590774860382), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tapi', + 1.0562509994459153), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tepu', + 1.0601519473543166), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tumpat', + 1.074669928882599), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ impi', + 1.078846170501709), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ umat', + 1.0791117155513763), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tampi', + 1.0883281208925248), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tumpu', + 1.091578345676422), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ umpat', + 1.092372225769043), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tepat', + 1.0979607516746521), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tampa', + 1.1118229238204955), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ amput', + 1.1226389572820663), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tapa', + 1.129335333744049), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ timpa', + 1.1353471846590042), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ empu', + 1.1459274488725661), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tempa', + 1.164648480837822), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tampu', + 1.1812463180065156), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tempat', + 1.1856716803007126), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tamat', + 1.2068403679332733), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ amat', + 1.2214121790246963), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ ampu', + 1.2350379461402894), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ taut', + 1.2796957146606445)]] + + + +.. code:: python + + expander.expand(another) + + + + +.. parsed-literal:: + + [[('ska', 'saya memang tak soka mknn Husein kampng tempt', 0.7199365496635437), + ('ska', 'saya memang tak suka mknn Husein kampng tempt', 0.8050327301025391), + ('ska', 'saya memang tak sika mknn Husein kampng tempt', 0.8729341626167297), + ('ska', 'saya memang tak saka mknn Husein kampng tempt', 0.875930666923523), + ('ska', 'saya memang tak spa mknn Husein kampng tempt', 0.8995948433876038), + ('ska', 'saya memang tak sua mknn Husein kampng tempt', 0.9496822357177734), + ('ska', 'saya memang tak seka mknn Husein kampng tempt', 0.9891390204429626), + ('ska', 'saya memang tak ski mknn Husein kampng tempt', 1.1318669319152832), + ('ska', 'saya memang tak sia mknn Husein kampng tempt', 1.1666431427001953)], + [('mknn', 'saya memang tak ska min Husein kampng tempt', 0.8653836846351624), + ('mknn', 'saya memang tak ska maun Husein kampng tempt', 1.045318603515625), + ('mknn', 'saya memang tak ska kun Husein kampng tempt', 1.0710314512252808), + ('mknn', 'saya memang tak ska ken Husein kampng tempt', 1.0728274583816528), + ('mknn', 'saya memang tak ska kon Husein kampng tempt', 1.0992072820663452), + ('mknn', 'saya memang tak ska ikon Husein kampng tempt', 1.1365187168121338), + ('mknn', 'saya memang tak ska makin Husein kampng tempt', 1.180336833000183), + ('mknn', 'saya memang tak ska main Husein kampng tempt', 1.182568907737732), + ('mknn', 'saya memang tak ska makan Husein kampng tempt', 1.183489203453064), + ('mknn', 'saya memang tak ska makna Husein kampng tempt', 1.184565544128418), + ('mknn', 'saya memang tak ska kan Husein kampng tempt', 1.2368937730789185), + ('mknn', 'saya memang tak ska akan Husein kampng tempt', 1.2527291774749756), + ('mknn', 'saya memang tak ska mani Husein kampng tempt', 1.266147494316101), + ('mknn', 'saya memang tak ska ikan Husein kampng tempt', 1.2773109674453735), + ('mknn', 'saya memang tak ska mini Husein kampng tempt', 1.3020210266113281), + ('mknn', 'saya memang tak ska mana Husein kampng tempt', 1.3099677562713623), + ('mknn', 'saya memang tak ska menu Husein kampng tempt', 1.3974181413650513), + ('mknn', 'saya memang tak ska mena Husein kampng tempt', 1.404064655303955), + ('mknn', + 'saya memang tak ska makanan Husein kampng tempt', + 1.4473483562469482)], + [('kampng', + 'saya memang tak ska mknn Husein kampung tempt', + 0.9272603988647461)], + [('tempt', + 'saya memang tak ska mknn Husein kampng tempo', + 0.7405402660369873), + ('tempt', + 'saya memang tak ska mknn Husein kampng tempe', + 0.7510019540786743), + ('tempt', 'saya memang tak ska mknn Husein kampng tempa', 0.885798454284668), + ('tempt', + 'saya memang tak ska mknn Husein kampng temut', + 0.9036741256713867), + ('tempt', + 'saya memang tak ska mknn Husein kampng tempat', + 0.9161624312400818)]] diff --git a/example/emotion/README.rst b/example/emotion/README.rst index 01b23235..0ce1e92a 100644 --- a/example/emotion/README.rst +++ b/example/emotion/README.rst @@ -7,8 +7,8 @@ .. parsed-literal:: - CPU times: user 10.4 s, sys: 640 ms, total: 11 s - Wall time: 11 s + CPU times: user 12 s, sys: 1.41 s, total: 13.4 s + Wall time: 17.1 s .. code:: ipython3 @@ -43,7 +43,7 @@ Load multinomial model .. parsed-literal:: anger - {'anger': 0.27993946463423486, 'fear': 0.1482931513658756, 'joy': 0.1880009584798728, 'love': 0.21711876657658918, 'sadness': 0.1296730712078804, 'surprise': 0.03697458773554805} + {'anger': 0.30367763926253094, 'fear': 0.16709964152193366, 'joy': 0.17026521921403184, 'love': 0.18405977732934192, 'sadness': 0.1388341895665479, 'surprise': 0.03606353310561458} @@ -73,31 +73,31 @@ Load xgb model .. parsed-literal:: love - {'anger': 0.21755809, 'fear': 0.090371706, 'joy': 0.13347618, 'love': 0.47302967, 'sadness': 0.0770047, 'surprise': 0.008559667} + {'anger': 0.22918181, 'fear': 0.089252785, 'joy': 0.1318236, 'love': 0.46476611, 'sadness': 0.07200217, 'surprise': 0.012973559} .. parsed-literal:: - [{'anger': 0.21755809, - 'fear': 0.090371706, - 'joy': 0.13347618, - 'love': 0.47302967, - 'sadness': 0.0770047, - 'surprise': 0.008559667}, + [{'anger': 0.22918181, + 'fear': 0.089252785, + 'joy': 0.1318236, + 'love': 0.46476611, + 'sadness': 0.07200217, + 'surprise': 0.012973559}, {'anger': 0.013483193, 'fear': 0.939588, 'joy': 0.01674833, 'love': 0.003220023, 'sadness': 0.022906518, 'surprise': 0.0040539484}, - {'anger': 0.09142393, - 'fear': 0.029400537, - 'joy': 0.78257465, - 'love': 0.02881839, - 'sadness': 0.058004435, - 'surprise': 0.009778041}, + {'anger': 0.10506946, + 'fear': 0.025150253, + 'joy': 0.725915, + 'love': 0.05211037, + 'sadness': 0.078554265, + 'surprise': 0.013200594}, {'anger': 0.11640434, 'fear': 0.097485565, 'joy': 0.24893147, @@ -110,12 +110,12 @@ Load xgb model 'love': 0.022184724, 'sadness': 0.41255626, 'surprise': 0.006135965}, - {'anger': 0.0714585, - 'fear': 0.19790031, - 'joy': 0.037659157, - 'love': 0.0025473926, - 'sadness': 0.00772799, - 'surprise': 0.6827066}] + {'anger': 0.07513438, + 'fear': 0.2525073, + 'joy': 0.024355419, + 'love': 0.002638406, + 'sadness': 0.0059716892, + 'surprise': 0.6393928}] @@ -167,27 +167,27 @@ List available deep learning models Testing fast-text model love ['love', 'fear', 'joy', 'love', 'sadness', 'surprise'] - [{'anger': 2.978304e-06, 'fear': 1.8461518e-10, 'joy': 1.0204276e-09, 'love': 0.999997, 'sadness': 1.3693535e-09, 'surprise': 2.6386826e-09}, {'anger': 1.2210384e-18, 'fear': 1.0, 'joy': 1.0015556e-19, 'love': 1.8750202e-24, 'sadness': 6.976661e-21, 'surprise': 3.2600536e-15}, {'anger': 2.47199e-19, 'fear': 2.3032567e-22, 'joy': 1.0, 'love': 5.1478095e-14, 'sadness': 4.464682e-20, 'surprise': 1.588908e-15}, {'anger': 4.1249185e-11, 'fear': 1.7474476e-10, 'joy': 0.00022258118, 'love': 0.9997774, 'sadness': 1.6592432e-11, 'surprise': 4.1854236e-09}, {'anger': 4.3972154e-08, 'fear': 2.1118221e-06, 'joy': 3.4898858e-07, 'love': 4.5489975e-12, 'sadness': 0.9999975, 'surprise': 4.8414757e-09}, {'anger': 1.1130476e-23, 'fear': 0.0003273876, 'joy': 5.694222e-17, 'love': 1.9363045e-25, 'sadness': 1.4252974e-26, 'surprise': 0.99967265}] + [{'anger': 2.538603e-07, 'fear': 4.1372344e-13, 'joy': 1.0892472e-08, 'love': 0.99999976, 'sadness': 3.8994935e-16, 'surprise': 2.439655e-08}, {'anger': 4.4489467e-24, 'fear': 1.0, 'joy': 1.3903143e-28, 'love': 1.7920514e-33, 'sadness': 1.01771616e-26, 'surprise': 6.799581e-18}, {'anger': 9.583714e-26, 'fear': 1.5029816e-24, 'joy': 1.0, 'love': 3.7527533e-13, 'sadness': 8.348174e-24, 'surprise': 2.080897e-16}, {'anger': 1.7409228e-13, 'fear': 3.2279754e-12, 'joy': 0.0005876841, 'love': 0.9994123, 'sadness': 1.8902605e-11, 'surprise': 9.9256076e-11}, {'anger': 1.2737708e-11, 'fear': 5.882562e-10, 'joy': 9.112171e-13, 'love': 7.7659496e-20, 'sadness': 1.0, 'surprise': 1.6035637e-16}, {'anger': 5.5730725e-37, 'fear': 0.16033638, 'joy': 1.2999706e-30, 'love': 0.0, 'sadness': 0.0, 'surprise': 0.8396636}] Testing hierarchical model - joy + anger ['anger', 'fear', 'joy', 'joy', 'sadness', 'joy'] - [{'anger': 0.39431405, 'fear': 0.13933083, 'joy': 0.17727984, 'love': 0.042310942, 'sadness': 0.22523886, 'surprise': 0.021525377}, {'anger': 0.004958992, 'fear': 0.9853917, 'joy': 0.006676573, 'love': 0.00023657709, 'sadness': 0.0017484307, 'surprise': 0.0009877522}, {'anger': 0.0013627211, 'fear': 0.0017271177, 'joy': 0.986464, 'love': 0.0039458317, 'sadness': 0.0021411367, 'surprise': 0.0043591294}, {'anger': 0.028909639, 'fear': 0.09853578, 'joy': 0.50412154, 'love': 0.26376858, 'sadness': 0.084195614, 'surprise': 0.02046885}, {'anger': 0.022849305, 'fear': 0.011993612, 'joy': 0.008679014, 'love': 0.002472554, 'sadness': 0.9502534, 'surprise': 0.003752149}, {'anger': 0.015510161, 'fear': 0.0571924, 'joy': 0.5819401, 'love': 0.21683867, 'sadness': 0.006425157, 'surprise': 0.12209346}] + [{'anger': 0.22394963, 'fear': 0.35022292, 'joy': 0.19895941, 'love': 0.013231089, 'sadness': 0.20033234, 'surprise': 0.013304558}, {'anger': 0.0056565125, 'fear': 0.9885886, 'joy': 0.0034398232, 'love': 0.00018917819, 'sadness': 0.0012037805, 'surprise': 0.00092218135}, {'anger': 0.01764421, 'fear': 0.01951682, 'joy': 0.8797468, 'love': 0.041130837, 'sadness': 0.013527576, 'surprise': 0.028433735}, {'anger': 0.028772388, 'fear': 0.07343067, 'joy': 0.48502314, 'love': 0.28668693, 'sadness': 0.10576224, 'surprise': 0.020324599}, {'anger': 0.021873059, 'fear': 0.014633018, 'joy': 0.01073073, 'love': 0.0012993184, 'sadness': 0.94936466, 'surprise': 0.0020992015}, {'anger': 0.020028168, 'fear': 0.17150529, 'joy': 0.3734562, 'love': 0.19241562, 'sadness': 0.008164915, 'surprise': 0.23442967}] Testing bahdanau model love - ['love', 'fear', 'joy', 'love', 'sadness', 'surprise'] - [{'anger': 0.44805261, 'fear': 0.18378404, 'joy': 0.02516251, 'love': 0.30925235, 'sadness': 0.027497768, 'surprise': 0.0062507084}, {'anger': 0.0010828926, 'fear': 0.9789995, 'joy': 0.0027138714, 'love': 0.00061593985, 'sadness': 0.0048968275, 'surprise': 0.011690898}, {'anger': 0.012288661, 'fear': 0.0025563037, 'joy': 0.85003525, 'love': 0.12451392, 'sadness': 0.0008497203, 'surprise': 0.009756153}, {'anger': 0.02319879, 'fear': 0.031080244, 'joy': 0.14820175, 'love': 0.7294624, 'sadness': 0.021997027, 'surprise': 0.046059813}, {'anger': 0.031083692, 'fear': 0.035790402, 'joy': 0.01741525, 'love': 0.00062268815, 'sadness': 0.9130492, 'surprise': 0.0020387478}, {'anger': 0.00159852, 'fear': 0.34762463, 'joy': 0.04318491, 'love': 0.0028805388, 'sadness': 0.00093575486, 'surprise': 0.6037757}] + ['anger', 'fear', 'joy', 'love', 'sadness', 'surprise'] + [{'anger': 0.53818357, 'fear': 0.14104106, 'joy': 0.010708541, 'love': 0.2570674, 'sadness': 0.047102023, 'surprise': 0.005897305}, {'anger': 0.0005677081, 'fear': 0.9770825, 'joy': 0.005677423, 'love': 0.0007302013, 'sadness': 0.0017472907, 'surprise': 0.014194911}, {'anger': 0.06975506, 'fear': 0.0069800974, 'joy': 0.5717373, 'love': 0.30618504, 'sadness': 0.011454151, 'surprise': 0.033888407}, {'anger': 0.0038130684, 'fear': 0.0053994465, 'joy': 0.10317592, 'love': 0.8656706, 'sadness': 0.0056833136, 'surprise': 0.016257582}, {'anger': 0.01122868, 'fear': 0.019208057, 'joy': 0.0024597098, 'love': 0.0002851458, 'sadness': 0.965973, 'surprise': 0.00084543176}, {'anger': 0.00083102344, 'fear': 0.23240082, 'joy': 0.033536877, 'love': 0.0011026214, 'sadness': 0.00037630452, 'surprise': 0.7317524}] Testing luong model love - ['love', 'fear', 'joy', 'love', 'sadness', 'fear'] - [{'anger': 0.044591118, 'fear': 0.063305356, 'joy': 0.33247164, 'love': 0.5347649, 'sadness': 0.0068765697, 'surprise': 0.017990304}, {'anger': 0.0064159264, 'fear': 0.9606779, 'joy': 0.012426791, 'love': 0.0013584964, 'sadness': 0.008015306, 'surprise': 0.011105636}, {'anger': 0.0036163705, 'fear': 5.7273093e-05, 'joy': 0.98739016, 'love': 0.0076421387, 'sadness': 0.00028883366, 'surprise': 0.0010052109}, {'anger': 0.017377134, 'fear': 0.0073309895, 'joy': 0.07374035, 'love': 0.3433876, 'sadness': 0.5455663, 'surprise': 0.012597541}, {'anger': 0.0007876828, 'fear': 0.0009606754, 'joy': 9.633098e-05, 'love': 0.00014691186, 'sadness': 0.9978861, 'surprise': 0.00012229013}, {'anger': 0.00045764598, 'fear': 0.37070635, 'joy': 0.0005788357, 'love': 0.00027592952, 'sadness': 0.00033797708, 'surprise': 0.6276433}] + ['joy', 'fear', 'joy', 'sadness', 'sadness', 'surprise'] + [{'anger': 0.057855386, 'fear': 0.040447887, 'joy': 0.29915547, 'love': 0.5720974, 'sadness': 0.00927453, 'surprise': 0.02116932}, {'anger': 0.0063275485, 'fear': 0.9673098, 'joy': 0.0065225014, 'love': 0.0008387138, 'sadness': 0.00706696, 'surprise': 0.011934649}, {'anger': 0.0014677589, 'fear': 0.0020899512, 'joy': 0.88741183, 'love': 0.076111265, 'sadness': 0.0038936164, 'surprise': 0.029025558}, {'anger': 0.013268307, 'fear': 0.0035831807, 'joy': 0.056010414, 'love': 0.21701123, 'sadness': 0.69225526, 'surprise': 0.017871574}, {'anger': 0.0018013288, 'fear': 0.0012173079, 'joy': 5.611221e-05, 'love': 9.00831e-05, 'sadness': 0.9967213, 'surprise': 0.000113809925}, {'anger': 0.00015200193, 'fear': 0.36670414, 'joy': 0.0003732592, 'love': 0.00011813393, 'sadness': 0.000118975, 'surprise': 0.63253355}] Testing bidirectional model - surprise - ['anger', 'anger', 'anger', 'anger', 'anger', 'fear'] - [{'anger': 0.613231, 'fear': 0.21215951, 'joy': 0.00012107872, 'love': 0.007714424, 'sadness': 0.0029091935, 'surprise': 0.16386479}, {'anger': 0.7650685, 'fear': 0.12844206, 'joy': 0.00046135965, 'love': 0.0025065169, 'sadness': 0.012999088, 'surprise': 0.09052232}, {'anger': 0.7017255, 'fear': 0.12622964, 'joy': 0.00019186054, 'love': 0.0041279723, 'sadness': 0.0051922314, 'surprise': 0.16253278}, {'anger': 0.83330584, 'fear': 0.099247426, 'joy': 0.0007255099, 'love': 0.0023077168, 'sadness': 0.016625375, 'surprise': 0.047788195}, {'anger': 0.77445495, 'fear': 0.11811776, 'joy': 0.00019311535, 'love': 0.002333317, 'sadness': 0.004926041, 'surprise': 0.09997472}, {'anger': 0.28467438, 'fear': 0.3107746, 'joy': 0.0009574863, 'love': 0.039786864, 'sadness': 0.0549624, 'surprise': 0.3088443}] + love + ['fear', 'fear', 'anger', 'joy', 'sadness', 'surprise'] + [{'anger': 0.031539902, 'fear': 0.44634053, 'joy': 0.0022038615, 'love': 0.24390388, 'sadness': 0.00030186496, 'surprise': 0.27570996}, {'anger': 0.0028205896, 'fear': 0.9787958, 'joy': 0.016622344, 'love': 0.00041048063, 'sadness': 0.0004424488, 'surprise': 0.00090834824}, {'anger': 0.4523394, 'fear': 0.32489082, 'joy': 0.04712723, 'love': 0.01679146, 'sadness': 0.039135754, 'surprise': 0.1197153}, {'anger': 0.04196525, 'fear': 0.08604635, 'joy': 0.65291435, 'love': 0.049389884, 'sadness': 0.077201255, 'surprise': 0.09248292}, {'anger': 0.06327597, 'fear': 0.058998022, 'joy': 0.041568566, 'love': 0.002343863, 'sadness': 0.8224733, 'surprise': 0.011340328}, {'anger': 1.5136379e-05, 'fear': 0.002162331, 'joy': 3.5301118e-06, 'love': 0.006482973, 'sadness': 2.4173462e-06, 'surprise': 0.99133366}] Testing bert model anger @@ -367,41 +367,41 @@ will try to evolve it. .. parsed-literal:: - [{'anger': 0.055561937, - 'fear': 0.034661848, - 'joy': 0.20765074, - 'love': 0.65774184, - 'sadness': 0.0210206, - 'surprise': 0.023363067}, - {'anger': 1.5065236e-05, - 'fear': 0.9998666, - 'joy': 6.3056427e-06, - 'love': 2.9068442e-06, - 'sadness': 3.6798014e-05, - 'surprise': 7.235542e-05}, - {'anger': 0.00097060547, - 'fear': 5.1922354e-05, - 'joy': 0.99052715, - 'love': 0.0024538564, - 'sadness': 0.0005109437, - 'surprise': 0.005485538}, - {'anger': 0.00014133049, - 'fear': 0.0004463539, - 'joy': 0.12486383, - 'love': 0.87307847, - 'sadness': 0.0013382707, - 'surprise': 0.0001317923}, - {'anger': 0.0077239843, - 'fear': 0.014800851, - 'joy': 0.008525367, - 'love': 0.0013007816, - 'sadness': 0.9655128, - 'surprise': 0.0021361646}, - {'anger': 0.0003960413, - 'fear': 0.6634573, - 'joy': 0.0014801685, - 'love': 0.00056572456, - 'sadness': 0.000516784, - 'surprise': 0.33358407}] + [{'anger': 0.07479232, + 'fear': 0.012134718, + 'joy': 0.034137156, + 'love': 0.85221285, + 'sadness': 0.006336733, + 'surprise': 0.020386234}, + {'anger': 1.6892743e-08, + 'fear': 0.99999964, + 'joy': 6.260633e-08, + 'love': 3.2111713e-10, + 'sadness': 3.542872e-08, + 'surprise': 2.2207877e-07}, + {'anger': 0.00012469916, + 'fear': 9.6892345e-06, + 'joy': 0.9917463, + 'love': 0.006561422, + 'sadness': 0.00040069615, + 'surprise': 0.0011572224}, + {'anger': 5.0021445e-05, + 'fear': 0.0010109642, + 'joy': 0.049688663, + 'love': 0.94577587, + 'sadness': 0.0032941191, + 'surprise': 0.00018034693}, + {'anger': 0.0010146926, + 'fear': 0.00020020001, + 'joy': 5.2909185e-05, + 'love': 2.640257e-06, + 'sadness': 0.99870074, + 'surprise': 2.8823646e-05}, + {'anger': 0.0057854424, + 'fear': 0.8317998, + 'joy': 0.017287944, + 'love': 0.008883897, + 'sadness': 0.0070799366, + 'surprise': 0.12916291}] diff --git a/example/emotion/load-emotion.ipynb b/example/emotion/load-emotion.ipynb index d777b987..4c4cc53a 100644 --- a/example/emotion/load-emotion.ipynb +++ b/example/emotion/load-emotion.ipynb @@ -9,8 +9,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 10.4 s, sys: 640 ms, total: 11 s\n", - "Wall time: 11 s\n" + "CPU times: user 12 s, sys: 1.41 s, total: 13.4 s\n", + "Wall time: 17.1 s\n" ] } ], @@ -58,7 +58,7 @@ "output_type": "stream", "text": [ "anger\n", - "{'anger': 0.27993946463423486, 'fear': 0.1482931513658756, 'joy': 0.1880009584798728, 'love': 0.21711876657658918, 'sadness': 0.1296730712078804, 'surprise': 0.03697458773554805}\n" + "{'anger': 0.30367763926253094, 'fear': 0.16709964152193366, 'joy': 0.17026521921403184, 'love': 0.18405977732934192, 'sadness': 0.1388341895665479, 'surprise': 0.03606353310561458}\n" ] }, { @@ -101,30 +101,30 @@ "output_type": "stream", "text": [ "love\n", - "{'anger': 0.21755809, 'fear': 0.090371706, 'joy': 0.13347618, 'love': 0.47302967, 'sadness': 0.0770047, 'surprise': 0.008559667}\n" + "{'anger': 0.22918181, 'fear': 0.089252785, 'joy': 0.1318236, 'love': 0.46476611, 'sadness': 0.07200217, 'surprise': 0.012973559}\n" ] }, { "data": { "text/plain": [ - "[{'anger': 0.21755809,\n", - " 'fear': 0.090371706,\n", - " 'joy': 0.13347618,\n", - " 'love': 0.47302967,\n", - " 'sadness': 0.0770047,\n", - " 'surprise': 0.008559667},\n", + "[{'anger': 0.22918181,\n", + " 'fear': 0.089252785,\n", + " 'joy': 0.1318236,\n", + " 'love': 0.46476611,\n", + " 'sadness': 0.07200217,\n", + " 'surprise': 0.012973559},\n", " {'anger': 0.013483193,\n", " 'fear': 0.939588,\n", " 'joy': 0.01674833,\n", " 'love': 0.003220023,\n", " 'sadness': 0.022906518,\n", " 'surprise': 0.0040539484},\n", - " {'anger': 0.09142393,\n", - " 'fear': 0.029400537,\n", - " 'joy': 0.78257465,\n", - " 'love': 0.02881839,\n", - " 'sadness': 0.058004435,\n", - " 'surprise': 0.009778041},\n", + " {'anger': 0.10506946,\n", + " 'fear': 0.025150253,\n", + " 'joy': 0.725915,\n", + " 'love': 0.05211037,\n", + " 'sadness': 0.078554265,\n", + " 'surprise': 0.013200594},\n", " {'anger': 0.11640434,\n", " 'fear': 0.097485565,\n", " 'joy': 0.24893147,\n", @@ -137,12 +137,12 @@ " 'love': 0.022184724,\n", " 'sadness': 0.41255626,\n", " 'surprise': 0.006135965},\n", - " {'anger': 0.0714585,\n", - " 'fear': 0.19790031,\n", - " 'joy': 0.037659157,\n", - " 'love': 0.0025473926,\n", - " 'sadness': 0.00772799,\n", - " 'surprise': 0.6827066}]" + " {'anger': 0.07513438,\n", + " 'fear': 0.2525073,\n", + " 'joy': 0.024355419,\n", + " 'love': 0.002638406,\n", + " 'sadness': 0.0059716892,\n", + " 'surprise': 0.6393928}]" ] }, "execution_count": 4, @@ -197,7 +197,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -207,27 +207,27 @@ "Testing fast-text model\n", "love\n", "['love', 'fear', 'joy', 'love', 'sadness', 'surprise']\n", - "[{'anger': 2.978304e-06, 'fear': 1.8461518e-10, 'joy': 1.0204276e-09, 'love': 0.999997, 'sadness': 1.3693535e-09, 'surprise': 2.6386826e-09}, {'anger': 1.2210384e-18, 'fear': 1.0, 'joy': 1.0015556e-19, 'love': 1.8750202e-24, 'sadness': 6.976661e-21, 'surprise': 3.2600536e-15}, {'anger': 2.47199e-19, 'fear': 2.3032567e-22, 'joy': 1.0, 'love': 5.1478095e-14, 'sadness': 4.464682e-20, 'surprise': 1.588908e-15}, {'anger': 4.1249185e-11, 'fear': 1.7474476e-10, 'joy': 0.00022258118, 'love': 0.9997774, 'sadness': 1.6592432e-11, 'surprise': 4.1854236e-09}, {'anger': 4.3972154e-08, 'fear': 2.1118221e-06, 'joy': 3.4898858e-07, 'love': 4.5489975e-12, 'sadness': 0.9999975, 'surprise': 4.8414757e-09}, {'anger': 1.1130476e-23, 'fear': 0.0003273876, 'joy': 5.694222e-17, 'love': 1.9363045e-25, 'sadness': 1.4252974e-26, 'surprise': 0.99967265}]\n", + "[{'anger': 2.538603e-07, 'fear': 4.1372344e-13, 'joy': 1.0892472e-08, 'love': 0.99999976, 'sadness': 3.8994935e-16, 'surprise': 2.439655e-08}, {'anger': 4.4489467e-24, 'fear': 1.0, 'joy': 1.3903143e-28, 'love': 1.7920514e-33, 'sadness': 1.01771616e-26, 'surprise': 6.799581e-18}, {'anger': 9.583714e-26, 'fear': 1.5029816e-24, 'joy': 1.0, 'love': 3.7527533e-13, 'sadness': 8.348174e-24, 'surprise': 2.080897e-16}, {'anger': 1.7409228e-13, 'fear': 3.2279754e-12, 'joy': 0.0005876841, 'love': 0.9994123, 'sadness': 1.8902605e-11, 'surprise': 9.9256076e-11}, {'anger': 1.2737708e-11, 'fear': 5.882562e-10, 'joy': 9.112171e-13, 'love': 7.7659496e-20, 'sadness': 1.0, 'surprise': 1.6035637e-16}, {'anger': 5.5730725e-37, 'fear': 0.16033638, 'joy': 1.2999706e-30, 'love': 0.0, 'sadness': 0.0, 'surprise': 0.8396636}]\n", "\n", "Testing hierarchical model\n", - "joy\n", + "anger\n", "['anger', 'fear', 'joy', 'joy', 'sadness', 'joy']\n", - "[{'anger': 0.39431405, 'fear': 0.13933083, 'joy': 0.17727984, 'love': 0.042310942, 'sadness': 0.22523886, 'surprise': 0.021525377}, {'anger': 0.004958992, 'fear': 0.9853917, 'joy': 0.006676573, 'love': 0.00023657709, 'sadness': 0.0017484307, 'surprise': 0.0009877522}, {'anger': 0.0013627211, 'fear': 0.0017271177, 'joy': 0.986464, 'love': 0.0039458317, 'sadness': 0.0021411367, 'surprise': 0.0043591294}, {'anger': 0.028909639, 'fear': 0.09853578, 'joy': 0.50412154, 'love': 0.26376858, 'sadness': 0.084195614, 'surprise': 0.02046885}, {'anger': 0.022849305, 'fear': 0.011993612, 'joy': 0.008679014, 'love': 0.002472554, 'sadness': 0.9502534, 'surprise': 0.003752149}, {'anger': 0.015510161, 'fear': 0.0571924, 'joy': 0.5819401, 'love': 0.21683867, 'sadness': 0.006425157, 'surprise': 0.12209346}]\n", + "[{'anger': 0.22394963, 'fear': 0.35022292, 'joy': 0.19895941, 'love': 0.013231089, 'sadness': 0.20033234, 'surprise': 0.013304558}, {'anger': 0.0056565125, 'fear': 0.9885886, 'joy': 0.0034398232, 'love': 0.00018917819, 'sadness': 0.0012037805, 'surprise': 0.00092218135}, {'anger': 0.01764421, 'fear': 0.01951682, 'joy': 0.8797468, 'love': 0.041130837, 'sadness': 0.013527576, 'surprise': 0.028433735}, {'anger': 0.028772388, 'fear': 0.07343067, 'joy': 0.48502314, 'love': 0.28668693, 'sadness': 0.10576224, 'surprise': 0.020324599}, {'anger': 0.021873059, 'fear': 0.014633018, 'joy': 0.01073073, 'love': 0.0012993184, 'sadness': 0.94936466, 'surprise': 0.0020992015}, {'anger': 0.020028168, 'fear': 0.17150529, 'joy': 0.3734562, 'love': 0.19241562, 'sadness': 0.008164915, 'surprise': 0.23442967}]\n", "\n", "Testing bahdanau model\n", "love\n", - "['love', 'fear', 'joy', 'love', 'sadness', 'surprise']\n", - "[{'anger': 0.44805261, 'fear': 0.18378404, 'joy': 0.02516251, 'love': 0.30925235, 'sadness': 0.027497768, 'surprise': 0.0062507084}, {'anger': 0.0010828926, 'fear': 0.9789995, 'joy': 0.0027138714, 'love': 0.00061593985, 'sadness': 0.0048968275, 'surprise': 0.011690898}, {'anger': 0.012288661, 'fear': 0.0025563037, 'joy': 0.85003525, 'love': 0.12451392, 'sadness': 0.0008497203, 'surprise': 0.009756153}, {'anger': 0.02319879, 'fear': 0.031080244, 'joy': 0.14820175, 'love': 0.7294624, 'sadness': 0.021997027, 'surprise': 0.046059813}, {'anger': 0.031083692, 'fear': 0.035790402, 'joy': 0.01741525, 'love': 0.00062268815, 'sadness': 0.9130492, 'surprise': 0.0020387478}, {'anger': 0.00159852, 'fear': 0.34762463, 'joy': 0.04318491, 'love': 0.0028805388, 'sadness': 0.00093575486, 'surprise': 0.6037757}]\n", + "['anger', 'fear', 'joy', 'love', 'sadness', 'surprise']\n", + "[{'anger': 0.53818357, 'fear': 0.14104106, 'joy': 0.010708541, 'love': 0.2570674, 'sadness': 0.047102023, 'surprise': 0.005897305}, {'anger': 0.0005677081, 'fear': 0.9770825, 'joy': 0.005677423, 'love': 0.0007302013, 'sadness': 0.0017472907, 'surprise': 0.014194911}, {'anger': 0.06975506, 'fear': 0.0069800974, 'joy': 0.5717373, 'love': 0.30618504, 'sadness': 0.011454151, 'surprise': 0.033888407}, {'anger': 0.0038130684, 'fear': 0.0053994465, 'joy': 0.10317592, 'love': 0.8656706, 'sadness': 0.0056833136, 'surprise': 0.016257582}, {'anger': 0.01122868, 'fear': 0.019208057, 'joy': 0.0024597098, 'love': 0.0002851458, 'sadness': 0.965973, 'surprise': 0.00084543176}, {'anger': 0.00083102344, 'fear': 0.23240082, 'joy': 0.033536877, 'love': 0.0011026214, 'sadness': 0.00037630452, 'surprise': 0.7317524}]\n", "\n", "Testing luong model\n", "love\n", - "['love', 'fear', 'joy', 'love', 'sadness', 'fear']\n", - "[{'anger': 0.044591118, 'fear': 0.063305356, 'joy': 0.33247164, 'love': 0.5347649, 'sadness': 0.0068765697, 'surprise': 0.017990304}, {'anger': 0.0064159264, 'fear': 0.9606779, 'joy': 0.012426791, 'love': 0.0013584964, 'sadness': 0.008015306, 'surprise': 0.011105636}, {'anger': 0.0036163705, 'fear': 5.7273093e-05, 'joy': 0.98739016, 'love': 0.0076421387, 'sadness': 0.00028883366, 'surprise': 0.0010052109}, {'anger': 0.017377134, 'fear': 0.0073309895, 'joy': 0.07374035, 'love': 0.3433876, 'sadness': 0.5455663, 'surprise': 0.012597541}, {'anger': 0.0007876828, 'fear': 0.0009606754, 'joy': 9.633098e-05, 'love': 0.00014691186, 'sadness': 0.9978861, 'surprise': 0.00012229013}, {'anger': 0.00045764598, 'fear': 0.37070635, 'joy': 0.0005788357, 'love': 0.00027592952, 'sadness': 0.00033797708, 'surprise': 0.6276433}]\n", + "['joy', 'fear', 'joy', 'sadness', 'sadness', 'surprise']\n", + "[{'anger': 0.057855386, 'fear': 0.040447887, 'joy': 0.29915547, 'love': 0.5720974, 'sadness': 0.00927453, 'surprise': 0.02116932}, {'anger': 0.0063275485, 'fear': 0.9673098, 'joy': 0.0065225014, 'love': 0.0008387138, 'sadness': 0.00706696, 'surprise': 0.011934649}, {'anger': 0.0014677589, 'fear': 0.0020899512, 'joy': 0.88741183, 'love': 0.076111265, 'sadness': 0.0038936164, 'surprise': 0.029025558}, {'anger': 0.013268307, 'fear': 0.0035831807, 'joy': 0.056010414, 'love': 0.21701123, 'sadness': 0.69225526, 'surprise': 0.017871574}, {'anger': 0.0018013288, 'fear': 0.0012173079, 'joy': 5.611221e-05, 'love': 9.00831e-05, 'sadness': 0.9967213, 'surprise': 0.000113809925}, {'anger': 0.00015200193, 'fear': 0.36670414, 'joy': 0.0003732592, 'love': 0.00011813393, 'sadness': 0.000118975, 'surprise': 0.63253355}]\n", "\n", "Testing bidirectional model\n", - "surprise\n", - "['anger', 'anger', 'anger', 'anger', 'anger', 'fear']\n", - "[{'anger': 0.613231, 'fear': 0.21215951, 'joy': 0.00012107872, 'love': 0.007714424, 'sadness': 0.0029091935, 'surprise': 0.16386479}, {'anger': 0.7650685, 'fear': 0.12844206, 'joy': 0.00046135965, 'love': 0.0025065169, 'sadness': 0.012999088, 'surprise': 0.09052232}, {'anger': 0.7017255, 'fear': 0.12622964, 'joy': 0.00019186054, 'love': 0.0041279723, 'sadness': 0.0051922314, 'surprise': 0.16253278}, {'anger': 0.83330584, 'fear': 0.099247426, 'joy': 0.0007255099, 'love': 0.0023077168, 'sadness': 0.016625375, 'surprise': 0.047788195}, {'anger': 0.77445495, 'fear': 0.11811776, 'joy': 0.00019311535, 'love': 0.002333317, 'sadness': 0.004926041, 'surprise': 0.09997472}, {'anger': 0.28467438, 'fear': 0.3107746, 'joy': 0.0009574863, 'love': 0.039786864, 'sadness': 0.0549624, 'surprise': 0.3088443}]\n", + "love\n", + "['fear', 'fear', 'anger', 'joy', 'sadness', 'surprise']\n", + "[{'anger': 0.031539902, 'fear': 0.44634053, 'joy': 0.0022038615, 'love': 0.24390388, 'sadness': 0.00030186496, 'surprise': 0.27570996}, {'anger': 0.0028205896, 'fear': 0.9787958, 'joy': 0.016622344, 'love': 0.00041048063, 'sadness': 0.0004424488, 'surprise': 0.00090834824}, {'anger': 0.4523394, 'fear': 0.32489082, 'joy': 0.04712723, 'love': 0.01679146, 'sadness': 0.039135754, 'surprise': 0.1197153}, {'anger': 0.04196525, 'fear': 0.08604635, 'joy': 0.65291435, 'love': 0.049389884, 'sadness': 0.077201255, 'surprise': 0.09248292}, {'anger': 0.06327597, 'fear': 0.058998022, 'joy': 0.041568566, 'love': 0.002343863, 'sadness': 0.8224733, 'surprise': 0.011340328}, {'anger': 1.5136379e-05, 'fear': 0.002162331, 'joy': 3.5301118e-06, 'love': 0.006482973, 'sadness': 2.4173462e-06, 'surprise': 0.99133366}]\n", "\n", "Testing bert model\n", "anger\n", @@ -301,7 +301,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -377,7 +377,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -520,42 +520,42 @@ { "data": { "text/plain": [ - "[{'anger': 0.055561937,\n", - " 'fear': 0.034661848,\n", - " 'joy': 0.20765074,\n", - " 'love': 0.65774184,\n", - " 'sadness': 0.0210206,\n", - " 'surprise': 0.023363067},\n", - " {'anger': 1.5065236e-05,\n", - " 'fear': 0.9998666,\n", - " 'joy': 6.3056427e-06,\n", - " 'love': 2.9068442e-06,\n", - " 'sadness': 3.6798014e-05,\n", - " 'surprise': 7.235542e-05},\n", - " {'anger': 0.00097060547,\n", - " 'fear': 5.1922354e-05,\n", - " 'joy': 0.99052715,\n", - " 'love': 0.0024538564,\n", - " 'sadness': 0.0005109437,\n", - " 'surprise': 0.005485538},\n", - " {'anger': 0.00014133049,\n", - " 'fear': 0.0004463539,\n", - " 'joy': 0.12486383,\n", - " 'love': 0.87307847,\n", - " 'sadness': 0.0013382707,\n", - " 'surprise': 0.0001317923},\n", - " {'anger': 0.0077239843,\n", - " 'fear': 0.014800851,\n", - " 'joy': 0.008525367,\n", - " 'love': 0.0013007816,\n", - " 'sadness': 0.9655128,\n", - " 'surprise': 0.0021361646},\n", - " {'anger': 0.0003960413,\n", - " 'fear': 0.6634573,\n", - " 'joy': 0.0014801685,\n", - " 'love': 0.00056572456,\n", - " 'sadness': 0.000516784,\n", - " 'surprise': 0.33358407}]" + "[{'anger': 0.07479232,\n", + " 'fear': 0.012134718,\n", + " 'joy': 0.034137156,\n", + " 'love': 0.85221285,\n", + " 'sadness': 0.006336733,\n", + " 'surprise': 0.020386234},\n", + " {'anger': 1.6892743e-08,\n", + " 'fear': 0.99999964,\n", + " 'joy': 6.260633e-08,\n", + " 'love': 3.2111713e-10,\n", + " 'sadness': 3.542872e-08,\n", + " 'surprise': 2.2207877e-07},\n", + " {'anger': 0.00012469916,\n", + " 'fear': 9.6892345e-06,\n", + " 'joy': 0.9917463,\n", + " 'love': 0.006561422,\n", + " 'sadness': 0.00040069615,\n", + " 'surprise': 0.0011572224},\n", + " {'anger': 5.0021445e-05,\n", + " 'fear': 0.0010109642,\n", + " 'joy': 0.049688663,\n", + " 'love': 0.94577587,\n", + " 'sadness': 0.0032941191,\n", + " 'surprise': 0.00018034693},\n", + " {'anger': 0.0010146926,\n", + " 'fear': 0.00020020001,\n", + " 'joy': 5.2909185e-05,\n", + " 'love': 2.640257e-06,\n", + " 'sadness': 0.99870074,\n", + " 'surprise': 2.8823646e-05},\n", + " {'anger': 0.0057854424,\n", + " 'fear': 0.8317998,\n", + " 'joy': 0.017287944,\n", + " 'love': 0.008883897,\n", + " 'sadness': 0.0070799366,\n", + " 'surprise': 0.12916291}]" ] }, "execution_count": 15, diff --git a/example/emotion/load-emotion_files/load-emotion_14_0.png b/example/emotion/load-emotion_files/load-emotion_14_0.png index b7737f2d..d84b2b03 100644 Binary files a/example/emotion/load-emotion_files/load-emotion_14_0.png and b/example/emotion/load-emotion_files/load-emotion_14_0.png differ diff --git a/example/emotion/load-emotion_files/load-emotion_18_0.png b/example/emotion/load-emotion_files/load-emotion_18_0.png index dbe33b71..fd10ba17 100644 Binary files a/example/emotion/load-emotion_files/load-emotion_18_0.png and b/example/emotion/load-emotion_files/load-emotion_18_0.png differ diff --git a/example/normalizer/README.rst b/example/normalizer/README.rst index 7119955f..2c743d99 100644 --- a/example/normalizer/README.rst +++ b/example/normalizer/README.rst @@ -7,14 +7,14 @@ .. parsed-literal:: - CPU times: user 13.2 s, sys: 1.41 s, total: 14.6 s - Wall time: 18.2 s + CPU times: user 13.6 s, sys: 1.56 s, total: 15.2 s + Wall time: 20.3 s .. code:: ipython3 - string = 'y u xsuka makan HUSEIN kt situ tmpt' - another = 'i mmg xska mknn HUSEIN kampng tempt' + string = 'y u xsuke makan HUSEIN kt situ tmpt' + another = 'i mmg xske mknn HUSEIN kampng tempt' Load basic normalizer --------------------- @@ -28,7 +28,7 @@ Load basic normalizer .. parsed-literal:: - 'kenapa awak xsuka makan Husein kt situ tmpt' + 'kenapa awak xsuke makan Husein kt situ tmpt' @@ -66,220 +66,6 @@ Load fuzzy normalizer -Load deep expander ------------------- - -.. code:: ipython3 - - wiki, ngrams = malaya.fast_text.load_wiki() - fast_text_embed = malaya.fast_text.fast_text(wiki['embed_weights'],wiki['dictionary'],ngrams) - normalizer = malaya.normalize.deep_expander(malays, fast_text_embed) - -.. code:: ipython3 - - normalizer.normalize(string) - - - - -.. parsed-literal:: - - [[('tmpt', - 'kenapa awak tak suka makan Husein kat situ tut', - 0.8088938253521919), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tuit', - 0.863929785296917), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tat', - 0.8680638003787995), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ top', - 0.8688952446055412), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tip', - 0.8978437346220016), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ taat', - 0.936883625289917), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ topi', - 0.9442774548711776), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tumit', - 0.9495834815340042), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tempe', - 0.9758907731723786), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ ampe', - 0.9821926467533112), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tempo', - 0.9836614096956253), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tepet', - 0.994007917971611), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ amit', - 0.9999424153804779), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tuat', - 1.0002889167022706), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ mat', - 1.0071370331926346), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ temut', - 1.011553812426567), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ ampit', - 1.022653616695404), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ ampo', - 1.0231078831071854), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tipu', - 1.0246861065587998), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tepi', - 1.0285266551542283), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ umut', - 1.0287358275117875), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ emat', - 1.0357482937116622), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ empat', - 1.0431590774860382), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tapi', - 1.0562509994459153), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tepu', - 1.0601519473543166), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tumpat', - 1.074669928882599), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ impi', - 1.078846170501709), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ umat', - 1.0791117155513763), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tampi', - 1.0883281208925248), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tumpu', - 1.091578345676422), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ umpat', - 1.092372225769043), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tepat', - 1.0979607516746521), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tampa', - 1.1118229238204955), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ amput', - 1.1226389572820663), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tapa', - 1.129335333744049), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ timpa', - 1.1353471846590042), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ empu', - 1.1459274488725661), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tempa', - 1.164648480837822), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tampu', - 1.1812463180065156), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tempat', - 1.1856716803007126), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ tamat', - 1.2068403679332733), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ amat', - 1.2214121790246963), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ ampu', - 1.2350379461402894), - ('tmpt', - 'kenapa awak tak suka makan Husein kat situ taut', - 1.2796957146606445)]] - - - -.. code:: ipython3 - - normalizer.normalize(another) - - - - -.. parsed-literal:: - - [[('ska', 'saya memang tak soka mknn Husein kampng tempt', 0.7199365496635437), - ('ska', 'saya memang tak suka mknn Husein kampng tempt', 0.8050327301025391), - ('ska', 'saya memang tak sika mknn Husein kampng tempt', 0.8729341626167297), - ('ska', 'saya memang tak saka mknn Husein kampng tempt', 0.875930666923523), - ('ska', 'saya memang tak spa mknn Husein kampng tempt', 0.8995948433876038), - ('ska', 'saya memang tak sua mknn Husein kampng tempt', 0.9496822357177734), - ('ska', 'saya memang tak seka mknn Husein kampng tempt', 0.9891390204429626), - ('ska', 'saya memang tak ski mknn Husein kampng tempt', 1.1318669319152832), - ('ska', 'saya memang tak sia mknn Husein kampng tempt', 1.1666431427001953)], - [('mknn', 'saya memang tak ska min Husein kampng tempt', 0.8653836846351624), - ('mknn', 'saya memang tak ska maun Husein kampng tempt', 1.045318603515625), - ('mknn', 'saya memang tak ska kun Husein kampng tempt', 1.0710314512252808), - ('mknn', 'saya memang tak ska ken Husein kampng tempt', 1.0728274583816528), - ('mknn', 'saya memang tak ska kon Husein kampng tempt', 1.0992072820663452), - ('mknn', 'saya memang tak ska ikon Husein kampng tempt', 1.1365187168121338), - ('mknn', 'saya memang tak ska makin Husein kampng tempt', 1.180336833000183), - ('mknn', 'saya memang tak ska main Husein kampng tempt', 1.182568907737732), - ('mknn', 'saya memang tak ska makan Husein kampng tempt', 1.183489203453064), - ('mknn', 'saya memang tak ska makna Husein kampng tempt', 1.184565544128418), - ('mknn', 'saya memang tak ska kan Husein kampng tempt', 1.2368937730789185), - ('mknn', 'saya memang tak ska akan Husein kampng tempt', 1.2527291774749756), - ('mknn', 'saya memang tak ska mani Husein kampng tempt', 1.266147494316101), - ('mknn', 'saya memang tak ska ikan Husein kampng tempt', 1.2773109674453735), - ('mknn', 'saya memang tak ska mini Husein kampng tempt', 1.3020210266113281), - ('mknn', 'saya memang tak ska mana Husein kampng tempt', 1.3099677562713623), - ('mknn', 'saya memang tak ska menu Husein kampng tempt', 1.3974181413650513), - ('mknn', 'saya memang tak ska mena Husein kampng tempt', 1.404064655303955), - ('mknn', - 'saya memang tak ska makanan Husein kampng tempt', - 1.4473483562469482)], - [('kampng', - 'saya memang tak ska mknn Husein kampung tempt', - 0.9272603988647461)], - [('tempt', - 'saya memang tak ska mknn Husein kampng tempo', - 0.7405402660369873), - ('tempt', - 'saya memang tak ska mknn Husein kampng tempe', - 0.7510019540786743), - ('tempt', 'saya memang tak ska mknn Husein kampng tempa', 0.885798454284668), - ('tempt', - 'saya memang tak ska mknn Husein kampng temut', - 0.9036741256713867), - ('tempt', - 'saya memang tak ska mknn Husein kampng tempat', - 0.9161624312400818)]] - - - -``deep_expander`` will suggest nearest distance based on Word Mover -distance. This distance algorithm really depends on vector definition. - Load spell normalizer --------------------- @@ -297,7 +83,7 @@ To list all selected words during normalize .. parsed-literal:: - [(('tepu', False), 10), (('tuat', False), 15), (('taut', False), 15), (('tapa', False), 10), (('timpa', False), 20), (('tampi', True), 15), (('tumpat', True), 24), (('temut', False), 15), (('tut', False), 16), (('umpat', True), 20), (('amat', False), 21), (('top', False), 11), (('ampit', False), 20), (('tampa', False), 15), (('tipu', False), 15), (('tat', False), 11), (('tepi', False), 10), (('ampu', False), 15), (('impi', False), 15), (('umut', False), 21), (('umat', False), 21), (('amit', False), 21), (('tampu', False), 15), (('tumit', False), 20), (('tempa', False), 15), (('tempat', False), 20), (('empu', False), 10), (('tapi', False), 10), (('topi', False), 10), (('tempo', False), 15), (('tuit', False), 15), (('tip', False), 16), (('tamat', False), 20), (('tepet', False), 15), (('tepat', False), 15), (('amput', False), 20), (('mat', False), 16), (('tumpu', False), 20), (('tempe', False), 15), (('emat', False), 15), (('ampo', False), 15), (('empat', True), 15), (('ampe', False), 15), (('taat', False), 15)] + [(('umut', False), 50), (('amit', False), 50), (('tepi', False), 50), (('tuit', False), 50), (('tempat', False), 80), (('tampa', False), 67), (('umpat', True), 67), (('taut', False), 50), (('amput', False), 67), (('tipu', False), 50), (('tapa', False), 50), (('temut', False), 67), (('mat', False), 57), (('empu', False), 50), (('tuat', False), 50), (('tempo', False), 67), (('tampi', True), 67), (('tepu', False), 50), (('tempe', False), 67), (('tampu', False), 67), (('ampo', False), 50), (('tut', False), 57), (('impi', False), 50), (('ampit', False), 67), (('tapi', False), 50), (('ampe', False), 50), (('tepat', False), 67), (('tumit', False), 67), (('ampu', False), 50), (('tumpu', False), 67), (('tamat', False), 67), (('tepet', False), 67), (('tempa', False), 67), (('tat', False), 57), (('amat', False), 50), (('emat', False), 50), (('umat', False), 50), (('tumpat', True), 80), (('tip', False), 57), (('empat', True), 67), (('taat', False), 50), (('timpa', False), 67), (('top', False), 57), (('topi', False), 50)] @@ -305,15 +91,15 @@ To list all selected words during normalize .. parsed-literal:: - 'kenapa awak tak suka makan Husein kat situ amit' + 'kenapa awak tak suka makan Husein kat situ tempat' Load deep learning ------------------ -This model is not perfect, really suggest you to use other models. -Husein needs to read more! +**This model is not perfect, really suggest you to use other models. +Husein needs to read more!** .. code:: ipython3 @@ -325,6 +111,6 @@ Husein needs to read more! .. parsed-literal:: - 'eye uau tak suka makan unsein kati situ tumpat' + 'eye uau tak suke makan unsein kati situ tumpat' diff --git a/example/normalizer/load-normalizer.ipynb b/example/normalizer/load-normalizer.ipynb index 24c95551..db1c92ff 100644 --- a/example/normalizer/load-normalizer.ipynb +++ b/example/normalizer/load-normalizer.ipynb @@ -9,8 +9,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 13.2 s, sys: 1.41 s, total: 14.6 s\n", - "Wall time: 18.2 s\n" + "CPU times: user 13.6 s, sys: 1.56 s, total: 15.2 s\n", + "Wall time: 20.3 s\n" ] } ], @@ -25,8 +25,8 @@ "metadata": {}, "outputs": [], "source": [ - "string = 'y u xsuka makan HUSEIN kt situ tmpt'\n", - "another = 'i mmg xska mknn HUSEIN kampng tempt'" + "string = 'y u xsuke makan HUSEIN kt situ tmpt'\n", + "another = 'i mmg xske mknn HUSEIN kampng tempt'" ] }, { @@ -44,7 +44,7 @@ { "data": { "text/plain": [ - "'kenapa awak xsuka makan Husein kt situ tmpt'" + "'kenapa awak xsuke makan Husein kt situ tmpt'" ] }, "execution_count": 3, @@ -113,247 +113,6 @@ "normalizer.normalize(another)" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Load deep expander" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "wiki, ngrams = malaya.fast_text.load_wiki()\n", - "fast_text_embed = malaya.fast_text.fast_text(wiki['embed_weights'],wiki['dictionary'],ngrams)\n", - "normalizer = malaya.normalize.deep_expander(malays, fast_text_embed)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[[('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ tut',\n", - " 0.8088938253521919),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ tuit',\n", - " 0.863929785296917),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ tat',\n", - " 0.8680638003787995),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ top',\n", - " 0.8688952446055412),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ tip',\n", - " 0.8978437346220016),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ taat',\n", - " 0.936883625289917),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ topi',\n", - " 0.9442774548711776),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ tumit',\n", - " 0.9495834815340042),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ tempe',\n", - " 0.9758907731723786),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ ampe',\n", - " 0.9821926467533112),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ tempo',\n", - " 0.9836614096956253),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ tepet',\n", - " 0.994007917971611),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ amit',\n", - " 0.9999424153804779),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ tuat',\n", - " 1.0002889167022706),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ mat',\n", - " 1.0071370331926346),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ temut',\n", - " 1.011553812426567),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ ampit',\n", - " 1.022653616695404),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ ampo',\n", - " 1.0231078831071854),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ tipu',\n", - " 1.0246861065587998),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ tepi',\n", - " 1.0285266551542283),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ umut',\n", - " 1.0287358275117875),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ emat',\n", - " 1.0357482937116622),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ empat',\n", - " 1.0431590774860382),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ tapi',\n", - " 1.0562509994459153),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ tepu',\n", - " 1.0601519473543166),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ tumpat',\n", - " 1.074669928882599),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ impi',\n", - " 1.078846170501709),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ umat',\n", - " 1.0791117155513763),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ tampi',\n", - " 1.0883281208925248),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ tumpu',\n", - " 1.091578345676422),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ umpat',\n", - " 1.092372225769043),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ tepat',\n", - " 1.0979607516746521),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ tampa',\n", - " 1.1118229238204955),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ amput',\n", - " 1.1226389572820663),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ tapa',\n", - " 1.129335333744049),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ timpa',\n", - " 1.1353471846590042),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ empu',\n", - " 1.1459274488725661),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ tempa',\n", - " 1.164648480837822),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ tampu',\n", - " 1.1812463180065156),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ tempat',\n", - " 1.1856716803007126),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ tamat',\n", - " 1.2068403679332733),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ amat',\n", - " 1.2214121790246963),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ ampu',\n", - " 1.2350379461402894),\n", - " ('tmpt',\n", - " 'kenapa awak tak suka makan Husein kat situ taut',\n", - " 1.2796957146606445)]]" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "normalizer.normalize(string)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[[('ska', 'saya memang tak soka mknn Husein kampng tempt', 0.7199365496635437),\n", - " ('ska', 'saya memang tak suka mknn Husein kampng tempt', 0.8050327301025391),\n", - " ('ska', 'saya memang tak sika mknn Husein kampng tempt', 0.8729341626167297),\n", - " ('ska', 'saya memang tak saka mknn Husein kampng tempt', 0.875930666923523),\n", - " ('ska', 'saya memang tak spa mknn Husein kampng tempt', 0.8995948433876038),\n", - " ('ska', 'saya memang tak sua mknn Husein kampng tempt', 0.9496822357177734),\n", - " ('ska', 'saya memang tak seka mknn Husein kampng tempt', 0.9891390204429626),\n", - " ('ska', 'saya memang tak ski mknn Husein kampng tempt', 1.1318669319152832),\n", - " ('ska', 'saya memang tak sia mknn Husein kampng tempt', 1.1666431427001953)],\n", - " [('mknn', 'saya memang tak ska min Husein kampng tempt', 0.8653836846351624),\n", - " ('mknn', 'saya memang tak ska maun Husein kampng tempt', 1.045318603515625),\n", - " ('mknn', 'saya memang tak ska kun Husein kampng tempt', 1.0710314512252808),\n", - " ('mknn', 'saya memang tak ska ken Husein kampng tempt', 1.0728274583816528),\n", - " ('mknn', 'saya memang tak ska kon Husein kampng tempt', 1.0992072820663452),\n", - " ('mknn', 'saya memang tak ska ikon Husein kampng tempt', 1.1365187168121338),\n", - " ('mknn', 'saya memang tak ska makin Husein kampng tempt', 1.180336833000183),\n", - " ('mknn', 'saya memang tak ska main Husein kampng tempt', 1.182568907737732),\n", - " ('mknn', 'saya memang tak ska makan Husein kampng tempt', 1.183489203453064),\n", - " ('mknn', 'saya memang tak ska makna Husein kampng tempt', 1.184565544128418),\n", - " ('mknn', 'saya memang tak ska kan Husein kampng tempt', 1.2368937730789185),\n", - " ('mknn', 'saya memang tak ska akan Husein kampng tempt', 1.2527291774749756),\n", - " ('mknn', 'saya memang tak ska mani Husein kampng tempt', 1.266147494316101),\n", - " ('mknn', 'saya memang tak ska ikan Husein kampng tempt', 1.2773109674453735),\n", - " ('mknn', 'saya memang tak ska mini Husein kampng tempt', 1.3020210266113281),\n", - " ('mknn', 'saya memang tak ska mana Husein kampng tempt', 1.3099677562713623),\n", - " ('mknn', 'saya memang tak ska menu Husein kampng tempt', 1.3974181413650513),\n", - " ('mknn', 'saya memang tak ska mena Husein kampng tempt', 1.404064655303955),\n", - " ('mknn',\n", - " 'saya memang tak ska makanan Husein kampng tempt',\n", - " 1.4473483562469482)],\n", - " [('kampng',\n", - " 'saya memang tak ska mknn Husein kampung tempt',\n", - " 0.9272603988647461)],\n", - " [('tempt',\n", - " 'saya memang tak ska mknn Husein kampng tempo',\n", - " 0.7405402660369873),\n", - " ('tempt',\n", - " 'saya memang tak ska mknn Husein kampng tempe',\n", - " 0.7510019540786743),\n", - " ('tempt', 'saya memang tak ska mknn Husein kampng tempa', 0.885798454284668),\n", - " ('tempt',\n", - " 'saya memang tak ska mknn Husein kampng temut',\n", - " 0.9036741256713867),\n", - " ('tempt',\n", - " 'saya memang tak ska mknn Husein kampng tempat',\n", - " 0.9161624312400818)]]" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "normalizer.normalize(another)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`deep_expander` will suggest nearest distance based on Word Mover distance. This distance algorithm really depends on vector definition." - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -363,7 +122,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -379,24 +138,24 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[(('tepu', False), 10), (('tuat', False), 15), (('taut', False), 15), (('tapa', False), 10), (('timpa', False), 20), (('tampi', True), 15), (('tumpat', True), 24), (('temut', False), 15), (('tut', False), 16), (('umpat', True), 20), (('amat', False), 21), (('top', False), 11), (('ampit', False), 20), (('tampa', False), 15), (('tipu', False), 15), (('tat', False), 11), (('tepi', False), 10), (('ampu', False), 15), (('impi', False), 15), (('umut', False), 21), (('umat', False), 21), (('amit', False), 21), (('tampu', False), 15), (('tumit', False), 20), (('tempa', False), 15), (('tempat', False), 20), (('empu', False), 10), (('tapi', False), 10), (('topi', False), 10), (('tempo', False), 15), (('tuit', False), 15), (('tip', False), 16), (('tamat', False), 20), (('tepet', False), 15), (('tepat', False), 15), (('amput', False), 20), (('mat', False), 16), (('tumpu', False), 20), (('tempe', False), 15), (('emat', False), 15), (('ampo', False), 15), (('empat', True), 15), (('ampe', False), 15), (('taat', False), 15)] \n", + "[(('umut', False), 50), (('amit', False), 50), (('tepi', False), 50), (('tuit', False), 50), (('tempat', False), 80), (('tampa', False), 67), (('umpat', True), 67), (('taut', False), 50), (('amput', False), 67), (('tipu', False), 50), (('tapa', False), 50), (('temut', False), 67), (('mat', False), 57), (('empu', False), 50), (('tuat', False), 50), (('tempo', False), 67), (('tampi', True), 67), (('tepu', False), 50), (('tempe', False), 67), (('tampu', False), 67), (('ampo', False), 50), (('tut', False), 57), (('impi', False), 50), (('ampit', False), 67), (('tapi', False), 50), (('ampe', False), 50), (('tepat', False), 67), (('tumit', False), 67), (('ampu', False), 50), (('tumpu', False), 67), (('tamat', False), 67), (('tepet', False), 67), (('tempa', False), 67), (('tat', False), 57), (('amat', False), 50), (('emat', False), 50), (('umat', False), 50), (('tumpat', True), 80), (('tip', False), 57), (('empat', True), 67), (('taat', False), 50), (('timpa', False), 67), (('top', False), 57), (('topi', False), 50)] \n", "\n" ] }, { "data": { "text/plain": [ - "'kenapa awak tak suka makan Husein kat situ amit'" + "'kenapa awak tak suka makan Husein kat situ tempat'" ] }, - "execution_count": 11, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -416,21 +175,21 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "This model is not perfect, really suggest you to use other models. Husein needs to read more!" + "**This model is not perfect, really suggest you to use other models. Husein needs to read more!**" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'eye uau tak suka makan unsein kati situ tumpat'" + "'eye uau tak suke makan unsein kati situ tumpat'" ] }, - "execution_count": 12, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } diff --git a/example/sentiment/README.rst b/example/sentiment/README.rst index 18c94c65..a15831b4 100644 --- a/example/sentiment/README.rst +++ b/example/sentiment/README.rst @@ -7,7 +7,7 @@ .. parsed-literal:: - CPU times: user 11.7 s, sys: 1.34 s, total: 13.1 s + CPU times: user 12.1 s, sys: 1.33 s, total: 13.5 s Wall time: 16.7 s @@ -33,16 +33,16 @@ Load multinomial model .. parsed-literal:: - {'negative': 0.27780816431771815, 'positive': 0.7221918356822792} - {'negative': 0.4230539695981826, 'positive': 0.5769460304018175} + {'negative': 0.2422829560944563, 'positive': 0.7577170439055456} + {'negative': 0.7385102541701198, 'positive': 0.26148974582987783} .. parsed-literal:: - [{'negative': 0.4230539695981826, 'positive': 0.5769460304018175}, - {'negative': 0.4230539695981826, 'positive': 0.5769460304018175}] + [{'negative': 0.7385102541701198, 'positive': 0.26148974582987783}, + {'negative': 0.7385102541701198, 'positive': 0.26148974582987783}] @@ -59,16 +59,16 @@ Load xgb model .. parsed-literal:: - {'negative': 0.44467238, 'positive': 0.5553276} - {'negative': 0.47532737, 'positive': 0.5246726} + {'negative': 0.24086821, 'positive': 0.7591318} + {'negative': 0.844284, 'positive': 0.15571605} .. parsed-literal:: - [{'negative': 0.47532737, 'positive': 0.5246726}, - {'negative': 0.47532737, 'positive': 0.5246726}] + [{'negative': 0.844284, 'positive': 0.15571605}, + {'negative': 0.844284, 'positive': 0.15571605}] @@ -113,37 +113,37 @@ Load deep learning models Testing fast-text model negative ['negative', 'positive'] - [{'negative': 0.8494132, 'positive': 0.15058675}, {'negative': 0.04582213, 'positive': 0.95417786}] + [{'negative': 0.8405276, 'positive': 0.15947239}, {'negative': 1.8619101e-05, 'positive': 0.9999814}] Testing hierarchical model - positive - ['positive', 'positive'] - [{'negative': 0.11536069, 'positive': 0.88463926}, {'negative': 0.10003439, 'positive': 0.8999656}] + negative + ['negative', 'positive'] + [{'negative': 0.9479493, 'positive': 0.052050766}, {'negative': 0.027757995, 'positive': 0.972242}] Testing bahdanau model - positive + negative ['negative', 'positive'] - [{'negative': 0.60403764, 'positive': 0.3959623}, {'negative': 0.5672228, 'positive': 0.43277723}] + [{'negative': 0.9993224, 'positive': 0.00067757705}, {'negative': 0.11770468, 'positive': 0.8822953}] Testing luong model negative ['negative', 'positive'] - [{'negative': 0.96496046, 'positive': 0.035039473}, {'negative': 0.08448372, 'positive': 0.91551626}] + [{'negative': 0.9428673, 'positive': 0.057132788}, {'negative': 0.009072777, 'positive': 0.9909272}] Testing bidirectional model - positive - ['positive', 'positive'] - [{'negative': 0.17688204, 'positive': 0.82311803}, {'negative': 0.13394275, 'positive': 0.8660573}] + negative + ['negative', 'positive'] + [{'negative': 0.993769, 'positive': 0.006230943}, {'negative': 0.0032205353, 'positive': 0.9967795}] Testing bert model - negative - ['negative', 'negative'] - [{'negative': 0.992415, 'positive': 0.007585059}, {'negative': 0.9923813, 'positive': 0.0076187113}] + positive + ['positive', 'negative'] + [{'negative': 0.37042966, 'positive': 0.62957036}, {'negative': 0.84760416, 'positive': 0.15239581}] Testing entity-network model - negative - ['negative', 'negative'] - [{'negative': 0.5229405, 'positive': 0.4770595}, {'negative': 0.6998231, 'positive': 0.3001769}] + positive + ['positive', 'positive'] + [{'negative': 0.44306344, 'positive': 0.55693656}, {'negative': 0.32117522, 'positive': 0.6788247}] @@ -303,8 +303,8 @@ will try to evolve it. .. parsed-literal:: - [{'negative': 0.38546535, 'positive': 0.6145346}, - {'negative': 0.50480145, 'positive': 0.49519858}] + [{'negative': 0.41368636, 'positive': 0.58631366}, + {'negative': 0.6855174, 'positive': 0.31448266}] @@ -334,11 +334,11 @@ corpus should be [(text, label)] precision recall f1-score support - Negative 0.00 0.00 0.00 12 - Neutral 0.75 0.16 0.26 19 - Positive 0.53 1.00 0.69 30 + Negative 0.00 0.00 0.00 11 + Neutral 1.00 0.10 0.18 20 + Positive 0.51 1.00 0.67 30 - avg / total 0.49 0.54 0.42 61 + avg / total 0.58 0.52 0.39 61 @@ -362,14 +362,14 @@ You also able to feed directory location precision recall f1-score support - adidas 0.97 0.60 0.74 303 - apple 0.99 0.57 0.73 477 - hungry 0.79 0.93 0.86 1051 - kerajaan 0.85 0.81 0.83 1403 - nike 0.96 0.53 0.68 329 - pembangkang 0.71 0.87 0.78 1496 + adidas 0.94 0.61 0.74 313 + apple 0.98 0.62 0.76 416 + hungry 0.82 0.92 0.87 1082 + kerajaan 0.85 0.82 0.83 1392 + nike 0.95 0.55 0.70 351 + pembangkang 0.71 0.86 0.78 1505 - avg / total 0.82 0.80 0.79 5059 + avg / total 0.82 0.80 0.80 5059 @@ -382,12 +382,12 @@ You also able to feed directory location .. parsed-literal:: - {'adidas': 0.0005529039473579767, - 'apple': 0.0006348307032386134, - 'hungry': 0.010374347097919939, - 'kerajaan': 0.07250377012308745, - 'nike': 0.00058477543567546, - 'pembangkang': 0.9153493726927218} + {'adidas': 0.000975603010411438, + 'apple': 0.0016314798511805502, + 'hungry': 0.012531351707188306, + 'kerajaan': 0.05689689670169819, + 'nike': 0.001125104249853524, + 'pembangkang': 0.9268395644796663} @@ -405,14 +405,14 @@ Train a multinomial using skip-gram vectorization precision recall f1-score support - adidas 0.36 0.86 0.51 301 - apple 0.50 0.87 0.63 482 - hungry 0.83 0.93 0.88 1046 - kerajaan 0.88 0.59 0.70 1358 - nike 0.56 0.81 0.66 321 - pembangkang 0.89 0.55 0.68 1551 + adidas 0.39 0.84 0.53 317 + apple 0.53 0.93 0.67 480 + hungry 0.83 0.94 0.88 1048 + kerajaan 0.90 0.60 0.72 1345 + nike 0.58 0.83 0.68 334 + pembangkang 0.88 0.56 0.69 1535 - avg / total 0.78 0.70 0.71 5059 + avg / total 0.79 0.72 0.72 5059 @@ -425,11 +425,11 @@ Train a multinomial using skip-gram vectorization .. parsed-literal:: - {'adidas': 2.2801686476133734e-13, - 'apple': 7.228512692567908e-14, - 'hungry': 1.2286365803998912e-09, - 'kerajaan': 2.285014011490273e-06, - 'nike': 2.223604221487894e-13, - 'pembangkang': 0.9999977137568394} + {'adidas': 1.5075646514607906e-12, + 'apple': 3.3125444042691963e-12, + 'hungry': 7.508118534366736e-10, + 'kerajaan': 4.03710500865345e-07, + 'nike': 2.5065260905002984e-12, + 'pembangkang': 0.9999995955313602} diff --git a/example/sentiment/load-sentiment.ipynb b/example/sentiment/load-sentiment.ipynb index 0b9164b0..2641dbc1 100644 --- a/example/sentiment/load-sentiment.ipynb +++ b/example/sentiment/load-sentiment.ipynb @@ -9,7 +9,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 11.7 s, sys: 1.34 s, total: 13.1 s\n", + "CPU times: user 12.1 s, sys: 1.33 s, total: 13.5 s\n", "Wall time: 16.7 s\n" ] } @@ -53,15 +53,15 @@ "name": "stdout", "output_type": "stream", "text": [ - "{'negative': 0.27780816431771815, 'positive': 0.7221918356822792}\n", - "{'negative': 0.4230539695981826, 'positive': 0.5769460304018175}\n" + "{'negative': 0.2422829560944563, 'positive': 0.7577170439055456}\n", + "{'negative': 0.7385102541701198, 'positive': 0.26148974582987783}\n" ] }, { "data": { "text/plain": [ - "[{'negative': 0.4230539695981826, 'positive': 0.5769460304018175},\n", - " {'negative': 0.4230539695981826, 'positive': 0.5769460304018175}]" + "[{'negative': 0.7385102541701198, 'positive': 0.26148974582987783},\n", + " {'negative': 0.7385102541701198, 'positive': 0.26148974582987783}]" ] }, "execution_count": 3, @@ -92,15 +92,15 @@ "name": "stdout", "output_type": "stream", "text": [ - "{'negative': 0.44467238, 'positive': 0.5553276}\n", - "{'negative': 0.47532737, 'positive': 0.5246726}\n" + "{'negative': 0.24086821, 'positive': 0.7591318}\n", + "{'negative': 0.844284, 'positive': 0.15571605}\n" ] }, { "data": { "text/plain": [ - "[{'negative': 0.47532737, 'positive': 0.5246726},\n", - " {'negative': 0.47532737, 'positive': 0.5246726}]" + "[{'negative': 0.844284, 'positive': 0.15571605},\n", + " {'negative': 0.844284, 'positive': 0.15571605}]" ] }, "execution_count": 4, @@ -167,37 +167,37 @@ "Testing fast-text model\n", "negative\n", "['negative', 'positive']\n", - "[{'negative': 0.8494132, 'positive': 0.15058675}, {'negative': 0.04582213, 'positive': 0.95417786}]\n", + "[{'negative': 0.8405276, 'positive': 0.15947239}, {'negative': 1.8619101e-05, 'positive': 0.9999814}]\n", "\n", "Testing hierarchical model\n", - "positive\n", - "['positive', 'positive']\n", - "[{'negative': 0.11536069, 'positive': 0.88463926}, {'negative': 0.10003439, 'positive': 0.8999656}]\n", + "negative\n", + "['negative', 'positive']\n", + "[{'negative': 0.9479493, 'positive': 0.052050766}, {'negative': 0.027757995, 'positive': 0.972242}]\n", "\n", "Testing bahdanau model\n", - "positive\n", + "negative\n", "['negative', 'positive']\n", - "[{'negative': 0.60403764, 'positive': 0.3959623}, {'negative': 0.5672228, 'positive': 0.43277723}]\n", + "[{'negative': 0.9993224, 'positive': 0.00067757705}, {'negative': 0.11770468, 'positive': 0.8822953}]\n", "\n", "Testing luong model\n", "negative\n", "['negative', 'positive']\n", - "[{'negative': 0.96496046, 'positive': 0.035039473}, {'negative': 0.08448372, 'positive': 0.91551626}]\n", + "[{'negative': 0.9428673, 'positive': 0.057132788}, {'negative': 0.009072777, 'positive': 0.9909272}]\n", "\n", "Testing bidirectional model\n", - "positive\n", - "['positive', 'positive']\n", - "[{'negative': 0.17688204, 'positive': 0.82311803}, {'negative': 0.13394275, 'positive': 0.8660573}]\n", + "negative\n", + "['negative', 'positive']\n", + "[{'negative': 0.993769, 'positive': 0.006230943}, {'negative': 0.0032205353, 'positive': 0.9967795}]\n", "\n", "Testing bert model\n", - "negative\n", - "['negative', 'negative']\n", - "[{'negative': 0.992415, 'positive': 0.007585059}, {'negative': 0.9923813, 'positive': 0.0076187113}]\n", + "positive\n", + "['positive', 'negative']\n", + "[{'negative': 0.37042966, 'positive': 0.62957036}, {'negative': 0.84760416, 'positive': 0.15239581}]\n", "\n", "Testing entity-network model\n", - "negative\n", - "['negative', 'negative']\n", - "[{'negative': 0.5229405, 'positive': 0.4770595}, {'negative': 0.6998231, 'positive': 0.3001769}]\n", + "positive\n", + "['positive', 'positive']\n", + "[{'negative': 0.44306344, 'positive': 0.55693656}, {'negative': 0.32117522, 'positive': 0.6788247}]\n", "\n" ] } @@ -251,7 +251,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -289,7 +289,7 @@ "outputs": [ { "data": { - "image/png": "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iIhIn2lSISKS3m7Ac2a2kpDwbzoh4d+jAO4+I2VwdaYFnhS5CVhuZisIjQoAd7+2+CsiIo2gSYWISHpzx3y+MUkUA0gLPClyHfAM8DYwlDgWEZF+0qRCRCQxd1+ROoZBNTQyonqBsj0zW+3uh6eOQ0REREREuqcFnrRlZtcD/wAeAba0rrv72mRBiYiIiIhIR3pFU4qcnf2cnbs2AqhMgoiIiIhITWkHT0REREREpCG0gydtmdlEYD6huO+ZwPeBy9399aSBiYiIiIhIoQmpA5DauhP4I7AP8AawAbg3aUQiIiIiItKRFnhS5CB3vwPY5u5b3H0OcEDqoEREREREpJgWeFJkq5ntTUisgpl9ENiWNiQREREREelEZ/CkyFzgt8CBZvYr4Djgy0kjEhERERGRjrSDJ0WeAh4AXgHeD/wSmJY0IhERERER6Ug7eFJkGfAnYGnu2lCiWEREREREpAta4Ekhdz8/dQwiIiIiItI9FTqXtsxsDrAReBTY2rru7muTBSUiIiIiIh1pB0+K7A18B/hX7toIcHCacEREREREZEe0wJMiM4F93f3N1IGIiIiIiEh3lEVTirwMTEwdhIiIiIiIdE87eFJkBHjBzFYDW1oX3X1GupBERERERKQTLfCkyHWpAxARERERkXKURVNERERERKQhdAZPRERERESkIbTAExERERERaQgt8ERERERERBpCCzwREREREZGG+B+lB53CXItsGgAAAABJRU5ErkJggg==\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -327,7 +327,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -465,8 +465,8 @@ { "data": { "text/plain": [ - "[{'negative': 0.38546535, 'positive': 0.6145346},\n", - " {'negative': 0.50480145, 'positive': 0.49519858}]" + "[{'negative': 0.41368636, 'positive': 0.58631366},\n", + " {'negative': 0.6855174, 'positive': 0.31448266}]" ] }, "execution_count": 15, @@ -523,11 +523,11 @@ "text": [ " precision recall f1-score support\n", "\n", - " Negative 0.00 0.00 0.00 12\n", - " Neutral 0.75 0.16 0.26 19\n", - " Positive 0.53 1.00 0.69 30\n", + " Negative 0.00 0.00 0.00 11\n", + " Neutral 1.00 0.10 0.18 20\n", + " Positive 0.51 1.00 0.67 30\n", "\n", - "avg / total 0.49 0.54 0.42 61\n", + "avg / total 0.58 0.52 0.39 61\n", "\n" ] } @@ -563,14 +563,14 @@ "text": [ " precision recall f1-score support\n", "\n", - " adidas 0.97 0.60 0.74 303\n", - " apple 0.99 0.57 0.73 477\n", - " hungry 0.79 0.93 0.86 1051\n", - " kerajaan 0.85 0.81 0.83 1403\n", - " nike 0.96 0.53 0.68 329\n", - "pembangkang 0.71 0.87 0.78 1496\n", + " adidas 0.94 0.61 0.74 313\n", + " apple 0.98 0.62 0.76 416\n", + " hungry 0.82 0.92 0.87 1082\n", + " kerajaan 0.85 0.82 0.83 1392\n", + " nike 0.95 0.55 0.70 351\n", + "pembangkang 0.71 0.86 0.78 1505\n", "\n", - "avg / total 0.82 0.80 0.79 5059\n", + "avg / total 0.82 0.80 0.80 5059\n", "\n" ] } @@ -587,12 +587,12 @@ { "data": { "text/plain": [ - "{'adidas': 0.0005529039473579767,\n", - " 'apple': 0.0006348307032386134,\n", - " 'hungry': 0.010374347097919939,\n", - " 'kerajaan': 0.07250377012308745,\n", - " 'nike': 0.00058477543567546,\n", - " 'pembangkang': 0.9153493726927218}" + "{'adidas': 0.000975603010411438,\n", + " 'apple': 0.0016314798511805502,\n", + " 'hungry': 0.012531351707188306,\n", + " 'kerajaan': 0.05689689670169819,\n", + " 'nike': 0.001125104249853524,\n", + " 'pembangkang': 0.9268395644796663}" ] }, "execution_count": 19, @@ -622,14 +622,14 @@ "text": [ " precision recall f1-score support\n", "\n", - " adidas 0.36 0.86 0.51 301\n", - " apple 0.50 0.87 0.63 482\n", - " hungry 0.83 0.93 0.88 1046\n", - " kerajaan 0.88 0.59 0.70 1358\n", - " nike 0.56 0.81 0.66 321\n", - "pembangkang 0.89 0.55 0.68 1551\n", + " adidas 0.39 0.84 0.53 317\n", + " apple 0.53 0.93 0.67 480\n", + " hungry 0.83 0.94 0.88 1048\n", + " kerajaan 0.90 0.60 0.72 1345\n", + " nike 0.58 0.83 0.68 334\n", + "pembangkang 0.88 0.56 0.69 1535\n", "\n", - "avg / total 0.78 0.70 0.71 5059\n", + "avg / total 0.79 0.72 0.72 5059\n", "\n" ] } @@ -648,12 +648,12 @@ { "data": { "text/plain": [ - "{'adidas': 2.2801686476133734e-13,\n", - " 'apple': 7.228512692567908e-14,\n", - " 'hungry': 1.2286365803998912e-09,\n", - " 'kerajaan': 2.285014011490273e-06,\n", - " 'nike': 2.223604221487894e-13,\n", - " 'pembangkang': 0.9999977137568394}" + "{'adidas': 1.5075646514607906e-12,\n", + " 'apple': 3.3125444042691963e-12,\n", + " 'hungry': 7.508118534366736e-10,\n", + " 'kerajaan': 4.03710500865345e-07,\n", + " 'nike': 2.5065260905002984e-12,\n", + " 'pembangkang': 0.9999995955313602}" ] }, "execution_count": 21, diff --git a/example/sentiment/load-sentiment_files/load-sentiment_15_0.png b/example/sentiment/load-sentiment_files/load-sentiment_15_0.png index ea10c9be..ffd79442 100644 Binary files a/example/sentiment/load-sentiment_files/load-sentiment_15_0.png and b/example/sentiment/load-sentiment_files/load-sentiment_15_0.png differ diff --git a/example/sentiment/load-sentiment_files/load-sentiment_17_0.png b/example/sentiment/load-sentiment_files/load-sentiment_17_0.png index d4f31825..20b0cc62 100644 Binary files a/example/sentiment/load-sentiment_files/load-sentiment_17_0.png and b/example/sentiment/load-sentiment_files/load-sentiment_17_0.png differ diff --git a/example/sentiment/load-sentiment_files/load-sentiment_19_0.png b/example/sentiment/load-sentiment_files/load-sentiment_19_0.png index 97c209e6..9a77eb66 100644 Binary files a/example/sentiment/load-sentiment_files/load-sentiment_19_0.png and b/example/sentiment/load-sentiment_files/load-sentiment_19_0.png differ diff --git a/example/similarity/README.rst b/example/similarity/README.rst new file mode 100644 index 00000000..d9e06f02 --- /dev/null +++ b/example/similarity/README.rst @@ -0,0 +1,587 @@ + +.. code:: ipython3 + + %%time + import malaya + + +.. parsed-literal:: + + CPU times: user 13.8 s, sys: 1.58 s, total: 15.4 s + Wall time: 19.6 s + + +.. code:: ipython3 + + news = 'najib razak dan mahathir mengalami masalah air di kemamam terengganu' + second_news = 'ikat penyedia perkhidmatan jalur lebar Telekom Malaysia (TM) perlu mencari jalan penyelesaian bagi meningkatkan akses capaian Internet ke seluruh negara, kata Menteri Komunikasi dan Multimedia, Gobind Singh Deo. Beliau berkata menjadi dasar kerajaan untuk membekalkan akses Internet jalur lebar kepada semua dan memberi penekanan kepada kualiti perkhidmatan yang terbaik. "Dasar kerajaan untuk bekalkan akses kepada semua bukan sekadar pembekalan sahaja tetapi beri penekanan kepada kualiti perkhidmatan yang baik dan dapat bersaing dengan negara lain pada tahap antarabangsa," kata Gobind Singh menerusi catatan di laman rasmi Twitter beliau, malam tadi. Beliau berkata demikian sebagai respons terhadap aduan beberapa pengguna Twitter berhubung akses Internet yang masih tidak stabil serta harga yang tidak berpatutan di beberapa lokasi di seluruh negara.' + +Topics provided by malaya +------------------------- + +Topics +^^^^^^ + +.. code:: ipython3 + + malaya.topic.topic['sosial'] + + + + +.. parsed-literal:: + + ['sosial', 'kehidupan', 'taraf hidup', 'sosiologi', 'keusahawan', 'masyarakat'] + + + +Influencer +^^^^^^^^^^ + +.. code:: ipython3 + + malaya.topic.influencer['mahathir'] + + + + +.. parsed-literal:: + + ['tun mahathir', + 'madey', + 'dr mahathir', + 'tun m', + 'mahathir', + 'madir', + 'dr m', + 'mahathir muhamad'] + + + +location +^^^^^^^^ + +.. code:: ipython3 + + malaya.topic.location[0] + + + + +.. parsed-literal:: + + {'negeri': 'JOHOR', 'parlimen': 'SEGAMAT', 'dun': 'BULOH KASAP'} + + + +wakil rakyat +^^^^^^^^^^^^ + +.. code:: ipython3 + + malaya.topic.calon[0] + + + + +.. parsed-literal:: + + {'KodN': 1, + 'KodParlimen': 1, + 'KodKawasan': 1, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DATUK ZAHIDI BIN ZAINUL ABIDIN', + 'parti': 'BN'} + + + +Train fuzzy text similarity +--------------------------- + +I want to train topics related when given a string. You can give any +corpus, the format is, + +.. code:: python + + {'left':['right1','right2']} + +.. code:: ipython3 + + fuzzy = malaya.similarity.fuzzy(malaya.topic.topic) + +.. code:: ipython3 + + fuzzy.get_similarity(news,fuzzy_ratio = 60) + + + + +.. parsed-literal:: + + ['najib razak', 'masalah air', 'mahathir', 'tan sri mokhzani mahathir'] + + + +.. code:: ipython3 + + fuzzy.get_similarity(second_news,fuzzy_ratio = 90) + + + + +.. parsed-literal:: + + ['telekom malaysia', + 'kerajaan', + 'internet', + 'twitter', + 'teknologi', + 'politik', + 'pendidikan', + 'sosial media'] + + + +Train bag-of-word text similarity +--------------------------------- + +I want to train topics related when given a string. You can give any +corpus, the format is, + +.. code:: python + + {'left':['right1','right2']} + +bag-of-word text similarity fitted by using character wised n-gram. + +``vectorizer`` supported ``['tfidf','count','skip-gram']``. + +.. code:: ipython3 + + tfidf = malaya.similarity.bow(malaya.topic.topic,vectorizer = 'tfidf') + +.. code:: ipython3 + + tfidf.get_similarity(second_news) + + + + +.. parsed-literal:: + + ['kkmm', 'universiti islam antarabangsa', 'perkhidmatan awam', 'twitter'] + + + +.. code:: ipython3 + + count = malaya.similarity.bow(malaya.topic.topic,vectorizer = 'count') + +.. code:: ipython3 + + count.get_similarity(second_news) + + + + +.. parsed-literal:: + + ['mic', + 'kerajaan', + 'majlis pakatan harapan', + 'jabatan bubar', + '1malaysia', + 'kemelangan penumpang cedera', + 'pendidikan', + 'malaysian chinese association', + 'ppbm', + 'menyiasat skandal', + 'tentera malaysia', + 'pakatan harapan', + 'parti islam semalaysia', + 'jabatan agama islam wilayah persekutuan', + 'bursa malaysia', + 'rela', + 'undi pos', + 'twitter', + 'parti pribumi bersatu malaysia', + 'perkhidmatan awam', + 'hutang negara', + 'politik', + 'timbalan perdana menteri', + 'kkmm', + 'perdana menteri', + 'ptptn', + 'menteri pertahanan', + 'universiti islam antarabangsa', + 'gaji menteri', + 'teknologi', + 'bebas tahanan', + 'infrastruktur', + 'menteri kewangan'] + + + +.. code:: ipython3 + + skip = malaya.similarity.bow(malaya.topic.topic,vectorizer = 'skip-gram') + +.. code:: ipython3 + + skip.get_similarity(second_news) + + + + +.. parsed-literal:: + + [] + + + +Train siamese network text similarity +------------------------------------- + +All parameters supported, + +.. code:: python + + """ + Train a deep siamese network for text similarity + + Parameters + ---------- + dictionary: dict + format {'left':['right']} + epoch: int, (default=5) + iteration numbers + batch_size: int, (default=32) + batch size for every feed, batch size must <= size of corpus + embedding_size: int, (default=256) + vector size representation for a word + output_size: int, (default=100) + encoder output size, bigger means more vector definition + maxlen: int, (default=100) + max length of a string to be train + ngram: tuple, (default=(1,4)) + n-grams size to train a corpus + num_layers: int, (default=100) + number of bidirectional rnn layers + + Returns + ------- + _DEEP_SIAMESE_SIMILARITY: malaya.similarity._DEEP_SIAMESE_SIMILARITY class + """ + +.. code:: ipython3 + + siamese = malaya.similarity.deep_siamese(malaya.topic.topic,epoch=3) + siamese.get_similarity(news) + + +.. parsed-literal:: + + minibatch loop: 100%|██████████| 137/137 [02:04<00:00, 1.35it/s, accuracy=0.5, cost=0.128] + minibatch loop: 100%|██████████| 137/137 [01:58<00:00, 1.45it/s, accuracy=0.75, cost=0.11] + minibatch loop: 100%|██████████| 137/137 [02:02<00:00, 1.38it/s, accuracy=1, cost=0.0455] + + + + +.. parsed-literal:: + + ['isytihar darurat', + 'mic', + 'dewan rakyat', + 'agama', + 'majlis pakatan harapan', + 'cambridge analytica', + 'tabung haji', + 'ganja', + 'universiti', + 'isu kerugian', + 'isu dadah', + 'tun daim zainuddin', + 'menteri dalam negeri', + 'perkasa', + 'pengedar dadah', + 'anwar ibrahim', + 'sst', + 'saham dan komoditi', + 'amanah', + 'astro awani', + 'recep tayyip erdogan', + 'kementerian dalam negeri', + 'pakatan harapan', + 'parti islam semalaysia', + 'jabatan agama islam wilayah persekutuan', + 'undi pos', + 'pusat daerah mangundi', + 'programming language', + 'wan azizah', + 'rumah mampu milik', + 'kkmm', + 'menteri pertahanan', + 'universiti islam antarabangsa', + 'datuk seri abdul hadi awang', + 'donald trump', + 'gaji menteri', + 'bebas tahanan', + 'ask me a question', + 'ahli dewan undangan negeri'] + + + +You can speed up your training iteration by using +`malaya-gpu `__ + +After you trained, actually you save that model by using method +``save_model``. Just provide directory you want to save. + +.. code:: ipython3 + + siamese.save_model('siamese') + +.. code:: ipython3 + + !ls siamese + + +.. parsed-literal:: + + checkpoint model.ckpt.meta + model.ckpt.data-00000-of-00001 model.json + model.ckpt.index + + +You can load your model but need to use interface provided by malaya, +``malaya.similarity.load_siamese`` + +.. code:: ipython3 + + siamese = malaya.similarity.load_siamese('siamese') + + +.. parsed-literal:: + + INFO:tensorflow:Restoring parameters from siamese/model.ckpt + + +.. code:: ipython3 + + siamese.get_similarity(news) + + + + +.. parsed-literal:: + + ['isytihar darurat', + 'mic', + 'majlis pakatan harapan', + 'cambridge analytica', + 'ask me a question', + 'tabung harapan', + 'tabung haji', + 'ganja', + 'universiti', + 'isu kerugian', + 'isu dadah', + 'tun daim zainuddin', + 'menteri dalam negeri', + 'perkasa', + 'pengedar dadah', + 'anwar ibrahim', + 'sst', + 'saham dan komoditi', + 'amanah', + 'astro awani', + 'recep tayyip erdogan', + 'kementerian dalam negeri', + 'parti islam semalaysia', + 'jabatan agama islam wilayah persekutuan', + 'isu ecrl', + 'parti keadilan rakyat', + 'pusat daerah mangundi', + 'programming language', + 'wan azizah', + 'timbalan perdana menteri', + 'kkmm', + 'perdana menteri', + 'masalah air', + 'menteri pertahanan', + 'universiti islam antarabangsa', + 'datuk seri abdul hadi awang', + 'donald trump', + 'gaji menteri', + 'bebas tahanan', + 'datuk seri azmin ali', + 'ahli dewan undangan negeri'] + + + +Train skipthought text similarity +--------------------------------- + +All parameters supported, + +.. code:: python + + """ + Train a deep skip-thought network for text similarity + + Parameters + ---------- + dictionary: dict + format {'left':['right']} + epoch: int, (default=5) + iteration numbers + batch_size: int, (default=32) + batch size for every feed, batch size must <= size of corpus + embedding_size: int, (default=256) + vector size representation for a word + maxlen: int, (default=100) + max length of a string to be train + ngram: tuple, (default=(1,4)) + n-grams size to train a corpus + + Returns + ------- + _DEEP_SIMILARITY: malaya.similarity._DEEP_SIMILARITY class + """ + +.. code:: ipython3 + + skipthought = malaya.similarity.deep_skipthought(malaya.topic.topic,epoch=3) + skipthought.get_similarity(news) + + +.. parsed-literal:: + + minibatch loop: 100%|██████████| 137/137 [01:35<00:00, 1.83it/s, cost=3.05] + minibatch loop: 100%|██████████| 137/137 [01:31<00:00, 1.69it/s, cost=0.428] + minibatch loop: 100%|██████████| 137/137 [01:38<00:00, 1.71it/s, cost=0.164] + + + + +.. parsed-literal:: + + ['malaysia-indonesia', + 'tunku ismail idris', + 'mikro-ekonomi', + 'tengku razaleigh hamzah', + 'k-pop', + 'kkmm', + 'pusat transformasi bandar', + 'hari raya', + '#fakenews', + 'makro-ekonomi', + 'lee kuan yew', + 'pilihan raya umum ke-14', + 'undi rosak', + 'datuk seri azmin ali', + 'ahli dewan undangan negeri', + 'recep tayyip erdogan', + 'inisiatif peduli rakyat', + 'nga kor ming'] + + + +You can speed up your training iteration by using +`malaya-gpu `__ + +After you trained, actually you save that model by using method +``save_model``. Just provide directory you want to save. + +.. code:: ipython3 + + skipthought.save_model('skipthought') + +.. code:: ipython3 + + !ls skipthought + + +.. parsed-literal:: + + checkpoint model.ckpt.meta + model.ckpt.data-00000-of-00001 model.json + model.ckpt.index + + +You can load your model but need to use interface provided by malaya, +``malaya.similarity.load_skipthought`` + +.. code:: ipython3 + + skipthought = malaya.similarity.load_skipthought('skipthought') + + +.. parsed-literal:: + + INFO:tensorflow:Restoring parameters from skipthought/model.ckpt + + +.. code:: ipython3 + + skipthought.get_similarity(news) + + + + +.. parsed-literal:: + + ['malaysia-indonesia', + 'tunku ismail idris', + 'mikro-ekonomi', + 'tengku razaleigh hamzah', + 'k-pop', + 'kkmm', + 'pusat transformasi bandar', + 'hari raya', + '#fakenews', + 'makro-ekonomi', + 'lee kuan yew', + 'pilihan raya umum ke-14', + 'undi rosak', + 'datuk seri azmin ali', + 'ahli dewan undangan negeri', + 'recep tayyip erdogan', + 'inisiatif peduli rakyat', + 'nga kor ming'] + + + +Using fuzzy for location +------------------------ + +.. code:: ipython3 + + malaya.similarity.fuzzy_location('saya suka makan sate di sungai petani') + + + + +.. parsed-literal:: + + {'negeri': [], 'parlimen': ['sungai petani'], 'dun': []} + + + +Check location from a string +---------------------------- + +.. code:: ipython3 + + malaya.similarity.is_location('sungai petani') + + + + +.. parsed-literal:: + + True + + diff --git a/example/similarity/load-similarity.ipynb b/example/similarity/load-similarity.ipynb new file mode 100644 index 00000000..363bef47 --- /dev/null +++ b/example/similarity/load-similarity.ipynb @@ -0,0 +1,856 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 13.8 s, sys: 1.58 s, total: 15.4 s\n", + "Wall time: 19.6 s\n" + ] + } + ], + "source": [ + "%%time\n", + "import malaya" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "news = 'najib razak dan mahathir mengalami masalah air di kemamam terengganu'\n", + "second_news = 'ikat penyedia perkhidmatan jalur lebar Telekom Malaysia (TM) perlu mencari jalan penyelesaian bagi meningkatkan akses capaian Internet ke seluruh negara, kata Menteri Komunikasi dan Multimedia, Gobind Singh Deo. Beliau berkata menjadi dasar kerajaan untuk membekalkan akses Internet jalur lebar kepada semua dan memberi penekanan kepada kualiti perkhidmatan yang terbaik. \"Dasar kerajaan untuk bekalkan akses kepada semua bukan sekadar pembekalan sahaja tetapi beri penekanan kepada kualiti perkhidmatan yang baik dan dapat bersaing dengan negara lain pada tahap antarabangsa,\" kata Gobind Singh menerusi catatan di laman rasmi Twitter beliau, malam tadi. Beliau berkata demikian sebagai respons terhadap aduan beberapa pengguna Twitter berhubung akses Internet yang masih tidak stabil serta harga yang tidak berpatutan di beberapa lokasi di seluruh negara.'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Topics provided by malaya" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Topics" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['sosial', 'kehidupan', 'taraf hidup', 'sosiologi', 'keusahawan', 'masyarakat']" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "malaya.topic.topic['sosial']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Influencer" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['tun mahathir',\n", + " 'madey',\n", + " 'dr mahathir',\n", + " 'tun m',\n", + " 'mahathir',\n", + " 'madir',\n", + " 'dr m',\n", + " 'mahathir muhamad']" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "malaya.topic.influencer['mahathir']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### location" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'negeri': 'JOHOR', 'parlimen': 'SEGAMAT', 'dun': 'BULOH KASAP'}" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "malaya.topic.location[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### wakil rakyat" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'KodN': 1,\n", + " 'KodParlimen': 1,\n", + " 'KodKawasan': 1,\n", + " 'JenisKawasan': 'PARLIMEN',\n", + " 'susunan': 2,\n", + " 'NamaCalon': 'DATUK ZAHIDI BIN ZAINUL ABIDIN',\n", + " 'parti': 'BN'}" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "malaya.topic.calon[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Train fuzzy text similarity\n", + "\n", + "I want to train topics related when given a string. You can give any corpus, the format is,\n", + "\n", + "```python\n", + "{'left':['right1','right2']}\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "fuzzy = malaya.similarity.fuzzy(malaya.topic.topic)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['najib razak', 'masalah air', 'mahathir', 'tan sri mokhzani mahathir']" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fuzzy.get_similarity(news,fuzzy_ratio = 60)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['telekom malaysia',\n", + " 'kerajaan',\n", + " 'internet',\n", + " 'twitter',\n", + " 'teknologi',\n", + " 'politik',\n", + " 'pendidikan',\n", + " 'sosial media']" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fuzzy.get_similarity(second_news,fuzzy_ratio = 90)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Train bag-of-word text similarity\n", + "\n", + "I want to train topics related when given a string. You can give any corpus, the format is,\n", + "\n", + "```python\n", + "{'left':['right1','right2']}\n", + "```\n", + "\n", + "bag-of-word text similarity fitted by using character wised n-gram.\n", + "\n", + "`vectorizer` supported `['tfidf','count','skip-gram']`." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "tfidf = malaya.similarity.bow(malaya.topic.topic,vectorizer = 'tfidf')" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['kkmm', 'universiti islam antarabangsa', 'perkhidmatan awam', 'twitter']" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tfidf.get_similarity(second_news)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "count = malaya.similarity.bow(malaya.topic.topic,vectorizer = 'count')" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['mic',\n", + " 'kerajaan',\n", + " 'majlis pakatan harapan',\n", + " 'jabatan bubar',\n", + " '1malaysia',\n", + " 'kemelangan penumpang cedera',\n", + " 'pendidikan',\n", + " 'malaysian chinese association',\n", + " 'ppbm',\n", + " 'menyiasat skandal',\n", + " 'tentera malaysia',\n", + " 'pakatan harapan',\n", + " 'parti islam semalaysia',\n", + " 'jabatan agama islam wilayah persekutuan',\n", + " 'bursa malaysia',\n", + " 'rela',\n", + " 'undi pos',\n", + " 'twitter',\n", + " 'parti pribumi bersatu malaysia',\n", + " 'perkhidmatan awam',\n", + " 'hutang negara',\n", + " 'politik',\n", + " 'timbalan perdana menteri',\n", + " 'kkmm',\n", + " 'perdana menteri',\n", + " 'ptptn',\n", + " 'menteri pertahanan',\n", + " 'universiti islam antarabangsa',\n", + " 'gaji menteri',\n", + " 'teknologi',\n", + " 'bebas tahanan',\n", + " 'infrastruktur',\n", + " 'menteri kewangan']" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "count.get_similarity(second_news)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "skip = malaya.similarity.bow(malaya.topic.topic,vectorizer = 'skip-gram')" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "skip.get_similarity(second_news)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Train siamese network text similarity\n", + "\n", + "All parameters supported,\n", + "```python\n", + " \"\"\"\n", + " Train a deep siamese network for text similarity\n", + "\n", + " Parameters\n", + " ----------\n", + " dictionary: dict\n", + " format {'left':['right']}\n", + " epoch: int, (default=5)\n", + " iteration numbers\n", + " batch_size: int, (default=32)\n", + " batch size for every feed, batch size must <= size of corpus\n", + " embedding_size: int, (default=256)\n", + " vector size representation for a word\n", + " output_size: int, (default=100)\n", + " encoder output size, bigger means more vector definition\n", + " maxlen: int, (default=100)\n", + " max length of a string to be train\n", + " ngram: tuple, (default=(1,4))\n", + " n-grams size to train a corpus\n", + " num_layers: int, (default=100)\n", + " number of bidirectional rnn layers\n", + "\n", + " Returns\n", + " -------\n", + " _DEEP_SIAMESE_SIMILARITY: malaya.similarity._DEEP_SIAMESE_SIMILARITY class\n", + " \"\"\"\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "minibatch loop: 100%|██████████| 137/137 [02:04<00:00, 1.35it/s, accuracy=0.5, cost=0.128] \n", + "minibatch loop: 100%|██████████| 137/137 [01:58<00:00, 1.45it/s, accuracy=0.75, cost=0.11] \n", + "minibatch loop: 100%|██████████| 137/137 [02:02<00:00, 1.38it/s, accuracy=1, cost=0.0455] \n" + ] + }, + { + "data": { + "text/plain": [ + "['isytihar darurat',\n", + " 'mic',\n", + " 'dewan rakyat',\n", + " 'agama',\n", + " 'majlis pakatan harapan',\n", + " 'cambridge analytica',\n", + " 'tabung haji',\n", + " 'ganja',\n", + " 'universiti',\n", + " 'isu kerugian',\n", + " 'isu dadah',\n", + " 'tun daim zainuddin',\n", + " 'menteri dalam negeri',\n", + " 'perkasa',\n", + " 'pengedar dadah',\n", + " 'anwar ibrahim',\n", + " 'sst',\n", + " 'saham dan komoditi',\n", + " 'amanah',\n", + " 'astro awani',\n", + " 'recep tayyip erdogan',\n", + " 'kementerian dalam negeri',\n", + " 'pakatan harapan',\n", + " 'parti islam semalaysia',\n", + " 'jabatan agama islam wilayah persekutuan',\n", + " 'undi pos',\n", + " 'pusat daerah mangundi',\n", + " 'programming language',\n", + " 'wan azizah',\n", + " 'rumah mampu milik',\n", + " 'kkmm',\n", + " 'menteri pertahanan',\n", + " 'universiti islam antarabangsa',\n", + " 'datuk seri abdul hadi awang',\n", + " 'donald trump',\n", + " 'gaji menteri',\n", + " 'bebas tahanan',\n", + " 'ask me a question',\n", + " 'ahli dewan undangan negeri']" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "siamese = malaya.similarity.deep_siamese(malaya.topic.topic,epoch=3)\n", + "siamese.get_similarity(news)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can speed up your training iteration by using [malaya-gpu](https://pypi.org/project/malaya-gpu/)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After you trained, actually you save that model by using method `save_model`. Just provide directory you want to save." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "siamese.save_model('siamese')" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "checkpoint model.ckpt.meta\r\n", + "model.ckpt.data-00000-of-00001 model.json\r\n", + "model.ckpt.index\r\n" + ] + } + ], + "source": [ + "!ls siamese" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can load your model but need to use interface provided by malaya, `malaya.similarity.load_siamese`" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Restoring parameters from siamese/model.ckpt\n" + ] + } + ], + "source": [ + "siamese = malaya.similarity.load_siamese('siamese')" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['isytihar darurat',\n", + " 'mic',\n", + " 'majlis pakatan harapan',\n", + " 'cambridge analytica',\n", + " 'ask me a question',\n", + " 'tabung harapan',\n", + " 'tabung haji',\n", + " 'ganja',\n", + " 'universiti',\n", + " 'isu kerugian',\n", + " 'isu dadah',\n", + " 'tun daim zainuddin',\n", + " 'menteri dalam negeri',\n", + " 'perkasa',\n", + " 'pengedar dadah',\n", + " 'anwar ibrahim',\n", + " 'sst',\n", + " 'saham dan komoditi',\n", + " 'amanah',\n", + " 'astro awani',\n", + " 'recep tayyip erdogan',\n", + " 'kementerian dalam negeri',\n", + " 'parti islam semalaysia',\n", + " 'jabatan agama islam wilayah persekutuan',\n", + " 'isu ecrl',\n", + " 'parti keadilan rakyat',\n", + " 'pusat daerah mangundi',\n", + " 'programming language',\n", + " 'wan azizah',\n", + " 'timbalan perdana menteri',\n", + " 'kkmm',\n", + " 'perdana menteri',\n", + " 'masalah air',\n", + " 'menteri pertahanan',\n", + " 'universiti islam antarabangsa',\n", + " 'datuk seri abdul hadi awang',\n", + " 'donald trump',\n", + " 'gaji menteri',\n", + " 'bebas tahanan',\n", + " 'datuk seri azmin ali',\n", + " 'ahli dewan undangan negeri']" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "siamese.get_similarity(news)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Train skipthought text similarity\n", + "\n", + "All parameters supported,\n", + "\n", + "```python\n", + " \"\"\"\n", + " Train a deep skip-thought network for text similarity\n", + "\n", + " Parameters\n", + " ----------\n", + " dictionary: dict\n", + " format {'left':['right']}\n", + " epoch: int, (default=5)\n", + " iteration numbers\n", + " batch_size: int, (default=32)\n", + " batch size for every feed, batch size must <= size of corpus\n", + " embedding_size: int, (default=256)\n", + " vector size representation for a word\n", + " maxlen: int, (default=100)\n", + " max length of a string to be train\n", + " ngram: tuple, (default=(1,4))\n", + " n-grams size to train a corpus\n", + "\n", + " Returns\n", + " -------\n", + " _DEEP_SIMILARITY: malaya.similarity._DEEP_SIMILARITY class\n", + " \"\"\"\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "minibatch loop: 100%|██████████| 137/137 [01:35<00:00, 1.83it/s, cost=3.05]\n", + "minibatch loop: 100%|██████████| 137/137 [01:31<00:00, 1.69it/s, cost=0.428]\n", + "minibatch loop: 100%|██████████| 137/137 [01:38<00:00, 1.71it/s, cost=0.164]\n" + ] + }, + { + "data": { + "text/plain": [ + "['malaysia-indonesia',\n", + " 'tunku ismail idris',\n", + " 'mikro-ekonomi',\n", + " 'tengku razaleigh hamzah',\n", + " 'k-pop',\n", + " 'kkmm',\n", + " 'pusat transformasi bandar',\n", + " 'hari raya',\n", + " '#fakenews',\n", + " 'makro-ekonomi',\n", + " 'lee kuan yew',\n", + " 'pilihan raya umum ke-14',\n", + " 'undi rosak',\n", + " 'datuk seri azmin ali',\n", + " 'ahli dewan undangan negeri',\n", + " 'recep tayyip erdogan',\n", + " 'inisiatif peduli rakyat',\n", + " 'nga kor ming']" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "skipthought = malaya.similarity.deep_skipthought(malaya.topic.topic,epoch=3)\n", + "skipthought.get_similarity(news)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can speed up your training iteration by using [malaya-gpu](https://pypi.org/project/malaya-gpu/)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After you trained, actually you save that model by using method `save_model`. Just provide directory you want to save." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "skipthought.save_model('skipthought')" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "checkpoint model.ckpt.meta\r\n", + "model.ckpt.data-00000-of-00001 model.json\r\n", + "model.ckpt.index\r\n" + ] + } + ], + "source": [ + "!ls skipthought" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can load your model but need to use interface provided by malaya, `malaya.similarity.load_skipthought`" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Restoring parameters from skipthought/model.ckpt\n" + ] + } + ], + "source": [ + "skipthought = malaya.similarity.load_skipthought('skipthought')" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['malaysia-indonesia',\n", + " 'tunku ismail idris',\n", + " 'mikro-ekonomi',\n", + " 'tengku razaleigh hamzah',\n", + " 'k-pop',\n", + " 'kkmm',\n", + " 'pusat transformasi bandar',\n", + " 'hari raya',\n", + " '#fakenews',\n", + " 'makro-ekonomi',\n", + " 'lee kuan yew',\n", + " 'pilihan raya umum ke-14',\n", + " 'undi rosak',\n", + " 'datuk seri azmin ali',\n", + " 'ahli dewan undangan negeri',\n", + " 'recep tayyip erdogan',\n", + " 'inisiatif peduli rakyat',\n", + " 'nga kor ming']" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "skipthought.get_similarity(news)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Using fuzzy for location" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'negeri': [], 'parlimen': ['sungai petani'], 'dun': []}" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "malaya.similarity.fuzzy_location('saya suka makan sate di sungai petani')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Check location from a string" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "malaya.similarity.is_location('sungai petani')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/example/subjectivity/README.rst b/example/subjectivity/README.rst index 79e9635b..618c7abc 100644 --- a/example/subjectivity/README.rst +++ b/example/subjectivity/README.rst @@ -7,8 +7,8 @@ .. parsed-literal:: - CPU times: user 10.4 s, sys: 630 ms, total: 11 s - Wall time: 11 s + CPU times: user 12.4 s, sys: 1.4 s, total: 13.8 s + Wall time: 17.2 s Explanation @@ -43,15 +43,15 @@ Load multinomial model .. parsed-literal:: {'negative': 0.46203835811002486, 'positive': 0.5379616418899767} - {'negative': 0.8698758314042119, 'positive': 0.13012416859579023} + {'negative': 0.8607294776614423, 'positive': 0.13927052233855727} .. parsed-literal:: - [{'negative': 0.8698758314042119, 'positive': 0.13012416859579023}, - {'negative': 0.8698758314042119, 'positive': 0.13012416859579023}] + [{'negative': 0.8607294776614423, 'positive': 0.13927052233855727}, + {'negative': 0.8607294776614423, 'positive': 0.13927052233855727}] @@ -118,28 +118,28 @@ List available deep learning models Testing fast-text model negative - ['negative', 'negative'] - [{'negative': 0.99998176, 'positive': 1.8284805e-05}, {'negative': 0.6197021, 'positive': 0.3802979}] + ['negative', 'positive'] + [{'negative': 1.0, 'positive': 5.600171e-08}, {'negative': 0.25236478, 'positive': 0.74763525}] Testing hierarchical model negative ['negative', 'positive'] - [{'negative': 0.9999926, 'positive': 7.3815904e-06}, {'negative': 0.17152506, 'positive': 0.82847494}] + [{'negative': 0.99999225, 'positive': 7.692454e-06}, {'negative': 0.29224393, 'positive': 0.70775604}] Testing bahdanau model negative - ['negative', 'negative'] - [{'negative': 0.99988747, 'positive': 0.000112509806}, {'negative': 0.41513687, 'positive': 0.5848631}] + ['negative', 'positive'] + [{'negative': 0.99998605, 'positive': 1.3971644e-05}, {'negative': 0.41739935, 'positive': 0.5826007}] Testing luong model positive ['positive', 'negative'] - [{'negative': 0.03757865, 'positive': 0.96242136}, {'negative': 0.3540184, 'positive': 0.64598167}] + [{'negative': 0.07556655, 'positive': 0.92443347}, {'negative': 0.96075815, 'positive': 0.039241895}] Testing bidirectional model negative - ['negative', 'negative'] - [{'negative': 0.99999166, 'positive': 8.3508085e-06}, {'negative': 0.9939621, 'positive': 0.0060379254}] + ['negative', 'positive'] + [{'negative': 0.9999918, 'positive': 8.21179e-06}, {'negative': 0.046924926, 'positive': 0.95307505}] Testing bert model negative @@ -309,7 +309,7 @@ will try to evolve it. .. parsed-literal:: - [{'negative': 0.06594214, 'positive': 0.93405783}, - {'negative': 0.9535811, 'positive': 0.046418883}] + [{'negative': 0.054842573, 'positive': 0.94515747}, + {'negative': 0.95071983, 'positive': 0.04928014}] diff --git a/example/subjectivity/load-subjectivity.ipynb b/example/subjectivity/load-subjectivity.ipynb index 92c6ce4d..b0469541 100644 --- a/example/subjectivity/load-subjectivity.ipynb +++ b/example/subjectivity/load-subjectivity.ipynb @@ -9,8 +9,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 10.4 s, sys: 630 ms, total: 11 s\n", - "Wall time: 11 s\n" + "CPU times: user 12.4 s, sys: 1.4 s, total: 13.8 s\n", + "Wall time: 17.2 s\n" ] } ], @@ -65,14 +65,14 @@ "output_type": "stream", "text": [ "{'negative': 0.46203835811002486, 'positive': 0.5379616418899767}\n", - "{'negative': 0.8698758314042119, 'positive': 0.13012416859579023}\n" + "{'negative': 0.8607294776614423, 'positive': 0.13927052233855727}\n" ] }, { "data": { "text/plain": [ - "[{'negative': 0.8698758314042119, 'positive': 0.13012416859579023},\n", - " {'negative': 0.8698758314042119, 'positive': 0.13012416859579023}]" + "[{'negative': 0.8607294776614423, 'positive': 0.13927052233855727},\n", + " {'negative': 0.8607294776614423, 'positive': 0.13927052233855727}]" ] }, "execution_count": 3, @@ -170,28 +170,28 @@ "text": [ "Testing fast-text model\n", "negative\n", - "['negative', 'negative']\n", - "[{'negative': 0.99998176, 'positive': 1.8284805e-05}, {'negative': 0.6197021, 'positive': 0.3802979}]\n", + "['negative', 'positive']\n", + "[{'negative': 1.0, 'positive': 5.600171e-08}, {'negative': 0.25236478, 'positive': 0.74763525}]\n", "\n", "Testing hierarchical model\n", "negative\n", "['negative', 'positive']\n", - "[{'negative': 0.9999926, 'positive': 7.3815904e-06}, {'negative': 0.17152506, 'positive': 0.82847494}]\n", + "[{'negative': 0.99999225, 'positive': 7.692454e-06}, {'negative': 0.29224393, 'positive': 0.70775604}]\n", "\n", "Testing bahdanau model\n", "negative\n", - "['negative', 'negative']\n", - "[{'negative': 0.99988747, 'positive': 0.000112509806}, {'negative': 0.41513687, 'positive': 0.5848631}]\n", + "['negative', 'positive']\n", + "[{'negative': 0.99998605, 'positive': 1.3971644e-05}, {'negative': 0.41739935, 'positive': 0.5826007}]\n", "\n", "Testing luong model\n", "positive\n", "['positive', 'negative']\n", - "[{'negative': 0.03757865, 'positive': 0.96242136}, {'negative': 0.3540184, 'positive': 0.64598167}]\n", + "[{'negative': 0.07556655, 'positive': 0.92443347}, {'negative': 0.96075815, 'positive': 0.039241895}]\n", "\n", "Testing bidirectional model\n", "negative\n", - "['negative', 'negative']\n", - "[{'negative': 0.99999166, 'positive': 8.3508085e-06}, {'negative': 0.9939621, 'positive': 0.0060379254}]\n", + "['negative', 'positive']\n", + "[{'negative': 0.9999918, 'positive': 8.21179e-06}, {'negative': 0.046924926, 'positive': 0.95307505}]\n", "\n", "Testing bert model\n", "negative\n", @@ -255,7 +255,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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9prKzNa5++Gp4xARERERkWK0kGswM7se+AfwMLC9dd3dNyQLSkRERERExqVXK5vt7OzrvNy1YUDlB0REREREKkw7ciIiIiIiIn1GO3INZmZTgEWEIrhnAt8HLnf315IGJiIiIiIiYxpMHYAkdQfwJ2Af4HVgM3BP0ohERERERGRcWsg120Hufjuw0923u/t84IDUQYmIiIiIyNi0kGu2HWa2NyHBCWb2QWBn2pBERERERGQ8OiPXbAuA3wEHmtmvgeOALyeNSERERERExqUduWZ7ErgfeBl4P/ArYGbSiEREREREZFzakWu2lcCfgRW5awOJYhERERERkS5pIddw7n5+6hhERERERKQYFQRvMDObD2wBHgF2tK67+4ZkQYmIiIiIyLi0I9dsewPfAf6VuzYMHJwmHBERERER6YYWcs02B9jX3d9IHYiIiIiIiHRPWSub7SVgSuogRERERESkGO3INdsw8LyZrQO2ty66++x0IYmIiIiIyHi0kGu261IHICIiIiIixSlrpYiIiIiISJ/RGTkREREREZE+o4WciIiIiIhIn9FCTkREREREpM9oISciIiIiItJn/gfTELJbPfYzqwAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] @@ -293,7 +293,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -331,7 +331,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -469,8 +469,8 @@ { "data": { "text/plain": [ - "[{'negative': 0.06594214, 'positive': 0.93405783},\n", - " {'negative': 0.9535811, 'positive': 0.046418883}]" + "[{'negative': 0.054842573, 'positive': 0.94515747},\n", + " {'negative': 0.95071983, 'positive': 0.04928014}]" ] }, "execution_count": 15, diff --git a/example/subjectivity/load-subjectivity_files/load-subjectivity_15_0.png b/example/subjectivity/load-subjectivity_files/load-subjectivity_15_0.png index 7bb40348..330351aa 100644 Binary files a/example/subjectivity/load-subjectivity_files/load-subjectivity_15_0.png and b/example/subjectivity/load-subjectivity_files/load-subjectivity_15_0.png differ diff --git a/example/subjectivity/load-subjectivity_files/load-subjectivity_17_0.png b/example/subjectivity/load-subjectivity_files/load-subjectivity_17_0.png index f467d0d5..b0a0f454 100644 Binary files a/example/subjectivity/load-subjectivity_files/load-subjectivity_17_0.png and b/example/subjectivity/load-subjectivity_files/load-subjectivity_17_0.png differ diff --git a/example/subjectivity/load-subjectivity_files/load-subjectivity_19_0.png b/example/subjectivity/load-subjectivity_files/load-subjectivity_19_0.png index fcdee996..4be85309 100644 Binary files a/example/subjectivity/load-subjectivity_files/load-subjectivity_19_0.png and b/example/subjectivity/load-subjectivity_files/load-subjectivity_19_0.png differ diff --git a/example/topics-influencers/README.rst b/example/topics-influencers/README.rst deleted file mode 100644 index 4e1b13c3..00000000 --- a/example/topics-influencers/README.rst +++ /dev/null @@ -1,363 +0,0 @@ - -.. code:: ipython3 - - import malaya - -.. code:: ipython3 - - news = 'najib razak dan mahathir mengalami masalah air di kemamam terengganu' - second_news = 'ikat penyedia perkhidmatan jalur lebar Telekom Malaysia (TM) perlu mencari jalan penyelesaian bagi meningkatkan akses capaian Internet ke seluruh negara, kata Menteri Komunikasi dan Multimedia, Gobind Singh Deo. Beliau berkata menjadi dasar kerajaan untuk membekalkan akses Internet jalur lebar kepada semua dan memberi penekanan kepada kualiti perkhidmatan yang terbaik. "Dasar kerajaan untuk bekalkan akses kepada semua bukan sekadar pembekalan sahaja tetapi beri penekanan kepada kualiti perkhidmatan yang baik dan dapat bersaing dengan negara lain pada tahap antarabangsa," kata Gobind Singh menerusi catatan di laman rasmi Twitter beliau, malam tadi. Beliau berkata demikian sebagai respons terhadap aduan beberapa pengguna Twitter berhubung akses Internet yang masih tidak stabil serta harga yang tidak berpatutan di beberapa lokasi di seluruh negara.' - -Using fuzzy for topics ----------------------- - -.. code:: ipython3 - - malaya.topic_influencer.fuzzy_topic(news) - - - - -.. parsed-literal:: - - ['najib razak', 'mahathir', 'masalah air'] - - - -.. code:: ipython3 - - malaya.topic_influencer.fuzzy_topic(second_news) - - - - -.. parsed-literal:: - - ['politik', - 'kkmm', - 'telekom malaysia', - 'internet', - 'pendidikan', - 'perkhidmatan awam', - 'teknologi', - 'twitter', - 'kerajaan', - 'sosial media'] - - - -Using fuzzy for influencers ---------------------------- - -.. code:: ipython3 - - malaya.topic_influencer.fuzzy_influencer(news) - - - - -.. parsed-literal:: - - ['najib razak', 'mahathir'] - - - -.. code:: ipython3 - - malaya.topic_influencer.fuzzy_influencer(second_news) - - - - -.. parsed-literal:: - - ['gobind singh deo'] - - - -Using fuzzy for location ------------------------- - -.. code:: ipython3 - - malaya.topic_influencer.fuzzy_location('saya suka makan sate di sungai petani') - - - - -.. parsed-literal:: - - {'negeri': [], 'parlimen': ['sungai petani'], 'dun': []} - - - -Check location from a string ----------------------------- - -.. code:: ipython3 - - malaya.topic_influencer.is_location('sungai petani') - - - - -.. parsed-literal:: - - True - - - -Train TF-IDF for topics analysis --------------------------------- - -.. code:: ipython3 - - topics_similarity = malaya.topic_influencer.fast_topic() - -.. code:: ipython3 - - topics_similarity.get_similarity(news) - - - - -.. parsed-literal:: - - ['najib razak', - 'mahathir', - 'tan sri mokhzani mahathir', - 'tengku razaleigh hamzah'] - - - -Train TF-IDF for influencers analysis -------------------------------------- - -.. code:: ipython3 - - influencers_similarity = malaya.topic_influencer.fast_influencer() - -.. code:: ipython3 - - influencers_similarity.get_similarity(news) - - - - -.. parsed-literal:: - - ['najib razak', - 'mahathir', - 'tan sri mokhzani mahathir', - 'tengku razaleigh hamzah'] - - - -.. code:: ipython3 - - influencers_similarity.get_similarity(second_news) - - - - -.. parsed-literal:: - - ['mic', - 'jabatan perancangan bandar dan desa', - 'pakatan harapan', - 'parti pribumi bersatu malaysia', - 'gobind singh deo', - 'ppbm', - 'parti islam semalaysia', - 'perkasa'] - - - -Train skip-thought model for topics analysis --------------------------------------------- - -.. code:: ipython3 - - deep_topic = malaya.topic_influencer.skipthought_topic() - - -.. parsed-literal:: - - minibatch loop: 100%|██████████| 157/157 [01:47<00:00, 1.67it/s, cost=0.447] - minibatch loop: 100%|██████████| 157/157 [01:45<00:00, 1.71it/s, cost=0.00799] - minibatch loop: 100%|██████████| 157/157 [01:45<00:00, 1.68it/s, cost=0.00315] - minibatch loop: 100%|██████████| 157/157 [01:44<00:00, 1.60it/s, cost=0.00197] - minibatch loop: 100%|██████████| 157/157 [01:44<00:00, 1.70it/s, cost=0.00152] - - -.. code:: ipython3 - - deep_topic.get_similarity(news, anchor = 0.5) - - - - -.. parsed-literal:: - - ['kkmm', - 'k-pop', - 'mikro-ekonomi', - 'malaysia-indonesia', - 'makro-ekonomi', - 'pilihan raya umum ke-14', - 'programming language', - '#fakenews', - 'undi rosak'] - - - -.. code:: ipython3 - - deep_topic.get_similarity(second_news, anchor = 0.5) - - - - -.. parsed-literal:: - - ['datuk seri abdul hadi awang', - 'kkmm', - 'k-pop', - 'mikro-ekonomi', - 'malaysia-indonesia', - 'makro-ekonomi', - 'pilihan raya umum ke-14', - 'programming language', - '#fakenews', - 'new straits times', - 'undi rosak'] - - - -Train skip-thought model for influencers analysis -------------------------------------------------- - -.. code:: ipython3 - - deep_influencer = malaya.topic_influencer.skipthought_influencer() - - -.. parsed-literal:: - - minibatch loop: 100%|██████████| 20/20 [00:13<00:00, 1.70it/s, cost=3.46] - minibatch loop: 100%|██████████| 20/20 [00:13<00:00, 1.33it/s, cost=1.08] - minibatch loop: 100%|██████████| 20/20 [00:13<00:00, 1.66it/s, cost=0.547] - minibatch loop: 100%|██████████| 20/20 [00:12<00:00, 1.74it/s, cost=0.275] - minibatch loop: 100%|██████████| 20/20 [00:12<00:00, 1.59it/s, cost=0.253] - minibatch loop: 100%|██████████| 20/20 [00:12<00:00, 1.69it/s, cost=0.281] - minibatch loop: 100%|██████████| 20/20 [00:12<00:00, 1.71it/s, cost=0.209] - minibatch loop: 100%|██████████| 20/20 [00:12<00:00, 1.66it/s, cost=0.259] - minibatch loop: 100%|██████████| 20/20 [00:12<00:00, 1.67it/s, cost=0.232] - minibatch loop: 100%|██████████| 20/20 [00:12<00:00, 1.62it/s, cost=0.219] - - -.. code:: ipython3 - - deep_influencer.get_similarity(news, anchor = 0.5) - - - - -.. parsed-literal:: - - ['najib razak', 'mahathir'] - - - -.. code:: ipython3 - - deep_influencer.get_similarity(second_news, anchor = 0.5) - - - - -.. parsed-literal:: - - ['gobind singh deo'] - - - -Train siamese network for topics analysis ------------------------------------------ - -.. code:: ipython3 - - deep_topic = malaya.topic_influencer.siamese_topic() - print(deep_topic.get_similarity(news, anchor = 0.5)) - print(deep_topic.get_similarity(second_news, anchor = 0.5)) - - -.. parsed-literal:: - - minibatch loop: 100%|██████████| 157/157 [01:50<00:00, 1.67it/s, accuracy=1, cost=0.114] - minibatch loop: 100%|██████████| 157/157 [01:49<00:00, 1.69it/s, accuracy=1, cost=0.0739] - minibatch loop: 100%|██████████| 157/157 [01:49<00:00, 1.66it/s, accuracy=1, cost=0.0686] - minibatch loop: 100%|██████████| 157/157 [01:50<00:00, 1.68it/s, accuracy=1, cost=0.0279] - minibatch loop: 100%|██████████| 157/157 [01:49<00:00, 1.70it/s, accuracy=1, cost=0.0193] - - -.. parsed-literal:: - - ['kesihatan', 'politik', 'wan azizah', 'kaum cina', 'tiga penjuru', 'pusat transformasi bandar', 'bumiputra', 'jabatan perancangan bandar dan desa', 'pusat daerah mangundi', 'menteri pertahanan', 'kewangan', 'gaza', 'kaum melayu', 'programming language', 'lgbt', 'infrastruktur', 'sinar harian', 'singapura', 'real madrid cf', 'anwar ibrahim'] - ['politik', 'kkmm', 'bumiputra', 'malaysia-indonesia', 'menteri pertahanan', 'motogp', 'programming language', 'twitter', 'lgbt', 'gaji menteri', 'singapura'] - - -.. code:: ipython3 - - print(deep_topic.get_similarity(news, anchor = 0.7)) - print(deep_topic.get_similarity(second_news, anchor = 0.7)) - - -.. parsed-literal:: - - [] - [] - - -Train siamese network for influencers analysis ----------------------------------------------- - -.. code:: ipython3 - - deep_influencer = malaya.topic_influencer.siamese_influencer() - - -.. parsed-literal:: - - minibatch loop: 100%|██████████| 20/20 [00:14<00:00, 1.46it/s, accuracy=0.583, cost=0.129] - minibatch loop: 100%|██████████| 20/20 [00:13<00:00, 1.48it/s, accuracy=0.542, cost=0.124] - minibatch loop: 100%|██████████| 20/20 [00:13<00:00, 1.49it/s, accuracy=0.542, cost=0.121] - minibatch loop: 100%|██████████| 20/20 [00:14<00:00, 1.49it/s, accuracy=0.833, cost=0.0885] - minibatch loop: 100%|██████████| 20/20 [00:14<00:00, 1.47it/s, accuracy=0.875, cost=0.0637] - - -.. code:: ipython3 - - deep_influencer.get_similarity(news, anchor = 0.5) - - - - -.. parsed-literal:: - - ['najib razak', 'mahathir'] - - - -.. code:: ipython3 - - deep_influencer.get_similarity(second_news, anchor = 0.5) - - - - -.. parsed-literal:: - - ['gobind singh deo'] - - diff --git a/example/topics-influencers/load-topics-influencers.ipynb b/example/topics-influencers/load-topics-influencers.ipynb deleted file mode 100644 index f3b7b2c5..00000000 --- a/example/topics-influencers/load-topics-influencers.ipynb +++ /dev/null @@ -1,590 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import malaya" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "news = 'najib razak dan mahathir mengalami masalah air di kemamam terengganu'\n", - "second_news = 'ikat penyedia perkhidmatan jalur lebar Telekom Malaysia (TM) perlu mencari jalan penyelesaian bagi meningkatkan akses capaian Internet ke seluruh negara, kata Menteri Komunikasi dan Multimedia, Gobind Singh Deo. Beliau berkata menjadi dasar kerajaan untuk membekalkan akses Internet jalur lebar kepada semua dan memberi penekanan kepada kualiti perkhidmatan yang terbaik. \"Dasar kerajaan untuk bekalkan akses kepada semua bukan sekadar pembekalan sahaja tetapi beri penekanan kepada kualiti perkhidmatan yang baik dan dapat bersaing dengan negara lain pada tahap antarabangsa,\" kata Gobind Singh menerusi catatan di laman rasmi Twitter beliau, malam tadi. Beliau berkata demikian sebagai respons terhadap aduan beberapa pengguna Twitter berhubung akses Internet yang masih tidak stabil serta harga yang tidak berpatutan di beberapa lokasi di seluruh negara.'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Using fuzzy for topics" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['najib razak', 'mahathir', 'masalah air']" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "malaya.topic_influencer.fuzzy_topic(news)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['politik',\n", - " 'kkmm',\n", - " 'telekom malaysia',\n", - " 'internet',\n", - " 'pendidikan',\n", - " 'perkhidmatan awam',\n", - " 'teknologi',\n", - " 'twitter',\n", - " 'kerajaan',\n", - " 'sosial media']" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "malaya.topic_influencer.fuzzy_topic(second_news)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Using fuzzy for influencers" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['najib razak', 'mahathir']" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "malaya.topic_influencer.fuzzy_influencer(news)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['gobind singh deo']" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "malaya.topic_influencer.fuzzy_influencer(second_news)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Using fuzzy for location" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'negeri': [], 'parlimen': ['sungai petani'], 'dun': []}" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "malaya.topic_influencer.fuzzy_location('saya suka makan sate di sungai petani')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Check location from a string" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "malaya.topic_influencer.is_location('sungai petani')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Train TF-IDF for topics analysis" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "topics_similarity = malaya.topic_influencer.fast_topic()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['najib razak',\n", - " 'mahathir',\n", - " 'tan sri mokhzani mahathir',\n", - " 'tengku razaleigh hamzah']" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "topics_similarity.get_similarity(news)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Train TF-IDF for influencers analysis" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "influencers_similarity = malaya.topic_influencer.fast_influencer()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['najib razak',\n", - " 'mahathir',\n", - " 'tan sri mokhzani mahathir',\n", - " 'tengku razaleigh hamzah']" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "influencers_similarity.get_similarity(news)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['mic',\n", - " 'jabatan perancangan bandar dan desa',\n", - " 'pakatan harapan',\n", - " 'parti pribumi bersatu malaysia',\n", - " 'gobind singh deo',\n", - " 'ppbm',\n", - " 'parti islam semalaysia',\n", - " 'perkasa']" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "influencers_similarity.get_similarity(second_news)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Train skip-thought model for topics analysis" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "minibatch loop: 100%|██████████| 157/157 [01:47<00:00, 1.67it/s, cost=0.447]\n", - "minibatch loop: 100%|██████████| 157/157 [01:45<00:00, 1.71it/s, cost=0.00799]\n", - "minibatch loop: 100%|██████████| 157/157 [01:45<00:00, 1.68it/s, cost=0.00315]\n", - "minibatch loop: 100%|██████████| 157/157 [01:44<00:00, 1.60it/s, cost=0.00197]\n", - "minibatch loop: 100%|██████████| 157/157 [01:44<00:00, 1.70it/s, cost=0.00152]\n" - ] - } - ], - "source": [ - "deep_topic = malaya.topic_influencer.skipthought_topic()" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['kkmm',\n", - " 'k-pop',\n", - " 'mikro-ekonomi',\n", - " 'malaysia-indonesia',\n", - " 'makro-ekonomi',\n", - " 'pilihan raya umum ke-14',\n", - " 'programming language',\n", - " '#fakenews',\n", - " 'undi rosak']" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "deep_topic.get_similarity(news, anchor = 0.5)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['datuk seri abdul hadi awang',\n", - " 'kkmm',\n", - " 'k-pop',\n", - " 'mikro-ekonomi',\n", - " 'malaysia-indonesia',\n", - " 'makro-ekonomi',\n", - " 'pilihan raya umum ke-14',\n", - " 'programming language',\n", - " '#fakenews',\n", - " 'new straits times',\n", - " 'undi rosak']" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "deep_topic.get_similarity(second_news, anchor = 0.5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Train skip-thought model for influencers analysis" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "minibatch loop: 100%|██████████| 20/20 [00:13<00:00, 1.70it/s, cost=3.46]\n", - "minibatch loop: 100%|██████████| 20/20 [00:13<00:00, 1.33it/s, cost=1.08]\n", - "minibatch loop: 100%|██████████| 20/20 [00:13<00:00, 1.66it/s, cost=0.547]\n", - "minibatch loop: 100%|██████████| 20/20 [00:12<00:00, 1.74it/s, cost=0.275]\n", - "minibatch loop: 100%|██████████| 20/20 [00:12<00:00, 1.59it/s, cost=0.253]\n", - "minibatch loop: 100%|██████████| 20/20 [00:12<00:00, 1.69it/s, cost=0.281]\n", - "minibatch loop: 100%|██████████| 20/20 [00:12<00:00, 1.71it/s, cost=0.209]\n", - "minibatch loop: 100%|██████████| 20/20 [00:12<00:00, 1.66it/s, cost=0.259]\n", - "minibatch loop: 100%|██████████| 20/20 [00:12<00:00, 1.67it/s, cost=0.232]\n", - "minibatch loop: 100%|██████████| 20/20 [00:12<00:00, 1.62it/s, cost=0.219]\n" - ] - } - ], - "source": [ - "deep_influencer = malaya.topic_influencer.skipthought_influencer()" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['najib razak', 'mahathir']" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "deep_influencer.get_similarity(news, anchor = 0.5)" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['gobind singh deo']" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "deep_influencer.get_similarity(second_news, anchor = 0.5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Train siamese network for topics analysis" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "minibatch loop: 100%|██████████| 157/157 [01:50<00:00, 1.67it/s, accuracy=1, cost=0.114] \n", - "minibatch loop: 100%|██████████| 157/157 [01:49<00:00, 1.69it/s, accuracy=1, cost=0.0739] \n", - "minibatch loop: 100%|██████████| 157/157 [01:49<00:00, 1.66it/s, accuracy=1, cost=0.0686] \n", - "minibatch loop: 100%|██████████| 157/157 [01:50<00:00, 1.68it/s, accuracy=1, cost=0.0279] \n", - "minibatch loop: 100%|██████████| 157/157 [01:49<00:00, 1.70it/s, accuracy=1, cost=0.0193] \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['kesihatan', 'politik', 'wan azizah', 'kaum cina', 'tiga penjuru', 'pusat transformasi bandar', 'bumiputra', 'jabatan perancangan bandar dan desa', 'pusat daerah mangundi', 'menteri pertahanan', 'kewangan', 'gaza', 'kaum melayu', 'programming language', 'lgbt', 'infrastruktur', 'sinar harian', 'singapura', 'real madrid cf', 'anwar ibrahim']\n", - "['politik', 'kkmm', 'bumiputra', 'malaysia-indonesia', 'menteri pertahanan', 'motogp', 'programming language', 'twitter', 'lgbt', 'gaji menteri', 'singapura']\n" - ] - } - ], - "source": [ - "deep_topic = malaya.topic_influencer.siamese_topic()\n", - "print(deep_topic.get_similarity(news, anchor = 0.5))\n", - "print(deep_topic.get_similarity(second_news, anchor = 0.5))" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[]\n", - "[]\n" - ] - } - ], - "source": [ - "print(deep_topic.get_similarity(news, anchor = 0.7))\n", - "print(deep_topic.get_similarity(second_news, anchor = 0.7))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Train siamese network for influencers analysis" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "minibatch loop: 100%|██████████| 20/20 [00:14<00:00, 1.46it/s, accuracy=0.583, cost=0.129]\n", - "minibatch loop: 100%|██████████| 20/20 [00:13<00:00, 1.48it/s, accuracy=0.542, cost=0.124]\n", - "minibatch loop: 100%|██████████| 20/20 [00:13<00:00, 1.49it/s, accuracy=0.542, cost=0.121]\n", - "minibatch loop: 100%|██████████| 20/20 [00:14<00:00, 1.49it/s, accuracy=0.833, cost=0.0885]\n", - "minibatch loop: 100%|██████████| 20/20 [00:14<00:00, 1.47it/s, accuracy=0.875, cost=0.0637]\n" - ] - } - ], - "source": [ - "deep_influencer = malaya.topic_influencer.siamese_influencer()" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['najib razak', 'mahathir']" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "deep_influencer.get_similarity(news, anchor = 0.5)" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['gobind singh deo']" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "deep_influencer.get_similarity(second_news, anchor = 0.5)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/example/word-mover/README.rst b/example/word-mover/README.rst deleted file mode 100644 index b6370389..00000000 --- a/example/word-mover/README.rst +++ /dev/null @@ -1,93 +0,0 @@ - -.. code:: ipython3 - - import malaya - -What is word mover distance? ----------------------------- - -between two documents in a meaningful way, even when they have no words -in common. It uses vector embeddings of words. It been shown to -outperform many of the state-of-the-art methods in k-nearest neighbors -classification. - -You can read more about word mover distance from `Word Distance between -Word -Embeddings `__. - -**Closest to 0 is better**. - -.. code:: ipython3 - - left_sentence = 'saya suka makan ayam' - right_sentence = 'saya suka makan ikan' - left_token = left_sentence.split() - right_token = right_sentence.split() - -.. code:: ipython3 - - w2v_wiki = malaya.word2vec.load_wiki() - w2v_wiki = malaya.word2vec.word2vec(w2v_wiki['nce_weights'],w2v_wiki['dictionary']) - -.. code:: ipython3 - - fasttext_wiki, ngrams = malaya.fast_text.load_wiki() - fasttext_wiki = malaya.fast_text.fast_text(fasttext_wiki['embed_weights'],fasttext_wiki['dictionary'], ngrams) - -Using word2vec --------------- - -.. code:: ipython3 - - malaya.word_mover.distance(left_token, right_token, w2v_wiki) - - - - -.. parsed-literal:: - - 0.8225146532058716 - - - -.. code:: ipython3 - - malaya.word_mover.distance(left_token, left_token, w2v_wiki) - - - - -.. parsed-literal:: - - 0.0 - - - -Using fast-text ---------------- - -.. code:: ipython3 - - malaya.word_mover.distance(left_token, right_token, fasttext_wiki) - - - - -.. parsed-literal:: - - 2.82466983795166 - - - -.. code:: ipython3 - - malaya.word_mover.distance(left_token, left_token, fasttext_wiki) - - - - -.. parsed-literal:: - - 0.0 - - diff --git a/example/word-mover/load-word-mover-distance.ipynb b/example/word-mover/load-word-mover-distance.ipynb index 9b6b9172..7b8699c5 100644 --- a/example/word-mover/load-word-mover-distance.ipynb +++ b/example/word-mover/load-word-mover-distance.ipynb @@ -4,8 +4,18 @@ "cell_type": "code", "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 12.6 s, sys: 1.43 s, total: 14 s\n", + "Wall time: 17.6 s\n" + ] + } + ], "source": [ + "%%time\n", "import malaya" ] }, @@ -90,7 +100,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -99,7 +109,7 @@ "0.0" ] }, - "execution_count": 7, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -117,7 +127,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -126,7 +136,7 @@ "2.82466983795166" ] }, - "execution_count": 6, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -154,6 +164,255 @@ "source": [ "malaya.word_mover.distance(left_token, left_token, fasttext_wiki)" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Load expander\n", + "\n", + "We want to expand shortforms based on `malaya.normalize.spell` by using word mover distance. If our vector knows that `mkn` semantically similar to `makan` based on `saya suka mkn ayam` sentence, word mover distance will become closer.\n", + "\n", + "It is really depends on our vector, and word2vec may not able to understand shortform, so we will use fast-text to fix `OUT-OF-VOCAB` problem." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "malays = malaya.load_malay_dictionary()\n", + "wiki, ngrams = malaya.fast_text.load_wiki()\n", + "fast_text_embed = malaya.fast_text.fast_text(wiki['embed_weights'],wiki['dictionary'],ngrams)\n", + "expander = malaya.word_mover.expander(malays, fast_text_embed)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "string = 'y u xsuka makan HUSEIN kt situ tmpt'\n", + "another = 'i mmg xska mknn HUSEIN kampng tempt'" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[[('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ tut',\n", + " 0.8088938253521919),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ tuit',\n", + " 0.863929785296917),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ tat',\n", + " 0.8680638003787995),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ top',\n", + " 0.8688952446055412),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ tip',\n", + " 0.8978437346220016),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ taat',\n", + " 0.936883625289917),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ topi',\n", + " 0.9442774548711776),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ tumit',\n", + " 0.9495834815340042),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ tempe',\n", + " 0.9758907731723786),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ ampe',\n", + " 0.9821926467533112),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ tempo',\n", + " 0.9836614096956253),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ tepet',\n", + " 0.994007917971611),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ amit',\n", + " 0.9999424153804779),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ tuat',\n", + " 1.0002889167022706),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ mat',\n", + " 1.0071370331926346),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ temut',\n", + " 1.011553812426567),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ ampit',\n", + " 1.022653616695404),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ ampo',\n", + " 1.0231078831071854),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ tipu',\n", + " 1.0246861065587998),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ tepi',\n", + " 1.0285266551542283),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ umut',\n", + " 1.0287358275117875),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ emat',\n", + " 1.0357482937116622),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ empat',\n", + " 1.0431590774860382),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ tapi',\n", + " 1.0562509994459153),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ tepu',\n", + " 1.0601519473543166),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ tumpat',\n", + " 1.074669928882599),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ impi',\n", + " 1.078846170501709),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ umat',\n", + " 1.0791117155513763),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ tampi',\n", + " 1.0883281208925248),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ tumpu',\n", + " 1.091578345676422),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ umpat',\n", + " 1.092372225769043),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ tepat',\n", + " 1.0979607516746521),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ tampa',\n", + " 1.1118229238204955),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ amput',\n", + " 1.1226389572820663),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ tapa',\n", + " 1.129335333744049),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ timpa',\n", + " 1.1353471846590042),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ empu',\n", + " 1.1459274488725661),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ tempa',\n", + " 1.164648480837822),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ tampu',\n", + " 1.1812463180065156),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ tempat',\n", + " 1.1856716803007126),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ tamat',\n", + " 1.2068403679332733),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ amat',\n", + " 1.2214121790246963),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ ampu',\n", + " 1.2350379461402894),\n", + " ('tmpt',\n", + " 'kenapa awak tak suka makan Husein kat situ taut',\n", + " 1.2796957146606445)]]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "expander.expand(string)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[[('ska', 'saya memang tak soka mknn Husein kampng tempt', 0.7199365496635437),\n", + " ('ska', 'saya memang tak suka mknn Husein kampng tempt', 0.8050327301025391),\n", + " ('ska', 'saya memang tak sika mknn Husein kampng tempt', 0.8729341626167297),\n", + " ('ska', 'saya memang tak saka mknn Husein kampng tempt', 0.875930666923523),\n", + " ('ska', 'saya memang tak spa mknn Husein kampng tempt', 0.8995948433876038),\n", + " ('ska', 'saya memang tak sua mknn Husein kampng tempt', 0.9496822357177734),\n", + " ('ska', 'saya memang tak seka mknn Husein kampng tempt', 0.9891390204429626),\n", + " ('ska', 'saya memang tak ski mknn Husein kampng tempt', 1.1318669319152832),\n", + " ('ska', 'saya memang tak sia mknn Husein kampng tempt', 1.1666431427001953)],\n", + " [('mknn', 'saya memang tak ska min Husein kampng tempt', 0.8653836846351624),\n", + " ('mknn', 'saya memang tak ska maun Husein kampng tempt', 1.045318603515625),\n", + " ('mknn', 'saya memang tak ska kun Husein kampng tempt', 1.0710314512252808),\n", + " ('mknn', 'saya memang tak ska ken Husein kampng tempt', 1.0728274583816528),\n", + " ('mknn', 'saya memang tak ska kon Husein kampng tempt', 1.0992072820663452),\n", + " ('mknn', 'saya memang tak ska ikon Husein kampng tempt', 1.1365187168121338),\n", + " ('mknn', 'saya memang tak ska makin Husein kampng tempt', 1.180336833000183),\n", + " ('mknn', 'saya memang tak ska main Husein kampng tempt', 1.182568907737732),\n", + " ('mknn', 'saya memang tak ska makan Husein kampng tempt', 1.183489203453064),\n", + " ('mknn', 'saya memang tak ska makna Husein kampng tempt', 1.184565544128418),\n", + " ('mknn', 'saya memang tak ska kan Husein kampng tempt', 1.2368937730789185),\n", + " ('mknn', 'saya memang tak ska akan Husein kampng tempt', 1.2527291774749756),\n", + " ('mknn', 'saya memang tak ska mani Husein kampng tempt', 1.266147494316101),\n", + " ('mknn', 'saya memang tak ska ikan Husein kampng tempt', 1.2773109674453735),\n", + " ('mknn', 'saya memang tak ska mini Husein kampng tempt', 1.3020210266113281),\n", + " ('mknn', 'saya memang tak ska mana Husein kampng tempt', 1.3099677562713623),\n", + " ('mknn', 'saya memang tak ska menu Husein kampng tempt', 1.3974181413650513),\n", + " ('mknn', 'saya memang tak ska mena Husein kampng tempt', 1.404064655303955),\n", + " ('mknn',\n", + " 'saya memang tak ska makanan Husein kampng tempt',\n", + " 1.4473483562469482)],\n", + " [('kampng',\n", + " 'saya memang tak ska mknn Husein kampung tempt',\n", + " 0.9272603988647461)],\n", + " [('tempt',\n", + " 'saya memang tak ska mknn Husein kampng tempo',\n", + " 0.7405402660369873),\n", + " ('tempt',\n", + " 'saya memang tak ska mknn Husein kampng tempe',\n", + " 0.7510019540786743),\n", + " ('tempt', 'saya memang tak ska mknn Husein kampng tempa', 0.885798454284668),\n", + " ('tempt',\n", + " 'saya memang tak ska mknn Husein kampng temut',\n", + " 0.9036741256713867),\n", + " ('tempt',\n", + " 'saya memang tak ska mknn Husein kampng tempat',\n", + " 0.9161624312400818)]]" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "expander.expand(another)" + ] } ], "metadata": { diff --git a/example/word-mover/load-word-mover-distance.rst b/example/word-mover/load-word-mover-distance.rst new file mode 100644 index 00000000..9356769b --- /dev/null +++ b/example/word-mover/load-word-mover-distance.rst @@ -0,0 +1,327 @@ + +.. code:: ipython3 + + %%time + import malaya + + +.. parsed-literal:: + + CPU times: user 12.6 s, sys: 1.43 s, total: 14 s + Wall time: 17.6 s + + +What is word mover distance? +---------------------------- + +between two documents in a meaningful way, even when they have no words +in common. It uses vector embeddings of words. It been shown to +outperform many of the state-of-the-art methods in k-nearest neighbors +classification. + +You can read more about word mover distance from `Word Distance between +Word +Embeddings `__. + +**Closest to 0 is better**. + +.. code:: ipython3 + + left_sentence = 'saya suka makan ayam' + right_sentence = 'saya suka makan ikan' + left_token = left_sentence.split() + right_token = right_sentence.split() + +.. code:: ipython3 + + w2v_wiki = malaya.word2vec.load_wiki() + w2v_wiki = malaya.word2vec.word2vec(w2v_wiki['nce_weights'],w2v_wiki['dictionary']) + +.. code:: ipython3 + + fasttext_wiki, ngrams = malaya.fast_text.load_wiki() + fasttext_wiki = malaya.fast_text.fast_text(fasttext_wiki['embed_weights'],fasttext_wiki['dictionary'], ngrams) + +Using word2vec +-------------- + +.. code:: ipython3 + + malaya.word_mover.distance(left_token, right_token, w2v_wiki) + + + + +.. parsed-literal:: + + 0.8225146532058716 + + + +.. code:: ipython3 + + malaya.word_mover.distance(left_token, left_token, w2v_wiki) + + + + +.. parsed-literal:: + + 0.0 + + + +Using fast-text +--------------- + +.. code:: ipython3 + + malaya.word_mover.distance(left_token, right_token, fasttext_wiki) + + + + +.. parsed-literal:: + + 2.82466983795166 + + + +.. code:: ipython3 + + malaya.word_mover.distance(left_token, left_token, fasttext_wiki) + + + + +.. parsed-literal:: + + 0.0 + + + +Load expander +------------- + +We want to expand shortforms based on ``malaya.normalize.spell`` by +using word mover distance. If our vector knows that ``mkn`` semantically +similar to ``makan`` based on ``saya suka mkn ayam`` sentence, word +mover distance will become closer. + +It is really depends on our vector, and word2vec may not able to +understand shortform, so we will use fast-text to fix ``OUT-OF-VOCAB`` +problem. + +.. code:: ipython3 + + malays = malaya.load_malay_dictionary() + wiki, ngrams = malaya.fast_text.load_wiki() + fast_text_embed = malaya.fast_text.fast_text(wiki['embed_weights'],wiki['dictionary'],ngrams) + expander = malaya.word_mover.expander(malays, fast_text_embed) + +.. code:: ipython3 + + string = 'y u xsuka makan HUSEIN kt situ tmpt' + another = 'i mmg xska mknn HUSEIN kampng tempt' + +.. code:: ipython3 + + expander.expand(string) + + + + +.. parsed-literal:: + + [[('tmpt', + 'kenapa awak tak suka makan Husein kat situ tut', + 0.8088938253521919), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tuit', + 0.863929785296917), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tat', + 0.8680638003787995), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ top', + 0.8688952446055412), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tip', + 0.8978437346220016), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ taat', + 0.936883625289917), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ topi', + 0.9442774548711776), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tumit', + 0.9495834815340042), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tempe', + 0.9758907731723786), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ ampe', + 0.9821926467533112), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tempo', + 0.9836614096956253), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tepet', + 0.994007917971611), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ amit', + 0.9999424153804779), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tuat', + 1.0002889167022706), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ mat', + 1.0071370331926346), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ temut', + 1.011553812426567), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ ampit', + 1.022653616695404), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ ampo', + 1.0231078831071854), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tipu', + 1.0246861065587998), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tepi', + 1.0285266551542283), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ umut', + 1.0287358275117875), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ emat', + 1.0357482937116622), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ empat', + 1.0431590774860382), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tapi', + 1.0562509994459153), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tepu', + 1.0601519473543166), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tumpat', + 1.074669928882599), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ impi', + 1.078846170501709), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ umat', + 1.0791117155513763), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tampi', + 1.0883281208925248), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tumpu', + 1.091578345676422), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ umpat', + 1.092372225769043), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tepat', + 1.0979607516746521), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tampa', + 1.1118229238204955), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ amput', + 1.1226389572820663), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tapa', + 1.129335333744049), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ timpa', + 1.1353471846590042), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ empu', + 1.1459274488725661), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tempa', + 1.164648480837822), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tampu', + 1.1812463180065156), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tempat', + 1.1856716803007126), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ tamat', + 1.2068403679332733), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ amat', + 1.2214121790246963), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ ampu', + 1.2350379461402894), + ('tmpt', + 'kenapa awak tak suka makan Husein kat situ taut', + 1.2796957146606445)]] + + + +.. code:: ipython3 + + expander.expand(another) + + + + +.. parsed-literal:: + + [[('ska', 'saya memang tak soka mknn Husein kampng tempt', 0.7199365496635437), + ('ska', 'saya memang tak suka mknn Husein kampng tempt', 0.8050327301025391), + ('ska', 'saya memang tak sika mknn Husein kampng tempt', 0.8729341626167297), + ('ska', 'saya memang tak saka mknn Husein kampng tempt', 0.875930666923523), + ('ska', 'saya memang tak spa mknn Husein kampng tempt', 0.8995948433876038), + ('ska', 'saya memang tak sua mknn Husein kampng tempt', 0.9496822357177734), + ('ska', 'saya memang tak seka mknn Husein kampng tempt', 0.9891390204429626), + ('ska', 'saya memang tak ski mknn Husein kampng tempt', 1.1318669319152832), + ('ska', 'saya memang tak sia mknn Husein kampng tempt', 1.1666431427001953)], + [('mknn', 'saya memang tak ska min Husein kampng tempt', 0.8653836846351624), + ('mknn', 'saya memang tak ska maun Husein kampng tempt', 1.045318603515625), + ('mknn', 'saya memang tak ska kun Husein kampng tempt', 1.0710314512252808), + ('mknn', 'saya memang tak ska ken Husein kampng tempt', 1.0728274583816528), + ('mknn', 'saya memang tak ska kon Husein kampng tempt', 1.0992072820663452), + ('mknn', 'saya memang tak ska ikon Husein kampng tempt', 1.1365187168121338), + ('mknn', 'saya memang tak ska makin Husein kampng tempt', 1.180336833000183), + ('mknn', 'saya memang tak ska main Husein kampng tempt', 1.182568907737732), + ('mknn', 'saya memang tak ska makan Husein kampng tempt', 1.183489203453064), + ('mknn', 'saya memang tak ska makna Husein kampng tempt', 1.184565544128418), + ('mknn', 'saya memang tak ska kan Husein kampng tempt', 1.2368937730789185), + ('mknn', 'saya memang tak ska akan Husein kampng tempt', 1.2527291774749756), + ('mknn', 'saya memang tak ska mani Husein kampng tempt', 1.266147494316101), + ('mknn', 'saya memang tak ska ikan Husein kampng tempt', 1.2773109674453735), + ('mknn', 'saya memang tak ska mini Husein kampng tempt', 1.3020210266113281), + ('mknn', 'saya memang tak ska mana Husein kampng tempt', 1.3099677562713623), + ('mknn', 'saya memang tak ska menu Husein kampng tempt', 1.3974181413650513), + ('mknn', 'saya memang tak ska mena Husein kampng tempt', 1.404064655303955), + ('mknn', + 'saya memang tak ska makanan Husein kampng tempt', + 1.4473483562469482)], + [('kampng', + 'saya memang tak ska mknn Husein kampung tempt', + 0.9272603988647461)], + [('tempt', + 'saya memang tak ska mknn Husein kampng tempo', + 0.7405402660369873), + ('tempt', + 'saya memang tak ska mknn Husein kampng tempe', + 0.7510019540786743), + ('tempt', 'saya memang tak ska mknn Husein kampng tempa', 0.885798454284668), + ('tempt', + 'saya memang tak ska mknn Husein kampng temut', + 0.9036741256713867), + ('tempt', + 'saya memang tak ska mknn Husein kampng tempat', + 0.9161624312400818)]] + + diff --git a/malaya/__init__.py b/malaya/__init__.py index 71ff70a8..e8f31cb2 100644 --- a/malaya/__init__.py +++ b/malaya/__init__.py @@ -17,8 +17,8 @@ from pathlib import Path home = os.path.join(str(Path.home()), 'Malaya') -version = '1.6' -bump_version = '1.6.1.1' +version = '1.7' +bump_version = '1.7.0.0' version_path = os.path.join(home, 'version') @@ -71,8 +71,12 @@ def _delete_macos(): fopen.write(version) -def print_cache(): - paths = DisplayablePath.make_tree(Path(home)) +def print_cache(location = None): + """ + Print cached data, this will print entire cache folder if let location = None + """ + path = os.path.join(home, location) if location else home + paths = DisplayablePath.make_tree(Path(path)) for path in paths: print(path.displayable()) @@ -269,12 +273,12 @@ def describe_dependency(): from . import num2word from . import pos from . import sentiment +from . import similarity from . import spell from . import stack from . import stem from . import subjective from . import summarize -from . import topic_influencer from . import topic_model from . import toxic from . import word_mover diff --git a/malaya/_models/_siamese_lstm.py b/malaya/_models/_siamese_lstm.py index 9ae245ef..ba691bc4 100644 --- a/malaya/_models/_siamese_lstm.py +++ b/malaya/_models/_siamese_lstm.py @@ -6,7 +6,6 @@ import tensorflow as tf from tqdm import tqdm -import uuid from ..texts._text_functions import str_idx, build_dataset @@ -30,7 +29,7 @@ def cells(size, reuse = False): ) def birnn(inputs, scope): - with tf.variable_scope(scope + str(uuid.uuid4())): + with tf.variable_scope(scope): for n in range(num_layers): (out_fw, out_bw), ( state_fw, @@ -113,6 +112,8 @@ def train_model( output_size = 300, maxlen = 100, dropout = 0.8, + num_layers = 1, + **kwargs ): concat = (' '.join(train_X_left + train_X_right)).split() vocabulary_size = len(list(set(concat))) @@ -124,13 +125,14 @@ def train_model( sess = tf.InteractiveSession() model = Model( size_layer = embedding_size, - num_layers = 1, + num_layers = num_layers, embedded_size = embedding_size, dict_size = len(dictionary), output_size = output_size, dropout = dropout, ) sess.run(tf.global_variables_initializer()) + saver = tf.train.Saver(tf.trainable_variables()) vectors_left = str_idx(train_X_left, dictionary, maxlen, UNK = 3) vectors_right = str_idx(train_X_right, dictionary, maxlen, UNK = 3) @@ -155,4 +157,22 @@ def train_model( }, ) pbar.set_postfix(cost = loss, accuracy = acc) - return sess, model, dictionary + return sess, model, dictionary, saver, dropout + + +def load_siamese(location, json): + graph = tf.Graph() + with graph.as_default(): + model = Model( + size_layer = json['embedding_size'], + num_layers = json['num_layers'], + embedded_size = json['embedding_size'], + dict_size = len(json['dictionary']), + output_size = json['output_size'], + dropout = json['dropout'], + ) + sess = tf.InteractiveSession() + sess.run(tf.global_variables_initializer()) + saver = tf.train.Saver(tf.trainable_variables()) + saver.restore(sess, location + '/model.ckpt') + return sess, model, saver diff --git a/malaya/_models/_skip_thought.py b/malaya/_models/_skip_thought.py index 42774297..3f08a35b 100644 --- a/malaya/_models/_skip_thought.py +++ b/malaya/_models/_skip_thought.py @@ -264,6 +264,7 @@ def train_model( ) sess = tf.InteractiveSession() sess.run(tf.global_variables_initializer()) + saver = tf.train.Saver(tf.trainable_variables()) for e in range(epoch): pbar = tqdm(range(0, len(train_X), batch_size), desc = 'minibatch loop') @@ -292,4 +293,19 @@ def train_model( }, ) pbar.set_postfix(cost = loss) - return sess, model, dictionary + return sess, model, dictionary, saver + + +def load_skipthought(location, json): + graph = tf.Graph() + with graph.as_default(): + model = Model( + len(json['dictionary']), + embedding_size = json['embedding_size'], + maxlen = json['maxlen'], + ) + sess = tf.InteractiveSession() + sess.run(tf.global_variables_initializer()) + saver = tf.train.Saver(tf.trainable_variables()) + saver.restore(sess, location + '/model.ckpt') + return sess, model, saver diff --git a/malaya/_models/_tensorflow_model.py b/malaya/_models/_tensorflow_model.py index a168d6c2..1d8cd589 100644 --- a/malaya/_models/_tensorflow_model.py +++ b/malaya/_models/_tensorflow_model.py @@ -8,21 +8,19 @@ import numpy as np from ..texts._text_functions import ( str_idx, - add_ngram, - fasttext_str_idx, entities_textcleaning, char_str_idx, generate_char_seq, language_detection_textcleaning, ) -from .._utils._parse_dependency import DependencyGraph -from ..stem import _classification_textcleaning_stemmer_attention +from ..stem import _classification_textcleaning_stemmer -def _convert_sparse_matrix_to_sparse_tensor(X, limit = 5): +def _convert_sparse_matrix_to_sparse_tensor(X, got_limit = True, limit = 5): coo = X.tocoo() indices = np.mat([coo.row, coo.col]).transpose() - coo.data[coo.data > limit] = limit + if got_limit: + coo.data[coo.data > limit] = limit return ( tf.SparseTensorValue(indices, coo.col, coo.shape), tf.SparseTensorValue(indices, coo.data, coo.shape), @@ -383,7 +381,6 @@ def __init__( sess, mode, dictionary, - ngram = None, alphas = None, input_mask = None, segment_ids = None, @@ -398,7 +395,6 @@ def __init__( self._sess = sess self._mode = mode self._dictionary = dictionary - self._ngram = ngram self._alphas = alphas self._input_mask = input_mask self._segment_ids = segment_ids @@ -408,6 +404,9 @@ def __init__( self._maxlen = maxlen self._label = label + def get_dictionary(self): + return self._dictionary + def predict(self, string, get_proba = False): """ classify a string. @@ -421,20 +420,16 @@ def predict(self, string, get_proba = False): dictionary: results """ assert isinstance(string, str), 'input must be a string' - string = _classification_textcleaning_stemmer_attention(string) + string = _classification_textcleaning_stemmer(string, attention = True) splitted = string[1].split() - if self._mode == 'fast-text': - batch_x = fasttext_str_idx([string[0]], self._dictionary) - batch_x = add_ngram(batch_x, self._ngram) + if self._mode in ['entity-network', 'bert']: + batch_x = str_idx( + [string[0]], self._dictionary, self._maxlen, UNK = 3 + ) else: - if self._mode in ['entity-network', 'bert']: - batch_x = str_idx( - [string[0]], self._dictionary, self._maxlen, UNK = 3 - ) - else: - batch_x = str_idx( - [string[0]], self._dictionary, len(splitted), UNK = 3 - ) + batch_x = str_idx( + [string[0]], self._dictionary, len(splitted), UNK = 3 + ) if self._mode in ['luong', 'bahdanau', 'hierarchical']: probs, alphas = self._sess.run( [tf.nn.softmax(self._logits), self._alphas], @@ -497,24 +492,13 @@ def predict_batch(self, strings, get_proba = False): assert isinstance(strings, list) and isinstance( strings[0], str ), 'input must be list of strings' - strings = [ - _classification_textcleaning_stemmer_attention(i)[0] - for i in strings - ] + strings = [_classification_textcleaning_stemmer(i) for i in strings] maxlen = max([len(i.split()) for i in strings]) - if self._mode == 'fast-text': - batch_x = fasttext_str_idx(strings, self._dictionary) - batch_x = add_ngram(batch_x, self._ngram) - batch_x = tf.keras.preprocessing.sequence.pad_sequences( - batch_x, maxlen - ) + if self._mode in ['entity-network', 'bert']: + batch_x = str_idx(strings, self._dictionary, self._maxlen, UNK = 3) else: - if self._mode in ['entity-network', 'bert']: - batch_x = str_idx( - strings, self._dictionary, self._maxlen, UNK = 3 - ) - else: - batch_x = str_idx(strings, self._dictionary, maxlen, UNK = 3) + batch_x = str_idx(strings, self._dictionary, maxlen, UNK = 3) + if self._mode not in ['bert', 'entity-network']: probs = self._sess.run( tf.nn.softmax(self._logits), feed_dict = {self._X: batch_x} @@ -564,7 +548,6 @@ def __init__( sess, mode, dictionary, - ngram = None, alphas = None, input_mask = None, segment_ids = None, @@ -578,7 +561,6 @@ def __init__( self._sess = sess self._mode = mode self._dictionary = dictionary - self._ngram = ngram self._alphas = alphas self._input_mask = input_mask self._segment_ids = segment_ids @@ -595,6 +577,9 @@ def __init__( 'identity_hate', ] + def get_dictionary(self): + return self._dictionary + def predict(self, string, get_proba = False): """ classify a string. @@ -608,20 +593,16 @@ def predict(self, string, get_proba = False): dictionary: results """ assert isinstance(string, str), 'input must be a string' - string = _classification_textcleaning_stemmer_attention(string) + string = _classification_textcleaning_stemmer(string, attention = True) splitted = string[1].split() - if self._mode == 'fast-text': - batch_x = fasttext_str_idx([string[0]], self._dictionary) - batch_x = add_ngram(batch_x, self._ngram) + if self._mode in ['entity-network', 'bert']: + batch_x = str_idx( + [string[0]], self._dictionary, self._maxlen, UNK = 3 + ) else: - if self._mode in ['entity-network', 'bert']: - batch_x = str_idx( - [string[0]], self._dictionary, self._maxlen, UNK = 3 - ) - else: - batch_x = str_idx( - [string[0]], self._dictionary, len(splitted), UNK = 3 - ) + batch_x = str_idx( + [string[0]], self._dictionary, len(splitted), UNK = 3 + ) if self._mode in ['luong', 'bahdanau', 'hierarchical']: probs, alphas = self._sess.run( [tf.nn.sigmoid(self._logits), self._alphas], @@ -677,23 +658,14 @@ def predict_batch(self, strings, get_proba = False): strings[0], str ), 'input must be list of strings' strings = [ - _classification_textcleaning_stemmer_attention(i)[0] + _classification_textcleaning_stemmer(i, attention = True)[0] for i in strings ] maxlen = max([len(i.split()) for i in strings]) - if self._mode == 'fast-text': - batch_x = fasttext_str_idx(strings, self._dictionary) - batch_x = add_ngram(batch_x, self._ngram) - batch_x = tf.keras.preprocessing.sequence.pad_sequences( - batch_x, maxlen - ) + if self._mode in ['entity-network']: + batch_x = str_idx(strings, self._dictionary, self._maxlen, UNK = 3) else: - if self._mode in ['entity-network']: - batch_x = str_idx( - strings, self._dictionary, self._maxlen, UNK = 3 - ) - else: - batch_x = str_idx(strings, self._dictionary, maxlen, UNK = 3) + batch_x = str_idx(strings, self._dictionary, maxlen, UNK = 3) if self._mode not in ['entity-network']: probs = self._sess.run( tf.nn.sigmoid(self._logits), feed_dict = {self._X: batch_x} @@ -828,9 +800,13 @@ def predict(self, string, get_proba = False): dictionary: results """ assert isinstance(string, str), 'input must be a string' - string = _classification_textcleaning_stemmer_attention(string)[0] + string = _classification_textcleaning_stemmer(string, attention = True)[ + 0 + ] transformed = self._vectorizer.transform([string]) - batch_x = _convert_sparse_matrix_to_sparse_tensor(transformed) + batch_x = _convert_sparse_matrix_to_sparse_tensor( + transformed, got_limit = False + ) probs = self._sess.run( tf.nn.softmax(self._model.logits), feed_dict = {self._model.X: batch_x[0], self._model.W: batch_x[1]}, @@ -856,11 +832,13 @@ def predict_batch(self, strings, get_proba = False): strings[0], str ), 'input must be list of strings' strings = [ - _classification_textcleaning_stemmer_attention(i)[0] + _classification_textcleaning_stemmer(i, attention = True)[0] for i in strings ] transformed = self._vectorizer.transform(strings) - batch_x = _convert_sparse_matrix_to_sparse_tensor(transformed) + batch_x = _convert_sparse_matrix_to_sparse_tensor( + transformed, got_limit = False + ) probs = self._sess.run( tf.nn.softmax(self._model.logits), feed_dict = {self._model.X: batch_x[0], self._model.W: batch_x[1]}, diff --git a/malaya/_utils/_paths.py b/malaya/_utils/_paths.py index 37aaa4e1..ceb765a0 100644 --- a/malaya/_utils/_paths.py +++ b/malaya/_utils/_paths.py @@ -88,8 +88,7 @@ 'fast-text': { 'model': home + '/toxic/fast-text/fasttext-toxic.pb', 'setting': home + '/toxic/fast-text/fasttext-toxic.json', - 'pickle': home + '/toxic/fast-text/fasttext-toxic.pkl', - 'version': 'v8', + 'version': 'v17', }, 'entity-network': { 'model': home + '/toxic/entity-network/entity-toxic.pb', @@ -120,9 +119,8 @@ 'setting': 'v8/toxic/hierarchical-toxic.json', }, 'fast-text': { - 'model': 'v8/toxic/fasttext-toxic.pb', - 'setting': 'v8/toxic/fasttext-toxic.json', - 'pickle': 'v8/toxic/fasttext-toxic.pkl', + 'model': 'v17/toxic/fasttext-toxic.pb', + 'setting': 'v17/toxic/fasttext-toxic.json', }, 'entity-network': { 'model': 'v8/toxic/entity-toxic.pb', @@ -307,50 +305,49 @@ 'bert': { 'model': home + '/sentiment/bert/bert-sentiment.pb', 'setting': home + '/sentiment/bert/bert-sentiment.json', - 'version': 'v8', + 'version': 'v17', }, 'entity-network': { 'model': home + '/sentiment/entity-network/entity-sentiment.pb', 'setting': home + '/sentiment/entity-network/entity-sentiment.json', - 'version': 'v8', + 'version': 'v17', }, 'hierarchical': { 'model': home + '/sentiment/hierarchical/hierarchical-sentiment.pb', 'setting': home + '/sentiment/hierarchical/hierarchical-sentiment.json', - 'version': 'v8', + 'version': 'v17', }, 'bahdanau': { 'model': home + '/sentiment/bahdanau/bahdanau-sentiment.pb', 'setting': home + '/sentiment/bahdanau/bahdanau-sentiment.json', - 'version': 'v8', + 'version': 'v17', }, 'luong': { 'model': home + '/sentiment/luong/luong-sentiment.pb', 'setting': home + '/sentiment/luong/luong-sentiment.json', - 'version': 'v8', + 'version': 'v17', }, 'bidirectional': { 'model': home + '/sentiment/bidirectional/bidirectional-sentiment.pb', 'setting': home + '/sentiment/bidirectional/bidirectional-sentiment.json', - 'version': 'v8', + 'version': 'v17', }, 'fast-text': { 'model': home + '/sentiment/fast-text/fasttext-sentiment.pb', 'setting': home + '/sentiment/fast-text/fasttext-sentiment.json', - 'pickle': home + '/sentiment/fast-text/fasttext-sentiment.pkl', - 'version': 'v8', + 'version': 'v17', }, 'multinomial': { 'model': home + '/sentiment/multinomial/multinomial-sentiment.pkl', 'vector': home + '/sentiment/multinomial/multinomial-sentiment-tfidf.pkl', - 'version': 'v8', + 'version': 'v17', }, 'xgb': { 'model': home + '/sentiment/xgb/xgboost-sentiment.pkl', 'vector': home + '/sentiment/xgb/xgboost-sentiment-tfidf.pkl', - 'version': 'v8', + 'version': 'v17', }, 'fast-text-char': { 'model': home @@ -359,53 +356,52 @@ 'meta': home + '/sentiment/fast-text-char/model.ckpt.meta', 'vector': home + '/sentiment/fast-text-char/vectorizer-sparse-sentiment.pkl', - 'version': 'v12', + 'version': 'v17', }, } S3_PATH_SENTIMENTS = { 'bert': { - 'model': 'v8/sentiment/bert-sentiment.pb', - 'setting': 'v8/sentiment/bert-sentiment.json', + 'model': 'v17/sentiment/bert-sentiment.pb', + 'setting': 'v17/sentiment/bert-sentiment.json', }, 'entity-network': { - 'model': 'v8/sentiment/entity-sentiment.pb', - 'setting': 'v8/sentiment/entity-sentiment.json', + 'model': 'v17/sentiment/entity-sentiment.pb', + 'setting': 'v17/sentiment/entity-sentiment.json', }, 'hierarchical': { - 'model': 'v8/sentiment/hierarchical-sentiment.pb', - 'setting': 'v8/sentiment/hierarchical-sentiment.json', + 'model': 'v17/sentiment/hierarchical-sentiment.pb', + 'setting': 'v17/sentiment/hierarchical-sentiment.json', }, 'bahdanau': { - 'model': 'v8/sentiment/bahdanau-sentiment.pb', - 'setting': 'v8/sentiment/bahdanau-sentiment.json', + 'model': 'v17/sentiment/bahdanau-sentiment.pb', + 'setting': 'v17/sentiment/bahdanau-sentiment.json', }, 'luong': { - 'model': 'v8/sentiment/luong-sentiment.pb', - 'setting': 'v8/sentiment/luong-sentiment.json', + 'model': 'v17/sentiment/luong-sentiment.pb', + 'setting': 'v17/sentiment/luong-sentiment.json', }, 'bidirectional': { - 'model': 'v8/sentiment/bidirectional-sentiment.pb', - 'setting': 'v8/sentiment/bidirectional-sentiment.json', + 'model': 'v17/sentiment/bidirectional-sentiment.pb', + 'setting': 'v17/sentiment/bidirectional-sentiment.json', }, 'fast-text': { - 'model': 'v8/sentiment/fasttext-sentiment.pb', - 'setting': 'v8/sentiment/fasttext-sentiment.json', - 'pickle': 'v8/sentiment/fasttext-sentiment.pkl', + 'model': 'v17/sentiment/fasttext-sentiment.pb', + 'setting': 'v17/sentiment/fasttext-sentiment.json', }, 'multinomial': { - 'model': 'v8/sentiment/multinomial-sentiment.pkl', - 'vector': 'v8/sentiment/multinomial-sentiment-tfidf.pkl', + 'model': 'v17/sentiment/multinomial-sentiment.pkl', + 'vector': 'v17/sentiment/multinomial-sentiment-tfidf.pkl', }, 'xgb': { - 'model': 'v8/sentiment/xgboost-sentiment.pkl', - 'vector': 'v8/sentiment/xgboost-sentiment-tfidf.pkl', + 'model': 'v17/sentiment/xgboost-sentiment.pkl', + 'vector': 'v17/sentiment/xgboost-sentiment-tfidf.pkl', }, 'fast-text-char': { - 'model': 'v12/sentiment/model.ckpt.data-00000-of-00001', - 'index': 'v12/sentiment/model.ckpt.index', - 'meta': 'v12/sentiment/model.ckpt.meta', - 'vector': 'v12/sentiment/vectorizer-sparse-sentiment.pkl', + 'model': 'v17/sentiment/model.ckpt.data-00000-of-00001', + 'index': 'v17/sentiment/model.ckpt.index', + 'meta': 'v17/sentiment/model.ckpt.meta', + 'vector': 'v17/sentiment/vectorizer-sparse-sentiment.pkl', }, } @@ -445,8 +441,7 @@ 'fast-text': { 'model': home + '/subjective/fast-text/fasttext-subjective.pb', 'setting': home + '/subjective/fast-text/fasttext-subjective.json', - 'pickle': home + '/subjective/fast-text/fasttext-subjective.pkl', - 'version': 'v10', + 'version': 'v17', }, 'multinomial': { 'model': home + '/subjective/multinomial/multinomial-subjective.pkl', @@ -466,7 +461,7 @@ 'meta': home + '/subjective/fast-text-char/model.ckpt.meta', 'vector': home + '/subjective/fast-text-char/vectorizer-sparse-subjective.pkl', - 'version': 'v12', + 'version': 'v17', }, } @@ -496,9 +491,8 @@ 'setting': 'v10/subjective/bidirectional-subjective.json', }, 'fast-text': { - 'model': 'v10/subjective/fasttext-subjective.pb', - 'setting': 'v10/subjective/fasttext-subjective.json', - 'pickle': 'v10/subjective/fasttext-subjective.pkl', + 'model': 'v17/subjective/fasttext-subjective.pb', + 'setting': 'v17/subjective/fasttext-subjective.json', }, 'multinomial': { 'model': 'v10/subjective/multinomial-subjective.pkl', @@ -509,10 +503,10 @@ 'vector': 'v10/subjective/xgboost-subjective-tfidf.pkl', }, 'fast-text-char': { - 'model': 'v12/subjective/model.ckpt.data-00000-of-00001', - 'index': 'v12/subjective/model.ckpt.index', - 'meta': 'v12/subjective/model.ckpt.meta', - 'vector': 'v12/subjective/vectorizer-sparse-subjective.pkl', + 'model': 'v17/subjective/model.ckpt.data-00000-of-00001', + 'index': 'v17/subjective/model.ckpt.index', + 'meta': 'v17/subjective/model.ckpt.meta', + 'vector': 'v17/subjective/vectorizer-sparse-subjective.pkl', }, } @@ -550,8 +544,7 @@ 'fast-text': { 'model': home + '/emotion/fast-text/fasttext-emotion.pb', 'setting': home + '/emotion/fast-text/fasttext-emotion.json', - 'pickle': home + '/emotion/fast-text/fasttext-emotion.pkl', - 'version': 'v12', + 'version': 'v17', }, 'multinomial': { 'model': home + '/emotion/multinomial/multinomial-emotion.pkl', @@ -570,7 +563,7 @@ 'meta': home + '/emotion/fast-text-char/model.ckpt.meta', 'vector': home + '/emotion/fast-text-char/vectorizer-sparse-emotion.pkl', - 'version': 'v12', + 'version': 'v17', }, } @@ -600,9 +593,8 @@ 'setting': 'v12/emotion/bidirectional-emotion.json', }, 'fast-text': { - 'model': 'v12/emotion/fasttext-emotion.pb', - 'setting': 'v12/emotion/fasttext-emotion.json', - 'pickle': 'v12/emotion/fasttext-emotion.pkl', + 'model': 'v17/emotion/fasttext-emotion.pb', + 'setting': 'v17/emotion/fasttext-emotion.json', }, 'multinomial': { 'model': 'v12/emotion/multinomial-emotion.pkl', @@ -613,10 +605,10 @@ 'vector': 'v12/emotion/xgboost-emotion-tfidf.pkl', }, 'fast-text-char': { - 'model': 'v12/emotion/model.ckpt.data-00000-of-00001', - 'index': 'v12/emotion/model.ckpt.index', - 'meta': 'v12/emotion/model.ckpt.meta', - 'vector': 'v12/emotion/vectorizer-sparse-emotion.pkl', + 'model': 'v17/emotion/model.ckpt.data-00000-of-00001', + 'index': 'v17/emotion/model.ckpt.index', + 'meta': 'v17/emotion/model.ckpt.meta', + 'vector': 'v17/emotion/vectorizer-sparse-emotion.pkl', }, } diff --git a/malaya/_utils/_softmax_class.py b/malaya/_utils/_softmax_class.py index 9a2295ad..0a730d79 100644 --- a/malaya/_utils/_softmax_class.py +++ b/malaya/_utils/_softmax_class.py @@ -19,7 +19,7 @@ def sparse_deep_model( class_name, label, output_size, - embedded_size = 64, + embedded_size = 128, model = 'fast-text-char', validate = True, ): @@ -65,48 +65,19 @@ def deep_model( ): assert isinstance(model, str), 'model must be a string' model = model.lower() - if model == 'fast-text': + if model in ['bahdanau', 'luong', 'hierarchical']: if validate: - check_file(path['fast-text'], s3_path['fast-text']) - else: - if not check_available(path['fast-text']): - raise Exception( - '%s/%s is not available, please `validate = True`' - % (class_name, model) - ) - try: - with open(path['fast-text']['setting'], 'r') as fopen: - dictionary = json.load(fopen)['dictionary'] - with open(path['fast-text']['pickle'], 'rb') as fopen: - ngram = pickle.load(fopen) - g = load_graph(path['fast-text']['model']) - except: - raise Exception( - "model corrupted due to some reasons, please run malaya.clear_cache('%s/%s') and try again" - % (class_name, model) - ) - return SOFTMAX( - g.get_tensor_by_name('import/Placeholder:0'), - g.get_tensor_by_name('import/logits:0'), - tf.InteractiveSession(graph = g), - model, - dictionary, - ngram = ngram, - label = label, - ) - elif model == 'hierarchical': - if validate: - check_file(path['hierarchical'], s3_path['hierarchical']) + check_file(path[model], s3_path[model]) else: - if not check_available(path['hierarchical']): + if not check_available(path[model]): raise Exception( '%s/%s is not available, please `validate = True`' % (class_name, model) ) try: - with open(path['hierarchical']['setting'], 'r') as fopen: + with open(path[model]['setting'], 'r') as fopen: dictionary = json.load(fopen)['dictionary'] - g = load_graph(path['hierarchical']['model']) + g = load_graph(path[model]['model']) except: raise Exception( "model corrupted due to some reasons, please run malaya.clear_cache('%s/%s') and try again" @@ -121,7 +92,7 @@ def deep_model( alphas = g.get_tensor_by_name('import/alphas:0'), label = label, ) - elif model in ['bahdanau', 'luong']: + elif model in ['bidirectional', 'fast-text']: if validate: check_file(path[model], s3_path[model]) else: @@ -139,33 +110,6 @@ def deep_model( "model corrupted due to some reasons, please run malaya.clear_cache('%s/%s') and try again" % (class_name, model) ) - return SOFTMAX( - g.get_tensor_by_name('import/Placeholder:0'), - g.get_tensor_by_name('import/logits:0'), - tf.InteractiveSession(graph = g), - model, - dictionary, - alphas = g.get_tensor_by_name('import/alphas:0'), - label = label, - ) - elif model == 'bidirectional': - if validate: - check_file(path['bidirectional'], s3_path['bidirectional']) - else: - if not check_available(path['bidirectional']): - raise Exception( - '%s/%s is not available, please `validate = True`' - % (class_name, model) - ) - try: - with open(path['bidirectional']['setting'], 'r') as fopen: - dictionary = json.load(fopen) - g = load_graph(path['bidirectional']['model']) - except: - raise Exception( - "model corrupted due to some reasons, please run malaya.clear_cache('%s/%s') and try again" - % (class_name, model) - ) return SOFTMAX( g.get_tensor_by_name('import/Placeholder:0'), g.get_tensor_by_name('import/logits:0'), @@ -227,6 +171,7 @@ def deep_model( "model corrupted due to some reasons, please run malaya.clear_cache('%s/%s') and try again" % (class_name, model) ) + maxlen = 100 if 'sentiment' in class_name else 80 return SOFTMAX( g.get_tensor_by_name('import/Placeholder_question:0'), g.get_tensor_by_name('import/logits:0'), @@ -238,6 +183,7 @@ def deep_model( ), story = g.get_tensor_by_name('import/Placeholder_story:0'), label = label, + maxlen = maxlen, ) else: raise Exception( diff --git a/malaya/normalize.py b/malaya/normalize.py index 0ad8c9b3..8293ae9b 100644 --- a/malaya/normalize.py +++ b/malaya/normalize.py @@ -6,12 +6,11 @@ import numpy as np from fuzzywuzzy import fuzz +from unidecode import unidecode import json import tensorflow as tf from collections import Counter from ._utils._utils import load_graph, check_file, check_available -from .num2word import to_cardinal -from .word_mover import distance as word_mover_distance from .texts._text_functions import ( normalizer_textcleaning, stemmer_str_idx, @@ -28,7 +27,7 @@ UNK, ) from .spell import _return_possible, _edit_normalizer, _return_known -from .topic_influencer import is_location +from .similarity import is_location from ._utils._paths import MALAY_TEXT, PATH_NORMALIZER, S3_PATH_NORMALIZER @@ -99,6 +98,9 @@ def normalize(self, string, debug = True): if word.istitle(): result.append(word) continue + if len(word) > 2: + if word[-2] in consonants and word[-1] == 'e': + word = word[:-1] + 'a' if word[0] == 'x' and len(word) > 1: result_string = 'tak ' word = word[1:] @@ -135,8 +137,8 @@ def normalize(self, string, debug = True): for candidate in list(candidates) ] if debug: - print([(k, fuzz.ratio(string, k[0])) for k in candidates], '\n') - strings = [fuzz.ratio(string, k[0]) for k in candidates] + print([(k, fuzz.ratio(word, k[0])) for k in candidates], '\n') + strings = [fuzz.ratio(word, k[0]) for k in candidates] descending_sort = np.argsort(strings)[::-1] selected = None for index in descending_sort: @@ -150,114 +152,20 @@ def normalize(self, string, debug = True): return ' '.join(result) -class _DEEP_CONTRACTION: - def __init__(self, corpus, vectorizer): - self.corpus = Counter(corpus) - self.vectorizer = vectorizer - - def _suggest(self, string): - """ - Normalize a string - - Parameters - ---------- - string : str - - debug : bool, optional (default=True) - If true, it will print character similarity distances. - - Returns - ------- - string: normalized string - """ - assert isinstance(string, str), 'input must be a string' - result, outer_candidates = [], [] - for word in normalizer_textcleaning(string).split(): - if word.istitle(): - result.append(word) - continue - if word[0] == 'x' and len(word) > 1: - result_string = 'tak ' - word = word[1:] - else: - result_string = '' - if word[-2:] == 'la': - end_result_string = ' lah' - word = word[:-2] - elif word[-3:] == 'lah': - end_result_string = ' lah' - word = word[:-3] - else: - end_result_string = '' - if word in sounds: - result.append(result_string + sounds[word] + end_result_string) - continue - if word in rules_normalizer: - result.append( - result_string + rules_normalizer[word] + end_result_string - ) - continue - if word in self.corpus: - result.append(result_string + word + end_result_string) - continue - candidates = ( - _return_known([word], self.corpus) - or _return_known(_edit_normalizer(word), self.corpus) - or _return_possible(word, self.corpus, _edit_normalizer) - or [word] - ) - candidates = list(candidates) - candidates = [ - (candidate, is_location(candidate)) - for candidate in list(candidates) - ] - strings = [fuzz.ratio(string, k[0]) for k in candidates] - descending_sort = np.argsort(strings)[::-1] - selected = None - for index in descending_sort: - if not candidates[index][1]: - selected = candidates[index][0] - break - selected = ( - candidates[descending_sort[0]][0] if not selected else selected - ) - result.append(result_string + word + end_result_string) - outer_candidates.append([(word, k[0]) for k in candidates]) - return ' '.join(result), outer_candidates - - def normalize(self, string): - result, candidates = self._suggest(string) - intermediates = [] - for candidate in candidates: - inner = [] - for c in candidate: - text = [c[1] if w in c[0] else w for w in result.split()] - inner.append( - ( - c[0], - ' '.join(text), - word_mover_distance( - text, result.split(), self.vectorizer - ), - ) - ) - inner.sort(key = lambda x: x[2]) - intermediates.append(inner) - return intermediates - - class _FUZZY_NORMALIZE: def __init__(self, normalized, corpus): self.normalized = normalized self.corpus = corpus - def normalize(self, string): + def normalize(self, string, fuzzy_ratio = 70): """ Normalize a string. Parameters ---------- string : str + fuzzy_ratio: int, (default=70) + ratio of similar characters by positions, if 90, means 90% Returns ------- @@ -269,6 +177,9 @@ def normalize(self, string): if word.istitle(): result.append(word) continue + if len(word) > 2: + if word[-2] in consonants and word[-1] == 'e': + word = word[:-1] + 'a' if word[0] == 'x' and len(word) > 1: result_string = 'tak ' word = word[1:] @@ -298,7 +209,7 @@ def normalize(self, string): results.append( np.mean([fuzz.ratio(word, k) for k in self.normalized[i]]) ) - if len(np.where(np.array(results) > 70)[0]) < 1: + if len(np.where(np.array(results) > fuzzy_ratio)[0]) < 1: result.append(result_string + word + end_result_string) continue result.append( @@ -324,6 +235,7 @@ def fuzzy(corpus): assert isinstance(corpus, list) and isinstance( corpus[0], str ), 'input must be list of strings' + corpus = [unidecode(w) for w in corpus] transform = [] for i in corpus: i = i.lower() @@ -331,19 +243,25 @@ def fuzzy(corpus): result.append(i) result.append(''.join(char for char in i if char not in vowels)) if i[0] in consonants and i[-1] in consonants: - result.append(i[0] + i[-1]) + inner = i[0] + i[-1] + result.append(inner) if i[-1] == 'a': + inner = i[:-1] result.append(i[:-1] + 'e') - result.append(i + 'k') + inner = i + 'k' + result.append(inner) if i[1] in vowels and i[0] in consonants: - result.append(i[0] + i[2:]) + inner = i[0] + i[2:] + result.append(inner) if i[-2] in vowels and i[-1] in consonants: - result.append(i[:-2] + i[-1]) + inner = i[:-2] + i[-1] + result.append(inner) result.append(i[0] + i[-1]) if i[-2:] == 'ar': result.append(i[:-2] + 'o') if i[:2] == 'ha': result.append(i[1:]) + result = filter(None, result) transform.append(list(set(result))) return _FUZZY_NORMALIZE(transform, corpus) @@ -363,17 +281,7 @@ def spell(corpus): assert isinstance(corpus, list) and isinstance( corpus[0], str ), 'input must be list of strings' - return _SPELL_NORMALIZE(corpus) - - -def deep_expander(corpus, vectorizer): - assert isinstance(corpus, list) and isinstance( - corpus[0], str - ), 'input must be list of strings' - assert hasattr( - vectorizer, 'get_vector_by_name' - ), 'vectorizer must has `get_vector_by_name` method' - return _DEEP_CONTRACTION(corpus, vectorizer) + return _SPELL_NORMALIZE([unidecode(w) for w in corpus]) def basic(string): diff --git a/malaya/similarity.py b/malaya/similarity.py new file mode 100644 index 00000000..a6efbd58 --- /dev/null +++ b/malaya/similarity.py @@ -0,0 +1,659 @@ +import sys +import warnings + +if not sys.warnoptions: + warnings.simplefilter('ignore') + +import re +import os +import random +import numpy as np +from fuzzywuzzy import fuzz +import json +from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer +from .texts.vectorizer import SkipGramVectorizer +from sklearn.metrics.pairwise import cosine_similarity +from sklearn.utils import shuffle +from .texts._text_functions import ( + STOPWORDS, + STOPWORD_CALON, + simple_textcleaning, + str_idx, +) +from .cluster import sentence_ngram +from . import home, _delete_macos +from ._utils._utils import download_file +from ._models._skip_thought import ( + train_model as skip_train, + batch_sequence, + load_skipthought as load_deep_skipthought, +) +from ._models._siamese_lstm import ( + train_model as siamese_train, + load_siamese as load_deep_siamese, +) + +from .topic import calon +from .topic import location + + +def _apply_stopwords_calon(string): + string = re.sub('[^A-Za-z ]+', ' ', string) + string = re.sub(r'[ ]+', ' ', string.lower()).strip() + return ' '.join( + [i for i in string.split() if i not in STOPWORD_CALON and len(i) > 1] + ) + + +_namacalon = [ + _apply_stopwords_calon(val['NamaCalon'].lower()) for _, val in calon.items() +] +_namacalon = list(set(_namacalon)) +_negeri = [val['negeri'].lower() for _, val in location.items()] +_parlimen = [val['parlimen'].lower() for _, val in location.items()] +_dun = [val['dun'].lower() for _, val in location.items()] +_location = _negeri + _parlimen + _dun + + +class _DEEP_SIAMESE_SIMILARITY: + def __init__( + self, + sess, + model, + keys, + dictionary, + maxlen, + saver, + embedding_size, + num_layers, + output_size, + dropout, + is_influencers = False, + ): + self._sess = sess + self._model = model + self.keys = keys + self.dictionary = dictionary + self.maxlen = maxlen + self._saver = saver + self._embedding_size = embedding_size + self._num_layers = num_layers + self._output_size = output_size + self._dropout = dropout + + def save_model(self, location): + """ + save model to tensorflow checkpoint file. + + Parameters + ---------- + string: str + + """ + assert isinstance(location, str), 'location must be a string' + self._saver.save(self._sess, '%s/model.ckpt' % (location)) + with open('%s/model.json' % (location), 'w') as fopen: + json.dump( + { + 'dictionary': self.dictionary, + 'maxlen': self.maxlen, + 'keys': self.keys, + 'embedding_size': self._embedding_size, + 'num_layers': self._num_layers, + 'output_size': self._output_size, + 'dropout': self._dropout, + }, + fopen, + ) + + def get_similarity(self, string, anchor = 0.5): + """ + Return similar topics / influencers. + + Parameters + ---------- + string: str + anchor: float, (default=0.5) + baseline similarity. + + Returns + ------- + results: list of strings + """ + assert isinstance(string, str), 'input must be a string' + assert isinstance(anchor, float), 'anchor must be a float' + assert ( + anchor > 0 and anchor < 1 + ), 'anchor must be bigger than 0, less than 1' + original_string = simple_textcleaning(string) + strings = [original_string] * len(self.keys) + left = str_idx(strings, self.dictionary, self.maxlen, UNK = 3) + right = str_idx(self.keys, self.dictionary, self.maxlen, UNK = 3) + distances = self._sess.run( + 1 - self._model.distance, + feed_dict = {self._model.X_left: left, self._model.X_right: right}, + ) + where = np.where(distances > anchor)[0] + results = [self.keys[i].lower() for i in where] + return list(set(results)) + + +class _DEEP_SIMILARITY: + def __init__( + self, + sess, + model, + vectorized, + keys, + dictionary, + maxlen, + saver, + embedding_size, + is_influencers = False, + ): + self._sess = sess + self._model = model + self.vectorized = vectorized + self.keys = keys + self.dictionary = dictionary + self.maxlen = maxlen + self._saver = saver + self._embedding_size = embedding_size + + def save_model(self, location): + """ + save model to tensorflow checkpoint file. + + Parameters + ---------- + string: str + + """ + assert isinstance(location, str), 'location must be a string' + self._saver.save(self._sess, '%s/model.ckpt' % (location)) + with open('%s/model.json' % (location), 'w') as fopen: + json.dump( + { + 'dictionary': self.dictionary, + 'maxlen': self.maxlen, + 'keys': self.keys, + 'vectorized': self.vectorized.tolist(), + 'embedding_size': self._embedding_size, + }, + fopen, + ) + + def get_similarity(self, string, anchor = 0.5): + """ + Return similar topics / influencers. + + Parameters + ---------- + string: str + anchor: float, (default=0.5) + baseline similarity. + + Returns + ------- + results: list of strings + """ + assert isinstance(string, str), 'input must be a string' + assert isinstance(anchor, float), 'anchor must be a float' + assert ( + anchor > 0 and anchor < 1 + ), 'anchor must be bigger than 0, less than 1' + original_string = simple_textcleaning(string) + string = ' '.join(set(original_string.split())) + encoded = self._sess.run( + self._model.get_thought, + feed_dict = { + self._model.INPUT: batch_sequence( + [string], self.dictionary, maxlen = self.maxlen + ) + }, + ) + where = np.where( + cosine_similarity(self.vectorized, encoded)[:, 0] > anchor + )[0] + results = [self.keys[i].lower() for i in where] + return list(set(results)) + + +class _FAST_SIMILARITY: + def __init__(self, vectorizer, vectorized, keys): + self.vectorizer = vectorizer + self.vectorized = vectorized + self.keys = keys + + def get_similarity(self, string, anchor = 0.1): + """ + Return similar topics / influencers. + + Parameters + ---------- + string: str + anchor: float, (default=0.5) + baseline similarity. + + Returns + ------- + results: list of strings + """ + assert isinstance(string, str), 'input must be a string' + assert isinstance(anchor, float), 'anchor must be a float' + assert ( + anchor > 0 and anchor < 1 + ), 'anchor must be bigger than 0, less than 1' + original_string = simple_textcleaning(string) + string = ' '.join(set(original_string.split())) + where = np.where( + cosine_similarity( + self.vectorized, self.vectorizer.transform([string]) + )[:, 0] + > anchor + )[0] + results = [self.keys[i].lower() for i in where] + return list(set(results)) + + +class _FUZZY: + def __init__(self, dictionary): + self._dictionary = dictionary + + def get_similarity(self, string, fuzzy_ratio = 90): + + assert isinstance(string, str), 'input must be a string' + assert isinstance(fuzzy_ratio, int), 'fuzzy_ratio must be an integer' + assert ( + fuzzy_ratio > 0 and fuzzy_ratio < 100 + ), 'fuzzy_ratio must be bigger than 0 and less than 100' + string = string.lower() + topics = [] + for key, vals in self._dictionary.items(): + for v in vals: + if fuzz.token_set_ratio(v, string) >= fuzzy_ratio: + topics.append(key.lower()) + break + return list(set(topics)) + + +def fuzzy(dictionary): + """ + Return similar topics. + + Parameters + ---------- + dictionary: dict + format {'left':['right']} + + Returns + ------- + results: _FUZZY object + """ + assert isinstance(dictionary, dict), 'dictionary must be a dictionary' + assert isinstance( + list(dictionary.keys())[0], str + ), 'keys dictionary must be a string' + assert isinstance( + list(dictionary.values())[0], list + ), 'values dictionary must be a list' + assert isinstance( + list(dictionary.values())[0][0], str + ), 'elements of values dictionary must be a string' + return _FUZZY(dictionary) + + +def is_location(string, fuzzy_ratio = 90, location = _location): + """ + check whether a string is a location, default is malaysia location. + + Parameters + ---------- + string: str + fuzzy_ratio: int, (default=90) + ratio of similar characters by positions, if 90, means 90% + location: list, (default=_location) + list of locations + + Returns + ------- + boolean: bool + """ + assert isinstance(string, str), 'input must be a string' + assert isinstance(fuzzy_ratio, int), 'fuzzy_ratio must be an integer' + assert ( + fuzzy_ratio > 0 and fuzzy_ratio < 100 + ), 'fuzzy_ratio must be bigger than 0 and less than 100' + for loc in location: + if fuzz.token_set_ratio(loc.lower(), string) >= fuzzy_ratio: + return True + return False + + +def fuzzy_location(string, fuzzy_ratio = 90): + """ + Return malaysia locations splitted by dun, parlimen and state from a string. + + Parameters + ---------- + string: str + fuzzy_ratio: int, (default=90) + ratio of similar characters by positions, if 90, means 90% + + Returns + ------- + results: list of strings + """ + assert isinstance(string, str), 'input must be a string' + assert isinstance(fuzzy_ratio, int), 'fuzzy_ratio must be an integer' + assert ( + fuzzy_ratio > 0 and fuzzy_ratio < 100 + ), 'fuzzy_ratio must be bigger than 0 and less than 100' + negeri_list = list( + set( + [ + i + for i in _negeri + if fuzz.token_set_ratio(i, string) >= fuzzy_ratio + ] + ) + ) + parlimen_list = list( + set( + [ + i + for i in _parlimen + if fuzz.token_set_ratio(i, string) >= fuzzy_ratio + ] + ) + ) + dun_list = list( + set([i for i in _dun if fuzz.token_set_ratio(i, string) >= fuzzy_ratio]) + ) + return {'negeri': negeri_list, 'parlimen': parlimen_list, 'dun': dun_list} + + +def _generate_topics(dictionary): + texts = [' '.join(words) for _, words in dictionary.items()] + keys = [key for key, _ in dictionary.items()] + texts = [' '.join(list(set(text.split()))) for text in texts] + output = [] + for text in texts: + output.append( + ' '.join([word for word in text.split() if word not in STOPWORDS]) + ) + return output, keys + + +def deep_siamese( + dictionary, + epoch = 5, + batch_size = 32, + embedding_size = 256, + output_size = 100, + maxlen = 100, + ngram = (1, 4), + num_layers = 1, + **kwargs +): + """ + Train a deep siamese network for text similarity + + Parameters + ---------- + dictionary: dict + format {'left':['right']} + epoch: int, (default=5) + iteration numbers + batch_size: int, (default=32) + batch size for every feed, batch size must <= size of corpus + embedding_size: int, (default=256) + vector size representation for a word + output_size: int, (default=100) + encoder output size, bigger means more vector definition + maxlen: int, (default=100) + max length of a string to be train + ngram: tuple, (default=(1,4)) + n-grams size to train a corpus + num_layers: int, (default=100) + number of bidirectional rnn layers + + Returns + ------- + _DEEP_SIAMESE_SIMILARITY: malaya.similarity._DEEP_SIAMESE_SIMILARITY class + """ + assert isinstance(dictionary, dict), 'dictionary must be a dictionary' + assert isinstance( + list(dictionary.keys())[0], str + ), 'keys dictionary must be a string' + assert isinstance( + list(dictionary.values())[0], list + ), 'values dictionary must be a list' + assert isinstance( + list(dictionary.values())[0][0], str + ), 'elements of values dictionary must be a string' + assert isinstance(epoch, int), 'epoch must be an integer' + assert isinstance(batch_size, int), 'batch_size must be an integer' + assert isinstance(embedding_size, int), 'embedding_size must be an integer' + assert isinstance(output_size, int), 'output_size must be an integer' + assert isinstance(maxlen, int), 'maxlen must be an integer' + assert isinstance(ngram, tuple), 'ngram must be a tuple' + assert isinstance(num_layers, int), 'num_layers must be an integer' + assert len(ngram) == 2, 'ngram size must equal to 2' + output, keys = _generate_topics(dictionary) + batch_x_left, batch_x_right, batch_y = [], [], [] + for i in range(len(output)): + augmentation = sentence_ngram(output[i]) + batch_x_right.extend([keys[i]] * len(augmentation)) + batch_x_left.extend(augmentation) + batch_y.extend([1] * len(augmentation)) + neg_batch_x_left, neg_batch_x_right = [], [] + for i in range(len(batch_x_left)): + random_num = random.randint(0, len(batch_x_left) - 1) + while random_num == i: + random_num = random.randint(0, len(batch_x_left) - 1) + neg_batch_x_right.append(batch_x_right[random_num]) + neg_batch_x_left.append(batch_x_left[i]) + batch_y.append(0) + batch_x_left.extend(neg_batch_x_left) + batch_x_right.extend(neg_batch_x_right) + batch_x_left, batch_x_right, batch_y = shuffle( + batch_x_left, batch_x_right, batch_y + ) + sess, model, dictionary, saver, dropout = siamese_train( + batch_x_left, + batch_x_right, + batch_y, + epoch = epoch, + batch_size = batch_size, + embedding_size = embedding_size, + output_size = output_size, + maxlen = maxlen, + num_layers = num_layers, + **kwargs + ) + return _DEEP_SIAMESE_SIMILARITY( + sess, + model, + keys, + dictionary, + maxlen, + saver, + embedding_size, + num_layers, + output_size, + dropout, + ) + + +def load_siamese(location): + if not os.path.isfile('%s/model.json' % (location)) or not os.path.isfile( + '%s/model.ckpt.meta' % (location) + ): + raise Exception( + 'siamese text similarity model at %s/ is not available, please train and save the model' + % (location) + ) + with open('%s/model.json' % (location)) as fopen: + json_ = json.load(fopen) + sess, model, saver = load_deep_siamese(location, json_) + return _DEEP_SIAMESE_SIMILARITY( + sess, + model, + json_['keys'], + json_['dictionary'], + json_['maxlen'], + saver, + json_['embedding_size'], + json_['num_layers'], + json_['output_size'], + json_['dropout'], + ) + + +def deep_skipthought( + dictionary, + epoch = 5, + batch_size = 16, + embedding_size = 256, + maxlen = 100, + ngram = (1, 4), +): + """ + Train a deep skip-thought network for text similarity + + Parameters + ---------- + dictionary: dict + format {'left':['right']} + epoch: int, (default=5) + iteration numbers + batch_size: int, (default=32) + batch size for every feed, batch size must <= size of corpus + embedding_size: int, (default=256) + vector size representation for a word + maxlen: int, (default=100) + max length of a string to be train + ngram: tuple, (default=(1,4)) + n-grams size to train a corpus + + Returns + ------- + _DEEP_SIMILARITY: malaya.similarity._DEEP_SIMILARITY class + """ + assert isinstance(dictionary, dict), 'dictionary must be a dictionary' + assert isinstance( + list(dictionary.keys())[0], str + ), 'keys dictionary must be a string' + assert isinstance( + list(dictionary.values())[0], list + ), 'values dictionary must be a list' + assert isinstance( + list(dictionary.values())[0][0], str + ), 'elements of values dictionary must be a string' + assert isinstance(epoch, int), 'epoch must be an integer' + assert isinstance(batch_size, int), 'batch_size must be an integer' + assert isinstance(embedding_size, int), 'embedding_size must be an integer' + assert isinstance(maxlen, int), 'maxlen must be an integer' + assert isinstance(ngram, tuple), 'ngram must be a tuple' + assert len(ngram) == 2, 'ngram size must equal to 2' + output, keys = _generate_topics(dictionary) + batch_x, batch_y = [], [] + for i in range(len(output)): + augmentation = sentence_ngram(output[i]) + batch_y.extend([keys[i]] * len(augmentation)) + batch_x.extend(augmentation) + batch_x, batch_y = shuffle(batch_x, batch_y) + sess, model, dictionary, saver = skip_train( + batch_x, + batch_y, + batch_y, + epoch = epoch, + batch_size = batch_size, + embedding_size = embedding_size, + maxlen = maxlen, + ) + vectorized = sess.run( + model.get_thought, + feed_dict = { + model.INPUT: batch_sequence(output, dictionary, maxlen = maxlen) + }, + ) + return _DEEP_SIMILARITY( + sess, model, vectorized, keys, dictionary, maxlen, saver, embedding_size + ) + + +def load_skipthought(location): + if not os.path.isfile('%s/model.json' % (location)) or not os.path.isfile( + '%s/model.ckpt.meta' % (location) + ): + raise Exception( + 'skipthought text similarity model at %s/ is not available, please train and save the model' + ) + with open('%s/model.json' % (location)) as fopen: + json_ = json.load(fopen) + sess, model, saver = load_deep_skipthought(location, json_) + return _DEEP_SIMILARITY( + sess, + model, + np.array(json_['vectorized']), + json_['keys'], + json_['dictionary'], + json_['maxlen'], + saver, + json_['embedding_size'], + ) + + +def bow(dictionary, vectorizer = 'tfidf', ngram = (3, 10)): + """ + Train a bow for text similarity + + Parameters + ---------- + dictionary: dict + format {'left':['right']} + vectorizer: str, (default='tfidf') + vectorization technique for a corpus + ngram: tuple, (default=(1,4)) + n-grams size to train a corpus + + Returns + ------- + _FAST_SIMILARITY: malaya.similarity._FAST_SIMILARITY class + """ + assert isinstance(dictionary, dict), 'dictionary must be a dictionary' + assert isinstance( + list(dictionary.keys())[0], str + ), 'keys dictionary must be a string' + assert isinstance( + list(dictionary.values())[0], list + ), 'values dictionary must be a list' + assert isinstance( + list(dictionary.values())[0][0], str + ), 'elements of values dictionary must be a string' + assert isinstance(vectorizer, str), 'vectorizer must be a string' + assert isinstance(ngram, tuple), 'ngram must be a tuple' + assert len(ngram) == 2, 'ngram size must equal to 2' + if 'tfidf' in vectorizer.lower(): + char_vectorizer = TfidfVectorizer( + sublinear_tf = True, + strip_accents = 'unicode', + analyzer = 'char', + ngram_range = ngram, + ) + elif 'count' in vectorizer.lower(): + char_vectorizer = CountVectorizer( + strip_accents = 'unicode', analyzer = 'char', ngram_range = ngram + ) + elif 'skip-gram' in vectorizer.lower(): + char_vectorizer = SkipGramVectorizer( + strip_accents = 'unicode', analyzer = 'char', ngram_range = ngram + ) + else: + raise Exception('model not supported') + output, keys = _generate_topics(dictionary) + vectorizer = char_vectorizer.fit(output) + vectorized = vectorizer.transform(output) + return _FAST_SIMILARITY(vectorizer, vectorized, keys) diff --git a/malaya/spell.py b/malaya/spell.py index d8a95196..fb829bd5 100644 --- a/malaya/spell.py +++ b/malaya/spell.py @@ -8,7 +8,7 @@ from fuzzywuzzy import fuzz import numpy as np from .texts._text_functions import normalizer_textcleaning -from .topic_influencer import is_location +from .similarity import is_location from .texts._tatabahasa import alphabet, consonants, vowels @@ -21,15 +21,20 @@ def _build_dicts(words): return occurences +def _augment_vowel(string, selected = ['a', 'i']): + pseudo = [] + for c in selected: + pseudo.append(''.join([w + c for w in string])) + return pseudo + + def _edit_normalizer(word): splits = [(word[:i], word[i:]) for i in range(len(word) + 1)] deletes = [a + b[1:] for a, b in splits if b] transposes = [a + b[1] + b[0] + b[2:] for a, b in splits if len(b) > 1] replaces = [a + c + b[1:] for a, b in splits for c in alphabet if b] inserts = [a + c + b for a, b in splits for c in alphabet] - pseudo = [] - for c in vowels: - pseudo.append(''.join([w + c for w in word])) + pseudo = _augment_vowel(word, vowels) fuzziness = [] if len(word): if word[-1] == 'e': @@ -43,20 +48,25 @@ def _edit_normalizer(word): and word[1] in consonants and word[2] in vowels ): - fuzziness.append(word[0] + word[2] + word[1:]) + inner = word[0] + word[2] + word[1:] + fuzziness.append(inner) if len(word) > 2: if ( word[0] in vowels and word[-1] in consonants and word[2] in consonants ): - fuzziness.append(word[:-2] + word[0] + word[-1]) + inner = word[:-2] + word[0] + word[-1] + fuzziness.append(inner) if len(word) > 2: if word[-1] == 'o' and word[-3] in vowels and word[-2] in consonants: - fuzziness.append(word[:-1] + 'ar') + inner = word[:-1] + 'ar' + fuzziness.append(inner) if len(word): if word[0] == 'a' and word[1] in consonants: - fuzziness.append('h' + word) + inner = 'h' + word + fuzziness.append(inner) + pseudo.extend(inner) return set(deletes + transposes + replaces + inserts + fuzziness + pseudo) @@ -100,23 +110,18 @@ def correct(self, string, first_char = True, debug = True): if not len(string): return string if first_char: - candidates = ( - _return_known([string], self.occurences[string[0]]) - or _return_known( - _edit_normalizer(string), self.occurences[string[0]] - ) - or _return_possible( - string, self.occurences[string[0]], _edit_normalizer - ) - or [string] - ) + selected = self.occurences[string[0]] else: - candidates = ( - _return_known([string], self.corpus) - or _return_known(_edit_normalizer(string), self.corpus) - or _return_possible(string, self.corpus, _edit_normalizer) - or [string] - ) + selected = self.corpus + if len(string) > 2: + if string[-2] in consonants and string[-1] == 'e': + string = string[:-1] + 'a' + candidates = ( + _return_known([string], selected) + or _return_known(_edit_normalizer(string), selected) + or _return_possible(string, selected, _edit_normalizer) + or [string] + ) candidates = [ (candidate, is_location(candidate)) for candidate in list(candidates) diff --git a/malaya/stem.py b/malaya/stem.py index b470c70f..95cbc632 100644 --- a/malaya/stem.py +++ b/malaya/stem.py @@ -10,7 +10,7 @@ from unidecode import unidecode from tensorflow.contrib.seq2seq.python.ops import beam_search_ops from Sastrawi.Stemmer.StemmerFactory import StemmerFactory -from .texts._tatabahasa import permulaan, hujung +from .texts._tatabahasa import permulaan, hujung, rules_normalizer from ._utils._utils import load_graph, check_file, check_available from .texts._text_functions import ( pad_sentence_batch, @@ -34,7 +34,7 @@ def _load_sastrawi(): sastrawi_stemmer = factory.create_stemmer() -def _classification_textcleaning_stemmer_attention(string): +def _classification_textcleaning_stemmer(string, attention = False): string = re.sub( 'http\S+|www.\S+', '', @@ -44,35 +44,16 @@ def _classification_textcleaning_stemmer_attention(string): ) string = unidecode(string).replace('.', ' . ').replace(',', ' , ') string = re.sub('[^A-Za-z ]+', ' ', string) - string = re.sub(r'[ ]+', ' ', string).strip() - string = ' '.join( - [i for i in re.findall('[\\w\']+|[;:\-\(\)&.,!?"]', string) if len(i)] - ) - string = string.lower().split() + string = re.sub(r'[ ]+', ' ', string.lower()).strip() + string = [rules_normalizer.get(w, w) for w in string.split()] string = [(naive(word), word) for word in string] - return ( - ' '.join([word[0] for word in string if len(word[0]) > 1]), - ' '.join([word[1] for word in string if len(word[0]) > 1]), - ) - - -def _classification_textcleaning_stemmer(string): - string = re.sub( - 'http\S+|www.\S+', - '', - ' '.join( - [i for i in string.split() if i.find('#') < 0 and i.find('@') < 0] - ), - ) - string = unidecode(string).replace('.', ' . ').replace(',', ' , ') - string = re.sub('[^A-Za-z ]+', ' ', string) - string = re.sub(r'[ ]+', ' ', string).strip() - string = ' '.join( - [i for i in re.findall('[\\w\']+|[;:\-\(\)&.,!?"]', string) if len(i)] - ) - string = string.lower().split() - string = [(naive(word), word) for word in string] - return ' '.join([word[0] for word in string if len(word[0]) > 1]) + if attention: + return ( + ' '.join([word[0] for word in string if len(word[0]) > 1]), + ' '.join([word[1] for word in string if len(word[0]) > 1]), + ) + else: + return ' '.join([word[0] for word in string if len(word[0]) > 1]) class _DEEP_STEMMER: @@ -134,7 +115,7 @@ def naive(word): if len(hujung_result): hujung_result = max(hujung_result, key = len) if len(hujung_result): - word = hujung_result[: -len(hujung_result)] + word = word[: -len(hujung_result)] permulaan_result = [e for e in permulaan if word.startswith(e)] if len(permulaan_result): permulaan_result = max(permulaan_result, key = len) diff --git a/malaya/texts/_english_expand.py b/malaya/texts/_english_expand.py new file mode 100644 index 00000000..f80f238f --- /dev/null +++ b/malaya/texts/_english_expand.py @@ -0,0 +1,206 @@ +english = { + 'afaik': 'as far as i know', + 'afk': 'away from keyboard', + 'asap': 'as soon as possible', + 'atk': 'at the keyboard', + 'atm': 'at the moment', + 'a3': 'anytime, anywhere, anyplace', + 'bak': 'back at keyboard', + 'bbl': 'be back later', + 'bbs': 'be back soon', + 'bfn': 'bye for now', + 'b4n': 'bye for now', + 'brb': 'be right back', + 'brt': 'be right there', + 'btw': 'by the way', + 'b4': 'before', + 'cu': 'see you', + 'cul8r': 'see you later', + 'cya': 'see you', + 'faq': 'frequently asked questions', + 'fc': 'fingers crossed', + 'fwiw': 'for what its worth', + 'fyi': 'for your information', + 'gal': 'get a life', + 'gg': 'good game', + 'gn': 'good night', + 'gmta': 'great minds think alike', + 'gr8': 'great!', + 'g9': 'genius', + 'ic': 'i see', + 'icq': 'i seek you', + 'ilu': 'ilu: i love you', + 'imho': 'in my humble opinion', + 'imo': 'in my opinion', + 'iow': 'in other words', + 'irl': 'in real life', + 'kiss': 'keep it simple, stupid', + 'ldr': 'long distance relationship', + 'lmao': 'laugh my ass off', + 'lol': 'laughing out loud', + 'ltns': 'long time no see', + 'l8r': 'later', + 'mte': 'my thoughts exactly', + 'm8': 'mate', + 'nrn': 'no reply necessary', + 'oic': 'oh i see', + 'pita': 'pain in the ass', + 'prt': 'party', + 'prw': 'parents are watching', + 'qpsa': 'que pasa', + 'rofl': 'rolling on the floor laughing', + 'roflol': 'rolling on the floor laughing out loud', + 'rotflmao': 'rolling on the floor laughing my ass off', + 'sk8': 'skate', + 'stats': 'your sex and age', + 'asl': 'age sex location', + 'thx': 'thank you', + 'ty': 'thank you', + 'ttfn': 'ta-ta for now!', + 'ttyl': 'talk to you later', + 'u': 'you', + 'u2': 'you too', + 'u4e': 'yours for ever', + 'wb': 'welcome back', + 'wtf': 'what the fuck', + 'wtg': 'way to go!', + 'wuf': 'where are you from?', + 'w8': 'wait', + '7k': 'sick laugher', + 'r': 'are', + 'w': 'wait', + 'hrs': 'hours', + 'd': 'the', + 'fwd': 'forward', + 'cant': 'cannot', + 'hve': 'have', + 'cause': 'because', + 'couldve': 'could have', + 've': 'have', + 'nt': 'not', + 'gonna': 'going to', + 'id': 'i would', + 'maam': 'madam', + 'nothin': 'nothing', + 'fu': 'fuck you', + 'aamof': 'as a matter of fact', + 'ack': 'acknowledgment', + 'ot': 'off topic', + 'op': 'original poster original post', + 'otoh': 'on the other hand', + 'pov': 'point of view', + 'rotfl': 'rolling on the floor laughing', + 'rtfm': 'read the fine manual', + 'fck': 'fuck', + 'tyvm': 'thank you very much', + 'tyt': 'take your time', + 'yeo fyeo': 'for your eyes only', + 'afair': 'as far as i remember recall', + 'aka': 'also known as', + 'bkbtk': 'back to keyboard', + 'btt': 'back to topic', + 'bc': 'because', + 'cys': 'check your settings', + 'diy': 'do it yourself', + 'eobd': 'end of business day', + 'eod': 'end of day', + 'eom': 'end of message', + 'eot': 'end of thread text transmission', + 'fack': 'full acknowledge', + 'fka': 'formerly known as', + 'fyi jfyi': 'justfor your information', + 'ftw': 'fuck the world for the win', + 'hf': 'have fun', + 'hth': 'hope this helps', + 'idk': 'i dont know', + 'iirc': 'if i recall remember correctly', + 'imnsho': 'in my not so humble honest opinion', + 'itt': 'in this thread', + 'dgmw': 'dont get me wrong', + 'mmw': 'mark my words', + 'na': 'not available applicable', + 'nan': 'not a number', + 'nntr': 'no need to reply', + 'noyb': 'none of your business', + 'omg': 'oh my god', + 'pebkac': 'problem exists between keyboard and chair', + 'rsvp repondez sil vous plait french': 'please reply', + 'scnr': 'sorry could not resist', + 'sflr': 'sorry for late reply', + 'spoc': 'single point of contact', + 'tba': 'to be announced', + 'tbc': 'to be continued to be confirmed', + 'tia': 'thanks in advance', + 'tgif': 'thanks god its friday', + 'thx tnx': 'thanks', + 'tq': 'thank you', + 'wt': 'whoomp there it is', + 'wfm': 'works for me', + 'wrt': 'with regard to', + 'wth': 'what the hell what the heck', + 'ymmd': 'you made my day', + 'ymmv': 'your mileage may vary', + 'yam': 'yet another meeting', + 'icymi': 'in case you missed it', + 'moro': 'tomorrow', + 'nte': 'tonight', + 'aeap': 'as early as possible', + 'alap': 'as late as possible', + 'b': 'blah blah blah', + 'byki': 'before you know it', + 'bff': 'best friends forever', + 'btam': 'be that as it may', + 'ctn': 'cannot talk now', + 'cus': 'see you soon', + 'cwot': 'complete waste of time', + 'cyt': 'see you tomorrow', + 'em': 'excuse me', + 'ff': 'face to face', + 'foaf': 'friend of a friend', + 'gr': 'great', + 'hak': 'hugs and kisses', + 'idc': 'i dont care', + 'ilu ily': 'i love you', + 'imu': 'i miss you', + 'jk': 'just kidding', + 'jc': 'just checking', + 'jtlyk': 'just to let you know', + 'kfy': 'kiss for you', + 'kmn': 'kill me now', + 'kpc': 'keeping parents clueless', + 'lr': 'later', + 'mof': 'male or female', + 'mtfbwy': 'may the force be with you', + 'myob': 'mind your own business', + 'naz': 'name address zip', + 'nc': 'no comment', + 'nimby': 'not in my backyard', + 'nm': 'never mind nothing much', + 'np': 'no problem', + 'nsfw': 'not safe for work', + 'ntim': 'not that it matters', + 'nvm': 'never mind', + 'oatus': 'on a totally unrelated subject', + 'omw': 'on my way', + 'otl': 'out to lunch', + 'otp': 'on the phone', + 'p': 'parent alert', + 'pal': 'parents are listening', + 'paw': 'parents are watching', + 'pir': 'parent in room', + 'pos': 'parent over shoulder', + 'props': 'proper respect proper recognition', + 'qt': 'cutie', + 'rn': 'right now', + 'ru': 'are you', + 'sep': 'someone elses problem', + 'sitd': 'still in the dark', + 'slap': 'sounds like a plan', + 'smim': 'send me an instant message', + 'so': 'significant other', + 'tmi': 'too much information', + 'ur': 'your you are', + 'wycm': 'will you call me', + 'wywh': 'wish you were here', + 'xoxoxox': 'hugs kisses', +} diff --git a/malaya/texts/_text_functions.py b/malaya/texts/_text_functions.py index ad8fa234..f8ab9254 100644 --- a/malaya/texts/_text_functions.py +++ b/malaya/texts/_text_functions.py @@ -112,8 +112,7 @@ def malaya_textcleaning(string): ] ), ) - string = unidecode(string).replace('.', '. ') - string = string.replace(',', ', ') + string = unidecode(string).replace('.', '. ').replace(',', ' , ') string = re.sub('[^\'"A-Za-z\- ]+', ' ', string) string = re.sub(r'[ ]+', ' ', string.lower()).strip() string = [word for word in string.lower().split() if _isWord(word)] @@ -230,7 +229,7 @@ def pos_entities_textcleaning(string): [i for i in string.split() if i.find('#') < 0 and i.find('@') < 0] ), ) - string = unidecode(string).replace('.', '. ').replace(',', ', ') + string = unidecode(string).replace('.', ' . ').replace(',', ' , ') string = re.sub('[^A-Za-z\- ]+', ' ', string) string = re.sub(r'[ ]+', ' ', string).strip() return ' '.join( @@ -244,7 +243,7 @@ def pos_entities_textcleaning(string): def classification_textcleaning(string, no_stopwords = False, lowering = True): """ - use by our text classifiers, stemmer, summarization, topic-modelling + stemmer, summarization, topic-modelling remove links, hashtags, alias """ string = re.sub( @@ -254,7 +253,7 @@ def classification_textcleaning(string, no_stopwords = False, lowering = True): [i for i in string.split() if i.find('#') < 0 and i.find('@') < 0] ), ) - string = unidecode(string).replace('.', '. ').replace(',', ', ') + string = unidecode(string).replace('.', ' . ').replace(',', ' , ') string = re.sub('[^A-Za-z ]+', ' ', string) string = re.sub(r'[ ]+', ' ', string).strip() if no_stopwords: @@ -285,14 +284,6 @@ def classification_textcleaning(string, no_stopwords = False, lowering = True): ) -def process_word_pos_entities(word): - word = word.lower() - word = re.sub('[^A-Za-z0-9\- ]+', '', word) - if word.isdigit(): - word = 'NUM' - return word - - def separate_dataset(trainset): datastring = [] datatarget = [] @@ -340,17 +331,6 @@ def stemmer_str_idx(corpus, dic, UNK = 3): return X -def fasttext_str_idx(texts, dictionary): - idx_trainset = [] - for text in texts: - idx = [] - for t in text.split(): - if t in dictionary: - idx.append(dictionary[t]) - idx_trainset.append(idx) - return idx_trainset - - def pad_sentence_batch(sentence_batch, pad_int): padded_seqs = [] seq_lens = [] @@ -363,19 +343,6 @@ def pad_sentence_batch(sentence_batch, pad_int): return padded_seqs, seq_lens -def add_ngram(sequences, token_indice, ngram = (2, 3)): - new_sequences = [] - for input_list in sequences: - new_list = input_list[:] - for ngram_value in range(ngram[0], ngram[1]): - for i in range(len(new_list) - ngram_value + 1): - ngram = tuple(new_list[i : i + ngram_value]) - if ngram in token_indice: - new_list.append(token_indice[ngram]) - new_sequences.append(new_list) - return new_sequences - - def char_str_idx(corpus, dic, UNK = 2): maxlen = max([len(i) for i in corpus]) X = np.zeros((len(corpus), maxlen)) diff --git a/malaya/topic/__init__.py b/malaya/topic/__init__.py new file mode 100644 index 00000000..70091575 --- /dev/null +++ b/malaya/topic/__init__.py @@ -0,0 +1,13 @@ +# Malaya Natural Language Toolkit +# +# Copyright (C) 2019 Malaya Project +# Licensed under the MIT License +# Author: huseinzol05 +# URL: +# For license information, see https://github.com/huseinzol05/Malaya/blob/master/LICENSE + +from .topic import topic +from .calon import calon +from .influencer import influencer +from .location import location +from .shortform import shortform diff --git a/malaya/topic/calon.py b/malaya/topic/calon.py new file mode 100644 index 00000000..65bfaa6b --- /dev/null +++ b/malaya/topic/calon.py @@ -0,0 +1,20153 @@ +calon = { + 0: { + 'KodN': 1, + 'KodParlimen': 1, + 'KodKawasan': 1, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DATUK ZAHIDI BIN ZAINUL ABIDIN', + 'parti': 'BN', + }, + 1: { + 'KodN': 1, + 'KodParlimen': 1, + 'KodKawasan': 1, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'MOKHTAR BIN SENIK', + 'parti': 'PAS', + }, + 2: { + 'KodN': 1, + 'KodParlimen': 1, + 'KodKawasan': 1, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'IZIZAM BIN IBRAHIM', + 'parti': 'PKR', + }, + 3: { + 'KodN': 1, + 'KodParlimen': 1, + 'KodKawasan': 101, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'TEH CHAI ANN', + 'parti': 'BN', + }, + 4: { + 'KodN': 1, + 'KodParlimen': 1, + 'KodKawasan': 101, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'TEH SENG CHUAN', + 'parti': 'PKR', + }, + 5: { + 'KodN': 1, + 'KodParlimen': 1, + 'KodKawasan': 101, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'KAMIS BIN HJ YUB', + 'parti': 'PAS', + }, + 6: { + 'KodN': 1, + 'KodParlimen': 1, + 'KodKawasan': 101, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'YAACOB BIN MAN', + 'parti': 'BEBAS', + }, + 7: { + 'KodN': 1, + 'KodParlimen': 1, + 'KodKawasan': 102, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'RUZAINI BIN RAIS', + 'parti': 'BN', + }, + 8: { + 'KodN': 1, + 'KodParlimen': 1, + 'KodKawasan': 102, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'AZAMHARI BIN MOHAMOOD', + 'parti': 'PAS', + }, + 9: { + 'KodN': 1, + 'KodParlimen': 1, + 'KodKawasan': 102, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'WAN KHARIZAL BIN WAN KHAZIM', + 'parti': 'PKR', + }, + 10: { + 'KodN': 1, + 'KodParlimen': 1, + 'KodKawasan': 103, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ASMAIZA BINTI AHMAD', + 'parti': 'BN', + }, + 11: { + 'KodN': 1, + 'KodParlimen': 1, + 'KodKawasan': 103, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'POZIYAH BINTI HAMZAH', + 'parti': 'PKR', + }, + 12: { + 'KodN': 1, + 'KodParlimen': 1, + 'KodKawasan': 103, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD ALI BIN PUTEH', + 'parti': 'PAS', + }, + 13: { + 'KodN': 1, + 'KodParlimen': 1, + 'KodKawasan': 104, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SITI BERENEE BT YAHAYA', + 'parti': 'BN', + }, + 14: { + 'KodN': 1, + 'KodParlimen': 1, + 'KodKawasan': 104, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AZHAR BIN OMAR', + 'parti': 'PKR', + }, + 15: { + 'KodN': 1, + 'KodParlimen': 1, + 'KodKawasan': 104, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHAMMAD BIN YAHYA', + 'parti': 'PAS', + }, + 16: { + 'KodN': 1, + 'KodParlimen': 1, + 'KodKawasan': 105, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AZIZAN BIN SULAIMAN', + 'parti': 'BN', + }, + 17: { + 'KodN': 1, + 'KodParlimen': 1, + 'KodKawasan': 105, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'CHE MAZLINA BT CHE YOB', + 'parti': 'PKR', + }, + 18: { + 'KodN': 1, + 'KodParlimen': 1, + 'KodKawasan': 105, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'BAHARUDDIN BIN AHMAD', + 'parti': 'PAS', + }, + 19: { + 'KodN': 1, + 'KodParlimen': 2, + 'KodKawasan': 2, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'AMIN BIN AHMAD', + 'parti': 'PKR', + }, + 20: { + 'KodN': 1, + 'KodParlimen': 2, + 'KodKawasan': 2, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'MOHD ZAHID BIN IBRAHIM', + 'parti': 'PAS', + }, + 21: { + 'KodN': 1, + 'KodParlimen': 2, + 'KodKawasan': 2, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'RAMLI BIN SHARIF', + 'parti': 'BN', + }, + 22: { + 'KodN': 1, + 'KodParlimen': 2, + 'KodKawasan': 206, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': "DATO' SERI AZLAN BIN MAN", + 'parti': 'BN', + }, + 23: { + 'KodN': 1, + 'KodParlimen': 2, + 'KodKawasan': 206, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOKHTAR BIN CHE KASSIM', + 'parti': 'PKR', + }, + 24: { + 'KodN': 1, + 'KodParlimen': 2, + 'KodKawasan': 206, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ABDUL JAMIL BIN KAMIS', + 'parti': 'PAS', + }, + 25: { + 'KodN': 1, + 'KodParlimen': 2, + 'KodKawasan': 207, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'FAKHRUL ANWAR BIN ISMAIL', + 'parti': 'PAS', + }, + 26: { + 'KodN': 1, + 'KodParlimen': 2, + 'KodKawasan': 207, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': "AZIHANI BINTI DATO' ALI", + 'parti': 'BN', + }, + 27: { + 'KodN': 1, + 'KodParlimen': 2, + 'KodKawasan': 207, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ASRUL NIZAN BIN ABDUL JALIL', + 'parti': 'PKR', + }, + 28: { + 'KodN': 1, + 'KodParlimen': 2, + 'KodKawasan': 208, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'GAN AY LING', + 'parti': 'PKR', + }, + 29: { + 'KodN': 1, + 'KodParlimen': 2, + 'KodKawasan': 208, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'CHUAH TIAN HEE', + 'parti': 'BN', + }, + 30: { + 'KodN': 1, + 'KodParlimen': 2, + 'KodKawasan': 208, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'WAN HASAN BIN ISMAIL', + 'parti': 'PAS', + }, + 31: { + 'KodN': 1, + 'KodParlimen': 2, + 'KodKawasan': 209, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD FUAT BIN HJ ABU', + 'parti': 'PAS', + }, + 32: { + 'KodN': 1, + 'KodParlimen': 2, + 'KodKawasan': 209, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AZAM BIN KARAP', + 'parti': 'PKR', + }, + 33: { + 'KodN': 1, + 'KodParlimen': 2, + 'KodKawasan': 209, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATUK AZAM BIN RASHID', + 'parti': 'BN', + }, + 34: { + 'KodN': 1, + 'KodParlimen': 2, + 'KodKawasan': 210, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HAMIZAN BIN HASSAN', + 'parti': 'BN', + }, + 35: { + 'KodN': 1, + 'KodParlimen': 2, + 'KodKawasan': 210, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD HANNAAN BIN KHAIRY', + 'parti': 'PKR', + }, + 36: { + 'KodN': 1, + 'KodParlimen': 2, + 'KodKawasan': 210, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MD RADZI BIN HASSAN', + 'parti': 'PAS', + }, + 37: { + 'KodN': 1, + 'KodParlimen': 3, + 'KodKawasan': 3, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': "DATO' SERI DR. SHAHIDAN BIN KASSIM", + 'parti': 'BN', + }, + 38: { + 'KodN': 1, + 'KodParlimen': 3, + 'KodKawasan': 3, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'PROF. DATO DR. ABDUL RAHMAN BIN DAUD', + 'parti': 'PKR', + }, + 39: { + 'KodN': 1, + 'KodParlimen': 3, + 'KodKawasan': 3, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'HAJI HASHIM BIN JASIN', + 'parti': 'PAS', + }, + 40: { + 'KodN': 1, + 'KodParlimen': 3, + 'KodKawasan': 311, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ROZIEANA BINTI AHMAD', + 'parti': 'BN', + }, + 41: { + 'KodN': 1, + 'KodParlimen': 3, + 'KodKawasan': 311, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HAJI AMIER BIN HASSAN ', + 'parti': 'PKR', + }, + 42: { + 'KodN': 1, + 'KodParlimen': 3, + 'KodKawasan': 311, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HAJI IDRIS BIN YAAKOB', + 'parti': 'PAS', + }, + 43: { + 'KodN': 1, + 'KodParlimen': 3, + 'KodKawasan': 312, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATUK ISMAIL BIN KASSIM', + 'parti': 'BN', + }, + 44: { + 'KodN': 1, + 'KodParlimen': 3, + 'KodKawasan': 312, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MATON BIN DIN ', + 'parti': 'PKR', + }, + 45: { + 'KodN': 1, + 'KodParlimen': 3, + 'KodKawasan': 312, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DR. A BAKAR BIN ALI', + 'parti': 'PAS', + }, + 46: { + 'KodN': 1, + 'KodParlimen': 3, + 'KodKawasan': 313, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'AFIFI BIN OSMAN', + 'parti': 'BN', + }, + 47: { + 'KodN': 1, + 'KodParlimen': 3, + 'KodKawasan': 313, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'BARIDAH BINTI NAYAN', + 'parti': 'PKR', + }, + 48: { + 'KodN': 1, + 'KodParlimen': 3, + 'KodKawasan': 313, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD RIDZUAN BIN HASHIM', + 'parti': 'PAS', + }, + 49: { + 'KodN': 1, + 'KodParlimen': 3, + 'KodKawasan': 314, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': "RUS'SELE BIN EIZAN", + 'parti': 'PAS', + }, + 50: { + 'KodN': 1, + 'KodParlimen': 3, + 'KodKawasan': 314, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'NURULHISHAM BIN YAAKOB', + 'parti': 'BN', + }, + 51: { + 'KodN': 1, + 'KodParlimen': 3, + 'KodKawasan': 314, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DR. WAN NORALHAKIM SHAGHIR BIN SAAD', + 'parti': 'PKR', + }, + 52: { + 'KodN': 1, + 'KodParlimen': 3, + 'KodKawasan': 315, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ZOLKARNAIN BIN ABIDIN', + 'parti': 'PKR', + }, + 53: { + 'KodN': 1, + 'KodParlimen': 3, + 'KodKawasan': 315, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD SHUKRI BIN RAMLI', + 'parti': 'PAS', + }, + 54: { + 'KodN': 1, + 'KodParlimen': 3, + 'KodKawasan': 315, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'CHE ZAIDI BIN SAIDIN', + 'parti': 'BN', + }, + 55: { + 'KodN': 2, + 'KodParlimen': 4, + 'KodKawasan': 4, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'mahathir', + 'parti': 'PKR', + }, + 56: { + 'KodN': 2, + 'KodParlimen': 4, + 'KodKawasan': 4, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'ZUBIR BIN AHMAD', + 'parti': 'PAS', + }, + 57: { + 'KodN': 2, + 'KodParlimen': 4, + 'KodKawasan': 4, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': "DATO' IR. HJ NAWAWI BIN HJ AHMAD", + 'parti': 'BN', + }, + 58: { + 'KodN': 2, + 'KodParlimen': 4, + 'KodKawasan': 401, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'AZLINA BINTI AZINAN', + 'parti': 'PAS', + }, + 59: { + 'KodN': 2, + 'KodParlimen': 4, + 'KodKawasan': 401, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': "DATO' HJ. RAWI BIN HJ. ABD HAMID", + 'parti': 'BN', + }, + 60: { + 'KodN': 2, + 'KodParlimen': 4, + 'KodKawasan': 401, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'JUHARI BIN BULAT', + 'parti': 'PKR', + }, + 61: { + 'KodN': 2, + 'KodParlimen': 4, + 'KodKawasan': 402, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'NORSAIDI BIN HJ. NANYAN', + 'parti': 'BN', + }, + 62: { + 'KodN': 2, + 'KodParlimen': 4, + 'KodKawasan': 402, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MAZLAN BIN AHMAD', + 'parti': 'PAS', + }, + 63: { + 'KodN': 2, + 'KodParlimen': 4, + 'KodKawasan': 402, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHAMAD RATU BIN MANSOR', + 'parti': 'BEBAS', + }, + 64: { + 'KodN': 2, + 'KodParlimen': 4, + 'KodKawasan': 402, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'MOHD FIRDAUS BIN AHMAD', + 'parti': 'PKR', + }, + 65: { + 'KodN': 2, + 'KodParlimen': 5, + 'KodKawasan': 5, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DATO’ WIRA OTHMAN BIN HJ AZIZ', + 'parti': 'BN', + }, + 66: { + 'KodN': 2, + 'KodParlimen': 5, + 'KodKawasan': 5, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': "DATO' SERI MUKHRIZ BIN MAHATHIR", + 'parti': 'PKR', + }, + 67: { + 'KodN': 2, + 'KodParlimen': 5, + 'KodKawasan': 5, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'ABDUL GHANI BIN AHMAD', + 'parti': 'PAS', + }, + 68: { + 'KodN': 2, + 'KodParlimen': 5, + 'KodKawasan': 503, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AHMAD AZHAR BIN ABDULLAH', + 'parti': 'BN', + }, + 69: { + 'KodN': 2, + 'KodParlimen': 5, + 'KodKawasan': 503, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MD REJAB BIN MD AKHIR', + 'parti': 'PAS', + }, + 70: { + 'KodN': 2, + 'KodParlimen': 5, + 'KodKawasan': 503, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DR SALMEE T SAID', + 'parti': 'PKR', + }, + 71: { + 'KodN': 2, + 'KodParlimen': 5, + 'KodKawasan': 504, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATO’ HJ ABU HASAN BIN SARIF', + 'parti': 'BN', + }, + 72: { + 'KodN': 2, + 'KodParlimen': 5, + 'KodKawasan': 504, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': "DATO' A. AZIZ BIN MOHAMOD", + 'parti': 'PKR', + }, + 73: { + 'KodN': 2, + 'KodParlimen': 5, + 'KodKawasan': 504, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'AZHAR BIN IBRAHIM', + 'parti': 'PAS', + }, + 74: { + 'KodN': 2, + 'KodParlimen': 6, + 'KodKawasan': 6, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': "DATO' SRI MOHD JOHARI BIN BAHARUM", + 'parti': 'BN', + }, + 75: { + 'KodN': 2, + 'KodParlimen': 6, + 'KodKawasan': 6, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': "DATO' AMIRUDDIN HAMZAH", + 'parti': 'PKR', + }, + 76: { + 'KodN': 2, + 'KodParlimen': 6, + 'KodKawasan': 6, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'NORHAFIZA BINTI FADZIL', + 'parti': 'PAS', + }, + 77: { + 'KodN': 2, + 'KodParlimen': 6, + 'KodKawasan': 605, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HABSHAH BINTI BAKAR', + 'parti': 'PAS', + }, + 78: { + 'KodN': 2, + 'KodParlimen': 6, + 'KodKawasan': 605, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HAJAH HALIMATON SHAADIAH BINTI SAAD', + 'parti': 'PKR', + }, + 79: { + 'KodN': 2, + 'KodParlimen': 6, + 'KodKawasan': 605, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': "DATO' HAJI AHMAD ZAINI JAPAR", + 'parti': 'BN', + }, + 80: { + 'KodN': 2, + 'KodParlimen': 6, + 'KodKawasan': 606, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ZULHAZMI BIN OSMAN', + 'parti': 'PAS', + }, + 81: { + 'KodN': 2, + 'KodParlimen': 6, + 'KodKawasan': 606, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': "DATO' SERI HJ MUKHRIZ TUN MAHATHIR", + 'parti': 'PKR', + }, + 82: { + 'KodN': 2, + 'KodParlimen': 6, + 'KodKawasan': 606, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': "DATO' AMINUDDIN BIN OMAR ", + 'parti': 'BN', + }, + 83: { + 'KodN': 2, + 'KodParlimen': 7, + 'KodKawasan': 7, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'MAHDZIR BIN KHALID', + 'parti': 'BN', + }, + 84: { + 'KodN': 2, + 'KodParlimen': 7, + 'KodKawasan': 7, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MOHD AZAM BIN ABD MAJID', + 'parti': 'PAS', + }, + 85: { + 'KodN': 2, + 'KodParlimen': 7, + 'KodKawasan': 7, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'MOHD KHAIRIZAL BIN KHAZALI', + 'parti': 'PKR', + }, + 86: { + 'KodN': 2, + 'KodParlimen': 7, + 'KodKawasan': 707, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'BADROL HISHAM BIN HASHIM', + 'parti': 'BN', + }, + 87: { + 'KodN': 2, + 'KodParlimen': 7, + 'KodKawasan': 707, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD YUSSOF BIN ZAKARIA', + 'parti': 'PAS', + }, + 88: { + 'KodN': 2, + 'KodParlimen': 7, + 'KodKawasan': 707, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'SYED FADZIL BIN SYED EMBUN', + 'parti': 'PKR', + }, + 89: { + 'KodN': 2, + 'KodParlimen': 7, + 'KodKawasan': 708, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'KAMA NORIAH BINTI IBRAHIM', + 'parti': 'BN', + }, + 90: { + 'KodN': 2, + 'KodParlimen': 7, + 'KodKawasan': 708, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD RADZI BIN AMIN', + 'parti': 'PAS', + }, + 91: { + 'KodN': 2, + 'KodParlimen': 7, + 'KodKawasan': 708, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HASHIM BIN IDRIS', + 'parti': 'PKR', + }, + 92: { + 'KodN': 2, + 'KodParlimen': 8, + 'KodKawasan': 8, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DATO SAID ALI BIN SYED ROSTAN', + 'parti': 'BN', + }, + 93: { + 'KodN': 2, + 'KodParlimen': 8, + 'KodKawasan': 8, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'HJ RADHI BIN MAT DIN', + 'parti': 'PAS', + }, + 94: { + 'KodN': 2, + 'KodParlimen': 8, + 'KodKawasan': 8, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DATO MAHFUZ BIN OMAR', + 'parti': 'PKR', + }, + 95: { + 'KodN': 2, + 'KodParlimen': 8, + 'KodKawasan': 809, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATO ARIFFIN BIN MAN', + 'parti': 'BN', + }, + 96: { + 'KodN': 2, + 'KodParlimen': 8, + 'KodKawasan': 809, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SALIM BIN MAHMOOD AL HAFIZ', + 'parti': 'PAS', + }, + 97: { + 'KodN': 2, + 'KodParlimen': 8, + 'KodKawasan': 809, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD AIZAD BIN ROSLAN', + 'parti': 'PKR', + }, + 98: { + 'KodN': 2, + 'KodParlimen': 8, + 'KodKawasan': 809, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'DATO MOHD ISMAIL BIN HJ OTHMAN', + 'parti': 'BEBAS', + }, + 99: { + 'KodN': 2, + 'KodParlimen': 8, + 'KodKawasan': 810, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DR MOHAMMAD NAWAR BIN ARIFFIN', + 'parti': 'BN', + }, + 100: { + 'KodN': 2, + 'KodParlimen': 8, + 'KodKawasan': 810, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'CHE MAT DZAHED BIN AHMAD', + 'parti': 'PKR', + }, + 101: { + 'KodN': 2, + 'KodParlimen': 8, + 'KodKawasan': 810, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'WAN ROMANI BIN WAN SALIM', + 'parti': 'PAS', + }, + 102: { + 'KodN': 2, + 'KodParlimen': 8, + 'KodKawasan': 811, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATO DR CHEAH SOON HAI', + 'parti': 'BN', + }, + 103: { + 'KodN': 2, + 'KodParlimen': 8, + 'KodKawasan': 811, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'YAHYA BIN SAAD', + 'parti': 'PAS', + }, + 104: { + 'KodN': 2, + 'KodParlimen': 8, + 'KodKawasan': 811, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'TAN KOK YEW', + 'parti': 'PKR', + }, + 105: { + 'KodN': 2, + 'KodParlimen': 9, + 'KodKawasan': 9, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MOHD AMINUL SHAFIQ BIN MOHD ABDUH', + 'parti': 'PAS', + }, + 106: { + 'KodN': 2, + 'KodParlimen': 9, + 'KodKawasan': 9, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'CHAN MING KAI', + 'parti': 'PKR', + }, + 107: { + 'KodN': 2, + 'KodParlimen': 9, + 'KodKawasan': 9, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DATO YOO WEI HOW', + 'parti': 'BN', + }, + 108: { + 'KodN': 2, + 'KodParlimen': 9, + 'KodKawasan': 912, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD SABRI OMAR', + 'parti': 'PAS', + }, + 109: { + 'KodN': 2, + 'KodParlimen': 9, + 'KodKawasan': 912, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATO SERI DIRAJA AHMAD BASHAH BIN HANIPAH', + 'parti': 'BN', + }, + 110: { + 'KodN': 2, + 'KodParlimen': 9, + 'KodKawasan': 912, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'IR ZAMBRI YUSUF ', + 'parti': 'PKR', + }, + 111: { + 'KodN': 2, + 'KodParlimen': 9, + 'KodKawasan': 913, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ZULKIFLI CHE HARON', + 'parti': 'PAS', + }, + 112: { + 'KodN': 2, + 'KodParlimen': 9, + 'KodKawasan': 913, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'TAN ENG HWA', + 'parti': 'BN', + }, + 113: { + 'KodN': 2, + 'KodParlimen': 9, + 'KodKawasan': 913, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'TEH SWEE LEUNG', + 'parti': 'PKR', + }, + 114: { + 'KodN': 2, + 'KodParlimen': 9, + 'KodKawasan': 913, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'TAN KANG YAP', + 'parti': 'PRM', + }, + 115: { + 'KodN': 2, + 'KodParlimen': 9, + 'KodKawasan': 914, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'AHMAD BIN SAAD@YAHYA', + 'parti': 'PAS', + }, + 116: { + 'KodN': 2, + 'KodParlimen': 9, + 'KodKawasan': 914, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ABDUL MALIK SAAD', + 'parti': 'BN', + }, + 117: { + 'KodN': 2, + 'KodParlimen': 9, + 'KodKawasan': 914, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'PHAHROLRAZI BIN MOHD ZAWAWI', + 'parti': 'PKR', + }, + 118: { + 'KodN': 2, + 'KodParlimen': 10, + 'KodKawasan': 10, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MUHAMAD RIDUAN BIN OTHMAN', + 'parti': 'PAS', + }, + 119: { + 'KodN': 2, + 'KodParlimen': 10, + 'KodKawasan': 10, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'ABDULLAH HASNAN BIN KAMARUDDIN', + 'parti': 'BN', + }, + 120: { + 'KodN': 2, + 'KodParlimen': 10, + 'KodKawasan': 10, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DR.AZMAN BIN ISMAIL', + 'parti': 'PKR', + }, + 121: { + 'KodN': 2, + 'KodParlimen': 10, + 'KodKawasan': 1015, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HAMDI BIN ISHAK', + 'parti': 'PAS', + }, + 122: { + 'KodN': 2, + 'KodParlimen': 10, + 'KodKawasan': 1015, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'JOHARI BIN AZIZ', + 'parti': 'BN', + }, + 123: { + 'KodN': 2, + 'KodParlimen': 10, + 'KodKawasan': 1015, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'IR AMIRUDDIN BIN HAMZAH', + 'parti': 'PKR', + }, + 124: { + 'KodN': 2, + 'KodParlimen': 10, + 'KodKawasan': 1016, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'OMAR BIN SAAD', + 'parti': 'PAS', + }, + 125: { + 'KodN': 2, + 'KodParlimen': 10, + 'KodKawasan': 1016, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ABDUL MUTALIB BIN HARUN', + 'parti': 'BN', + }, + 126: { + 'KodN': 2, + 'KodParlimen': 10, + 'KodKawasan': 1016, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD ASMIRUL ANUAR BIN ARIS', + 'parti': 'PKR', + }, + 127: { + 'KodN': 2, + 'KodParlimen': 10, + 'KodKawasan': 1017, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DR.ISMAIL BIN SALLEH', + 'parti': 'PKR', + }, + 128: { + 'KodN': 2, + 'KodParlimen': 10, + 'KodKawasan': 1017, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DR.AHMAD FAKHRUDDIN BIN FAKHRURAZI', + 'parti': 'PAS', + }, + 129: { + 'KodN': 2, + 'KodParlimen': 10, + 'KodKawasan': 1017, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ABDUL HALIM BIN SAID', + 'parti': 'BN', + }, + 130: { + 'KodN': 2, + 'KodParlimen': 11, + 'KodKawasan': 11, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': "DATO' WIRA OTHMAN BIN ABDUL", + 'parti': 'BN', + }, + 131: { + 'KodN': 2, + 'KodParlimen': 11, + 'KodKawasan': 11, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'AWANG BIN HASHIM', + 'parti': 'PAS', + }, + 132: { + 'KodN': 2, + 'KodParlimen': 11, + 'KodKawasan': 11, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'WAN SAIFULRUDDIN BIN WAN JAN', + 'parti': 'PKR', + }, + 133: { + 'KodN': 2, + 'KodParlimen': 11, + 'KodKawasan': 11, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'ABDUL MALEK BIN ABDUL MANAF', + 'parti': 'BEBAS', + }, + 134: { + 'KodN': 2, + 'KodParlimen': 11, + 'KodKawasan': 1118, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HJ AHMAD FATAHI BIN OMAR', + 'parti': 'BN', + }, + 135: { + 'KodN': 2, + 'KodParlimen': 11, + 'KodKawasan': 1118, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': "DATO'DR MOHD HAYATI BIN OTHMAN", + 'parti': 'PAS', + }, + 136: { + 'KodN': 2, + 'KodParlimen': 11, + 'KodKawasan': 1118, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD FIRDAUS BIN JAAFAR', + 'parti': 'PKR', + }, + 137: { + 'KodN': 2, + 'KodParlimen': 11, + 'KodKawasan': 1119, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DATO HJH SURAYA BINTI YAACOB', + 'parti': 'BN', + }, + 138: { + 'KodN': 2, + 'KodParlimen': 11, + 'KodKawasan': 1119, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'SAIFUL SYAZWAN BIN SHAFIE', + 'parti': 'PAS', + }, + 139: { + 'KodN': 2, + 'KodParlimen': 11, + 'KodKawasan': 1119, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ABDUL RAZAK BIN KHAMIS', + 'parti': 'PKR', + }, + 140: { + 'KodN': 2, + 'KodParlimen': 12, + 'KodKawasan': 12, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'USTAZ SABRI BIN AZIT', + 'parti': 'PAS', + }, + 141: { + 'KodN': 2, + 'KodParlimen': 12, + 'KodKawasan': 12, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': "DATO' SERI JAMIL KHIR BIN BAHAROM", + 'parti': 'BN', + }, + 142: { + 'KodN': 2, + 'KodParlimen': 12, + 'KodKawasan': 12, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'AKHRAMSYAH MUAMAR UBAIDIAH BIN TANSRI SANUSI', + 'parti': 'PKR', + }, + 143: { + 'KodN': 2, + 'KodParlimen': 12, + 'KodKawasan': 1220, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'NOHD AZAM BIN ABD SAMAT', + 'parti': 'PAS', + }, + 144: { + 'KodN': 2, + 'KodParlimen': 12, + 'KodKawasan': 1220, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': "ZAHRAN BIN DATO' HJ ABDULLAH", + 'parti': 'PKR', + }, + 145: { + 'KodN': 2, + 'KodParlimen': 12, + 'KodKawasan': 1220, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': "DATO' HJH NORMA BINTI AWANG", + 'parti': 'BN', + }, + 146: { + 'KodN': 2, + 'KodParlimen': 12, + 'KodKawasan': 1221, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MUSODDAK BIN HAJI AHMAD', + 'parti': 'PAS', + }, + 147: { + 'KodN': 2, + 'KodParlimen': 12, + 'KodKawasan': 1221, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD SAFFUAN BIN SABARI', + 'parti': 'PKR', + }, + 148: { + 'KodN': 2, + 'KodParlimen': 12, + 'KodKawasan': 1221, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': "DATO' WIRA DR KU ABD RAHMAN BIN KU ISMAIL", + 'parti': 'BN', + }, + 149: { + 'KodN': 2, + 'KodParlimen': 12, + 'KodKawasan': 1222, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MUZANI BIN AZIZAN', + 'parti': 'PAS', + }, + 150: { + 'KodN': 2, + 'KodParlimen': 12, + 'KodKawasan': 1222, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': "DATO' JOHARI BIN ABDUL", + 'parti': 'PKR', + }, + 151: { + 'KodN': 2, + 'KodParlimen': 12, + 'KodKawasan': 1222, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': "DATO' BOEY CHIN GAN", + 'parti': 'BN', + }, + 152: { + 'KodN': 2, + 'KodParlimen': 12, + 'KodKawasan': 1222, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'PALANIAPPAN A/L MARIMUTHU', + 'parti': 'BEBAS', + }, + 153: { + 'KodN': 2, + 'KodParlimen': 13, + 'KodKawasan': 13, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MANSOR BIN ABD RAHMAN', + 'parti': 'BN', + }, + 154: { + 'KodN': 2, + 'KodParlimen': 13, + 'KodKawasan': 13, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'AHMAD TARMIZI BIN SULAIMAN', + 'parti': 'PAS', + }, + 155: { + 'KodN': 2, + 'KodParlimen': 13, + 'KodKawasan': 13, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'AZLI BIN UDA', + 'parti': 'PKR', + }, + 156: { + 'KodN': 2, + 'KodParlimen': 13, + 'KodKawasan': 1323, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD TAJUDIN BIN ABDULLAH', + 'parti': 'BN', + }, + 157: { + 'KodN': 2, + 'KodParlimen': 13, + 'KodKawasan': 1323, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD ISA BIN SHAFIE', + 'parti': 'PAS', + }, + 158: { + 'KodN': 2, + 'KodParlimen': 13, + 'KodKawasan': 1323, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ABDUL RASHID BIN ABDULLAH', + 'parti': 'PKR', + }, + 159: { + 'KodN': 2, + 'KodParlimen': 13, + 'KodKawasan': 1324, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD NAZRI BIN ABU HASSAN', + 'parti': 'PKR', + }, + 160: { + 'KodN': 2, + 'KodParlimen': 13, + 'KodKawasan': 1324, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MAHADZIR BIN ABDUL HAMID', + 'parti': 'BN', + }, + 161: { + 'KodN': 2, + 'KodParlimen': 13, + 'KodKawasan': 1324, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MUHAMMAD SANUSI BIN MD NOR', + 'parti': 'PAS', + }, + 162: { + 'KodN': 2, + 'KodParlimen': 14, + 'KodKawasan': 14, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'NOR AZRINA BINTI SURIP', + 'parti': 'PKR', + }, + 163: { + 'KodN': 2, + 'KodParlimen': 14, + 'KodKawasan': 14, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DATO HAJI TAJUL URUS BIN HAJI MAT ZAIN', + 'parti': 'BN', + }, + 164: { + 'KodN': 2, + 'KodParlimen': 14, + 'KodKawasan': 14, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'AHMAD FAUZI BIN RAMLI', + 'parti': 'PAS', + }, + 165: { + 'KodN': 2, + 'KodParlimen': 14, + 'KodKawasan': 1425, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'R SUMMUGAM A/L RENGASAMY', + 'parti': 'PKR', + }, + 166: { + 'KodN': 2, + 'KodParlimen': 14, + 'KodKawasan': 1425, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'JASPAL SINGH A/L GURBAKHES SINGH', + 'parti': 'BN', + }, + 167: { + 'KodN': 2, + 'KodParlimen': 14, + 'KodKawasan': 1425, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HAJI MOHD ALI BIN SULAIMAN', + 'parti': 'PAS', + }, + 168: { + 'KodN': 2, + 'KodParlimen': 14, + 'KodKawasan': 1426, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ANNUAR BIN AHMAD', + 'parti': 'BN', + }, + 169: { + 'KodN': 2, + 'KodParlimen': 14, + 'KodKawasan': 1426, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HANIF BIN GHAZALI', + 'parti': 'PAS', + }, + 170: { + 'KodN': 2, + 'KodParlimen': 14, + 'KodKawasan': 1426, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MEJAR (B) ANUAR BIN ABDUL HAMID', + 'parti': 'PKR', + }, + 171: { + 'KodN': 2, + 'KodParlimen': 15, + 'KodKawasan': 15, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DATO JOHARI BIN ABDUL', + 'parti': 'PKR', + }, + 172: { + 'KodN': 2, + 'KodParlimen': 15, + 'KodKawasan': 15, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'SHARIR BIN LONG', + 'parti': 'PAS', + }, + 173: { + 'KodN': 2, + 'KodParlimen': 15, + 'KodKawasan': 15, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DATO SHAHANIM BINTI MOHAMAD YUSOFF', + 'parti': 'BN', + }, + 174: { + 'KodN': 2, + 'KodParlimen': 15, + 'KodKawasan': 15, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'SRITHARAN A/L PICHATU', + 'parti': 'PRM', + }, + 175: { + 'KodN': 2, + 'KodParlimen': 15, + 'KodKawasan': 1527, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ROSLI BIN YUSUF', + 'parti': 'PKR', + }, + 176: { + 'KodN': 2, + 'KodParlimen': 15, + 'KodKawasan': 1527, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AHMAD FADZLI BIN HASHIM', + 'parti': 'PAS', + }, + 177: { + 'KodN': 2, + 'KodParlimen': 15, + 'KodKawasan': 1527, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DATO ALI BIN YAHAYA', + 'parti': 'BN', + }, + 178: { + 'KodN': 2, + 'KodParlimen': 15, + 'KodKawasan': 1528, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'TAN HOCK HUAT', + 'parti': 'BEBAS', + }, + 179: { + 'KodN': 2, + 'KodParlimen': 15, + 'KodKawasan': 1528, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'OTHMAN BIN CHE MEE', + 'parti': 'PAS', + }, + 180: { + 'KodN': 2, + 'KodParlimen': 15, + 'KodKawasan': 1528, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'SIMON OOI TZE MIN', + 'parti': 'PKR', + }, + 181: { + 'KodN': 2, + 'KodParlimen': 15, + 'KodKawasan': 1528, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'KO HUNG WENG', + 'parti': 'BN', + }, + 182: { + 'KodN': 2, + 'KodParlimen': 15, + 'KodKawasan': 1528, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'TAN KEE CHYE', + 'parti': 'PRM', + }, + 183: { + 'KodN': 2, + 'KodParlimen': 15, + 'KodKawasan': 1529, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DR ROBERT LING KUI EE', + 'parti': 'PKR', + }, + 184: { + 'KodN': 2, + 'KodParlimen': 15, + 'KodKawasan': 1529, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'NURHIDAYAH FOO BINTI ABDULLAH', + 'parti': 'PAS', + }, + 185: { + 'KodN': 2, + 'KodParlimen': 15, + 'KodKawasan': 1529, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'TAN KOK SEONG', + 'parti': 'BN', + }, + 186: { + 'KodN': 2, + 'KodParlimen': 15, + 'KodKawasan': 1529, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'MOHD HASHIM BIN SAALUDIN', + 'parti': 'PRM', + }, + 187: { + 'KodN': 2, + 'KodParlimen': 16, + 'KodKawasan': 16, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'ABDUL AZEEZ BIN ABDUL RAHIM', + 'parti': 'BN', + }, + 188: { + 'KodN': 2, + 'KodParlimen': 16, + 'KodKawasan': 16, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'HASSAN BIN SAAD', + 'parti': 'PAS', + }, + 189: { + 'KodN': 2, + 'KodParlimen': 16, + 'KodKawasan': 16, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'MOHD TAUFIK BIN YAACOB', + 'parti': 'PKR', + }, + 190: { + 'KodN': 2, + 'KodParlimen': 16, + 'KodKawasan': 1630, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHAMED NOOR BIN MOHAMED AMIN', + 'parti': 'BN', + }, + 191: { + 'KodN': 2, + 'KodParlimen': 16, + 'KodKawasan': 1630, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ABD NASIR BIN IDRIS', + 'parti': 'PAS', + }, + 192: { + 'KodN': 2, + 'KodParlimen': 16, + 'KodKawasan': 1630, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ABD RAHIM BIN KECHIK@WAN CHIK', + 'parti': 'PKR', + }, + 193: { + 'KodN': 2, + 'KodParlimen': 16, + 'KodKawasan': 1631, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HARUN BIN ABUL AZIZ', + 'parti': 'BN', + }, + 194: { + 'KodN': 2, + 'KodParlimen': 16, + 'KodKawasan': 1631, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'JOHARI BIN ABDULLAH', + 'parti': 'PKR', + }, + 195: { + 'KodN': 2, + 'KodParlimen': 16, + 'KodKawasan': 1631, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'NAJMI BIN AHMAD', + 'parti': 'PAS', + }, + 196: { + 'KodN': 2, + 'KodParlimen': 16, + 'KodKawasan': 1632, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD KHAIRUL AZHAR BIN ABDULLAH', + 'parti': 'BN', + }, + 197: { + 'KodN': 2, + 'KodParlimen': 16, + 'KodKawasan': 1632, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MANSOR BIN ZAKARIA', + 'parti': 'PAS', + }, + 198: { + 'KodN': 2, + 'KodParlimen': 16, + 'KodKawasan': 1632, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHAMAD SOFEE BIN RAZAK', + 'parti': 'PKR', + }, + 199: { + 'KodN': 2, + 'KodParlimen': 17, + 'KodKawasan': 17, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MUHAMAD SOBRI BIN OSMAN', + 'parti': 'PAS', + }, + 200: { + 'KodN': 2, + 'KodParlimen': 17, + 'KodKawasan': 17, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'LEONG YONG KONG ', + 'parti': 'BN', + }, + 201: { + 'KodN': 2, + 'KodParlimen': 17, + 'KodKawasan': 17, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'KARUPAIYA A/L MUTUSAMI', + 'parti': 'PKR', + }, + 202: { + 'KodN': 2, + 'KodParlimen': 17, + 'KodKawasan': 1733, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ASMADI BIN ABU TALIB', + 'parti': 'BN', + }, + 203: { + 'KodN': 2, + 'KodParlimen': 17, + 'KodKawasan': 1733, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATO SITI ASHAH BINTI GHAZALI', + 'parti': 'PAS', + }, + 204: { + 'KodN': 2, + 'KodParlimen': 17, + 'KodKawasan': 1733, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ABD RAZAK BIN SALLEH', + 'parti': 'PKR', + }, + 205: { + 'KodN': 2, + 'KodParlimen': 17, + 'KodKawasan': 1734, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'AZMAN BIN NASRUDIN', + 'parti': 'PKR', + }, + 206: { + 'KodN': 2, + 'KodParlimen': 17, + 'KodKawasan': 1734, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AHMAD TAUFIQ BIN BAHARUM', + 'parti': 'PAS', + }, + 207: { + 'KodN': 2, + 'KodParlimen': 17, + 'KodKawasan': 1734, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'THURAISINGAM A/L K.S MUTHU', + 'parti': 'BN', + }, + 208: { + 'KodN': 2, + 'KodParlimen': 18, + 'KodKawasan': 18, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': "DATO' ABD AZIZ BIN HJ SHEIKH FADZIR", + 'parti': 'BN', + }, + 209: { + 'KodN': 2, + 'KodParlimen': 18, + 'KodKawasan': 18, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': "DATO' SAIFUDDIN NASUTION ISMAIL", + 'parti': 'PKR', + }, + 210: { + 'KodN': 2, + 'KodParlimen': 18, + 'KodKawasan': 18, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'USTAZ HASSAN RAZAK', + 'parti': 'PAS', + }, + 211: { + 'KodN': 2, + 'KodParlimen': 18, + 'KodKawasan': 1835, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'CHUA THIONG GEE', + 'parti': 'BN', + }, + 212: { + 'KodN': 2, + 'KodParlimen': 18, + 'KodKawasan': 1835, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD KHAIRI SALLEH', + 'parti': 'PAS', + }, + 213: { + 'KodN': 2, + 'KodParlimen': 18, + 'KodKawasan': 1836, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': "DATO' NORSABRINA BINTI MOHD NOOR", + 'parti': 'BN', + }, + 214: { + 'KodN': 2, + 'KodParlimen': 18, + 'KodKawasan': 1836, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': "DATO' AZIMI BIN DAIM", + 'parti': 'PKR', + }, + 215: { + 'KodN': 3, + 'KodParlimen': 19, + 'KodKawasan': 19, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DATUK WAN JOHANI BIN WAN HUSSIN', + 'parti': 'BN', + }, + 216: { + 'KodN': 3, + 'KodParlimen': 19, + 'KodKawasan': 19, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DATO HJ CHE ABDULLAH B MAT NAWI', + 'parti': 'PAS', + }, + 217: { + 'KodN': 3, + 'KodParlimen': 19, + 'KodKawasan': 19, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DATUK HJ NORDIN BIN SALLEH', + 'parti': 'PKR', + }, + 218: { + 'KodN': 3, + 'KodParlimen': 19, + 'KodKawasan': 1901, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HJ MAT RAZI BIN MAT AIL', + 'parti': 'BN', + }, + 219: { + 'KodN': 3, + 'KodParlimen': 19, + 'KodKawasan': 1901, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HJ WAN ROSLAN BIN WAN HAMAT', + 'parti': 'PAS', + }, + 220: { + 'KodN': 3, + 'KodParlimen': 19, + 'KodKawasan': 1901, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DATO WAN ROSDI BIN RASIK', + 'parti': 'PKR', + }, + 221: { + 'KodN': 3, + 'KodParlimen': 19, + 'KodKawasan': 1902, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'NIK FAIZAH BT NIK OTHMAN', + 'parti': 'PKR', + }, + 222: { + 'KodN': 3, + 'KodParlimen': 19, + 'KodKawasan': 1902, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HASHIM BIN MOHAMAD', + 'parti': 'BN', + }, + 223: { + 'KodN': 3, + 'KodParlimen': 19, + 'KodKawasan': 1902, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HJ ADNAN BIN HASSAN', + 'parti': 'PAS', + }, + 224: { + 'KodN': 3, + 'KodParlimen': 19, + 'KodKawasan': 1903, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATO BENTARA KANAN HJ AHMAD BIN YAKOB', + 'parti': 'PAS', + }, + 225: { + 'KodN': 3, + 'KodParlimen': 19, + 'KodKawasan': 1903, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'WAN JOHARI BIN WAN OMAR', + 'parti': 'PKR', + }, + 226: { + 'KodN': 3, + 'KodParlimen': 19, + 'KodKawasan': 1903, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'WAN MOHD SANUSI BIN WAN YUNUS', + 'parti': 'BN', + }, + 227: { + 'KodN': 3, + 'KodParlimen': 19, + 'KodKawasan': 1904, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD KHIR ZAHRI BIN ABDUL GHANI', + 'parti': 'PKR', + }, + 228: { + 'KodN': 3, + 'KodParlimen': 19, + 'KodKawasan': 1904, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HJ ROSLI BIN ABDULLAH', + 'parti': 'PAS', + }, + 229: { + 'KodN': 3, + 'KodParlimen': 19, + 'KodKawasan': 1904, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DATUK HJ MOHD ROSDI B AB AZIZ', + 'parti': 'BN', + }, + 230: { + 'KodN': 3, + 'KodParlimen': 20, + 'KodKawasan': 20, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'MOHAMAD BIN IBRAHIM', + 'parti': 'PKR', + }, + 231: { + 'KodN': 3, + 'KodParlimen': 20, + 'KodKawasan': 20, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'AHMAD MARZUK BIN SHAARY', + 'parti': 'PAS', + }, + 232: { + 'KodN': 3, + 'KodParlimen': 20, + 'KodKawasan': 20, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'ZALUZI BIN SULAIMAN', + 'parti': 'BN', + }, + 233: { + 'KodN': 3, + 'KodParlimen': 20, + 'KodKawasan': 2005, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'NIK AZMI BIN NIK MAN@NIK OSMAN', + 'parti': 'PKR', + }, + 234: { + 'KodN': 3, + 'KodParlimen': 20, + 'KodKawasan': 2005, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'WAN SHAHRUL AZUAN BIN WAN AB AZIZ', + 'parti': 'BN', + }, + 235: { + 'KodN': 3, + 'KodParlimen': 20, + 'KodKawasan': 2005, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'IZANI BIN HUSIN', + 'parti': 'PAS', + }, + 236: { + 'KodN': 3, + 'KodParlimen': 20, + 'KodKawasan': 2006, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHAMED FAREEZ BIN NOOR AMRAN ', + 'parti': 'BN', + }, + 237: { + 'KodN': 3, + 'KodParlimen': 20, + 'KodKawasan': 2006, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AHMAD FATHAN BIN MAHMOOD @ MAHAMAD', + 'parti': 'PAS', + }, + 238: { + 'KodN': 3, + 'KodParlimen': 20, + 'KodKawasan': 2006, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'NIK OMAR BIN NIK AB. AZIZ', + 'parti': 'PKR', + }, + 239: { + 'KodN': 3, + 'KodParlimen': 20, + 'KodKawasan': 2007, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD AMAR BIN ABDULLAH', + 'parti': 'PAS', + }, + 240: { + 'KodN': 3, + 'KodParlimen': 20, + 'KodKawasan': 2007, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ZARINA BINTI EUSOPE', + 'parti': 'BN', + }, + 241: { + 'KodN': 3, + 'KodParlimen': 20, + 'KodKawasan': 2007, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD ZULHAZMI BIN HASSAN', + 'parti': 'PKR', + }, + 242: { + 'KodN': 3, + 'KodParlimen': 21, + 'KodKawasan': 21, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'FIKHRAN HAMSHI BIN MOHAMAD FATMI', + 'parti': 'BN', + }, + 243: { + 'KodN': 3, + 'KodParlimen': 21, + 'KodKawasan': 21, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'HUSAM BIN MUSA', + 'parti': 'PKR', + }, + 244: { + 'KodN': 3, + 'KodParlimen': 21, + 'KodKawasan': 21, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'TAKIYUDDIN BIN HASSAN', + 'parti': 'PAS', + }, + 245: { + 'KodN': 3, + 'KodParlimen': 21, + 'KodKawasan': 2108, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MADIHAH BINTI ABDUL AZIZ', + 'parti': 'BN', + }, + 246: { + 'KodN': 3, + 'KodParlimen': 21, + 'KodKawasan': 2108, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HAFIDZAH BIN MUSTAKIM', + 'parti': 'PKR', + }, + 247: { + 'KodN': 3, + 'KodParlimen': 21, + 'KodKawasan': 2108, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ROHANI BINTI IBRAHIM', + 'parti': 'PAS', + }, + 248: { + 'KodN': 3, + 'KodParlimen': 21, + 'KodKawasan': 2109, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'CHUA HOCK KUAN', + 'parti': 'BN', + }, + 249: { + 'KodN': 3, + 'KodParlimen': 21, + 'KodKawasan': 2109, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ANUAR TAN BIN ABDULLAH', + 'parti': 'PAS', + }, + 250: { + 'KodN': 3, + 'KodParlimen': 21, + 'KodKawasan': 2109, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ABDUL RASHID BIN RAHMAN', + 'parti': 'PKR', + }, + 251: { + 'KodN': 3, + 'KodParlimen': 21, + 'KodKawasan': 2110, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SANUSI BIN OTHMAN', + 'parti': 'PKR', + }, + 252: { + 'KodN': 3, + 'KodParlimen': 21, + 'KodKawasan': 2110, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHAMED HASNAN BIN CHE HUSSIN', + 'parti': 'BN', + }, + 253: { + 'KodN': 3, + 'KodParlimen': 21, + 'KodKawasan': 2110, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DR RAMLI BIN MAMAT', + 'parti': 'PAS', + }, + 254: { + 'KodN': 3, + 'KodParlimen': 22, + 'KodKawasan': 22, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'NOR AZMAWI BIN AB RAHMAN', + 'parti': 'BN', + }, + 255: { + 'KodN': 3, + 'KodParlimen': 22, + 'KodKawasan': 22, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'AHMAD FADHLI BIN SHAARI', + 'parti': 'PAS', + }, + 256: { + 'KodN': 3, + 'KodParlimen': 22, + 'KodKawasan': 22, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': "DATO' PADUKA HJ DR IBRAHIM BIN ALI", + 'parti': 'BEBAS', + }, + 257: { + 'KodN': 3, + 'KodParlimen': 22, + 'KodKawasan': 22, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'CHE UJANG BIN CHE DAUD', + 'parti': 'PKR', + }, + 258: { + 'KodN': 3, + 'KodParlimen': 22, + 'KodKawasan': 2211, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': "DATO' YAHAYA BIN MAMAT", + 'parti': 'BN', + }, + 259: { + 'KodN': 3, + 'KodParlimen': 22, + 'KodKawasan': 2211, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ROZI BIN MOHAMAD', + 'parti': 'PAS', + }, + 260: { + 'KodN': 3, + 'KodParlimen': 22, + 'KodKawasan': 2211, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DR WAN ZUKHAIRY BIN WAN ZAIN', + 'parti': 'PKR', + }, + 261: { + 'KodN': 3, + 'KodParlimen': 22, + 'KodKawasan': 2211, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': "DATO' PADUKA HJ DR IBRAHIM BIN ALI", + 'parti': 'BEBAS', + }, + 262: { + 'KodN': 3, + 'KodParlimen': 22, + 'KodKawasan': 2212, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': "DR SYA'RANI BIN MOHD NAIM", + 'parti': 'PKR', + }, + 263: { + 'KodN': 3, + 'KodParlimen': 22, + 'KodKawasan': 2212, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'CHE JOHAN BIN CHE PA', + 'parti': 'BN', + }, + 264: { + 'KodN': 3, + 'KodParlimen': 22, + 'KodKawasan': 2212, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': "DATO' HJ HANIFA BIN AHMAD", + 'parti': 'PAS', + }, + 265: { + 'KodN': 3, + 'KodParlimen': 22, + 'KodKawasan': 2212, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'IR SUHARTO BIN MAT NASIR', + 'parti': 'BEBAS', + }, + 266: { + 'KodN': 3, + 'KodParlimen': 22, + 'KodKawasan': 2213, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'AHMAD ANUAR BIN HUSIN', + 'parti': 'BN', + }, + 267: { + 'KodN': 3, + 'KodParlimen': 22, + 'KodKawasan': 2213, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': "DATO' HJ MOHD NASSURRUDIN", + 'parti': 'PAS', + }, + 268: { + 'KodN': 3, + 'KodParlimen': 22, + 'KodKawasan': 2213, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD ROMIZU BIN ALI', + 'parti': 'PKR', + }, + 269: { + 'KodN': 3, + 'KodParlimen': 22, + 'KodKawasan': 2213, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'CHE DAUD BIN CHE MAN', + 'parti': 'BEBAS', + }, + 270: { + 'KodN': 3, + 'KodParlimen': 23, + 'KodKawasan': 23, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'ABDULLAH BIN MAT YASIM', + 'parti': 'BN', + }, + 271: { + 'KodN': 3, + 'KodParlimen': 23, + 'KodKawasan': 23, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'ZAILAH BINTI MOHD YUSOFF', + 'parti': 'PAS', + }, + 272: { + 'KodN': 3, + 'KodParlimen': 23, + 'KodKawasan': 23, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'WAN SHAH JIHAN BIN WAN DIN', + 'parti': 'PKR', + }, + 273: { + 'KodN': 3, + 'KodParlimen': 23, + 'KodKawasan': 2314, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MUHAMMAD AFIFI BIN MUHAMMAD NOOR', + 'parti': 'BN', + }, + 274: { + 'KodN': 3, + 'KodParlimen': 23, + 'KodKawasan': 2314, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'ZURAIDIN BIN ABDULLAH', + 'parti': 'PAS', + }, + 275: { + 'KodN': 3, + 'KodParlimen': 23, + 'KodKawasan': 2314, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ALI ABDU RAHMAN BIN HASAN', + 'parti': 'PKR', + }, + 276: { + 'KodN': 3, + 'KodParlimen': 23, + 'KodKawasan': 2314, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ZAKARIA BIN HASSAN', + 'parti': 'BEBAS', + }, + 277: { + 'KodN': 3, + 'KodParlimen': 23, + 'KodKawasan': 2315, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'GHAZALI BIN ISMAIL', + 'parti': 'BN', + }, + 278: { + 'KodN': 3, + 'KodParlimen': 23, + 'KodKawasan': 2315, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD RIDZUAN BIN MUHAMAD', + 'parti': 'PKR', + }, + 279: { + 'KodN': 3, + 'KodParlimen': 23, + 'KodKawasan': 2315, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHAMAD BIN AWANG', + 'parti': 'PAS', + }, + 280: { + 'KodN': 3, + 'KodParlimen': 23, + 'KodKawasan': 2316, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'AKBAR BIN SALIM', + 'parti': 'BN', + }, + 281: { + 'KodN': 3, + 'KodParlimen': 23, + 'KodKawasan': 2316, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ABDUL RASUL BIN MOHAMED', + 'parti': 'PAS', + }, + 282: { + 'KodN': 3, + 'KodParlimen': 23, + 'KodKawasan': 2316, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD HISYAMUDDIN BIN GHAZALI', + 'parti': 'PKR', + }, + 283: { + 'KodN': 3, + 'KodParlimen': 24, + 'KodKawasan': 24, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DATO SRI MUHAMMAD BIN ABDUL GHANI', + 'parti': 'BN', + }, + 284: { + 'KodN': 3, + 'KodParlimen': 24, + 'KodKawasan': 24, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'TUAN IBRAHIM B. TUAN MAN', + 'parti': 'PAS', + }, + 285: { + 'KodN': 3, + 'KodParlimen': 24, + 'KodKawasan': 24, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DR ABDUL HALIM B YUSOF', + 'parti': 'PKR', + }, + 286: { + 'KodN': 3, + 'KodParlimen': 24, + 'KodKawasan': 2417, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHAMAD NOORDIN BIN HAJI AWANG', + 'parti': 'BN', + }, + 287: { + 'KodN': 3, + 'KodParlimen': 24, + 'KodKawasan': 2417, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'SAIFUL ADLI B ABU BAKAR', + 'parti': 'PAS', + }, + 288: { + 'KodN': 3, + 'KodParlimen': 24, + 'KodKawasan': 2417, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HUSAM B MUSA', + 'parti': 'PKR', + }, + 289: { + 'KodN': 3, + 'KodParlimen': 24, + 'KodKawasan': 2418, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'BAKRI BIN YUSOFF', + 'parti': 'BN', + }, + 290: { + 'KodN': 3, + 'KodParlimen': 24, + 'KodKawasan': 2418, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ABDUL RAHMAN B YUNUS', + 'parti': 'PAS', + }, + 291: { + 'KodN': 3, + 'KodParlimen': 24, + 'KodKawasan': 2418, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD NOR YAZID', + 'parti': 'PKR', + }, + 292: { + 'KodN': 3, + 'KodParlimen': 24, + 'KodKawasan': 2419, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'NURUL AMAL BIN MOHD FAUZI', + 'parti': 'BN', + }, + 293: { + 'KodN': 3, + 'KodParlimen': 24, + 'KodKawasan': 2419, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'WAN AHMAD KAMIL ABDULLAH', + 'parti': 'PKR', + }, + 294: { + 'KodN': 3, + 'KodParlimen': 24, + 'KodKawasan': 2419, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MUMTAZ BT MD NAWI', + 'parti': 'PAS', + }, + 295: { + 'KodN': 3, + 'KodParlimen': 25, + 'KodKawasan': 25, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MOHD ZULKIFLI BIN HJ ZAKARIA', + 'parti': 'PKR', + }, + 296: { + 'KodN': 3, + 'KodParlimen': 25, + 'KodKawasan': 25, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'NIK MOHAMAD ABDUH BIN NIK ABDUL AZIZ', + 'parti': 'PAS', + }, + 297: { + 'KodN': 3, + 'KodParlimen': 25, + 'KodKawasan': 25, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'AWANG ADEK BIN HUSSIN', + 'parti': 'BN', + }, + 298: { + 'KodN': 3, + 'KodParlimen': 25, + 'KodKawasan': 2520, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD RADZUAN BIN ABDULLAH', + 'parti': 'BN', + }, + 299: { + 'KodN': 3, + 'KodParlimen': 25, + 'KodKawasan': 2520, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HASSAN BIN MOHAMOOD', + 'parti': 'PAS', + }, + 300: { + 'KodN': 3, + 'KodParlimen': 25, + 'KodKawasan': 2521, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ILIAS BIN HUSAIN', + 'parti': 'BN', + }, + 301: { + 'KodN': 3, + 'KodParlimen': 25, + 'KodKawasan': 2521, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD HUZAIMI BIN CHE HUSSIN', + 'parti': 'PKR', + }, + 302: { + 'KodN': 3, + 'KodParlimen': 25, + 'KodKawasan': 2521, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ISMAIL BIN GHANI', + 'parti': 'PKR', + }, + 303: { + 'KodN': 3, + 'KodParlimen': 25, + 'KodKawasan': 2522, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD RADZUAN BIN HAMAT', + 'parti': 'BN', + }, + 304: { + 'KodN': 3, + 'KodParlimen': 25, + 'KodKawasan': 2522, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ABDUL AZZIZ BIN KADIR', + 'parti': 'PAS', + }, + 305: { + 'KodN': 3, + 'KodParlimen': 25, + 'KodKawasan': 2522, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD FAMI BIN ZAKARIA', + 'parti': 'PKR', + }, + 306: { + 'KodN': 3, + 'KodParlimen': 26, + 'KodKawasan': 26, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'ANNUAR BIN MUSA', + 'parti': 'BN', + }, + 307: { + 'KodN': 3, + 'KodParlimen': 26, + 'KodKawasan': 26, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'WAN ISMAIL BIN WAN JUSOH', + 'parti': 'PAS', + }, + 308: { + 'KodN': 3, + 'KodParlimen': 26, + 'KodKawasan': 26, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'RADZI BIN JIDIN', + 'parti': 'PKR', + }, + 309: { + 'KodN': 3, + 'KodParlimen': 26, + 'KodKawasan': 2623, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AZMI BIN ISHAK', + 'parti': 'BN', + }, + 310: { + 'KodN': 3, + 'KodParlimen': 26, + 'KodKawasan': 2623, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MD YUSNAN BIN YUSOF', + 'parti': 'PAS', + }, + 311: { + 'KodN': 3, + 'KodParlimen': 26, + 'KodKawasan': 2623, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'AZIZ BIN KADIR', + 'parti': 'PKR', + }, + 312: { + 'KodN': 3, + 'KodParlimen': 26, + 'KodKawasan': 2624, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHAMMAD AZAM BIN ISMAIL', + 'parti': 'BN', + }, + 313: { + 'KodN': 3, + 'KodParlimen': 26, + 'KodKawasan': 2624, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AZAMI BIN MOHD NOR', + 'parti': 'PAS', + }, + 314: { + 'KodN': 3, + 'KodParlimen': 26, + 'KodKawasan': 2624, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'CHE IBRAHIM BIN MOHAMMAD', + 'parti': 'PKR', + }, + 315: { + 'KodN': 3, + 'KodParlimen': 26, + 'KodKawasan': 2625, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MD ALWI BIN CHE AHMAD', + 'parti': 'BN', + }, + 316: { + 'KodN': 3, + 'KodParlimen': 26, + 'KodKawasan': 2625, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'NIK MAHADI BIN NIK MAHMOOD', + 'parti': 'PAS', + }, + 317: { + 'KodN': 3, + 'KodParlimen': 26, + 'KodKawasan': 2625, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD HANAFI BIN ISMAIL', + 'parti': 'PKR', + }, + 318: { + 'KodN': 3, + 'KodParlimen': 27, + 'KodKawasan': 27, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'IKMAL HISHAM BIN ABDUL AZIZ', + 'parti': 'BN', + }, + 319: { + 'KodN': 3, + 'KodParlimen': 27, + 'KodKawasan': 27, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'JOHARI BIN MAT', + 'parti': 'PAS', + }, + 320: { + 'KodN': 3, + 'KodParlimen': 27, + 'KodKawasan': 27, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'FAUZI BIN ZAKARIA', + 'parti': 'PKR', + }, + 321: { + 'KodN': 3, + 'KodParlimen': 27, + 'KodKawasan': 2726, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DYG SANIAH BINTI AWG HAMID', + 'parti': 'BN', + }, + 322: { + 'KodN': 3, + 'KodParlimen': 27, + 'KodKawasan': 2726, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HISHAM BIN FAUZI', + 'parti': 'PKR', + }, + 323: { + 'KodN': 3, + 'KodParlimen': 27, + 'KodKawasan': 2726, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ABDUL FATTAH BIN HAJI MAHMOOD', + 'parti': 'PAS', + }, + 324: { + 'KodN': 3, + 'KodParlimen': 27, + 'KodKawasan': 2727, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'BAKRI @MOHD BAKRI BIN MUSTAPHA', + 'parti': 'BN', + }, + 325: { + 'KodN': 3, + 'KodParlimen': 27, + 'KodKawasan': 2727, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD SOBA BIN HUSSIN', + 'parti': 'PKR', + }, + 326: { + 'KodN': 3, + 'KodParlimen': 27, + 'KodKawasan': 2727, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'WAN YUSOF BIN WAN MUSTAFFA', + 'parti': 'PAS', + }, + 327: { + 'KodN': 3, + 'KodParlimen': 27, + 'KodKawasan': 2728, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MD ANIZAM BIN AB RAHMAN', + 'parti': 'PAS', + }, + 328: { + 'KodN': 3, + 'KodParlimen': 27, + 'KodKawasan': 2728, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'WAN RAKEMI BIN WAN ZAHARI', + 'parti': 'BN', + }, + 329: { + 'KodN': 3, + 'KodParlimen': 27, + 'KodKawasan': 2728, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'BAHARI BIN MOHAMAD NOOR', + 'parti': 'PKR', + }, + 330: { + 'KodN': 3, + 'KodParlimen': 28, + 'KodKawasan': 28, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DATO DR. ASYRAF WAJDI BIN DUSUKI', + 'parti': 'BN', + }, + 331: { + 'KodN': 3, + 'KodParlimen': 28, + 'KodKawasan': 28, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DATO DR. NIK ZAWAWI BIN SALLEH', + 'parti': 'PAS', + }, + 332: { + 'KodN': 3, + 'KodParlimen': 28, + 'KodKawasan': 28, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DATUK KAMARUDDIN BIN MOHD NOOR', + 'parti': 'PKR', + }, + 333: { + 'KodN': 3, + 'KodParlimen': 28, + 'KodKawasan': 2829, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'TUAN SARIPUDDIN BIN TUAN ISMAIL', + 'parti': 'PAS', + }, + 334: { + 'KodN': 3, + 'KodParlimen': 28, + 'KodKawasan': 2829, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ZULKIFLE BIN ALI', + 'parti': 'BN', + }, + 335: { + 'KodN': 3, + 'KodParlimen': 28, + 'KodKawasan': 2829, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ISMAIL BIN MOHAMAD', + 'parti': 'PKR', + }, + 336: { + 'KodN': 3, + 'KodParlimen': 28, + 'KodKawasan': 2830, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD HANAFIAH BIN MOHD AZIZ', + 'parti': 'BN', + }, + 337: { + 'KodN': 3, + 'KodParlimen': 28, + 'KodKawasan': 2830, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHAMED NAZLAN BIN MOHD HASBULLAH', + 'parti': 'PAS', + }, + 338: { + 'KodN': 3, + 'KodParlimen': 28, + 'KodKawasan': 2830, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ZARIR BIN YAACOB', + 'parti': 'PKR', + }, + 339: { + 'KodN': 3, + 'KodParlimen': 28, + 'KodKawasan': 2831, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ZAWAWI BIN OTHMAN', + 'parti': 'BN', + }, + 340: { + 'KodN': 3, + 'KodParlimen': 28, + 'KodKawasan': 2831, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'WAN HASSAN BIN WAN IBRAHIM', + 'parti': 'PAS', + }, + 341: { + 'KodN': 3, + 'KodParlimen': 28, + 'KodKawasan': 2831, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'WAN MARZUDI BIN WAN OMAR', + 'parti': 'PKR', + }, + 342: { + 'KodN': 3, + 'KodParlimen': 28, + 'KodKawasan': 2832, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATO DR. MOHD KAISAN BIN AB RAHMAN', + 'parti': 'BN', + }, + 343: { + 'KodN': 3, + 'KodParlimen': 28, + 'KodKawasan': 2832, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': "MOHD RODZI BIN JA'AFAR", + 'parti': 'PAS', + }, + 344: { + 'KodN': 3, + 'KodParlimen': 28, + 'KodKawasan': 2832, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ABDUL RAHMAN ', + 'parti': 'PKR', + }, + 345: { + 'KodN': 3, + 'KodParlimen': 29, + 'KodKawasan': 29, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'ZULKIFLI BIN MAMAT', + 'parti': 'PAS', + }, + 346: { + 'KodN': 3, + 'KodParlimen': 29, + 'KodKawasan': 29, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'SAZMI BIN MIAH', + 'parti': 'PKR', + }, + 347: { + 'KodN': 3, + 'KodParlimen': 29, + 'KodKawasan': 29, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'AHMAD JAZLAN BIN YAAKUB', + 'parti': 'BN', + }, + 348: { + 'KodN': 3, + 'KodParlimen': 29, + 'KodKawasan': 2933, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'AHMAD TARMIZI BIN ISMAIL', + 'parti': 'BN', + }, + 349: { + 'KodN': 3, + 'KodParlimen': 29, + 'KodKawasan': 2933, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'USTAZ AZHAR BIN SALLEH', + 'parti': 'PAS', + }, + 350: { + 'KodN': 3, + 'KodParlimen': 29, + 'KodKawasan': 2933, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AB HALIM @ KAMARUDDIN BIN HAJI AB KADI', + 'parti': 'PKR', + }, + 351: { + 'KodN': 3, + 'KodParlimen': 29, + 'KodKawasan': 2934, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'WAN MOHD ADNAN BIN WAN AZIZ', + 'parti': 'BN', + }, + 352: { + 'KodN': 3, + 'KodParlimen': 29, + 'KodKawasan': 2934, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD REDZUAN BIN ALIAS', + 'parti': 'PKR', + }, + 353: { + 'KodN': 3, + 'KodParlimen': 29, + 'KodKawasan': 2934, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHAMED FADZLI BIN HASSAN', + 'parti': 'PAS', + }, + 354: { + 'KodN': 3, + 'KodParlimen': 29, + 'KodKawasan': 2935, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ERIANDI BIN ISMAIL', + 'parti': 'BN', + }, + 355: { + 'KodN': 3, + 'KodParlimen': 29, + 'KodKawasan': 2935, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD ROSELI BIN ISMAIL', + 'parti': 'PAS', + }, + 356: { + 'KodN': 3, + 'KodParlimen': 29, + 'KodKawasan': 2935, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ABDUL KADIR BIN OTHMAN', + 'parti': 'PKR', + }, + 357: { + 'KodN': 3, + 'KodParlimen': 30, + 'KodKawasan': 30, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'YB. DATO’ HAJI MUSTAPA BIN MOHAMED', + 'parti': 'BN', + }, + 358: { + 'KodN': 3, + 'KodParlimen': 30, + 'KodKawasan': 30, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'MUHAMMAD HAMID', + 'parti': 'PAS', + }, + 359: { + 'KodN': 3, + 'KodParlimen': 30, + 'KodKawasan': 30, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'AZRAN ARIFFIN', + 'parti': 'PKR', + }, + 360: { + 'KodN': 3, + 'KodParlimen': 30, + 'KodKawasan': 3036, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'YB. DATUK HAJI MOHD ADHAN KECHIK', + 'parti': 'BN', + }, + 361: { + 'KodN': 3, + 'KodParlimen': 30, + 'KodKawasan': 3036, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ROMZI', + 'parti': 'PAS', + }, + 362: { + 'KodN': 3, + 'KodParlimen': 30, + 'KodKawasan': 3036, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ASLAN', + 'parti': 'PKR', + }, + 363: { + 'KodN': 3, + 'KodParlimen': 30, + 'KodKawasan': 3037, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'YB. DATO’ HAJI MUSTAPA BIN MOHAMED', + 'parti': 'BN', + }, + 364: { + 'KodN': 3, + 'KodParlimen': 30, + 'KodKawasan': 3037, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': "ABDULLAH YA'KUB", + 'parti': 'PAS', + }, + 365: { + 'KodN': 3, + 'KodParlimen': 30, + 'KodKawasan': 3037, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'AMINUDDIN B YAACUB', + 'parti': 'PKR', + }, + 366: { + 'KodN': 3, + 'KodParlimen': 30, + 'KodKawasan': 3038, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'YB. DATUK HAJI ABDUL AZIZ DERASHID', + 'parti': 'BN', + }, + 367: { + 'KodN': 3, + 'KodParlimen': 30, + 'KodKawasan': 3038, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AFENDI MOHAMAD', + 'parti': 'PAS', + }, + 368: { + 'KodN': 3, + 'KodParlimen': 31, + 'KodKawasan': 31, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'MOHD YAZID BIN ABDULLAH', + 'parti': 'PKR', + }, + 369: { + 'KodN': 3, + 'KodParlimen': 31, + 'KodKawasan': 31, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'ABD LATIFF BIN ABD RAHMAN', + 'parti': 'PAS', + }, + 370: { + 'KodN': 3, + 'KodParlimen': 31, + 'KodKawasan': 31, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': "DATO' RAMZI BIN AB RAHMAN", + 'parti': 'BN', + }, + 371: { + 'KodN': 3, + 'KodParlimen': 31, + 'KodKawasan': 3139, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'WAN MOHAMAD AZLAN BIN AHMAD', + 'parti': 'PKR', + }, + 372: { + 'KodN': 3, + 'KodParlimen': 31, + 'KodKawasan': 3139, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ZAKI BIN MUHAMMAD', + 'parti': 'BN', + }, + 373: { + 'KodN': 3, + 'KodParlimen': 31, + 'KodKawasan': 3139, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MUHAMMAD BIN MAT SULAIMAN', + 'parti': 'PAS', + }, + 374: { + 'KodN': 3, + 'KodParlimen': 31, + 'KodKawasan': 3140, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DR ZUBER BIN HASSAN', + 'parti': 'BN', + }, + 375: { + 'KodN': 3, + 'KodParlimen': 31, + 'KodKawasan': 3140, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD ROSLAN BIN PUTEH', + 'parti': 'PKR', + }, + 376: { + 'KodN': 3, + 'KodParlimen': 31, + 'KodKawasan': 3140, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'HILIMI BIN ABDULLAH', + 'parti': 'PAS', + }, + 377: { + 'KodN': 3, + 'KodParlimen': 31, + 'KodKawasan': 3140, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ABDUL AZIZ BIN AHAMD', + 'parti': 'BEBAS', + }, + 378: { + 'KodN': 3, + 'KodParlimen': 31, + 'KodKawasan': 3141, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SUZAINI ADLINA BINTI SUKRI', + 'parti': 'BN', + }, + 379: { + 'KodN': 3, + 'KodParlimen': 31, + 'KodKawasan': 3141, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'MOHAMED DAHAN BIN MAT JALI', + 'parti': 'PKR', + }, + 380: { + 'KodN': 3, + 'KodParlimen': 31, + 'KodKawasan': 3141, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD FAUZI BIN ABDULLAH', + 'parti': 'PAS', + }, + 381: { + 'KodN': 3, + 'KodParlimen': 31, + 'KodKawasan': 3141, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DERAMAN BIN MAMAT', + 'parti': 'BEBAS', + }, + 382: { + 'KodN': 3, + 'KodParlimen': 31, + 'KodKawasan': 3142, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MUHAMMAD BIN AWANG', + 'parti': 'BN', + }, + 383: { + 'KodN': 3, + 'KodParlimen': 31, + 'KodKawasan': 3142, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'WAN AHAMAD FADZIL BIN WAN OMAR', + 'parti': 'PKR', + }, + 384: { + 'KodN': 3, + 'KodParlimen': 31, + 'KodKawasan': 3142, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'KU MOHD ZAKI BIN KU HUSSIN', + 'parti': 'PAS', + }, + 385: { + 'KodN': 3, + 'KodParlimen': 32, + 'KodKawasan': 32, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'TENGKU RAZALEIGH BIN MOHD HAMZAH', + 'parti': 'BN', + }, + 386: { + 'KodN': 3, + 'KodParlimen': 32, + 'KodKawasan': 32, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'ABDULLAH BIN HUSSEIN', + 'parti': 'PAS', + }, + 387: { + 'KodN': 3, + 'KodParlimen': 32, + 'KodKawasan': 32, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MOHD NOOR BIN HUSSIN', + 'parti': 'PKR', + }, + 388: { + 'KodN': 3, + 'KodParlimen': 32, + 'KodKawasan': 3243, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HJ ABD AZIZ BIN YUSOFF', + 'parti': 'BN', + }, + 389: { + 'KodN': 3, + 'KodParlimen': 32, + 'KodKawasan': 3243, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD SIDEK@SAUPI BIN ABD RAZAK', + 'parti': 'PAS', + }, + 390: { + 'KodN': 3, + 'KodParlimen': 32, + 'KodKawasan': 3243, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HJ OTHMAN BIN YUSOFF', + 'parti': 'PKR', + }, + 391: { + 'KodN': 3, + 'KodParlimen': 32, + 'KodKawasan': 3244, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'AMRAN BIN ARIFIN', + 'parti': 'BN', + }, + 392: { + 'KodN': 3, + 'KodParlimen': 32, + 'KodKawasan': 3244, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'AZMAN BIN AHMAD', + 'parti': 'PAS', + }, + 393: { + 'KodN': 3, + 'KodParlimen': 32, + 'KodKawasan': 3244, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'NORAINI BINTI HUSIN', + 'parti': 'PKR', + }, + 394: { + 'KodN': 3, + 'KodParlimen': 32, + 'KodKawasan': 3245, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD SYAHBUDDIN BIN HASHIM', + 'parti': 'BN', + }, + 395: { + 'KodN': 3, + 'KodParlimen': 32, + 'KodKawasan': 3245, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SUHAIMI BIN MAT DERIS', + 'parti': 'PAS', + }, + 396: { + 'KodN': 3, + 'KodParlimen': 32, + 'KodKawasan': 3245, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'NASIR BIN DOLLAH', + 'parti': 'PKR', + }, + 397: { + 'KodN': 4, + 'KodParlimen': 33, + 'KodKawasan': 33, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'RIDUAN BIN MOHAMMAD NOR ', + 'parti': 'PAS', + }, + 398: { + 'KodN': 4, + 'KodParlimen': 33, + 'KodKawasan': 33, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'IDRIS BIN JUSOH ', + 'parti': 'BN', + }, + 399: { + 'KodN': 4, + 'KodParlimen': 33, + 'KodKawasan': 33, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'WAN NAZARI BIN WAN JUSOH ', + 'parti': 'PKR', + }, + 400: { + 'KodN': 4, + 'KodParlimen': 33, + 'KodKawasan': 3301, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HASBI BIN SALLEH ', + 'parti': 'PAS', + }, + 401: { + 'KodN': 4, + 'KodParlimen': 33, + 'KodKawasan': 3301, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'TENGKU ZAIHAN BIN CHE KU ABD RAHMAN ', + 'parti': 'BN', + }, + 402: { + 'KodN': 4, + 'KodParlimen': 33, + 'KodKawasan': 3301, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'CHE KU HASHIM BIN CHE KU MAT ', + 'parti': 'PKR', + }, + 403: { + 'KodN': 4, + 'KodParlimen': 33, + 'KodKawasan': 3302, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD NUR HUZAINI BIN AB RAHMAN ', + 'parti': 'PAS', + }, + 404: { + 'KodN': 4, + 'KodParlimen': 33, + 'KodKawasan': 3302, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'NOHD MAHDI BIN MUSA ', + 'parti': 'BN', + }, + 405: { + 'KodN': 4, + 'KodParlimen': 33, + 'KodKawasan': 3302, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'TENGKU ROSLAN BIN TENGKU OTHMAN @ TENGKU RAMLI ', + 'parti': 'PKR', + }, + 406: { + 'KodN': 4, + 'KodParlimen': 33, + 'KodKawasan': 3303, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MUHAMMAD PEHIMI BIN YUSOF ', + 'parti': 'BN', + }, + 407: { + 'KodN': 4, + 'KodParlimen': 33, + 'KodKawasan': 3303, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'KAMARUZAMAN BIN WAN SU ', + 'parti': 'PKR', + }, + 408: { + 'KodN': 4, + 'KodParlimen': 33, + 'KodKawasan': 3303, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'WAN AZHAR BIN WAN AHMAD ', + 'parti': 'PAS', + }, + 409: { + 'KodN': 4, + 'KodParlimen': 33, + 'KodKawasan': 3304, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ISMAIL BIN ABD KADIR ', + 'parti': 'PKR', + }, + 410: { + 'KodN': 4, + 'KodParlimen': 33, + 'KodKawasan': 3304, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MAT DAIK BIN MOHAMAD ', + 'parti': 'PAS', + }, + 411: { + 'KodN': 4, + 'KodParlimen': 33, + 'KodKawasan': 3304, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'NAWI BIN MOHAMAD', + 'parti': 'BN', + }, + 412: { + 'KodN': 4, + 'KodParlimen': 34, + 'KodKawasan': 34, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DATO HJ MOHD JIDIN BIN SHAFEE', + 'parti': 'BN', + }, + 413: { + 'KodN': 4, + 'KodParlimen': 34, + 'KodKawasan': 34, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'SHAHARIZZUKIRNAIN BIN ABD KADIR', + 'parti': 'PAS', + }, + 414: { + 'KodN': 4, + 'KodParlimen': 34, + 'KodKawasan': 34, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DATO DR MOHD FAUZI BIN MUSA', + 'parti': 'PKR', + }, + 415: { + 'KodN': 4, + 'KodParlimen': 34, + 'KodKawasan': 3405, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD ISKANDAR BIN JAAFAR', + 'parti': 'BN', + }, + 416: { + 'KodN': 4, + 'KodParlimen': 34, + 'KodKawasan': 3405, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ABD AZIZ BIN ABAS', + 'parti': 'PKR', + }, + 417: { + 'KodN': 4, + 'KodParlimen': 34, + 'KodKawasan': 3405, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'AZMAN BIN IBRAHIM', + 'parti': 'PAS', + }, + 418: { + 'KodN': 4, + 'KodParlimen': 34, + 'KodKawasan': 3406, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATUK ABD HALIM BIN JUSOH', + 'parti': 'BN', + }, + 419: { + 'KodN': 4, + 'KodParlimen': 34, + 'KodKawasan': 3406, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ZUL BAHRI BIN A RAHMAN', + 'parti': 'PAS', + }, + 420: { + 'KodN': 4, + 'KodParlimen': 34, + 'KodKawasan': 3406, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'WAN MOKHTAR BIN WAN IBRAHIM', + 'parti': 'PKR', + }, + 421: { + 'KodN': 4, + 'KodParlimen': 34, + 'KodKawasan': 3407, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': "DATO' SABRI BIN MOHD NOOR", + 'parti': 'BN', + }, + 422: { + 'KodN': 4, + 'KodParlimen': 34, + 'KodKawasan': 3407, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MUSTAFFA BIN ABDULLAH', + 'parti': 'PKR', + }, + 423: { + 'KodN': 4, + 'KodParlimen': 34, + 'KodKawasan': 3407, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'AZMI BIN MAAROF', + 'parti': 'PAS', + }, + 424: { + 'KodN': 4, + 'KodParlimen': 34, + 'KodKawasan': 3408, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'BAZLAN BIN ABD RAHMAN', + 'parti': 'BN', + }, + 425: { + 'KodN': 4, + 'KodParlimen': 34, + 'KodKawasan': 3408, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AMIR BIN LONG', + 'parti': 'PKR', + }, + 426: { + 'KodN': 4, + 'KodParlimen': 34, + 'KodKawasan': 3408, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD SHAFIZI BIN ISMAIL', + 'parti': 'PAS', + }, + 427: { + 'KodN': 4, + 'KodParlimen': 35, + 'KodKawasan': 35, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'Tengku Asmadi bin Tengku Mohamad', + 'parti': 'BN', + }, + 428: { + 'KodN': 4, + 'KodParlimen': 35, + 'KodKawasan': 35, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'Mohd Khairuddin bin Aman Razali', + 'parti': 'PAS', + }, + 429: { + 'KodN': 4, + 'KodParlimen': 35, + 'KodKawasan': 35, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'Abdullah bin Mohamad', + 'parti': 'PKR', + }, + 430: { + 'KodN': 4, + 'KodParlimen': 35, + 'KodKawasan': 3509, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'Basir bin Ismail', + 'parti': 'BN', + }, + 431: { + 'KodN': 4, + 'KodParlimen': 35, + 'KodKawasan': 3509, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'Hishamuddin bin Abdul Karim ', + 'parti': 'PAS', + }, + 432: { + 'KodN': 4, + 'KodParlimen': 35, + 'KodKawasan': 3509, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'Wan Hafizie Suzli bin Wan Hassan', + 'parti': 'PKR', + }, + 433: { + 'KodN': 4, + 'KodParlimen': 35, + 'KodKawasan': 3510, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'Che Mansor bin Salleh', + 'parti': 'BN', + }, + 434: { + 'KodN': 4, + 'KodParlimen': 35, + 'KodKawasan': 3510, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'Ridzuan bin Hashim', + 'parti': 'PAS', + }, + 435: { + 'KodN': 4, + 'KodParlimen': 35, + 'KodKawasan': 3510, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'Azik bin Chik', + 'parti': 'PKR', + }, + 436: { + 'KodN': 4, + 'KodParlimen': 35, + 'KodKawasan': 3511, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'Ahmad Razif bin Abd Rahman', + 'parti': 'BN', + }, + 437: { + 'KodN': 4, + 'KodParlimen': 35, + 'KodKawasan': 3511, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'Abu Bakar bin Abdullah', + 'parti': 'PKR', + }, + 438: { + 'KodN': 4, + 'KodParlimen': 35, + 'KodKawasan': 3511, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'Mohd Fazil bin Wahab', + 'parti': 'PAS', + }, + 439: { + 'KodN': 4, + 'KodParlimen': 35, + 'KodKawasan': 3512, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'Tuan Arif Sahibu Fadilah bin Tuan Ahmad', + 'parti': 'BN', + }, + 440: { + 'KodN': 4, + 'KodParlimen': 35, + 'KodKawasan': 3512, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'Alias bin Razak', + 'parti': 'PAS', + }, + 441: { + 'KodN': 4, + 'KodParlimen': 35, + 'KodKawasan': 3512, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'Fatimah Laili binti Omar', + 'parti': 'PKR', + }, + 442: { + 'KodN': 4, + 'KodParlimen': 36, + 'KodKawasan': 36, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': "DATO' RAJA BAHARIN", + 'parti': 'PKR', + }, + 443: { + 'KodN': 4, + 'KodParlimen': 36, + 'KodKawasan': 36, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'AHMAD AMZAD BIN MOHAMED @HASHIM', + 'parti': 'PAS', + }, + 444: { + 'KodN': 4, + 'KodParlimen': 36, + 'KodKawasan': 36, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'WAN NAWAWI BIN HAJI WAN ISMAIL', + 'parti': 'BN', + }, + 445: { + 'KodN': 4, + 'KodParlimen': 36, + 'KodKawasan': 3613, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'WAN SUKAIRI BIN WAN ABDULLAH', + 'parti': 'PAS', + }, + 446: { + 'KodN': 4, + 'KodParlimen': 36, + 'KodKawasan': 3613, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'SALLEH BIN OTHMAN', + 'parti': 'BN', + }, + 447: { + 'KodN': 4, + 'KodParlimen': 36, + 'KodKawasan': 3613, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD ZUBIR BIN MOHAMED', + 'parti': 'PKR', + }, + 448: { + 'KodN': 4, + 'KodParlimen': 36, + 'KodKawasan': 3614, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'AZAN BIN ISMAIL', + 'parti': 'PKR', + }, + 449: { + 'KodN': 4, + 'KodParlimen': 36, + 'KodKawasan': 3614, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AHMAD SHAH BIN MOHAMED', + 'parti': 'PAS', + }, + 450: { + 'KodN': 4, + 'KodParlimen': 36, + 'KodKawasan': 3614, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'TOH SENG CHENG', + 'parti': 'BN', + }, + 451: { + 'KodN': 4, + 'KodParlimen': 36, + 'KodKawasan': 3615, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATUK MOHD SABRI BIN ALWI', + 'parti': 'BN', + }, + 452: { + 'KodN': 4, + 'KodParlimen': 36, + 'KodKawasan': 3615, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': "DATO' TENGKU HASSAN BIN T. OMAR", + 'parti': 'PAS', + }, + 453: { + 'KodN': 4, + 'KodParlimen': 36, + 'KodKawasan': 3615, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': "DATO' HAJI ZULKIFLI ", + 'parti': 'PKR', + }, + 454: { + 'KodN': 4, + 'KodParlimen': 36, + 'KodKawasan': 3616, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MUHAMMAD KHALIL BIN ABDUL HADI', + 'parti': 'PAS', + }, + 455: { + 'KodN': 4, + 'KodParlimen': 36, + 'KodKawasan': 3616, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': "DATO' RAJA BAHARIN", + 'parti': 'PKR', + }, + 456: { + 'KodN': 4, + 'KodParlimen': 36, + 'KodKawasan': 3616, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ZAMRI BIN AWANG HITAM', + 'parti': 'BN', + }, + 457: { + 'KodN': 4, + 'KodParlimen': 37, + 'KodKawasan': 37, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'TUAN HAJI MOHAMAD NOR BIN ENDOT', + 'parti': 'BN', + }, + 458: { + 'KodN': 4, + 'KodParlimen': 37, + 'KodKawasan': 37, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': "DATO' SERI HAJI ABDUL HADI BIN AWANG", + 'parti': 'PAS', + }, + 459: { + 'KodN': 4, + 'KodParlimen': 37, + 'KodKawasan': 37, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'ZARAWI BIN SULONG', + 'parti': 'PKR', + }, + 460: { + 'KodN': 4, + 'KodParlimen': 37, + 'KodKawasan': 3717, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': "DATO' HAJI SAIFUL BAHRI BIN DATO' BAHARUDDIN", + 'parti': 'BN', + }, + 461: { + 'KodN': 4, + 'KodParlimen': 37, + 'KodKawasan': 3717, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ARIFFIN BIN DERAMAN', + 'parti': 'PAS', + }, + 462: { + 'KodN': 4, + 'KodParlimen': 37, + 'KodKawasan': 3717, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'AHMAD SABRI BIN ALI @ MAMAT', + 'parti': 'PKR', + }, + 463: { + 'KodN': 4, + 'KodParlimen': 37, + 'KodKawasan': 3718, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'TOH PUAN HAJAH ZAITUN BINTI MAT AMIN', + 'parti': 'BN', + }, + 464: { + 'KodN': 4, + 'KodParlimen': 37, + 'KodKawasan': 3718, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'USTAZ MOHD NOR BIN HAMZAH', + 'parti': 'PAS', + }, + 465: { + 'KodN': 4, + 'KodParlimen': 37, + 'KodKawasan': 3718, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD DALIZAN BIN ABD AZIZ', + 'parti': 'PKR', + }, + 466: { + 'KodN': 4, + 'KodParlimen': 37, + 'KodKawasan': 3719, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': "DATO' HAJI NIK DIR BIN NIK WAN KU", + 'parti': 'BN', + }, + 467: { + 'KodN': 4, + 'KodParlimen': 37, + 'KodKawasan': 3719, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ZARAWI BIN SULONG', + 'parti': 'PKR', + }, + 468: { + 'KodN': 4, + 'KodParlimen': 37, + 'KodKawasan': 3719, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DR AHMAD SAMSURI BIN MOKHTAR', + 'parti': 'PAS', + }, + 469: { + 'KodN': 4, + 'KodParlimen': 37, + 'KodKawasan': 3720, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'A.LATIFF BIN AWANG', + 'parti': 'BN', + }, + 470: { + 'KodN': 4, + 'KodParlimen': 37, + 'KodKawasan': 3720, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'AIDI BIN AHMAD', + 'parti': 'PKR', + }, + 471: { + 'KodN': 4, + 'KodParlimen': 37, + 'KodKawasan': 3720, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SULAIMAN BIN SULONG', + 'parti': 'PAS', + }, + 472: { + 'KodN': 4, + 'KodParlimen': 38, + 'KodKawasan': 38, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': "DATO'HAJI ROSOL BIN WAHID", + 'parti': 'BN', + }, + 473: { + 'KodN': 4, + 'KodParlimen': 38, + 'KodKawasan': 38, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DATUK RAZALI BIN IDRISS', + 'parti': 'PKR', + }, + 474: { + 'KodN': 4, + 'KodParlimen': 38, + 'KodKawasan': 38, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'HAJI MUHYIDIN BIN ABDUL RASHID', + 'parti': 'PAS', + }, + 475: { + 'KodN': 4, + 'KodParlimen': 38, + 'KodKawasan': 3821, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': "DATO' ROZI BIN MAMAT", + 'parti': 'BN', + }, + 476: { + 'KodN': 4, + 'KodParlimen': 38, + 'KodKawasan': 3821, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'USTAZ KAMARUZAMAN BIN ABDULLAH', + 'parti': 'PAS', + }, + 477: { + 'KodN': 4, + 'KodParlimen': 38, + 'KodKawasan': 3821, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SYARIFAH NORHAYATI BINTI SYED OMAR', + 'parti': 'PKR', + }, + 478: { + 'KodN': 4, + 'KodParlimen': 38, + 'KodKawasan': 3822, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'EN YUSOF BIN AWANG HITAM ', + 'parti': 'BN', + }, + 479: { + 'KodN': 4, + 'KodParlimen': 38, + 'KodKawasan': 3822, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD HAFIZUDDIN BIN HUSSAIN', + 'parti': 'PKR', + }, + 480: { + 'KodN': 4, + 'KodParlimen': 38, + 'KodKawasan': 3822, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HILMI BIN HARUN', + 'parti': 'PAS', + }, + 481: { + 'KodN': 4, + 'KodParlimen': 38, + 'KodKawasan': 3823, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': "DATO'HJ TENGKU PUTERA BIN TG AWANG", + 'parti': 'BN', + }, + 482: { + 'KodN': 4, + 'KodParlimen': 38, + 'KodKawasan': 3823, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD NOR BIN OTHMAN', + 'parti': 'PKR', + }, + 483: { + 'KodN': 4, + 'KodParlimen': 38, + 'KodKawasan': 3823, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DR HJ MAMAD BIN PUTEH', + 'parti': 'PAS', + }, + 484: { + 'KodN': 4, + 'KodParlimen': 38, + 'KodKawasan': 3824, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ZAMANI BIN MAMAT', + 'parti': 'PKR', + }, + 485: { + 'KodN': 4, + 'KodParlimen': 38, + 'KodKawasan': 3824, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DR GHAZALI BIN TAIB', + 'parti': 'BN', + }, + 486: { + 'KodN': 4, + 'KodParlimen': 38, + 'KodKawasan': 3824, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MALIAMAN BIN KASSIM', + 'parti': 'PAS', + }, + 487: { + 'KodN': 4, + 'KodParlimen': 39, + 'KodKawasan': 39, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DATO DIN ADAM ', + 'parti': 'BN', + }, + 488: { + 'KodN': 4, + 'KodParlimen': 39, + 'KodKawasan': 39, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'USTAZ WAN HASSAN MOHD RAMLI', + 'parti': 'PAS', + }, + 489: { + 'KodN': 4, + 'KodParlimen': 39, + 'KodKawasan': 39, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'HJ ABD RAHMAN YUSOF ', + 'parti': 'PKR', + }, + 490: { + 'KodN': 4, + 'KodParlimen': 39, + 'KodKawasan': 3925, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HAJI GHAZALI SULAIMAN ', + 'parti': 'PAS', + }, + 491: { + 'KodN': 4, + 'KodParlimen': 39, + 'KodKawasan': 3925, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHAMAD ARIF ARIFIN ', + 'parti': 'PKR', + }, + 492: { + 'KodN': 4, + 'KodParlimen': 39, + 'KodKawasan': 3925, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ROSLEE DAUD ', + 'parti': 'BN', + }, + 493: { + 'KodN': 4, + 'KodParlimen': 39, + 'KodKawasan': 3926, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HAJI WAN ZAULKFLI WAN GATI', + 'parti': 'BN', + }, + 494: { + 'KodN': 4, + 'KodParlimen': 39, + 'KodKawasan': 3926, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'CIKGU ALIAS ', + 'parti': 'PAS', + }, + 495: { + 'KodN': 4, + 'KodParlimen': 39, + 'KodKawasan': 3926, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HJ FADLY ART ', + 'parti': 'PKR', + }, + 496: { + 'KodN': 4, + 'KodParlimen': 39, + 'KodKawasan': 3927, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'CIKGU WAN HAPANDI ', + 'parti': 'PAS', + }, + 497: { + 'KodN': 4, + 'KodParlimen': 39, + 'KodKawasan': 3927, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ZAINUN A.BAKAR ', + 'parti': 'BN', + }, + 498: { + 'KodN': 4, + 'KodParlimen': 39, + 'KodKawasan': 3927, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ZULKIFLI ALI ', + 'parti': 'PKR', + }, + 499: { + 'KodN': 4, + 'KodParlimen': 39, + 'KodKawasan': 3928, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HASBIE MUDA ', + 'parti': 'PKR', + }, + 500: { + 'KodN': 4, + 'KodParlimen': 39, + 'KodKawasan': 3928, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'T HAMZAH T DRAMAN ', + 'parti': 'BN', + }, + 501: { + 'KodN': 4, + 'KodParlimen': 39, + 'KodKawasan': 3928, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'USTAZ SAIFUL BAHRI MAMAT ', + 'parti': 'PAS', + }, + 502: { + 'KodN': 4, + 'KodParlimen': 40, + 'KodKawasan': 40, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'MOHD HUZAIFAH BIN MD SUHAIMI', + 'parti': 'PKR', + }, + 503: { + 'KodN': 4, + 'KodParlimen': 40, + 'KodKawasan': 40, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'AHMAD SHABERY BIN CHEEK', + 'parti': 'BN', + }, + 504: { + 'KodN': 4, + 'KodParlimen': 40, + 'KodKawasan': 40, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'CHE ALIAS BIN AB HAMID', + 'parti': 'PAS', + }, + 505: { + 'KodN': 4, + 'KodParlimen': 40, + 'KodKawasan': 4029, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ROSLI BIN OTHMAN', + 'parti': 'BN', + }, + 506: { + 'KodN': 4, + 'KodParlimen': 40, + 'KodKawasan': 4029, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SAIFUL AZMI BIN SUHAILI', + 'parti': 'PAS', + }, + 507: { + 'KodN': 4, + 'KodParlimen': 40, + 'KodKawasan': 4029, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'RIZAN BIN ALI', + 'parti': 'PKR', + }, + 508: { + 'KodN': 4, + 'KodParlimen': 40, + 'KodKawasan': 4030, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HAZRI BIN JUSOH', + 'parti': 'PAS', + }, + 509: { + 'KodN': 4, + 'KodParlimen': 40, + 'KodKawasan': 4030, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'AHMAD BIN SAID', + 'parti': 'BN', + }, + 510: { + 'KodN': 4, + 'KodParlimen': 40, + 'KodKawasan': 4030, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'WAN MARZUKI BIN WAN SEMBOK', + 'parti': 'PKR', + }, + 511: { + 'KodN': 4, + 'KodParlimen': 40, + 'KodKawasan': 4031, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHAMED BIN AWANG TERA', + 'parti': 'BN', + }, + 512: { + 'KodN': 4, + 'KodParlimen': 40, + 'KodKawasan': 4031, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HANAFIAH BIN MAT', + 'parti': 'PAS', + }, + 513: { + 'KodN': 4, + 'KodParlimen': 40, + 'KodKawasan': 4031, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'WAN MOHD ANIES BIN WAN MOHD ADNAN', + 'parti': 'PKR', + }, + 514: { + 'KodN': 4, + 'KodParlimen': 40, + 'KodKawasan': 4032, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'WAN ABDUL HAKIM BIN WAN MOKHTAR', + 'parti': 'BN', + }, + 515: { + 'KodN': 4, + 'KodParlimen': 40, + 'KodKawasan': 4032, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AB RAZAK BIN IBRAHIM', + 'parti': 'PAS', + }, + 516: { + 'KodN': 4, + 'KodParlimen': 40, + 'KodKawasan': 4032, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD ZUKRI BIN AKSAH', + 'parti': 'PKR', + }, + 517: { + 'KodN': 5, + 'KodParlimen': 41, + 'KodKawasan': 41, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': "DATO' SRI REEZAL MERICAN BIN NAINA MERICAN", + 'parti': 'BN', + }, + 518: { + 'KodN': 5, + 'KodParlimen': 41, + 'KodKawasan': 41, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DR. ZAIDI BIN ZAKARIA', + 'parti': 'PKR', + }, + 519: { + 'KodN': 5, + 'KodParlimen': 41, + 'KodKawasan': 41, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'SITI MASTURA BINTI MUHAMMAD', + 'parti': 'PAS', + }, + 520: { + 'KodN': 5, + 'KodParlimen': 41, + 'KodKawasan': 4101, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD YUSNI BIN MAT PIAH', + 'parti': 'PAS', + }, + 521: { + 'KodN': 5, + 'KodParlimen': 41, + 'KodKawasan': 4101, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATUK HJ MOHD ZAIN BIN AHMAD', + 'parti': 'BN', + }, + 522: { + 'KodN': 5, + 'KodParlimen': 41, + 'KodKawasan': 4102, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'KHALIQ MEHTAB BIN MOHD ISHAQ', + 'parti': 'PKR', + }, + 523: { + 'KodN': 5, + 'KodParlimen': 41, + 'KodKawasan': 4102, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOKHTAR BIN RAMLY', + 'parti': 'PAS', + }, + 524: { + 'KodN': 5, + 'KodParlimen': 41, + 'KodKawasan': 4102, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HJ SHARIFUL AZHAR BIN IBRAHIM', + 'parti': 'BN', + }, + 525: { + 'KodN': 5, + 'KodParlimen': 41, + 'KodKawasan': 4103, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': "DATO' IR AHMAD ZAKIYUDDIN BIN ABD RAHMAN", + 'parti': 'PKR', + }, + 526: { + 'KodN': 5, + 'KodParlimen': 41, + 'KodKawasan': 4103, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HJ BUKHORI BIN GHAZALI', + 'parti': 'PAS', + }, + 527: { + 'KodN': 5, + 'KodParlimen': 41, + 'KodKawasan': 4103, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': "DATO' HJ ROSLAN BIN SAIDIN", + 'parti': 'BN', + }, + 528: { + 'KodN': 5, + 'KodParlimen': 42, + 'KodKawasan': 42, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'SHABUDIN BIN YAHAYA', + 'parti': 'BN', + }, + 529: { + 'KodN': 5, + 'KodParlimen': 42, + 'KodKawasan': 42, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'MARZUKI BIN YAHYA', + 'parti': 'PKR', + }, + 530: { + 'KodN': 5, + 'KodParlimen': 42, + 'KodKawasan': 42, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'RIZAL HAFIZ BIN RUSLAN', + 'parti': 'PAS', + }, + 531: { + 'KodN': 5, + 'KodParlimen': 42, + 'KodKawasan': 4204, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'NOR HAFIZAH BINTI OTHMAN', + 'parti': 'BN', + }, + 532: { + 'KodN': 5, + 'KodParlimen': 42, + 'KodKawasan': 4204, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AZMAN SHAH BIN OTHMAN', + 'parti': 'PRM', + }, + 533: { + 'KodN': 5, + 'KodParlimen': 42, + 'KodKawasan': 4204, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD SOBRI BIN SALEH', + 'parti': 'PAS', + }, + 534: { + 'KodN': 5, + 'KodParlimen': 42, + 'KodKawasan': 4204, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'MOHD. SHARIFF BIN OMAR', + 'parti': 'PKR', + }, + 535: { + 'KodN': 5, + 'KodParlimen': 42, + 'KodKawasan': 4205, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ZAHADI BIN HJ. MOHD', + 'parti': 'PAS', + }, + 536: { + 'KodN': 5, + 'KodParlimen': 42, + 'KodKawasan': 4205, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MUHAMAD YUSOFF BIN MOHD', + 'parti': 'BN', + }, + 537: { + 'KodN': 5, + 'KodParlimen': 42, + 'KodKawasan': 4205, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'YUSRI BIN ISAHAK', + 'parti': 'PKR', + }, + 538: { + 'KodN': 5, + 'KodParlimen': 42, + 'KodKawasan': 4206, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHAMAD HANIF BIN HARON', + 'parti': 'PAS', + }, + 539: { + 'KodN': 5, + 'KodParlimen': 42, + 'KodKawasan': 4206, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MUSTAFA KAMAL BIN AHMAD', + 'parti': 'PKR', + }, + 540: { + 'KodN': 5, + 'KodParlimen': 42, + 'KodKawasan': 4206, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'LEE THIAN HONG', + 'parti': 'PRM', + }, + 541: { + 'KodN': 5, + 'KodParlimen': 42, + 'KodKawasan': 4206, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'ZAMRI BIN CHE ROS', + 'parti': 'BN', + }, + 542: { + 'KodN': 5, + 'KodParlimen': 43, + 'KodKawasan': 43, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'LEE BENG SENG', + 'parti': 'BN', + }, + 543: { + 'KodN': 5, + 'KodParlimen': 43, + 'KodKawasan': 43, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'KOAY XING BOON', + 'parti': 'MU', + }, + 544: { + 'KodN': 5, + 'KodParlimen': 43, + 'KodKawasan': 43, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'LIM GUAN ENG', + 'parti': 'PKR', + }, + 545: { + 'KodN': 5, + 'KodParlimen': 43, + 'KodKawasan': 43, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'HUANG CHENG GUAN', + 'parti': 'PCM', + }, + 546: { + 'KodN': 5, + 'KodParlimen': 43, + 'KodKawasan': 4307, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'LIM HAI SONG ', + 'parti': 'BN', + }, + 547: { + 'KodN': 5, + 'KodParlimen': 43, + 'KodKawasan': 4307, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'NEOH BOK KENG', + 'parti': 'MU', + }, + 548: { + 'KodN': 5, + 'KodParlimen': 43, + 'KodKawasan': 4307, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'ONG YIN YIN', + 'parti': 'PFP', + }, + 549: { + 'KodN': 5, + 'KodParlimen': 43, + 'KodKawasan': 4307, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'PHEE BOON POH', + 'parti': 'PKR', + }, + 550: { + 'KodN': 5, + 'KodParlimen': 43, + 'KodKawasan': 4307, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'TAN LAY HOCK', + 'parti': 'PRM', + }, + 551: { + 'KodN': 5, + 'KodParlimen': 43, + 'KodKawasan': 4308, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'FABIAN GEORGE ALBART', + 'parti': 'PFP', + }, + 552: { + 'KodN': 5, + 'KodParlimen': 43, + 'KodKawasan': 4308, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'SOON LIP CHEE ', + 'parti': 'PKR', + }, + 553: { + 'KodN': 5, + 'KodParlimen': 43, + 'KodKawasan': 4308, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HARI DEVYNDRAN A/P MUNISWARAN', + 'parti': 'MU', + }, + 554: { + 'KodN': 5, + 'KodParlimen': 43, + 'KodKawasan': 4308, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ANG CHOR KEONG', + 'parti': 'BN', + }, + 555: { + 'KodN': 5, + 'KodParlimen': 43, + 'KodKawasan': 4308, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'TEOH CHAI DENG', + 'parti': 'PRM', + }, + 556: { + 'KodN': 5, + 'KodParlimen': 43, + 'KodKawasan': 4309, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'TEOH UAT LYE', + 'parti': 'MU', + }, + 557: { + 'KodN': 5, + 'KodParlimen': 43, + 'KodKawasan': 4309, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DHINAGARAN A/L JAYABALAN', + 'parti': 'BN', + }, + 558: { + 'KodN': 5, + 'KodParlimen': 43, + 'KodKawasan': 4309, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'JASPER OOI ZANG HAN', + 'parti': 'PFP', + }, + 559: { + 'KodN': 5, + 'KodParlimen': 43, + 'KodKawasan': 4309, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'TEOH HUCK PING', + 'parti': 'PRM', + }, + 560: { + 'KodN': 5, + 'KodParlimen': 43, + 'KodKawasan': 4309, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'SATEES a/l MUNIANDY', + 'parti': 'PKR', + }, + 561: { + 'KodN': 5, + 'KodParlimen': 44, + 'KodKawasan': 44, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': "NURUL IZZAH BT DATO' SERI ANWAR", + 'parti': 'PKR', + }, + 562: { + 'KodN': 5, + 'KodParlimen': 44, + 'KodKawasan': 44, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'AFNAN HAMIMI BIN DATO TAIB AZAMUDIN', + 'parti': 'PAS', + }, + 563: { + 'KodN': 5, + 'KodParlimen': 44, + 'KodKawasan': 44, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DATUK HJ MOHD ZAIDI BIN HJ MOHD SAID', + 'parti': 'BN', + }, + 564: { + 'KodN': 5, + 'KodParlimen': 44, + 'KodKawasan': 4410, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ABU BAKAR SIDEKH BIN ZAINUL ABIDIN', + 'parti': 'BN', + }, + 565: { + 'KodN': 5, + 'KodParlimen': 44, + 'KodKawasan': 4410, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DR. AFIF BIN BAHARDIN', + 'parti': 'PKR', + }, + 566: { + 'KodN': 5, + 'KodParlimen': 44, + 'KodKawasan': 4410, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'IR WAN AHMAD RAFAIE BIN DATO" ABDUL RASHID', + 'parti': 'PAS', + }, + 567: { + 'KodN': 5, + 'KodParlimen': 44, + 'KodKawasan': 4411, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ANUAR FAISAL BIN YAHAYA', + 'parti': 'BN', + }, + 568: { + 'KodN': 5, + 'KodParlimen': 44, + 'KodKawasan': 4411, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MUHAMMAD FAUZI BIN YUSOF', + 'parti': 'PAS', + }, + 569: { + 'KodN': 5, + 'KodParlimen': 44, + 'KodKawasan': 4411, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': "MUHAMMAD FAIZ BIN DATO' FADZIL", + 'parti': 'PKR', + }, + 570: { + 'KodN': 5, + 'KodParlimen': 44, + 'KodKawasan': 4412, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SUHAIMI BIN SABUDIN', + 'parti': 'BN', + }, + 571: { + 'KodN': 5, + 'KodParlimen': 44, + 'KodKawasan': 4412, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DR. NORLELA BT ARIFFIN', + 'parti': 'PKR', + }, + 572: { + 'KodN': 5, + 'KodParlimen': 44, + 'KodKawasan': 4412, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MUHAMMAD FAWWAZ BIN MAT JAN', + 'parti': 'PAS', + }, + 573: { + 'KodN': 5, + 'KodParlimen': 45, + 'KodKawasan': 45, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'GUI GUAT LYE', + 'parti': 'BN', + }, + 574: { + 'KodN': 5, + 'KodParlimen': 45, + 'KodKawasan': 45, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'SIM CHEE KEONG', + 'parti': 'PKR', + }, + 575: { + 'KodN': 5, + 'KodParlimen': 45, + 'KodKawasan': 4513, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HENG LEE LEE', + 'parti': 'PKR', + }, + 576: { + 'KodN': 5, + 'KodParlimen': 45, + 'KodKawasan': 4513, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'LEE POH KONG', + 'parti': 'PFP', + }, + 577: { + 'KodN': 5, + 'KodParlimen': 45, + 'KodKawasan': 4513, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'GOH SWEE GIM', + 'parti': 'BN', + }, + 578: { + 'KodN': 5, + 'KodParlimen': 45, + 'KodKawasan': 4513, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'SONG CHEE MENG', + 'parti': 'PRM', + }, + 579: { + 'KodN': 5, + 'KodParlimen': 45, + 'KodKawasan': 4514, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'LIM JHUN HOU', + 'parti': 'MU', + }, + 580: { + 'KodN': 5, + 'KodParlimen': 45, + 'KodKawasan': 4514, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'TANG AH BA', + 'parti': 'PRM', + }, + 581: { + 'KodN': 5, + 'KodParlimen': 45, + 'KodKawasan': 4514, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'DATUK TAN TEIK CHENG', + 'parti': 'BN', + }, + 582: { + 'KodN': 5, + 'KodParlimen': 45, + 'KodKawasan': 4514, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'MD JAMIL BIN ABD RAHMAN', + 'parti': 'PAS', + }, + 583: { + 'KodN': 5, + 'KodParlimen': 45, + 'KodKawasan': 4514, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'LEE KHAI LOON', + 'parti': 'PKR', + }, + 584: { + 'KodN': 5, + 'KodParlimen': 45, + 'KodKawasan': 4515, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'LIEW EE JIN', + 'parti': 'PFP', + }, + 585: { + 'KodN': 5, + 'KodParlimen': 45, + 'KodKawasan': 4515, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'KUAN HIN YEEP', + 'parti': 'BN', + }, + 586: { + 'KodN': 5, + 'KodParlimen': 45, + 'KodKawasan': 4515, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'CHONG ENG', + 'parti': 'PKR', + }, + 587: { + 'KodN': 5, + 'KodParlimen': 45, + 'KodKawasan': 4515, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'LAI YEAN NEE', + 'parti': 'PRM', + }, + 588: { + 'KodN': 5, + 'KodParlimen': 46, + 'KodKawasan': 46, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'OOI KHAR GIAP', + 'parti': 'PFP', + }, + 589: { + 'KodN': 5, + 'KodParlimen': 46, + 'KodKawasan': 46, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'JAYANTHI DEVI BALAGURU', + 'parti': 'BN', + }, + 590: { + 'KodN': 5, + 'KodParlimen': 46, + 'KodKawasan': 46, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'JAY KUMAR', + 'parti': 'PAS', + }, + 591: { + 'KodN': 5, + 'KodParlimen': 46, + 'KodKawasan': 46, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'KASTHURIRAANI PATTO', + 'parti': 'PKR', + }, + 592: { + 'KodN': 5, + 'KodParlimen': 46, + 'KodKawasan': 4616, + 'JenisKawasan': 'DUN', + 'susunan': 6, + 'NamaCalon': 'PROF. P. RAMASAMY', + 'parti': 'PKR', + }, + 593: { + 'KodN': 5, + 'KodParlimen': 46, + 'KodKawasan': 4616, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'OOI KHAR GIAP', + 'parti': 'PFP', + }, + 594: { + 'KodN': 5, + 'KodParlimen': 46, + 'KodKawasan': 4616, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'M.SURESH ', + 'parti': 'BN', + }, + 595: { + 'KodN': 5, + 'KodParlimen': 46, + 'KodKawasan': 4616, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'R.KUMARY', + 'parti': 'BEBAS', + }, + 596: { + 'KodN': 5, + 'KodParlimen': 46, + 'KodKawasan': 4616, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'ASOGHAN A/L GOVINDARAJU', + 'parti': 'PAP', + }, + 597: { + 'KodN': 5, + 'KodParlimen': 46, + 'KodKawasan': 4616, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'SAMUGANATHAN A/L MUNIANDY', + 'parti': 'PRM', + }, + 598: { + 'KodN': 5, + 'KodParlimen': 46, + 'KodKawasan': 4617, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'GOOI HSIAO-LEUNG', + 'parti': 'PKR', + }, + 599: { + 'KodN': 5, + 'KodParlimen': 46, + 'KodKawasan': 4617, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'EDWARD JOSEPH', + 'parti': 'PFP', + }, + 600: { + 'KodN': 5, + 'KodParlimen': 46, + 'KodKawasan': 4617, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DR THOR TEONG GEE', + 'parti': 'BN', + }, + 601: { + 'KodN': 5, + 'KodParlimen': 46, + 'KodKawasan': 4617, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'NORAZMAN BIN ISHAK', + 'parti': 'PAS', + }, + 602: { + 'KodN': 5, + 'KodParlimen': 46, + 'KodKawasan': 4618, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'GOH B KOON', + 'parti': 'PRM', + }, + 603: { + 'KodN': 5, + 'KodParlimen': 46, + 'KodKawasan': 4618, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ONG SEONG LU', + 'parti': 'PFP', + }, + 604: { + 'KodN': 5, + 'KodParlimen': 46, + 'KodKawasan': 4618, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HARTINI TAN BINTI ABDULLAH', + 'parti': 'BN', + }, + 605: { + 'KodN': 5, + 'KodParlimen': 46, + 'KodKawasan': 4618, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'GOH CHOON AIK', + 'parti': 'PKR', + }, + 606: { + 'KodN': 5, + 'KodParlimen': 46, + 'KodKawasan': 4618, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'KUMARAVELU A/L ARUMUGAM', + 'parti': 'PAS', + }, + 607: { + 'KodN': 5, + 'KodParlimen': 47, + 'KodKawasan': 47, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': "DATO' MANSOR BIN OTHMAN", + 'parti': 'PKR', + }, + 608: { + 'KodN': 5, + 'KodParlimen': 47, + 'KodKawasan': 47, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': "DATO' IR DR SHAIK HUSSEIN BIN MYDIN", + 'parti': 'BN', + }, + 609: { + 'KodN': 5, + 'KodParlimen': 47, + 'KodKawasan': 47, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'MOHD HELMI BIN HARUN', + 'parti': 'PAS', + }, + 610: { + 'KodN': 5, + 'KodParlimen': 47, + 'KodKawasan': 47, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'TAN TEE BENG', + 'parti': 'BEBAS', + }, + 611: { + 'KodN': 5, + 'KodParlimen': 47, + 'KodKawasan': 4719, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'TAN BENG HUAT', + 'parti': 'PAP', + }, + 612: { + 'KodN': 5, + 'KodParlimen': 47, + 'KodKawasan': 4719, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DR. KIEW HENG CHONG', + 'parti': 'BN', + }, + 613: { + 'KodN': 5, + 'KodParlimen': 47, + 'KodKawasan': 4719, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DAPHNE A/P EDWARD ', + 'parti': 'PFP', + }, + 614: { + 'KodN': 5, + 'KodParlimen': 47, + 'KodKawasan': 4719, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': "H'NG MOOI LYE", + 'parti': 'PKR', + }, + 615: { + 'KodN': 5, + 'KodParlimen': 47, + 'KodKawasan': 4719, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'TAN CHEW SUAN', + 'parti': 'PRM', + }, + 616: { + 'KodN': 5, + 'KodParlimen': 47, + 'KodKawasan': 4719, + 'JenisKawasan': 'DUN', + 'susunan': 6, + 'NamaCalon': 'KOAY XING BOON', + 'parti': 'MU', + }, + 617: { + 'KodN': 5, + 'KodParlimen': 47, + 'KodKawasan': 4720, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'TAN CHOW KANG', + 'parti': 'PRM', + }, + 618: { + 'KodN': 5, + 'KodParlimen': 47, + 'KodKawasan': 4720, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'OSMAN BIN JAAFAR', + 'parti': 'PAS', + }, + 619: { + 'KodN': 5, + 'KodParlimen': 47, + 'KodKawasan': 4720, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DR. AMAR PRITPAL BIN ABDULLAH', + 'parti': 'PKR', + }, + 620: { + 'KodN': 5, + 'KodParlimen': 47, + 'KodKawasan': 4720, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': "DATO' MOHAMED SANI BIN BAKAR", + 'parti': 'BN', + }, + 621: { + 'KodN': 5, + 'KodParlimen': 47, + 'KodKawasan': 4721, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ZULKIFLI BIN IBRAHIM', + 'parti': 'PKR', + }, + 622: { + 'KodN': 5, + 'KodParlimen': 47, + 'KodKawasan': 4721, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': "DATO' MAHMUD BIN ZAKARIA", + 'parti': 'BN', + }, + 623: { + 'KodN': 5, + 'KodParlimen': 47, + 'KodKawasan': 4721, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'NOR ZAMRI BIN LATIF', + 'parti': 'PAS', + }, + 624: { + 'KodN': 5, + 'KodParlimen': 48, + 'KodKawasan': 48, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'WONG HON WAI', + 'parti': 'PKR', + }, + 625: { + 'KodN': 5, + 'KodParlimen': 48, + 'KodKawasan': 48, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'ANDY YONG KIM SENG', + 'parti': 'BN', + }, + 626: { + 'KodN': 5, + 'KodParlimen': 48, + 'KodKawasan': 48, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'TAN GIN THEAM', + 'parti': 'MU', + }, + 627: { + 'KodN': 5, + 'KodParlimen': 48, + 'KodKawasan': 4822, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'LEE ZHENG YONG', + 'parti': 'MU', + }, + 628: { + 'KodN': 5, + 'KodParlimen': 48, + 'KodKawasan': 4822, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'CHUA CHEONG WEE', + 'parti': 'PRM', + }, + 629: { + 'KodN': 5, + 'KodParlimen': 48, + 'KodKawasan': 4822, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ZAIRIL KHIR JOHARI', + 'parti': 'PKR', + }, + 630: { + 'KodN': 5, + 'KodParlimen': 48, + 'KodKawasan': 4822, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'TENG CHANG YEOW', + 'parti': 'BN', + }, + 631: { + 'KodN': 5, + 'KodParlimen': 48, + 'KodKawasan': 4823, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'LIM GUAN ENG', + 'parti': 'PKR', + }, + 632: { + 'KodN': 5, + 'KodParlimen': 48, + 'KodKawasan': 4823, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'TAN HEAP SENG', + 'parti': 'BN', + }, + 633: { + 'KodN': 5, + 'KodParlimen': 48, + 'KodKawasan': 4823, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'TAN GIN THEAM', + 'parti': 'MU', + }, + 634: { + 'KodN': 5, + 'KodParlimen': 48, + 'KodKawasan': 4823, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'MANIKANDAN A/L RAMAYAH', + 'parti': 'PCM', + }, + 635: { + 'KodN': 5, + 'KodParlimen': 48, + 'KodKawasan': 4824, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'OOI ZHI YI', + 'parti': 'BN', + }, + 636: { + 'KodN': 5, + 'KodParlimen': 48, + 'KodKawasan': 4824, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'WU KAI MIN', + 'parti': 'MU', + }, + 637: { + 'KodN': 5, + 'KodParlimen': 48, + 'KodKawasan': 4824, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'JASON ONG KHAN LEE', + 'parti': 'PKR', + }, + 638: { + 'KodN': 5, + 'KodParlimen': 48, + 'KodKawasan': 4825, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'LOO JIEH SHENG', + 'parti': 'BN', + }, + 639: { + 'KodN': 5, + 'KodParlimen': 48, + 'KodKawasan': 4825, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'WEE KEAN WAI', + 'parti': 'MU', + }, + 640: { + 'KodN': 5, + 'KodParlimen': 48, + 'KodKawasan': 4825, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'LEE CHUN KIT', + 'parti': 'PKR', + }, + 641: { + 'KodN': 5, + 'KodParlimen': 49, + 'KodKawasan': 49, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'NG SIEW LAI', + 'parti': 'BN', + }, + 642: { + 'KodN': 5, + 'KodParlimen': 49, + 'KodKawasan': 49, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'CHOW KON YEOW', + 'parti': 'PKR', + }, + 643: { + 'KodN': 5, + 'KodParlimen': 49, + 'KodKawasan': 4926, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': "H'NG KHOON LENG", + 'parti': 'BN', + }, + 644: { + 'KodN': 5, + 'KodParlimen': 49, + 'KodKawasan': 4926, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'CHOW KON YEOW', + 'parti': 'PKR', + }, + 645: { + 'KodN': 5, + 'KodParlimen': 49, + 'KodKawasan': 4927, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'LIM SWEE BOK', + 'parti': 'BN', + }, + 646: { + 'KodN': 5, + 'KodParlimen': 49, + 'KodKawasan': 4927, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'KOAY TENG LYE', + 'parti': 'BEBAS', + }, + 647: { + 'KodN': 5, + 'KodParlimen': 49, + 'KodKawasan': 4927, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DANIEL GOOI ZI SEN', + 'parti': 'PKR', + }, + 648: { + 'KodN': 5, + 'KodParlimen': 49, + 'KodKawasan': 4927, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'CHEW SENG TUNG', + 'parti': 'PRM', + }, + 649: { + 'KodN': 5, + 'KodParlimen': 49, + 'KodKawasan': 4927, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'RAGINDRAN SIVASAMY', + 'parti': 'BEBAS', + }, + 650: { + 'KodN': 5, + 'KodParlimen': 49, + 'KodKawasan': 4928, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'TEH LAI HENG', + 'parti': 'PKR', + }, + 651: { + 'KodN': 5, + 'KodParlimen': 49, + 'KodKawasan': 4928, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'TAN HING TEIK', + 'parti': 'BN', + }, + 652: { + 'KodN': 5, + 'KodParlimen': 49, + 'KodKawasan': 4928, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ONG CHUN JIET', + 'parti': 'MU', + }, + 653: { + 'KodN': 5, + 'KodParlimen': 50, + 'KodKawasan': 50, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DATUK BALJIT SINGH A/L JIGIRI SINGH', + 'parti': 'BN', + }, + 654: { + 'KodN': 5, + 'KodParlimen': 50, + 'KodKawasan': 50, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'RSN SANISVARA NETHAJI RAYER', + 'parti': 'PKR', + }, + 655: { + 'KodN': 5, + 'KodParlimen': 50, + 'KodKawasan': 50, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'TAN SIM BEE', + 'parti': 'MU', + }, + 656: { + 'KodN': 5, + 'KodParlimen': 50, + 'KodKawasan': 5029, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'LEE BOON TEN', + 'parti': 'BN', + }, + 657: { + 'KodN': 5, + 'KodParlimen': 50, + 'KodKawasan': 5029, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'JAGDEEP SINGH DEO A/L KARPAL SINGH ', + 'parti': 'PKR', + }, + 658: { + 'KodN': 5, + 'KodParlimen': 50, + 'KodKawasan': 5029, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'LIM BOO CHANG ', + 'parti': 'MU', + }, + 659: { + 'KodN': 5, + 'KodParlimen': 50, + 'KodKawasan': 5029, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'NICHOLAS DIANE A/L MORGAN ', + 'parti': 'PFP', + }, + 660: { + 'KodN': 5, + 'KodParlimen': 50, + 'KodKawasan': 5029, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'MUHAMMAD MAJNUN BIN ABDUL WAHAB', + 'parti': 'PAP', + }, + 661: { + 'KodN': 5, + 'KodParlimen': 50, + 'KodKawasan': 5030, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'NG FOOK ON', + 'parti': 'BN', + }, + 662: { + 'KodN': 5, + 'KodParlimen': 50, + 'KodKawasan': 5030, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'LIM SIEW KHIM', + 'parti': 'PKR', + }, + 663: { + 'KodN': 5, + 'KodParlimen': 50, + 'KodKawasan': 5030, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'YACOOP BIN OMAR', + 'parti': 'PAS', + }, + 664: { + 'KodN': 5, + 'KodParlimen': 50, + 'KodKawasan': 5030, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'TAN SIM-BEE', + 'parti': 'MU', + }, + 665: { + 'KodN': 5, + 'KodParlimen': 50, + 'KodKawasan': 5030, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'TEH YEE CHEU', + 'parti': 'PSM', + }, + 666: { + 'KodN': 5, + 'KodParlimen': 50, + 'KodKawasan': 5030, + 'JenisKawasan': 'DUN', + 'susunan': 6, + 'NamaCalon': 'MOHAMED YACOOB BIN MOHAMED NOOR', + 'parti': 'BEBAS', + }, + 667: { + 'KodN': 5, + 'KodParlimen': 50, + 'KodKawasan': 5031, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'KOO PEI-CHEE', + 'parti': 'BN', + }, + 668: { + 'KodN': 5, + 'KodParlimen': 50, + 'KodKawasan': 5031, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ONG AH-TEONG', + 'parti': 'PKR', + }, + 669: { + 'KodN': 5, + 'KodParlimen': 50, + 'KodKawasan': 5031, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'KEE LEAN-EE', + 'parti': 'MU', + }, + 670: { + 'KodN': 5, + 'KodParlimen': 51, + 'KodKawasan': 51, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'LOW JOO- HIAP', + 'parti': 'BN', + }, + 671: { + 'KodN': 5, + 'KodParlimen': 51, + 'KodKawasan': 51, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'RAMKARPAL SINGH A/L KARPAL SINGH', + 'parti': 'PKR', + }, + 672: { + 'KodN': 5, + 'KodParlimen': 51, + 'KodKawasan': 51, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'LAI XUE-CHING', + 'parti': 'MU', + }, + 673: { + 'KodN': 5, + 'KodParlimen': 51, + 'KodKawasan': 5132, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'KHOO KAY TEONG', + 'parti': 'BN', + }, + 674: { + 'KodN': 5, + 'KodParlimen': 51, + 'KodKawasan': 5132, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'SYERLEENA BINTI ABDUL RASHID', + 'parti': 'PKR', + }, + 675: { + 'KodN': 5, + 'KodParlimen': 51, + 'KodKawasan': 5132, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'TAN YANG-YUNG', + 'parti': 'MU', + }, + 676: { + 'KodN': 5, + 'KodParlimen': 51, + 'KodKawasan': 5133, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'TAN KAH LEONG', + 'parti': 'BN', + }, + 677: { + 'KodN': 5, + 'KodParlimen': 51, + 'KodKawasan': 5133, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'JOSEPH NG SOON SIANG', + 'parti': 'PKR', + }, + 678: { + 'KodN': 5, + 'KodParlimen': 51, + 'KodKawasan': 5133, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'KANG TEIK WOI', + 'parti': 'MU', + }, + 679: { + 'KodN': 5, + 'KodParlimen': 51, + 'KodKawasan': 5134, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'WONG CHING CHONG', + 'parti': 'BN', + }, + 680: { + 'KodN': 5, + 'KodParlimen': 51, + 'KodKawasan': 5134, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'YEOH SOON HIN', + 'parti': 'PKR', + }, + 681: { + 'KodN': 5, + 'KodParlimen': 51, + 'KodKawasan': 5134, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'KUAN AUN WAN ', + 'parti': 'MU', + }, + 682: { + 'KodN': 5, + 'KodParlimen': 52, + 'KodKawasan': 52, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DAVID YIM BOON LEONG', + 'parti': 'MU', + }, + 683: { + 'KodN': 5, + 'KodParlimen': 52, + 'KodKawasan': 52, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'SIM TZE TZIN', + 'parti': 'PKR', + }, + 684: { + 'KodN': 5, + 'KodParlimen': 52, + 'KodKawasan': 52, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'CHUAH SENG GUAN', + 'parti': 'BN', + }, + 685: { + 'KodN': 5, + 'KodParlimen': 52, + 'KodKawasan': 52, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'ISZUREE BIN IBRAHIM', + 'parti': 'PAS', + }, + 686: { + 'KodN': 5, + 'KodParlimen': 52, + 'KodKawasan': 5235, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HNG CHEE WEY', + 'parti': 'BN', + }, + 687: { + 'KodN': 5, + 'KodParlimen': 52, + 'KodKawasan': 5235, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'VIKNESWARAN A/L MUNIANDY', + 'parti': 'PAS', + }, + 688: { + 'KodN': 5, + 'KodParlimen': 52, + 'KodKawasan': 5235, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'KUMARESAN A/L ARAMUSAM', + 'parti': 'PKR', + }, + 689: { + 'KodN': 5, + 'KodParlimen': 52, + 'KodKawasan': 5235, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'TEOH KEAN LEANG', + 'parti': 'PFP', + }, + 690: { + 'KodN': 5, + 'KodParlimen': 52, + 'KodKawasan': 5235, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'TEOH KOK SIANG', + 'parti': 'MU', + }, + 691: { + 'KodN': 5, + 'KodParlimen': 52, + 'KodKawasan': 5236, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DAVID YIM BOON-LEONG', + 'parti': 'MU', + }, + 692: { + 'KodN': 5, + 'KodParlimen': 52, + 'KodKawasan': 5236, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD FARHAN BIN YUSRI', + 'parti': 'PAS', + }, + 693: { + 'KodN': 5, + 'KodParlimen': 52, + 'KodKawasan': 5236, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'OH TONG-KEONG', + 'parti': 'BN', + }, + 694: { + 'KodN': 5, + 'KodParlimen': 52, + 'KodKawasan': 5236, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'SAIFUDDIN NASUITION BIN ISMAIL', + 'parti': 'PKR', + }, + 695: { + 'KodN': 5, + 'KodParlimen': 52, + 'KodKawasan': 5237, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': "DATO' ABDUL HALIM BIN HUSSAIN", + 'parti': 'PKR', + }, + 696: { + 'KodN': 5, + 'KodParlimen': 52, + 'KodKawasan': 5237, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'SAIFUL LIZAN BIN MD YUSOFF', + 'parti': 'PAS', + }, + 697: { + 'KodN': 5, + 'KodParlimen': 52, + 'KodKawasan': 5237, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DATUK HAJI LAIKAT ALI BIN MOHAMED ALI', + 'parti': 'BN', + }, + 698: { + 'KodN': 5, + 'KodParlimen': 53, + 'KodKawasan': 53, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': "DATO' SERI DR. HJ. HILMI BIN HJ. YAHAYA", + 'parti': 'BN', + }, + 699: { + 'KodN': 5, + 'KodParlimen': 53, + 'KodKawasan': 53, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'MUHAMMAD BAKHTIAR BIN WAN CHIK', + 'parti': 'PKR', + }, + 700: { + 'KodN': 5, + 'KodParlimen': 53, + 'KodKawasan': 53, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': "MUHAMMAD IMRAN BIN MUHAMMAD SA'AD", + 'parti': 'PAS', + }, + 701: { + 'KodN': 5, + 'KodParlimen': 53, + 'KodKawasan': 5338, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HJ RUSLI BIN HASHIM', + 'parti': 'BN', + }, + 702: { + 'KodN': 5, + 'KodParlimen': 53, + 'KodKawasan': 5338, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AZRUL MAHATHIR BIN AZIZ', + 'parti': 'PKR', + }, + 703: { + 'KodN': 5, + 'KodParlimen': 53, + 'KodKawasan': 5338, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ZARINA BINTI SHINTA MADAR', + 'parti': 'PAS', + }, + 704: { + 'KodN': 5, + 'KodParlimen': 53, + 'KodKawasan': 5339, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'DATUK DR. HJ. MUHAMAD FARID BIN HJ. SAAD', + 'parti': 'BN', + }, + 705: { + 'KodN': 5, + 'KodParlimen': 53, + 'KodKawasan': 5339, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HJ MOHD TUAH BIN ISMAIL', + 'parti': 'PKR', + }, + 706: { + 'KodN': 5, + 'KodParlimen': 53, + 'KodKawasan': 5339, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HJ TAUFIK BIN HASHIM', + 'parti': 'PAS', + }, + 707: { + 'KodN': 5, + 'KodParlimen': 53, + 'KodKawasan': 5339, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'YEOH CHENG HUAT ', + 'parti': 'PRM', + }, + 708: { + 'KodN': 5, + 'KodParlimen': 53, + 'KodKawasan': 5340, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HJ ZOLKIFLY BIN MD LAZIM', + 'parti': 'PKR', + }, + 709: { + 'KodN': 5, + 'KodParlimen': 53, + 'KodKawasan': 5340, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DATUK SHAH HEADAN HEADAN BIN AYOOB HUSSAIN SHAH', + 'parti': 'BN', + }, + 710: { + 'KodN': 5, + 'KodParlimen': 53, + 'KodKawasan': 5340, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HJ ALI BIN OTHMAN', + 'parti': 'PAS', + }, + 711: { + 'KodN': 6, + 'KodParlimen': 54, + 'KodKawasan': 54, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'Ustaz Dahalan', + 'parti': 'PAS', + }, + 712: { + 'KodN': 6, + 'KodParlimen': 54, + 'KodKawasan': 54, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'Dato Hasbullah Bin Osman', + 'parti': 'BN', + }, + 713: { + 'KodN': 6, + 'KodParlimen': 54, + 'KodKawasan': 54, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'Ibrahim Hanafiah', + 'parti': 'PKR', + }, + 714: { + 'KodN': 6, + 'KodParlimen': 54, + 'KodKawasan': 5401, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'Dato Hj. Aznel Hj. Ibrahim', + 'parti': 'BN', + }, + 715: { + 'KodN': 6, + 'KodParlimen': 54, + 'KodKawasan': 5401, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'Hamidi Ismail', + 'parti': 'PAS', + }, + 716: { + 'KodN': 6, + 'KodParlimen': 54, + 'KodKawasan': 5401, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': ' DR AHMAD SAFWAN (DR IWAN)', + 'parti': 'PKR', + }, + 717: { + 'KodN': 6, + 'KodParlimen': 54, + 'KodKawasan': 5402, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'Fadzil Aziz', + 'parti': 'PKR', + }, + 718: { + 'KodN': 6, + 'KodParlimen': 54, + 'KodKawasan': 5402, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'Md Pozi bin Md Sani', + 'parti': 'PAS', + }, + 719: { + 'KodN': 6, + 'KodParlimen': 54, + 'KodKawasan': 5402, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'Salbiah binti Mohamed', + 'parti': 'BN', + }, + 720: { + 'KodN': 6, + 'KodParlimen': 55, + 'KodKawasan': 55, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'AMIRUL FAIRUZZEEN', + 'parti': 'PKR', + }, + 721: { + 'KodN': 6, + 'KodParlimen': 55, + 'KodKawasan': 55, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'USTAZ MUJAHID IR FADZIL', + 'parti': 'PAS', + }, + 722: { + 'KodN': 6, + 'KodParlimen': 55, + 'KodKawasan': 55, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DR. SHAMSUL ANUAR NASARAH', + 'parti': 'BN', + }, + 723: { + 'KodN': 6, + 'KodParlimen': 55, + 'KodKawasan': 5503, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'AZHAR HJ. RASDI', + 'parti': 'PAS', + }, + 724: { + 'KodN': 6, + 'KodParlimen': 55, + 'KodKawasan': 5503, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'NOOR SHAM BINTI ABU SAMAH', + 'parti': 'PKR', + }, + 725: { + 'KodN': 6, + 'KodParlimen': 55, + 'KodKawasan': 5503, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'TARMIZI BIN IDRIS', + 'parti': 'BN', + }, + 726: { + 'KodN': 6, + 'KodParlimen': 55, + 'KodKawasan': 5504, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'USTAZ RIFAAT BIN HJ RAZMAN', + 'parti': 'PAS', + }, + 727: { + 'KodN': 6, + 'KodParlimen': 55, + 'KodKawasan': 5504, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'SAARANI BIN MOHAMAD', + 'parti': 'BN', + }, + 728: { + 'KodN': 6, + 'KodParlimen': 55, + 'KodKawasan': 5504, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'NOOR HASNIDA BINTI MOHD. HASHIM', + 'parti': 'PKR', + }, + 729: { + 'KodN': 6, + 'KodParlimen': 56, + 'KodKawasan': 56, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'ABU HUSIN BIN MOHMMAD', + 'parti': 'PAS', + }, + 730: { + 'KodN': 6, + 'KodParlimen': 56, + 'KodKawasan': 56, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'HAMZAH BIN ZAINUDIN', + 'parti': 'BN', + }, + 731: { + 'KodN': 6, + 'KodParlimen': 56, + 'KodKawasan': 56, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'KHAIRIL ANUAR BIN AKHIRUDDIN', + 'parti': 'PKR', + }, + 732: { + 'KodN': 6, + 'KodParlimen': 56, + 'KodKawasan': 5605, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'FAIZUL ARBY BIN MOHD SHOHOR', + 'parti': 'BN', + }, + 733: { + 'KodN': 6, + 'KodParlimen': 56, + 'KodKawasan': 5605, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'RAZALI BIN ISMAIL', + 'parti': 'PKR', + }, + 734: { + 'KodN': 6, + 'KodParlimen': 56, + 'KodKawasan': 5605, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD AKMAL BIN KAMARUDIN', + 'parti': 'PAS', + }, + 735: { + 'KodN': 6, + 'KodParlimen': 56, + 'KodKawasan': 5606, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MAT SUPRI BIN MUSA', + 'parti': 'PKR', + }, + 736: { + 'KodN': 6, + 'KodParlimen': 56, + 'KodKawasan': 5606, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'KHALIL BIN YAHAYA', + 'parti': 'PAS', + }, + 737: { + 'KodN': 6, + 'KodParlimen': 56, + 'KodKawasan': 5606, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SALIZA BINTI AHMAD', + 'parti': 'BN', + }, + 738: { + 'KodN': 6, + 'KodParlimen': 56, + 'KodKawasan': 5607, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD SHAHIR BIN MOHD HASSAN', + 'parti': 'PAS', + }, + 739: { + 'KodN': 6, + 'KodParlimen': 56, + 'KodKawasan': 5607, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ZAINAL ABIDIN BIN ABD RAHMAN', + 'parti': 'BERJASA', + }, + 740: { + 'KodN': 6, + 'KodParlimen': 56, + 'KodKawasan': 5607, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MUHAMAD AIMAN AIZUDDIN BIN MD HUSIN', + 'parti': 'PKR', + }, + 741: { + 'KodN': 6, + 'KodParlimen': 56, + 'KodKawasan': 5607, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'MUHAMMAD AMIN BIN ZAKARIA', + 'parti': 'BN', + }, + 742: { + 'KodN': 6, + 'KodParlimen': 57, + 'KodKawasan': 57, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'Dato Puhat B. Mat Nayan', + 'parti': 'BN', + }, + 743: { + 'KodN': 6, + 'KodParlimen': 57, + 'KodKawasan': 57, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'Dato Mujahid B. Yusuf Rawa', + 'parti': 'PKR', + }, + 744: { + 'KodN': 6, + 'KodParlimen': 57, + 'KodKawasan': 57, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'Ahmad Azhar B. Shahrin', + 'parti': 'PAS', + }, + 745: { + 'KodN': 6, + 'KodParlimen': 57, + 'KodKawasan': 5708, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'Hasnul Zulkarnain B Abd Munaim', + 'parti': 'PKR', + }, + 746: { + 'KodN': 6, + 'KodParlimen': 57, + 'KodKawasan': 5708, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'Abu Bakar b Hussin', + 'parti': 'PAS', + }, + 747: { + 'KodN': 6, + 'KodParlimen': 57, + 'KodKawasan': 5708, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'Norsalewati bt Mat Norwani', + 'parti': 'BN', + }, + 748: { + 'KodN': 6, + 'KodParlimen': 57, + 'KodKawasan': 5709, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'Shahrul Nizam b Razali ', + 'parti': 'BN', + }, + 749: { + 'KodN': 6, + 'KodParlimen': 57, + 'KodKawasan': 5709, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'Abdul Yunus b Jamhari', + 'parti': 'PKR', + }, + 750: { + 'KodN': 6, + 'KodParlimen': 57, + 'KodKawasan': 5709, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'Abdul Baharin ', + 'parti': 'PAS', + }, + 751: { + 'KodN': 6, + 'KodParlimen': 58, + 'KodKawasan': 58, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DATO DR HJ AZMI BIN GHAZALI', + 'parti': 'BN', + }, + 752: { + 'KodN': 6, + 'KodParlimen': 58, + 'KodKawasan': 58, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'ADAM BIN ASMUNI', + 'parti': 'PKR', + }, + 753: { + 'KodN': 6, + 'KodParlimen': 58, + 'KodKawasan': 58, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'ROHAYA BINTI BAKAR', + 'parti': 'PAS', + }, + 754: { + 'KodN': 6, + 'KodParlimen': 58, + 'KodKawasan': 5810, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HJ AHMAD ZAKI BIN HUSSIN', + 'parti': 'PKR', + }, + 755: { + 'KodN': 6, + 'KodParlimen': 58, + 'KodKawasan': 5810, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATO HJ SHAM BIN MAT SAHAT', + 'parti': 'BN', + }, + 756: { + 'KodN': 6, + 'KodParlimen': 58, + 'KodKawasan': 5810, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'WAN TARMIZI BIN WAN AZIZ', + 'parti': 'PAS', + }, + 757: { + 'KodN': 6, + 'KodParlimen': 58, + 'KodKawasan': 5811, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'RAZMAN BIN ZAKARIA', + 'parti': 'PAS', + }, + 758: { + 'KodN': 6, + 'KodParlimen': 58, + 'KodKawasan': 5811, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HJ ZAINI BIN CHA', + 'parti': 'BN', + }, + 759: { + 'KodN': 6, + 'KodParlimen': 58, + 'KodKawasan': 5811, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ISMAIL BIN ALI', + 'parti': 'PKR', + }, + 760: { + 'KodN': 6, + 'KodParlimen': 58, + 'KodKawasan': 5812, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SAQIF BIN ANSORULLAH', + 'parti': 'PKR', + }, + 761: { + 'KodN': 6, + 'KodParlimen': 58, + 'KodKawasan': 5812, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HJ HUSIN BIN DIN', + 'parti': 'PAS', + }, + 762: { + 'KodN': 6, + 'KodParlimen': 58, + 'KodKawasan': 5812, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MUHAMAD NOOR BIN DAWOO', + 'parti': 'BN', + }, + 763: { + 'KodN': 6, + 'KodParlimen': 59, + 'KodKawasan': 59, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'USTAZ IDRIS AHMAD', + 'parti': 'PAS', + }, + 764: { + 'KodN': 6, + 'KodParlimen': 59, + 'KodKawasan': 59, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'SYED ABU HUSSIN BIN HAFIZ SYED ABDUL FASAL', + 'parti': 'BN', + }, + 765: { + 'KodN': 6, + 'KodParlimen': 59, + 'KodKawasan': 59, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DATO HJ KHADRI KHALID', + 'parti': 'PKR', + }, + 766: { + 'KodN': 6, + 'KodParlimen': 59, + 'KodKawasan': 5913, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD KAMARUDDIN BIN ABU BAKAR', + 'parti': 'BN', + }, + 767: { + 'KodN': 6, + 'KodParlimen': 59, + 'KodKawasan': 5913, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'CHUA YEE LING', + 'parti': 'PKR', + }, + 768: { + 'KodN': 6, + 'KodParlimen': 59, + 'KodKawasan': 5913, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HAJI RAHIM ISMAIL', + 'parti': 'PAS', + }, + 769: { + 'KodN': 6, + 'KodParlimen': 59, + 'KodKawasan': 5914, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'USTAZ NORDIN JAAFAR', + 'parti': 'PAS', + }, + 770: { + 'KodN': 6, + 'KodParlimen': 59, + 'KodKawasan': 5914, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'IR. MEGAT SHARIFFUDIN IBRAHIM', + 'parti': 'PKR', + }, + 771: { + 'KodN': 6, + 'KodParlimen': 59, + 'KodKawasan': 5914, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHGANAN A/L P MANIKAM', + 'parti': 'BEBAS', + }, + 772: { + 'KodN': 6, + 'KodParlimen': 59, + 'KodKawasan': 5914, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'AHMAD SAIDI BIN MOHAMAD DAUD', + 'parti': 'BN', + }, + 773: { + 'KodN': 6, + 'KodParlimen': 59, + 'KodKawasan': 5915, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'JAMILAH BINTI ZAKARIA', + 'parti': 'BN', + }, + 774: { + 'KodN': 6, + 'KodParlimen': 59, + 'KodKawasan': 5915, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATUK SHAHARUDDIN ABDUL RASHID', + 'parti': 'PKR', + }, + 775: { + 'KodN': 6, + 'KodParlimen': 59, + 'KodKawasan': 5915, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'USTAZ FAISAL BIN ABDUL RAHMAN', + 'parti': 'PAS', + }, + 776: { + 'KodN': 6, + 'KodParlimen': 60, + 'KodKawasan': 60, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'TAN KENG LIANG', + 'parti': 'BN', + }, + 777: { + 'KodN': 6, + 'KodParlimen': 60, + 'KodKawasan': 60, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'IBRAHIM BIN ISMAIL', + 'parti': 'PAS', + }, + 778: { + 'KodN': 6, + 'KodParlimen': 60, + 'KodKawasan': 60, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'TEH KOK LIM', + 'parti': 'PKR', + }, + 779: { + 'KodN': 6, + 'KodParlimen': 60, + 'KodKawasan': 6016, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHAMAD FAKHRUDIN BIN ABDUL AZIZ', + 'parti': 'PAS', + }, + 780: { + 'KodN': 6, + 'KodParlimen': 60, + 'KodKawasan': 6016, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MUHD FADHIL BIN NURUDDIN', + 'parti': 'PKR', + }, + 781: { + 'KodN': 6, + 'KodParlimen': 60, + 'KodKawasan': 6016, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHAMMAD ZAHIR BIN ABDUL KHALID', + 'parti': 'BN', + }, + 782: { + 'KodN': 6, + 'KodParlimen': 60, + 'KodKawasan': 6017, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'LEE LI KUAN', + 'parti': 'BN', + }, + 783: { + 'KodN': 6, + 'KodParlimen': 60, + 'KodKawasan': 6017, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'LEOW THYE YIH', + 'parti': 'PKR', + }, + 784: { + 'KodN': 6, + 'KodParlimen': 60, + 'KodKawasan': 6018, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SOO KAY PING', + 'parti': 'BN', + }, + 785: { + 'KodN': 6, + 'KodParlimen': 60, + 'KodKawasan': 6018, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'NGA KOR MING', + 'parti': 'PKR', + }, + 786: { + 'KodN': 6, + 'KodParlimen': 61, + 'KodKawasan': 61, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'EJAZI BIN YAHAYA', + 'parti': 'PKR', + }, + 787: { + 'KodN': 6, + 'KodParlimen': 61, + 'KodKawasan': 61, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'MOHAMED NAZRI BIN ABDUL AZIZ', + 'parti': 'BN', + }, + 788: { + 'KodN': 6, + 'KodParlimen': 61, + 'KodKawasan': 61, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'MOHAMAD AZALAN BIN MOHAMAD RADZI', + 'parti': 'PAS', + }, + 789: { + 'KodN': 6, + 'KodParlimen': 61, + 'KodKawasan': 6119, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'KHAIRUL ANUAR BIN MUSA', + 'parti': 'PKR', + }, + 790: { + 'KodN': 6, + 'KodParlimen': 61, + 'KodKawasan': 6119, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHAMMAD FARID FAIZI BIN AZIZAN', + 'parti': 'PAS', + }, + 791: { + 'KodN': 6, + 'KodParlimen': 61, + 'KodKawasan': 6119, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ZAINUN BIN MAT NOOR', + 'parti': 'BN', + }, + 792: { + 'KodN': 6, + 'KodParlimen': 61, + 'KodKawasan': 6120, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ZULKARNINE BIN HASHIM', + 'parti': 'PKR', + }, + 793: { + 'KodN': 6, + 'KodParlimen': 61, + 'KodKawasan': 6120, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'JURIJ BIN JALALUDIN', + 'parti': 'BN', + }, + 794: { + 'KodN': 6, + 'KodParlimen': 61, + 'KodKawasan': 6120, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'AZIZI BIN MOHAMED RIDZUWAN', + 'parti': 'PAS', + }, + 795: { + 'KodN': 6, + 'KodParlimen': 62, + 'KodKawasan': 62, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'S. KESAVAN A/L SUBRAMANIAM ', + 'parti': 'PKR', + }, + 796: { + 'KodN': 6, + 'KodParlimen': 62, + 'KodKawasan': 62, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DR. ISHAK BIN IBRAHIM', + 'parti': 'PAS', + }, + 797: { + 'KodN': 6, + 'KodParlimen': 62, + 'KodKawasan': 62, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': "DATO' SRI DEVAMANY A/L S. KRISHNASAMY", + 'parti': 'BN', + }, + 798: { + 'KodN': 6, + 'KodParlimen': 62, + 'KodKawasan': 62, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'MICHAEL JEYAKUMAR DEVARAJ', + 'parti': 'PSM', + }, + 799: { + 'KodN': 6, + 'KodParlimen': 62, + 'KodKawasan': 6221, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MADHI BIN HASAN', + 'parti': 'PKR', + }, + 800: { + 'KodN': 6, + 'KodParlimen': 62, + 'KodKawasan': 6221, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ISRAN FAHMI BIN ISMAIL', + 'parti': 'PAS', + }, + 801: { + 'KodN': 6, + 'KodParlimen': 62, + 'KodKawasan': 6221, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': "DATO' HJ MOHD ZOLKAFLY BIN HJ HARUN", + 'parti': 'BN', + }, + 802: { + 'KodN': 6, + 'KodParlimen': 62, + 'KodKawasan': 6222, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'LOH SZE YEE', + 'parti': 'PKR', + }, + 803: { + 'KodN': 6, + 'KodParlimen': 62, + 'KodKawasan': 6222, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': "DATO' TAN LIAN HOE", + 'parti': 'BN', + }, + 804: { + 'KodN': 6, + 'KodParlimen': 63, + 'KodKawasan': 63, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'AHMAD HUSNI BIN HANADZLAH ', + 'parti': 'BN', + }, + 805: { + 'KodN': 6, + 'KodParlimen': 63, + 'KodKawasan': 63, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': "AHMAD FAIZAL BIN DATO' AZUMU", + 'parti': 'PKR', + }, + 806: { + 'KodN': 6, + 'KodParlimen': 63, + 'KodKawasan': 63, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'USTAZ ZULKIFLI BIN ZAKARIA ', + 'parti': 'PAS', + }, + 807: { + 'KodN': 6, + 'KodParlimen': 63, + 'KodKawasan': 6323, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'USTAZ HAFEZ BIN SABRI ', + 'parti': 'PAS', + }, + 808: { + 'KodN': 6, + 'KodParlimen': 63, + 'KodKawasan': 6323, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ASMUNI BIN AWI ', + 'parti': 'PKR', + }, + 809: { + 'KodN': 6, + 'KodParlimen': 63, + 'KodKawasan': 6323, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHAMAD ZIAD BIN MOHAMED ZAINAL ABIDIN ', + 'parti': 'BN', + }, + 810: { + 'KodN': 6, + 'KodParlimen': 63, + 'KodKawasan': 6324, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'USTAZ SALLEH BIN SAID ', + 'parti': 'PAS', + }, + 811: { + 'KodN': 6, + 'KodParlimen': 63, + 'KodKawasan': 6324, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AMINUDDIN BIN HAJI MD HANAFIAH ', + 'parti': 'BN', + }, + 812: { + 'KodN': 6, + 'KodParlimen': 63, + 'KodKawasan': 6324, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MURUGIAH A/L SUBRAMANIAM ', + 'parti': 'BEBAS', + }, + 813: { + 'KodN': 6, + 'KodParlimen': 63, + 'KodKawasan': 6324, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'MUHAMMAD ARAFAT BIN VARISAI MUHAMAD ', + 'parti': 'PKR', + }, + 814: { + 'KodN': 6, + 'KodParlimen': 64, + 'KodKawasan': 64, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'KATHLEEN WONG MEI YIN', + 'parti': 'BN', + }, + 815: { + 'KodN': 6, + 'KodParlimen': 64, + 'KodKawasan': 64, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'WONG KAH WOH', + 'parti': 'PKR', + }, + 816: { + 'KodN': 6, + 'KodParlimen': 64, + 'KodKawasan': 6425, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'JENNY CHOY TSI JEN', + 'parti': 'PKR', + }, + 817: { + 'KodN': 6, + 'KodParlimen': 64, + 'KodKawasan': 6425, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'LIEW KAR TUAN', + 'parti': 'BN', + }, + 818: { + 'KodN': 6, + 'KodParlimen': 64, + 'KodKawasan': 6426, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'KHOO BOON CHUAN', + 'parti': 'BN', + }, + 819: { + 'KodN': 6, + 'KodParlimen': 64, + 'KodKawasan': 6426, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ABDUL AZIZ BIN BARI', + 'parti': 'PKR', + }, + 820: { + 'KodN': 6, + 'KodParlimen': 64, + 'KodKawasan': 6426, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MAZLAN BIN MD ISA', + 'parti': 'PAS', + }, + 821: { + 'KodN': 6, + 'KodParlimen': 64, + 'KodKawasan': 6427, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'LEE CHUAN HOW', + 'parti': 'PKR', + }, + 822: { + 'KodN': 6, + 'KodParlimen': 64, + 'KodKawasan': 6427, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'NG KAI CHEONG', + 'parti': 'BN', + }, + 823: { + 'KodN': 6, + 'KodParlimen': 65, + 'KodKawasan': 65, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'CHENG WEI YEE', + 'parti': 'BN', + }, + 824: { + 'KodN': 6, + 'KodParlimen': 65, + 'KodKawasan': 65, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'M.KULASEGARAN A/L V.MURUGESON', + 'parti': 'PKR', + }, + 825: { + 'KodN': 6, + 'KodParlimen': 65, + 'KodKawasan': 6528, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'LOW GUO NAN', + 'parti': 'BN', + }, + 826: { + 'KodN': 6, + 'KodParlimen': 65, + 'KodKawasan': 6528, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ONG BOON PIOW', + 'parti': 'PKR', + }, + 827: { + 'KodN': 6, + 'KodParlimen': 65, + 'KodKawasan': 6529, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'CHANG KOK AUN', + 'parti': 'BN', + }, + 828: { + 'KodN': 6, + 'KodParlimen': 65, + 'KodKawasan': 6529, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'KO CHUNG SEN', + 'parti': 'PKR', + }, + 829: { + 'KodN': 6, + 'KodParlimen': 65, + 'KodKawasan': 6530, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'THANGARANI A/P THIAGARAJAN', + 'parti': 'BN', + }, + 830: { + 'KodN': 6, + 'KodParlimen': 65, + 'KodKawasan': 6530, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'SIVASUBRAMANIAM A/L ATHINARAYANAN', + 'parti': 'PKR', + }, + 831: { + 'KodN': 6, + 'KodParlimen': 65, + 'KodKawasan': 6530, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHANARANI A/P RASIAH', + 'parti': 'PSM', + }, + 832: { + 'KodN': 6, + 'KodParlimen': 66, + 'KodKawasan': 66, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'LEONG CHEE WAI', + 'parti': 'BN', + }, + 833: { + 'KodN': 6, + 'KodParlimen': 66, + 'KodKawasan': 66, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'V.SIVAKUMAR', + 'parti': 'PKR', + }, + 834: { + 'KodN': 6, + 'KodParlimen': 66, + 'KodKawasan': 66, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'SEKAR', + 'parti': 'PSM', + }, + 835: { + 'KodN': 6, + 'KodParlimen': 66, + 'KodKawasan': 6631, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'CHEAH POU HIAN ', + 'parti': 'PKR', + }, + 836: { + 'KodN': 6, + 'KodParlimen': 66, + 'KodKawasan': 6631, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'M.SARASWATHY', + 'parti': 'PSM', + }, + 837: { + 'KodN': 6, + 'KodParlimen': 66, + 'KodKawasan': 6631, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'THANKARAJ A/L KRISHNAN', + 'parti': 'BN', + }, + 838: { + 'KodN': 6, + 'KodParlimen': 66, + 'KodKawasan': 6632, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'WONG KAM SENG', + 'parti': 'BN', + }, + 839: { + 'KodN': 6, + 'KodParlimen': 66, + 'KodKawasan': 6632, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'CHAW KAM FOON ', + 'parti': 'PKR', + }, + 840: { + 'KodN': 6, + 'KodParlimen': 66, + 'KodKawasan': 6632, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'CHIN KWAI LEONG', + 'parti': 'PSM', + }, + 841: { + 'KodN': 6, + 'KodParlimen': 66, + 'KodKawasan': 6633, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'YONG CHOO KIONG', + 'parti': 'PKR', + }, + 842: { + 'KodN': 6, + 'KodParlimen': 66, + 'KodKawasan': 6633, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'YUEN CHAN HOW', + 'parti': 'BN', + }, + 843: { + 'KodN': 6, + 'KodParlimen': 66, + 'KodKawasan': 6633, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'CHIN KWAI HENG', + 'parti': 'PSM', + }, + 844: { + 'KodN': 6, + 'KodParlimen': 67, + 'KodKawasan': 67, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DRS. KHALIL IDHAM LIM', + 'parti': 'PAS', + }, + 845: { + 'KodN': 6, + 'KodParlimen': 67, + 'KodKawasan': 67, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DATIN MASTURA YAZID ', + 'parti': 'BN', + }, + 846: { + 'KodN': 6, + 'KodParlimen': 67, + 'KodKawasan': 67, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DR AHMAD TERMIZI RAMLI', + 'parti': 'PKR', + }, + 847: { + 'KodN': 6, + 'KodParlimen': 67, + 'KodKawasan': 6734, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MASLIN SHAM BIN RAZMAN ', + 'parti': 'BN', + }, + 848: { + 'KodN': 6, + 'KodParlimen': 67, + 'KodKawasan': 6734, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'LAKSAMANA PERTAMA (B) MOHAMAD IMRAN BIN ABD HAMID ', + 'parti': 'PKR', + }, + 849: { + 'KodN': 6, + 'KodParlimen': 67, + 'KodKawasan': 6734, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'INTAN NORHANI BINTI MOHAMAD BASIR', + 'parti': 'PAS', + }, + 850: { + 'KodN': 6, + 'KodParlimen': 67, + 'KodKawasan': 6735, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'JAMIL DZULKARNAIN', + 'parti': 'PAS', + }, + 851: { + 'KodN': 6, + 'KodParlimen': 67, + 'KodKawasan': 6735, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HAJI MOHAMAD ISA BIN JAAFAR ', + 'parti': 'PKR', + }, + 852: { + 'KodN': 6, + 'KodParlimen': 67, + 'KodKawasan': 6735, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHAMAD ZURAIMI RAZALI', + 'parti': 'BN', + }, + 853: { + 'KodN': 6, + 'KodParlimen': 68, + 'KodKawasan': 68, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'PANG CHOK KING', + 'parti': 'BN', + }, + 854: { + 'KodN': 6, + 'KodParlimen': 68, + 'KodKawasan': 68, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'MOHAMAD NAZEER BIN M K M HAMEED', + 'parti': 'PAS', + }, + 855: { + 'KodN': 6, + 'KodParlimen': 68, + 'KodKawasan': 68, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'NGEH KOO HAM', + 'parti': 'PKR', + }, + 856: { + 'KodN': 6, + 'KodParlimen': 68, + 'KodKawasan': 6836, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ZAKARIA BIN HASHIM', + 'parti': 'PAS', + }, + 857: { + 'KodN': 6, + 'KodParlimen': 68, + 'KodKawasan': 6836, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MURAD BIN ABDULLAH', + 'parti': 'PKR', + }, + 858: { + 'KodN': 6, + 'KodParlimen': 68, + 'KodKawasan': 6836, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ABD MANAF BIN HASHIM', + 'parti': 'BN', + }, + 859: { + 'KodN': 6, + 'KodParlimen': 68, + 'KodKawasan': 6837, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'WONG MAY ING', + 'parti': 'PKR', + }, + 860: { + 'KodN': 6, + 'KodParlimen': 68, + 'KodKawasan': 6837, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HO KEAN WEI', + 'parti': 'BN', + }, + 861: { + 'KodN': 6, + 'KodParlimen': 68, + 'KodKawasan': 6838, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'TENG KEEK SOONG', + 'parti': 'BN', + }, + 862: { + 'KodN': 6, + 'KodParlimen': 68, + 'KodKawasan': 6838, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'TEOH YEE CHERN', + 'parti': 'PKR', + }, + 863: { + 'KodN': 6, + 'KodParlimen': 69, + 'KodKawasan': 69, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DR. NAJIHATUSSALEHAH BT AHMAD', + 'parti': 'PAS', + }, + 864: { + 'KodN': 6, + 'KodParlimen': 69, + 'KodKawasan': 69, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DATO MOHD NIZAR BIN ZAKARIA', + 'parti': 'BN', + }, + 865: { + 'KodN': 6, + 'KodParlimen': 69, + 'KodKawasan': 69, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'TARMIZI BIN MOHD JAM', + 'parti': 'PKR', + }, + 866: { + 'KodN': 6, + 'KodParlimen': 69, + 'KodKawasan': 6939, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'KHAIRUDDIN BIN ABU HANIPAH', + 'parti': 'BN', + }, + 867: { + 'KodN': 6, + 'KodParlimen': 69, + 'KodKawasan': 6939, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'USTAZ MOHD ZAHID BIN ABU BAKAR', + 'parti': 'PAS', + }, + 868: { + 'KodN': 6, + 'KodParlimen': 69, + 'KodKawasan': 6939, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HAJI YAHANIS BIN YAHYA', + 'parti': 'PKR', + }, + 869: { + 'KodN': 6, + 'KodParlimen': 69, + 'KodKawasan': 6940, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'AZRUL HAKKIM BIN AZHAR', + 'parti': 'PKR', + }, + 870: { + 'KodN': 6, + 'KodParlimen': 69, + 'KodKawasan': 6940, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'USTAZ HJ MUHAMMAD ISMI BIN HJ MAT TAIB', + 'parti': 'PAS', + }, + 871: { + 'KodN': 6, + 'KodParlimen': 69, + 'KodKawasan': 6940, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'KHAIRUL SHAHRIL BIN MOHAMED', + 'parti': 'BN', + }, + 872: { + 'KodN': 6, + 'KodParlimen': 70, + 'KodKawasan': 70, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'YOUGAN A/L MAHALINGAM', + 'parti': 'PAS', + }, + 873: { + 'KodN': 6, + 'KodParlimen': 70, + 'KodKawasan': 70, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'LEE CHEE LEONG', + 'parti': 'BN', + }, + 874: { + 'KodN': 6, + 'KodParlimen': 70, + 'KodKawasan': 70, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'SU KEONG SIONG', + 'parti': 'PKR', + }, + 875: { + 'KodN': 6, + 'KodParlimen': 70, + 'KodKawasan': 7041, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'CHANG GWO CHYANG', + 'parti': 'BN', + }, + 876: { + 'KodN': 6, + 'KodParlimen': 70, + 'KodKawasan': 7041, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'LEONG CHEOK KENG', + 'parti': 'PKR', + }, + 877: { + 'KodN': 6, + 'KodParlimen': 70, + 'KodKawasan': 7041, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'BAWANI A/P KANIAPAN', + 'parti': 'PSM', + }, + 878: { + 'KodN': 6, + 'KodParlimen': 70, + 'KodKawasan': 7042, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'CHONG ZHEMIN', + 'parti': 'PKR', + }, + 879: { + 'KodN': 6, + 'KodParlimen': 70, + 'KodKawasan': 7042, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DANIEL WA WAI HOW', + 'parti': 'BN', + }, + 880: { + 'KodN': 6, + 'KodParlimen': 70, + 'KodKawasan': 7043, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'NOLEE ASHILIN BINTI MOHAMED RADZI', + 'parti': 'BN', + }, + 881: { + 'KodN': 6, + 'KodParlimen': 70, + 'KodKawasan': 7043, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'USTAZ HAJI MOHD SOFIAN BIN HAJI REJAB', + 'parti': 'PAS', + }, + 882: { + 'KodN': 6, + 'KodParlimen': 70, + 'KodKawasan': 7043, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD AZLAN HELMI BIN HELMI', + 'parti': 'PKR', + }, + 883: { + 'KodN': 6, + 'KodParlimen': 71, + 'KodKawasan': 71, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DR LEE BOON CHYE', + 'parti': 'PKR', + }, + 884: { + 'KodN': 6, + 'KodParlimen': 71, + 'KodKawasan': 71, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'ISMAIL BIN ARIFFIN', + 'parti': 'PAS', + }, + 885: { + 'KodN': 6, + 'KodParlimen': 71, + 'KodKawasan': 71, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'HENG SEAI KIE', + 'parti': 'BN', + }, + 886: { + 'KodN': 6, + 'KodParlimen': 71, + 'KodKawasan': 7144, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'RADZI BIN ZAINON', + 'parti': 'PAS', + }, + 887: { + 'KodN': 6, + 'KodParlimen': 71, + 'KodKawasan': 7144, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATO SERI NIZAR JAMALUDDIN', + 'parti': 'PKR', + }, + 888: { + 'KodN': 6, + 'KodParlimen': 71, + 'KodKawasan': 7144, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DATUK HAMZAH BIN MOHAMAD KASIM', + 'parti': 'BN', + }, + 889: { + 'KodN': 6, + 'KodParlimen': 71, + 'KodKawasan': 7145, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD ARIF ABD LATIFF ', + 'parti': 'PAS', + }, + 890: { + 'KodN': 6, + 'KodParlimen': 71, + 'KodKawasan': 7145, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'LIEW YEE LIN', + 'parti': 'BN', + }, + 891: { + 'KodN': 6, + 'KodParlimen': 71, + 'KodKawasan': 7145, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'TAN KAR HING', + 'parti': 'PKR', + }, + 892: { + 'KodN': 6, + 'KodParlimen': 71, + 'KodKawasan': 7146, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ALBERT CHANG CHUN CHEUN', + 'parti': 'BN', + }, + 893: { + 'KodN': 6, + 'KodParlimen': 71, + 'KodKawasan': 7146, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOKHTAR ABDULLAH', + 'parti': 'PAS', + }, + 894: { + 'KodN': 6, + 'KodParlimen': 71, + 'KodKawasan': 7146, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SANDREA NG SHAI CHEE', + 'parti': 'PKR', + }, + 895: { + 'KodN': 6, + 'KodParlimen': 72, + 'KodKawasan': 72, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MOHAMED AZNI MOHAMED ALI', + 'parti': 'PKR', + }, + 896: { + 'KodN': 6, + 'KodParlimen': 72, + 'KodKawasan': 72, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': ' DATUK SERI M. SARAVANAN ', + 'parti': 'BN', + }, + 897: { + 'KodN': 6, + 'KodParlimen': 72, + 'KodKawasan': 72, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'NOR AZLI MUSA', + 'parti': 'PAS', + }, + 898: { + 'KodN': 6, + 'KodParlimen': 72, + 'KodKawasan': 7247, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'CHOONG SHIN HENG', + 'parti': 'BN', + }, + 899: { + 'KodN': 6, + 'KodParlimen': 72, + 'KodKawasan': 7247, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AHMAD FAIZAL DATO AZUMU', + 'parti': 'PKR', + }, + 900: { + 'KodN': 6, + 'KodParlimen': 72, + 'KodKawasan': 7247, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'NORDIN HASSAN ', + 'parti': 'PAS', + }, + 901: { + 'KodN': 6, + 'KodParlimen': 72, + 'KodKawasan': 7248, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SALMAH ABD LATIF', + 'parti': 'PAS', + }, + 902: { + 'KodN': 6, + 'KodParlimen': 72, + 'KodKawasan': 7248, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'TAN SENG TOH', + 'parti': 'PKR', + }, + 903: { + 'KodN': 6, + 'KodParlimen': 72, + 'KodKawasan': 7248, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DATO SAMSUDIN ABU HASSAN', + 'parti': 'BN', + }, + 904: { + 'KodN': 6, + 'KodParlimen': 73, + 'KodKawasan': 73, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DR SALIHUDDIN', + 'parti': 'PKR', + }, + 905: { + 'KodN': 6, + 'KodParlimen': 73, + 'KodKawasan': 73, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DATO SRI TAJUDDIN B ABDUL RAHMAN', + 'parti': 'BN', + }, + 906: { + 'KodN': 6, + 'KodParlimen': 73, + 'KodKawasan': 73, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'USTAZ ZAFARULAZHAN ', + 'parti': 'PAS', + }, + 907: { + 'KodN': 6, + 'KodParlimen': 73, + 'KodKawasan': 7349, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MUSTAFA KAMAL B MAULUT', + 'parti': 'BEBAS', + }, + 908: { + 'KodN': 6, + 'KodParlimen': 73, + 'KodKawasan': 7349, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ZAINOL FADZI B PAHARUDIN', + 'parti': 'BN', + }, + 909: { + 'KodN': 6, + 'KodParlimen': 73, + 'KodKawasan': 7349, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHAMAD MAHARANI B MD TASI', + 'parti': 'PKR', + }, + 910: { + 'KodN': 6, + 'KodParlimen': 73, + 'KodKawasan': 7349, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'MOHAMAD YUSOFF B ABDULLAH', + 'parti': 'PAS', + }, + 911: { + 'KodN': 6, + 'KodParlimen': 73, + 'KodKawasan': 7350, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATUK DR WAN NORASHIKIN BT WAN NORDIN', + 'parti': 'BN', + }, + 912: { + 'KodN': 6, + 'KodParlimen': 73, + 'KodKawasan': 7350, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'CIKGU ZAITON', + 'parti': 'PKR', + }, + 913: { + 'KodN': 6, + 'KodParlimen': 73, + 'KodKawasan': 7350, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'USTAZ MUSTAFA SHAARI', + 'parti': 'PAS', + }, + 914: { + 'KodN': 6, + 'KodParlimen': 74, + 'KodKawasan': 74, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': "DATO' SERI DIRAJA DR ZAMBRY BIN ABD KADIR", + 'parti': 'BN', + }, + 915: { + 'KodN': 6, + 'KodParlimen': 74, + 'KodKawasan': 74, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'MOHAMMAD ZAMRI BIN IBRAHIM', + 'parti': 'PAS', + }, + 916: { + 'KodN': 6, + 'KodParlimen': 74, + 'KodKawasan': 74, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DR. MOHD HATTA BIN MD RAMLI', + 'parti': 'PKR', + }, + 917: { + 'KodN': 6, + 'KodParlimen': 74, + 'KodKawasan': 7451, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATO RASHIDI BIN IBRAHIM', + 'parti': 'BN', + }, + 918: { + 'KodN': 6, + 'KodParlimen': 74, + 'KodKawasan': 7451, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ROHAWATI ABIDIN', + 'parti': 'PAS', + }, + 919: { + 'KodN': 6, + 'KodParlimen': 74, + 'KodKawasan': 7451, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'YAHAYA MAT NOR', + 'parti': 'PKR', + }, + 920: { + 'KodN': 6, + 'KodParlimen': 74, + 'KodKawasan': 7452, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATO SERI DIRAJA DR ZAMBRY BIN ABD KADIR', + 'parti': 'BN', + }, + 921: { + 'KodN': 6, + 'KodParlimen': 74, + 'KodKawasan': 7452, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ZAINAL ABIDIN BIN SAAD', + 'parti': 'PAS', + }, + 922: { + 'KodN': 6, + 'KodParlimen': 74, + 'KodKawasan': 7452, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'NORDIN BIN AHMAD ISMAIL', + 'parti': 'PKR', + }, + 923: { + 'KodN': 6, + 'KodParlimen': 75, + 'KodKawasan': 75, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'ATA ABDUL MUNIM HASAN ADLI', + 'parti': 'PAS', + }, + 924: { + 'KodN': 6, + 'KodParlimen': 75, + 'KodKawasan': 75, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': ' AHMAD ZAHID BIN HAMIDI', + 'parti': 'BN', + }, + 925: { + 'KodN': 6, + 'KodParlimen': 75, + 'KodKawasan': 75, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'PAKHRURRAZI BIN HJ ARSHAD', + 'parti': 'PKR', + }, + 926: { + 'KodN': 6, + 'KodParlimen': 75, + 'KodKawasan': 7553, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SHAHRUL ZAMAN BIN YAHYA', + 'parti': 'BN', + }, + 927: { + 'KodN': 6, + 'KodParlimen': 75, + 'KodKawasan': 7553, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HATIM BIN MUSA', + 'parti': 'PKR', + }, + 928: { + 'KodN': 6, + 'KodParlimen': 75, + 'KodKawasan': 7553, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD MOKHERI BIN JALIL', + 'parti': 'PAS', + }, + 929: { + 'KodN': 6, + 'KodParlimen': 75, + 'KodKawasan': 7554, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MANNIVANAN A/L GOWINDASAMY', + 'parti': 'PKR', + }, + 930: { + 'KodN': 6, + 'KodParlimen': 75, + 'KodKawasan': 7554, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD MISBAHUL MUNIR BIN MASDUKI', + 'parti': 'PAS', + }, + 931: { + 'KodN': 6, + 'KodParlimen': 75, + 'KodKawasan': 7554, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'KHAIRUDDIN BIN TARMIZI', + 'parti': 'BN', + }, + 932: { + 'KodN': 6, + 'KodParlimen': 76, + 'KodKawasan': 76, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'NGA KOR MING', + 'parti': 'PKR', + }, + 933: { + 'KodN': 6, + 'KodParlimen': 76, + 'KodKawasan': 76, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DR AHMAD RAMADZAN BIN AHMAD DAUD', + 'parti': 'PAS', + }, + 934: { + 'KodN': 6, + 'KodParlimen': 76, + 'KodKawasan': 76, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'MAH SIEW KEONG', + 'parti': 'BN', + }, + 935: { + 'KodN': 6, + 'KodParlimen': 76, + 'KodKawasan': 7655, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'KONG SUN CHIN', + 'parti': 'BN', + }, + 936: { + 'KodN': 6, + 'KodParlimen': 76, + 'KodKawasan': 7655, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'TERENCE NAIDU ', + 'parti': 'PKR', + }, + 937: { + 'KodN': 6, + 'KodParlimen': 76, + 'KodKawasan': 7655, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'S.KUMARESAN', + 'parti': 'PAS', + }, + 938: { + 'KodN': 6, + 'KodParlimen': 76, + 'KodKawasan': 7656, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD AZHAR BIN JAMALUDDIN', + 'parti': 'BN', + }, + 939: { + 'KodN': 6, + 'KodParlimen': 76, + 'KodKawasan': 7656, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD FAIZUL BIN MOHAMED ISMAIL', + 'parti': 'PKR', + }, + 940: { + 'KodN': 6, + 'KodParlimen': 76, + 'KodKawasan': 7656, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD AZHAR BIN MOHD RAFIEI', + 'parti': 'PAS', + }, + 941: { + 'KodN': 6, + 'KodParlimen': 77, + 'KodKawasan': 77, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MOHD TARMIZI BIN ABD RAHMAN', + 'parti': 'PAS', + }, + 942: { + 'KodN': 6, + 'KodParlimen': 77, + 'KodKawasan': 77, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'MAH HANG SOON', + 'parti': 'BN', + }, + 943: { + 'KodN': 6, + 'KodParlimen': 77, + 'KodKawasan': 77, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'CHANG LIH KANG', + 'parti': 'PKR', + }, + 944: { + 'KodN': 6, + 'KodParlimen': 77, + 'KodKawasan': 7757, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'APPLASAMY A/L JETAKIAH', + 'parti': 'PAS', + }, + 945: { + 'KodN': 6, + 'KodParlimen': 77, + 'KodKawasan': 7757, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ELANGO A/L VADIL VELOO', + 'parti': 'BN', + }, + 946: { + 'KodN': 6, + 'KodParlimen': 77, + 'KodKawasan': 7757, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SIVANESAN A/L SUBRAMANIAM', + 'parti': 'PKR', + }, + 947: { + 'KodN': 6, + 'KodParlimen': 77, + 'KodKawasan': 7758, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD ZULFADLI BIN ZAINAL', + 'parti': 'PAS', + }, + 948: { + 'KodN': 6, + 'KodParlimen': 77, + 'KodKawasan': 7758, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD KHUSAIRI BIN ABD TALIB', + 'parti': 'BN', + }, + 949: { + 'KodN': 6, + 'KodParlimen': 77, + 'KodKawasan': 7758, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'AMRAN BIN IBRAHIM', + 'parti': 'PKR', + }, + 950: { + 'KodN': 6, + 'KodParlimen': 77, + 'KodKawasan': 7759, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SYED ZAMZURI BIN SYED NENGAH', + 'parti': 'PAS', + }, + 951: { + 'KodN': 6, + 'KodParlimen': 77, + 'KodKawasan': 7759, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'RUSNAH BINTI KASSIM', + 'parti': 'BN', + }, + 952: { + 'KodN': 6, + 'KodParlimen': 77, + 'KodKawasan': 7759, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'AMINUDDIN BIN ZULKIPLI', + 'parti': 'PKR', + }, + 953: { + 'KodN': 7, + 'KodParlimen': 78, + 'KodKawasan': 78, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'MOHD TAHIR BIN HAJI KASSIM', + 'parti': 'BERJASA', + }, + 954: { + 'KodN': 7, + 'KodParlimen': 78, + 'KodKawasan': 78, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MANOGARAN MARIMUTHU', + 'parti': 'PKR', + }, + 955: { + 'KodN': 7, + 'KodParlimen': 78, + 'KodKawasan': 78, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'WAN MAHADIR BIN WAN MAHMUD', + 'parti': 'PAS', + }, + 956: { + 'KodN': 7, + 'KodParlimen': 78, + 'KodKawasan': 78, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'SIVARAJ A/L CHANDRAN', + 'parti': 'BN', + }, + 957: { + 'KodN': 7, + 'KodParlimen': 78, + 'KodKawasan': 78, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 5, + 'NamaCalon': 'SURESH KUMAR A/L BALASUBRAMANIAM', + 'parti': 'PSM', + }, + 958: { + 'KodN': 7, + 'KodParlimen': 78, + 'KodKawasan': 7801, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'CHIONG YOKE KONG', + 'parti': 'PKR', + }, + 959: { + 'KodN': 7, + 'KodParlimen': 78, + 'KodKawasan': 7801, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'LEONG TAK MAN', + 'parti': 'BN', + }, + 960: { + 'KodN': 7, + 'KodParlimen': 78, + 'KodKawasan': 7801, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'KUMAR A/L SILAMBARAM', + 'parti': 'PAS', + }, + 961: { + 'KodN': 7, + 'KodParlimen': 78, + 'KodKawasan': 7802, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ABDUL RASID BIN MOHAMED ALI', + 'parti': 'PKR', + }, + 962: { + 'KodN': 7, + 'KodParlimen': 78, + 'KodKawasan': 7802, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ABDUL KARIM BIN NOR', + 'parti': 'PAS', + }, + 963: { + 'KodN': 7, + 'KodParlimen': 78, + 'KodKawasan': 7802, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MAT NOR A/L AYAT', + 'parti': 'PSM', + }, + 964: { + 'KodN': 7, + 'KodParlimen': 78, + 'KodKawasan': 7802, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'WAN ROSDY BIN WAN ISMAIL', + 'parti': 'BN', + }, + 965: { + 'KodN': 7, + 'KodParlimen': 79, + 'KodKawasan': 79, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'ABDUL RAHMAN BIN MOHAMAD', + 'parti': 'BN', + }, + 966: { + 'KodN': 7, + 'KodParlimen': 79, + 'KodKawasan': 79, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'BAHARUDIN BIN ABD RAHMAN', + 'parti': 'PKR', + }, + 967: { + 'KodN': 7, + 'KodParlimen': 79, + 'KodKawasan': 79, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'SOBIRIN BIN DULI', + 'parti': 'PAS', + }, + 968: { + 'KodN': 7, + 'KodParlimen': 79, + 'KodKawasan': 7903, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ALIAS BIN ABDUL RAHMAN', + 'parti': 'PKR', + }, + 969: { + 'KodN': 7, + 'KodParlimen': 79, + 'KodKawasan': 7903, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MUSTAPA BIN LONG', + 'parti': 'BN', + }, + 970: { + 'KodN': 7, + 'KodParlimen': 79, + 'KodKawasan': 7903, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ROSLAN BIN HARUN', + 'parti': 'PAS', + }, + 971: { + 'KodN': 7, + 'KodParlimen': 79, + 'KodKawasan': 7904, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SALUDIN BIN ENDOL', + 'parti': 'PAS', + }, + 972: { + 'KodN': 7, + 'KodParlimen': 79, + 'KodKawasan': 7904, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'RASHID BIN MUHAMAD', + 'parti': 'PKR', + }, + 973: { + 'KodN': 7, + 'KodParlimen': 79, + 'KodKawasan': 7904, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'LEE AH WONG', + 'parti': 'BN', + }, + 974: { + 'KodN': 7, + 'KodParlimen': 79, + 'KodKawasan': 7905, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD SOFFI BIN ABD RAZAK', + 'parti': 'BN', + }, + 975: { + 'KodN': 7, + 'KodParlimen': 79, + 'KodKawasan': 7905, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ANUAR BIN KASIM', + 'parti': 'PAS', + }, + 976: { + 'KodN': 7, + 'KodParlimen': 79, + 'KodKawasan': 7905, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SABARUDDIN BIN MOHD YASSIM', + 'parti': 'PKR', + }, + 977: { + 'KodN': 7, + 'KodParlimen': 80, + 'KodKawasan': 80, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'TENGKU ZULPURI SHAH BIN RAJA PUJI', + 'parti': 'PKR', + }, + 978: { + 'KodN': 7, + 'KodParlimen': 80, + 'KodKawasan': 80, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'CHEW MEI FUN', + 'parti': 'BN', + }, + 979: { + 'KodN': 7, + 'KodParlimen': 80, + 'KodKawasan': 80, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'MOHAMED NILAM BIN ABDUL MANAP', + 'parti': 'PAS', + }, + 980: { + 'KodN': 7, + 'KodParlimen': 80, + 'KodKawasan': 8006, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ABD AZIZ BIN MAT KIRAM', + 'parti': 'BN', + }, + 981: { + 'KodN': 7, + 'KodParlimen': 80, + 'KodKawasan': 8006, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DASIMAH BINTI ZAINUDIN', + 'parti': 'PKR', + }, + 982: { + 'KodN': 7, + 'KodParlimen': 80, + 'KodKawasan': 8006, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': "TENGKU ABDUL RAHMAN BIN TENGKU JA'AFAR", + 'parti': 'PAS', + }, + 983: { + 'KodN': 7, + 'KodParlimen': 80, + 'KodKawasan': 8007, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'NG LEAP PONG', + 'parti': 'BN', + }, + 984: { + 'KodN': 7, + 'KodParlimen': 80, + 'KodKawasan': 8007, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'CHIN CHOY HEE', + 'parti': 'PAS', + }, + 985: { + 'KodN': 7, + 'KodParlimen': 80, + 'KodKawasan': 8007, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'CHOW YU HUI', + 'parti': 'PKR', + }, + 986: { + 'KodN': 7, + 'KodParlimen': 80, + 'KodKawasan': 8008, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'SHAHIRUDDIN BIN AB MOIN', + 'parti': 'BN', + }, + 987: { + 'KodN': 7, + 'KodParlimen': 80, + 'KodKawasan': 8008, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HAMZAH BIN JAAFFAR', + 'parti': 'PKR', + }, + 988: { + 'KodN': 7, + 'KodParlimen': 80, + 'KodKawasan': 8008, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'BEDU RAHIM BIN ISMAIL', + 'parti': 'PAS', + }, + 989: { + 'KodN': 7, + 'KodParlimen': 81, + 'KodKawasan': 81, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DATO HAJI AHMAD NAZLAN BIN IDRIS', + 'parti': 'BN', + }, + 990: { + 'KodN': 7, + 'KodParlimen': 81, + 'KodKawasan': 81, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'WAN MOHD SHAHARIR BIN WAN ABD JALIL', + 'parti': 'PKR', + }, + 991: { + 'KodN': 7, + 'KodParlimen': 81, + 'KodKawasan': 81, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'YOHANIS BIN AHMAD', + 'parti': 'PAS', + }, + 992: { + 'KodN': 7, + 'KodParlimen': 81, + 'KodKawasan': 8109, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD ZAKHWAN BIN BADARDDIN', + 'parti': 'PAS', + }, + 993: { + 'KodN': 7, + 'KodParlimen': 81, + 'KodKawasan': 8109, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'WAN AMIZAN BIN WAN ABD RAZAK', + 'parti': 'BN', + }, + 994: { + 'KodN': 7, + 'KodParlimen': 81, + 'KodKawasan': 8109, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'NORDIN BIN SAMAT', + 'parti': 'PKR', + }, + 995: { + 'KodN': 7, + 'KodParlimen': 81, + 'KodKawasan': 8110, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATO LIM CHONG LY', + 'parti': 'BN', + }, + 996: { + 'KodN': 7, + 'KodParlimen': 81, + 'KodKawasan': 8110, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'WONG CHUN YUAN', + 'parti': 'PKR', + }, + 997: { + 'KodN': 7, + 'KodParlimen': 81, + 'KodKawasan': 8110, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ZURIDAN BIN DAUD', + 'parti': 'PAS', + }, + 998: { + 'KodN': 7, + 'KodParlimen': 81, + 'KodKawasan': 8111, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATO HAJI NAZRI BIN CHE NGAH', + 'parti': 'BN', + }, + 999: { + 'KodN': 7, + 'KodParlimen': 81, + 'KodKawasan': 8111, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'JAMALUDDIN BIN ABD RAHIM', + 'parti': 'PKR', + }, + 1000: { + 'KodN': 7, + 'KodParlimen': 81, + 'KodKawasan': 8111, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'AHMAD NAAWI BIN SAMAH', + 'parti': 'PAS', + }, + 1001: { + 'KodN': 7, + 'KodParlimen': 82, + 'KodKawasan': 82, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': "DATO' DR JOHAN BIN MAT SAH", + 'parti': 'BN', + }, + 1002: { + 'KodN': 7, + 'KodParlimen': 82, + 'KodKawasan': 82, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'SAIFUDDIN BIN ABDULLAH', + 'parti': 'PKR', + }, + 1003: { + 'KodN': 7, + 'KodParlimen': 82, + 'KodKawasan': 82, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'NASRUDIN BIN HASSAN', + 'parti': 'PAS', + }, + 1004: { + 'KodN': 7, + 'KodParlimen': 82, + 'KodKawasan': 8212, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': "DATO' SUHAIMI BIN JUSOH @ SULONG", + 'parti': 'BN', + }, + 1005: { + 'KodN': 7, + 'KodParlimen': 82, + 'KodKawasan': 8212, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ANDANSURA BIN RABU', + 'parti': 'PAS', + }, + 1006: { + 'KodN': 7, + 'KodParlimen': 82, + 'KodKawasan': 8212, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ZULKIFLI BIN MOHAMED', + 'parti': 'PKR', + }, + 1007: { + 'KodN': 7, + 'KodParlimen': 82, + 'KodKawasan': 8213, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'QUEK TAI SEONG', + 'parti': 'BN', + }, + 1008: { + 'KodN': 7, + 'KodParlimen': 82, + 'KodKawasan': 8213, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD YUSOF BIN HASHIM', + 'parti': 'PAS', + }, + 1009: { + 'KodN': 7, + 'KodParlimen': 82, + 'KodKawasan': 8213, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'LEE CHEAN CHUNG', + 'parti': 'PKR', + }, + 1010: { + 'KodN': 7, + 'KodParlimen': 83, + 'KodKawasan': 83, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'WONG KEAN HWEE', + 'parti': 'BN', + }, + 1011: { + 'KodN': 7, + 'KodParlimen': 83, + 'KodKawasan': 83, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'FUZIAH BINTI SALLEH', + 'parti': 'PKR', + }, + 1012: { + 'KodN': 7, + 'KodParlimen': 83, + 'KodKawasan': 83, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'SULAIMAN BIN MD DERUS', + 'parti': 'PAS', + }, + 1013: { + 'KodN': 7, + 'KodParlimen': 83, + 'KodKawasan': 8314, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'AZIZAH BINTI MOHD ALI', + 'parti': 'PAS', + }, + 1014: { + 'KodN': 7, + 'KodParlimen': 83, + 'KodKawasan': 8314, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'TEE CHOON SER', + 'parti': 'BN', + }, + 1015: { + 'KodN': 7, + 'KodParlimen': 83, + 'KodKawasan': 8314, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SIM CHON SIANG', + 'parti': 'PKR', + }, + 1016: { + 'KodN': 7, + 'KodParlimen': 83, + 'KodKawasan': 8315, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'T. ZULKIFLI BIN T. AHMAD', + 'parti': 'BN', + }, + 1017: { + 'KodN': 7, + 'KodParlimen': 83, + 'KodKawasan': 8315, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SABRINA BT MD YUSOF', + 'parti': 'PKR', + }, + 1018: { + 'KodN': 7, + 'KodParlimen': 83, + 'KodKawasan': 8315, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ROSLI BIN ABD JABBAR', + 'parti': 'PAS', + }, + 1019: { + 'KodN': 7, + 'KodParlimen': 83, + 'KodKawasan': 8316, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'FAKHRUL ANUAR BIN ZULKAWI', + 'parti': 'PKR', + }, + 1020: { + 'KodN': 7, + 'KodParlimen': 83, + 'KodKawasan': 8316, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SHAFIK FAUZAN BIN SHARIF', + 'parti': 'BN', + }, + 1021: { + 'KodN': 7, + 'KodParlimen': 83, + 'KodKawasan': 8316, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'WAN MASERI BINTI WAN MOHAMAD', + 'parti': 'PAS', + }, + 1022: { + 'KodN': 7, + 'KodParlimen': 84, + 'KodKawasan': 84, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MOHD SHAHAR BIN ABDULLAH', + 'parti': 'BN', + }, + 1023: { + 'KodN': 7, + 'KodParlimen': 84, + 'KodKawasan': 84, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'MOHD ASHRAF MUSTAQIM BIN BADRUL MUNIR', + 'parti': 'PKR', + }, + 1024: { + 'KodN': 7, + 'KodParlimen': 84, + 'KodKawasan': 84, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'MOHAMAD AZHAR BIN MOHAMAD NOOR ', + 'parti': 'PAS', + }, + 1025: { + 'KodN': 7, + 'KodParlimen': 84, + 'KodKawasan': 8417, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MD. SOHAIMI BIN MOHAMAD SHAH', + 'parti': 'BN', + }, + 1026: { + 'KodN': 7, + 'KodParlimen': 84, + 'KodKawasan': 8417, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'FAUZI BIN ABDUL RAHMAN', + 'parti': 'PKR', + }, + 1027: { + 'KodN': 7, + 'KodParlimen': 84, + 'KodKawasan': 8417, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HAZMIN BIN DIBOK', + 'parti': 'PAS', + }, + 1028: { + 'KodN': 7, + 'KodParlimen': 84, + 'KodKawasan': 8418, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ABD. RAHIM BIN MUDA', + 'parti': 'BN', + }, + 1029: { + 'KodN': 7, + 'KodParlimen': 84, + 'KodKawasan': 8418, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD NOR HISHAM BIN MUHAMMAD', + 'parti': 'PAS', + }, + 1030: { + 'KodN': 7, + 'KodParlimen': 84, + 'KodKawasan': 8418, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'NUR ADDIN BIN IBRAHIM', + 'parti': 'PKR', + }, + 1031: { + 'KodN': 7, + 'KodParlimen': 84, + 'KodKawasan': 8419, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD ZAILI BIN HJ. BESAR', + 'parti': 'BN', + }, + 1032: { + 'KodN': 7, + 'KodParlimen': 84, + 'KodKawasan': 8419, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD TARMIZI BIN YAHAYA', + 'parti': 'PAS', + }, + 1033: { + 'KodN': 7, + 'KodParlimen': 84, + 'KodKawasan': 8419, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'KAMARZAMAN BIN MOHAMED YUNUS', + 'parti': 'PKR', + }, + 1034: { + 'KodN': 7, + 'KodParlimen': 84, + 'KodKawasan': 8419, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'BENZIN BIN DAGOK', + 'parti': 'BEBAS', + }, + 1035: { + 'KodN': 7, + 'KodParlimen': 85, + 'KodKawasan': 85, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'ABD KADIR BIN SAINUDDIN', + 'parti': 'BEBAS', + }, + 1036: { + 'KodN': 7, + 'KodParlimen': 85, + 'KodKawasan': 85, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'AHIATUDIN BIN DAUD', + 'parti': 'PAS', + }, + 1037: { + 'KodN': 7, + 'KodParlimen': 85, + 'KodKawasan': 85, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'najib razak', + 'parti': 'BN', + }, + 1038: { + 'KodN': 7, + 'KodParlimen': 85, + 'KodKawasan': 85, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MUHAMMAD ZAHID BIN MD ARIP', + 'parti': 'PKR', + }, + 1039: { + 'KodN': 7, + 'KodParlimen': 85, + 'KodKawasan': 8520, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'KHAIRUDDIN BIN MAHMOD', + 'parti': 'BN', + }, + 1040: { + 'KodN': 7, + 'KodParlimen': 85, + 'KodKawasan': 8520, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ZAINUDDIN BIN NOH', + 'parti': 'PAS', + }, + 1041: { + 'KodN': 7, + 'KodParlimen': 85, + 'KodKawasan': 8520, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ABU BAKAR BIN LEBAI SUDIN', + 'parti': 'PKR', + }, + 1042: { + 'KodN': 7, + 'KodParlimen': 85, + 'KodKawasan': 8521, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'SH MOHMED PUZI BIN SH AL', + 'parti': 'BN', + }, + 1043: { + 'KodN': 7, + 'KodParlimen': 85, + 'KodKawasan': 8521, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SALIM BIN ABDUL MAJID', + 'parti': 'PKR', + }, + 1044: { + 'KodN': 7, + 'KodParlimen': 85, + 'KodKawasan': 8521, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ABU KASSIM BIN MANAF', + 'parti': 'PAS', + }, + 1045: { + 'KodN': 7, + 'KodParlimen': 85, + 'KodKawasan': 8522, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHAMMAD FAKHRUDDIN BIN MOHD ARIFF', + 'parti': 'BN', + }, + 1046: { + 'KodN': 7, + 'KodParlimen': 85, + 'KodKawasan': 8522, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AFIF SYAIROL BIN ABDUL RAHIM ', + 'parti': 'PKR', + }, + 1047: { + 'KodN': 7, + 'KodParlimen': 85, + 'KodKawasan': 8522, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD NAZHAR BIN OTHMAN', + 'parti': 'PAS', + }, + 1048: { + 'KodN': 7, + 'KodParlimen': 85, + 'KodKawasan': 8523, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ABU BAKAR BIN HARUN ', + 'parti': 'BN', + }, + 1049: { + 'KodN': 7, + 'KodParlimen': 85, + 'KodKawasan': 8523, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHAMAD RAZALI BIN ITHNAIN ', + 'parti': 'PKR', + }, + 1050: { + 'KodN': 7, + 'KodParlimen': 85, + 'KodKawasan': 8523, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD FADHIL NOOR BIN ABDUL KARIM', + 'parti': 'PAS', + }, + 1051: { + 'KodN': 7, + 'KodParlimen': 86, + 'KodKawasan': 86, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'AHMAD FARID BIN AHMAD NORDIN', + 'parti': 'PKR', + }, + 1052: { + 'KodN': 7, + 'KodParlimen': 86, + 'KodKawasan': 86, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'HASENAN BIN HARUN', + 'parti': 'PAS', + }, + 1053: { + 'KodN': 7, + 'KodParlimen': 86, + 'KodKawasan': 86, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': "DATO' SRI DR. HJ. ISMAIL BIN ABD MUTTALIB", + 'parti': 'BN', + }, + 1054: { + 'KodN': 7, + 'KodParlimen': 86, + 'KodKawasan': 8624, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD SOFIAN BIN ABD JALIL', + 'parti': 'PAS', + }, + 1055: { + 'KodN': 7, + 'KodParlimen': 86, + 'KodKawasan': 8624, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': "NURHIDAYAH BINTI DATO' MOHAMAD SHAHAIMI", + 'parti': 'BN', + }, + 1056: { + 'KodN': 7, + 'KodParlimen': 86, + 'KodKawasan': 8624, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ROSLI BIN AMIN', + 'parti': 'PKR', + }, + 1057: { + 'KodN': 7, + 'KodParlimen': 86, + 'KodKawasan': 8625, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'BOSTAMIN BIN BAKAR', + 'parti': 'PKR', + }, + 1058: { + 'KodN': 7, + 'KodParlimen': 86, + 'KodKawasan': 8625, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': "DATO' SRI HJH SHAHANIZA BINTI SHAMSUDIN", + 'parti': 'BN', + }, + 1059: { + 'KodN': 7, + 'KodParlimen': 86, + 'KodKawasan': 8625, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'FAZIL AZMI BIN NADZRI', + 'parti': 'PAS', + }, + 1060: { + 'KodN': 7, + 'KodParlimen': 86, + 'KodKawasan': 8626, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MUJIBUR RAHMAN BIN ISHAK', + 'parti': 'PAS', + }, + 1061: { + 'KodN': 7, + 'KodParlimen': 86, + 'KodKawasan': 8626, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': "DATO' HJ MOHAMED ARIFIN BIN AWANG ISMAIL", + 'parti': 'BN', + }, + 1062: { + 'KodN': 7, + 'KodParlimen': 86, + 'KodKawasan': 8626, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ZULIANA BINTI MOHAMED', + 'parti': 'PKR', + }, + 1063: { + 'KodN': 7, + 'KodParlimen': 87, + 'KodKawasan': 87, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'Kamal bin Ashaari ', + 'parti': 'PAS', + }, + 1064: { + 'KodN': 7, + 'KodParlimen': 87, + 'KodKawasan': 87, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'Mohamad Rafidee bin Hassim', + 'parti': 'PKR', + }, + 1065: { + 'KodN': 7, + 'KodParlimen': 87, + 'KodKawasan': 87, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': "Dato' Sri Hj Ismail bin Hj Mohamed Said", + 'parti': 'BN', + }, + 1066: { + 'KodN': 7, + 'KodParlimen': 87, + 'KodKawasan': 8727, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': "Dato' Sri Hj Mohamed bin Hj Jaafar", + 'parti': 'BN', + }, + 1067: { + 'KodN': 7, + 'KodParlimen': 87, + 'KodKawasan': 8727, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'Abdullah bin Yusoh', + 'parti': 'PAS', + }, + 1068: { + 'KodN': 7, + 'KodParlimen': 87, + 'KodKawasan': 8727, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'Faizah binti Baharum', + 'parti': 'PKR', + }, + 1069: { + 'KodN': 7, + 'KodParlimen': 87, + 'KodKawasan': 8728, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': "Dato' Sri Syed Ibrahim bin Syed Ahmad", + 'parti': 'BN', + }, + 1070: { + 'KodN': 7, + 'KodParlimen': 87, + 'KodKawasan': 8728, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'Aireroshsiri bin Roslan', + 'parti': 'PAS', + }, + 1071: { + 'KodN': 7, + 'KodParlimen': 87, + 'KodKawasan': 8728, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'Adnan bin Abdul Manaf', + 'parti': 'PKR', + }, + 1072: { + 'KodN': 7, + 'KodParlimen': 87, + 'KodKawasan': 8729, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': "Dato' Hj Wan Salman bin Hj Wan Ismail", + 'parti': 'BN', + }, + 1073: { + 'KodN': 7, + 'KodParlimen': 87, + 'KodKawasan': 8729, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'Shahril Azman bin Abd Halim', + 'parti': 'PAS', + }, + 1074: { + 'KodN': 7, + 'KodParlimen': 87, + 'KodKawasan': 8729, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'Jalani bin Ludin', + 'parti': 'PKR', + }, + 1075: { + 'KodN': 7, + 'KodParlimen': 88, + 'KodKawasan': 88, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': "DATO'SRI HAJI MOHD SHARKAR BIN SHAMSUDDIN", + 'parti': 'BN', + }, + 1076: { + 'KodN': 7, + 'KodParlimen': 88, + 'KodKawasan': 88, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 5, + 'NamaCalon': 'MOHD ANUAR BIN MOHD TAHIR', + 'parti': 'PKR', + }, + 1077: { + 'KodN': 7, + 'KodParlimen': 88, + 'KodKawasan': 88, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'MOHD JUSOH BIN DARUS', + 'parti': 'PAS', + }, + 1078: { + 'KodN': 7, + 'KodParlimen': 88, + 'KodKawasan': 88, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'MOHAMAD FAKHRUDDIN BIN ABU HANIPAH', + 'parti': 'BEBAS', + }, + 1079: { + 'KodN': 7, + 'KodParlimen': 88, + 'KodKawasan': 88, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MOHD KHAIDIR BIN AHMAD', + 'parti': 'BEBAS', + }, + 1080: { + 'KodN': 7, + 'KodParlimen': 88, + 'KodKawasan': 8830, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': "DATO' WONG TAT CHEE @ WONG TAI CHEE", + 'parti': 'BN', + }, + 1081: { + 'KodN': 7, + 'KodParlimen': 88, + 'KodKawasan': 8830, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'WOO CHEE-WAN', + 'parti': 'PKR', + }, + 1082: { + 'KodN': 7, + 'KodParlimen': 88, + 'KodKawasan': 8830, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ABIRERAH BIN AWANG CHIK', + 'parti': 'PAS', + }, + 1083: { + 'KodN': 7, + 'KodParlimen': 88, + 'KodKawasan': 8830, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATO CHUAH BOON-SEONG', + 'parti': 'BEBAS', + }, + 1084: { + 'KodN': 7, + 'KodParlimen': 88, + 'KodKawasan': 8831, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATUK SERI HAJI MOHD SHARKAR BIN SHAMSUDDIN', + 'parti': 'BN', + }, + 1085: { + 'KodN': 7, + 'KodParlimen': 88, + 'KodKawasan': 8831, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD KHAIDIR BIN AHMAD', + 'parti': 'BEBAS', + }, + 1086: { + 'KodN': 7, + 'KodParlimen': 88, + 'KodKawasan': 8831, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'HASSAN BIN OMAR', + 'parti': 'PAS', + }, + 1087: { + 'KodN': 7, + 'KodParlimen': 88, + 'KodKawasan': 8831, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ABAS BIN AWANG', + 'parti': 'PKR', + }, + 1088: { + 'KodN': 7, + 'KodParlimen': 88, + 'KodKawasan': 8832, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': "DATO' NOR AZMI BIN MAT LUDIN", + 'parti': 'BN', + }, + 1089: { + 'KodN': 7, + 'KodParlimen': 88, + 'KodKawasan': 8832, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SYED HAMID BIN SYED MOHAMED', + 'parti': 'PKR', + }, + 1090: { + 'KodN': 7, + 'KodParlimen': 88, + 'KodKawasan': 8832, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HASANUDDIN BIN SALIM', + 'parti': 'PAS', + }, + 1091: { + 'KodN': 7, + 'KodParlimen': 89, + 'KodKawasan': 89, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DATUK SERI LIOW TIONG LAI', + 'parti': 'BN', + }, + 1092: { + 'KodN': 7, + 'KodParlimen': 89, + 'KodKawasan': 89, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'BALASUBRAMANIAN NACHIAPAN', + 'parti': 'PAS', + }, + 1093: { + 'KodN': 7, + 'KodParlimen': 89, + 'KodKawasan': 89, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'WONG TACK', + 'parti': 'PKR', + }, + 1094: { + 'KodN': 7, + 'KodParlimen': 89, + 'KodKawasan': 8933, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'LEE CHIN CHEN', + 'parti': 'PKR', + }, + 1095: { + 'KodN': 7, + 'KodParlimen': 89, + 'KodKawasan': 8933, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD ZAMRI BIN NONG', + 'parti': 'PAS', + }, + 1096: { + 'KodN': 7, + 'KodParlimen': 89, + 'KodKawasan': 8933, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'POO MUN HOONG', + 'parti': 'BN', + }, + 1097: { + 'KodN': 7, + 'KodParlimen': 89, + 'KodKawasan': 8934, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'LAU HOI KEONG', + 'parti': 'BN', + }, + 1098: { + 'KodN': 7, + 'KodParlimen': 89, + 'KodKawasan': 8934, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'YOUNG SYEFURA BINTI OTHMAN', + 'parti': 'PKR', + }, + 1099: { + 'KodN': 7, + 'KodParlimen': 89, + 'KodKawasan': 8934, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'USTAZ ROSLAN MD ESA', + 'parti': 'PAS', + }, + 1100: { + 'KodN': 7, + 'KodParlimen': 89, + 'KodKawasan': 8935, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': "DATO' GOONASAKAREN A/L RAMAN", + 'parti': 'BN', + }, + 1101: { + 'KodN': 7, + 'KodParlimen': 89, + 'KodKawasan': 8935, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'KAMACHE', + 'parti': 'PKR', + }, + 1102: { + 'KodN': 7, + 'KodParlimen': 89, + 'KodKawasan': 8935, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'T.KARUNANEETHI', + 'parti': 'BEBAS', + }, + 1103: { + 'KodN': 7, + 'KodParlimen': 89, + 'KodKawasan': 8935, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'MOHD KHAIRUDDIN BIN ABDULLAH', + 'parti': 'PAS', + }, + 1104: { + 'KodN': 7, + 'KodParlimen': 89, + 'KodKawasan': 8936, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATUK SERI HAJI ADNAN HAJI YAAKOB', + 'parti': 'BN', + }, + 1105: { + 'KodN': 7, + 'KodParlimen': 89, + 'KodKawasan': 8936, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'CIKGU NOR HAIZAN @ CIKGU ENAB', + 'parti': 'PKR', + }, + 1106: { + 'KodN': 7, + 'KodParlimen': 89, + 'KodKawasan': 8936, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ZAHARIM BIN OSMAN', + 'parti': 'PAS', + }, + 1107: { + 'KodN': 7, + 'KodParlimen': 90, + 'KodKawasan': 90, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'ZAKARIA BIN ABDUL HAMID', + 'parti': 'PKR', + }, + 1108: { + 'KodN': 7, + 'KodParlimen': 90, + 'KodKawasan': 90, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'MUSANIFF BIN AB RAHMAN', + 'parti': 'PAS', + }, + 1109: { + 'KodN': 7, + 'KodParlimen': 90, + 'KodKawasan': 90, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': "DATO' SRI ISMAIL SABRI BIN YAAKOB", + 'parti': 'BN', + }, + 1110: { + 'KodN': 7, + 'KodParlimen': 90, + 'KodKawasan': 9037, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD SHAHRUL BIN MOHAMED', + 'parti': 'PAS', + }, + 1111: { + 'KodN': 7, + 'KodParlimen': 90, + 'KodKawasan': 9037, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AHMAD MAJDIL FAUZI BIN ABD AZIZ', + 'parti': 'PKR', + }, + 1112: { + 'KodN': 7, + 'KodParlimen': 90, + 'KodKawasan': 9037, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': "DATO' SRI NOROLAZALI BIN SULAIMAN", + 'parti': 'BN', + }, + 1113: { + 'KodN': 7, + 'KodParlimen': 90, + 'KodKawasan': 9038, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'LEONG YU MAN', + 'parti': 'PKR', + }, + 1114: { + 'KodN': 7, + 'KodParlimen': 90, + 'KodKawasan': 9038, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'TAN TIN LOON', + 'parti': 'BN', + }, + 1115: { + 'KodN': 7, + 'KodParlimen': 90, + 'KodKawasan': 9039, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MANOLAN BIN MOHAMAD', + 'parti': 'PKR', + }, + 1116: { + 'KodN': 7, + 'KodParlimen': 90, + 'KodKawasan': 9039, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MD YUSOF BIN CHE DIN', + 'parti': 'PAS', + }, + 1117: { + 'KodN': 7, + 'KodParlimen': 90, + 'KodKawasan': 9039, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': "DATO' MOHD FADIL BIN OSMAN", + 'parti': 'BN', + }, + 1118: { + 'KodN': 7, + 'KodParlimen': 91, + 'KodKawasan': 91, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'M SHAHRUL NIZAM BIN ABDUL HALIFF', + 'parti': 'PAS', + }, + 1119: { + 'KodN': 7, + 'KodParlimen': 91, + 'KodKawasan': 91, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'SITANURISAH BINTI AB. KADIR', + 'parti': 'PKR', + }, + 1120: { + 'KodN': 7, + 'KodParlimen': 91, + 'KodKawasan': 91, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'HASAN BIN ARIFIN', + 'parti': 'BN', + }, + 1121: { + 'KodN': 7, + 'KodParlimen': 91, + 'KodKawasan': 9140, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SAMSIAH BINTI ARSHAD', + 'parti': 'BN', + }, + 1122: { + 'KodN': 7, + 'KodParlimen': 91, + 'KodKawasan': 9140, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'NAZRI BIN AHMAD', + 'parti': 'PAS', + }, + 1123: { + 'KodN': 7, + 'KodParlimen': 91, + 'KodKawasan': 9140, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ZULKURNAIN BIN MOHAMAD RIDZUAN', + 'parti': 'PKR', + }, + 1124: { + 'KodN': 7, + 'KodParlimen': 91, + 'KodKawasan': 9141, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'RAZALI BIN KASSIM', + 'parti': 'BN', + }, + 1125: { + 'KodN': 7, + 'KodParlimen': 91, + 'KodKawasan': 9141, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'RAMLI BIN AWANG AHMAT', + 'parti': 'PAS', + }, + 1126: { + 'KodN': 7, + 'KodParlimen': 91, + 'KodKawasan': 9141, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'OSMAN BIN A.BAKAR', + 'parti': 'PKR', + }, + 1127: { + 'KodN': 7, + 'KodParlimen': 91, + 'KodKawasan': 9142, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'MOHD JOHARI BIN HUSSIN', + 'parti': 'BN', + }, + 1128: { + 'KodN': 7, + 'KodParlimen': 91, + 'KodKawasan': 9142, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD ZOLFAKAR BIN TAIB', + 'parti': 'BEBAS', + }, + 1129: { + 'KodN': 7, + 'KodParlimen': 91, + 'KodKawasan': 9142, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MD YUNOS BIN RAMLI', + 'parti': 'PAS', + }, + 1130: { + 'KodN': 7, + 'KodParlimen': 91, + 'KodKawasan': 9142, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'AHMAD SAZILI BIN MOHD NOR', + 'parti': 'PKR', + }, + 1131: { + 'KodN': 8, + 'KodParlimen': 92, + 'KodKawasan': 92, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MOHD FASIAH BIN MOHD FAKEH', + 'parti': 'BN', + }, + 1132: { + 'KodN': 8, + 'KodParlimen': 92, + 'KodKawasan': 92, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'MUHAMMAD LABIB BIN ABD JALIL', + 'parti': 'PAS', + }, + 1133: { + 'KodN': 8, + 'KodParlimen': 92, + 'KodKawasan': 92, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'WARNO BIN DOGOL', + 'parti': 'PKR', + }, + 1134: { + 'KodN': 8, + 'KodParlimen': 92, + 'KodKawasan': 9201, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'RIZAM BIN ISMAIL', + 'parti': 'BN', + }, + 1135: { + 'KodN': 8, + 'KodParlimen': 92, + 'KodKawasan': 9201, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ZAMRI BIN YAHYA', + 'parti': 'PAS', + }, + 1136: { + 'KodN': 8, + 'KodParlimen': 92, + 'KodKawasan': 9201, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD HAMIZAR BIN SULAIMAN', + 'parti': 'PKR', + }, + 1137: { + 'KodN': 8, + 'KodParlimen': 92, + 'KodKawasan': 9202, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SALLEHUDDIN BIN MOHD ISKAN', + 'parti': 'BN', + }, + 1138: { + 'KodN': 8, + 'KodParlimen': 92, + 'KodKawasan': 9202, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AHMAD MUSTAIN BIN OTHMAN', + 'parti': 'PKR', + }, + 1139: { + 'KodN': 8, + 'KodParlimen': 92, + 'KodKawasan': 9202, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SALLEHEN BIN MUKHYI', + 'parti': 'PAS', + }, + 1140: { + 'KodN': 8, + 'KodParlimen': 93, + 'KodKawasan': 93, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'BUDIMAN BIN MOHD ZOHDI', + 'parti': 'BN', + }, + 1141: { + 'KodN': 8, + 'KodParlimen': 93, + 'KodKawasan': 93, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'MUSLIMIN BIN YAHYA', + 'parti': 'PKR', + }, + 1142: { + 'KodN': 8, + 'KodParlimen': 93, + 'KodKawasan': 93, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'MOHAMED SALLEH MOHD HUSIN', + 'parti': 'PAS', + }, + 1143: { + 'KodN': 8, + 'KodParlimen': 93, + 'KodKawasan': 9303, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATO IMRAN BIN TAMRIN', + 'parti': 'BN', + }, + 1144: { + 'KodN': 8, + 'KodParlimen': 93, + 'KodKawasan': 9303, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MARIAM BINTI ABDUL RASHID', + 'parti': 'PKR', + }, + 1145: { + 'KodN': 8, + 'KodParlimen': 93, + 'KodKawasan': 9303, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD RAZALI BIN SHAARI', + 'parti': 'PAS', + }, + 1146: { + 'KodN': 8, + 'KodParlimen': 93, + 'KodKawasan': 9304, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'LEE YEE YUAN', + 'parti': 'BN', + }, + 1147: { + 'KodN': 8, + 'KodParlimen': 93, + 'KodKawasan': 9304, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'NG SUEE LIM', + 'parti': 'PKR', + }, + 1148: { + 'KodN': 8, + 'KodParlimen': 93, + 'KodKawasan': 9304, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'FADZLIN BIN TASLIMIN', + 'parti': 'PAS', + }, + 1149: { + 'KodN': 8, + 'KodParlimen': 94, + 'KodKawasan': 94, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DATUK P KAMALANATHAN A/L PANCHANATHAN', + 'parti': 'BN', + }, + 1150: { + 'KodN': 8, + 'KodParlimen': 94, + 'KodKawasan': 94, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'DR WAN MAT BIN SULAIMAN', + 'parti': 'PAS', + }, + 1151: { + 'KodN': 8, + 'KodParlimen': 94, + 'KodKawasan': 94, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'JUNE LEOW HSIAD HUI', + 'parti': 'PKR', + }, + 1152: { + 'KodN': 8, + 'KodParlimen': 94, + 'KodKawasan': 94, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'KUMAR A/L S PARAMASIVAM', + 'parti': 'BEBAS', + }, + 1153: { + 'KodN': 8, + 'KodParlimen': 94, + 'KodKawasan': 9405, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DATUK HAJAH ROSNI BINTI SOHAR', + 'parti': 'BN', + }, + 1154: { + 'KodN': 8, + 'KodParlimen': 94, + 'KodKawasan': 9405, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD AMRAN BIN SAKIR', + 'parti': 'PKR', + }, + 1155: { + 'KodN': 8, + 'KodParlimen': 94, + 'KodKawasan': 9405, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHAMMED SALLEH BIN RI', + 'parti': 'PAS', + }, + 1156: { + 'KodN': 8, + 'KodParlimen': 94, + 'KodKawasan': 9406, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATUK WONG KOON MUN', + 'parti': 'BN', + }, + 1157: { + 'KodN': 8, + 'KodParlimen': 94, + 'KodKawasan': 9406, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'LEE KEE HIONG', + 'parti': 'PKR', + }, + 1158: { + 'KodN': 8, + 'KodParlimen': 94, + 'KodKawasan': 9406, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'NAHARUDDIN BIN ABDUL RASHID', + 'parti': 'PAS', + }, + 1159: { + 'KodN': 8, + 'KodParlimen': 94, + 'KodKawasan': 9407, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATUK HAJI MAT NADZARI BIN AHMAD DAHLAN', + 'parti': 'BN', + }, + 1160: { + 'KodN': 8, + 'KodParlimen': 94, + 'KodKawasan': 9407, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HARUMAINI BIN HAJI OMAR', + 'parti': 'PKR', + }, + 1161: { + 'KodN': 8, + 'KodParlimen': 94, + 'KodKawasan': 9407, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD HASNIZAN BIN HARUN', + 'parti': 'PAS', + }, + 1162: { + 'KodN': 8, + 'KodParlimen': 95, + 'KodKawasan': 95, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'TS NOH BIN OMAR', + 'parti': 'BN', + }, + 1163: { + 'KodN': 8, + 'KodParlimen': 95, + 'KodKawasan': 95, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'NOR AZ AZLAN BIN AHMAD', + 'parti': 'PAS', + }, + 1164: { + 'KodN': 8, + 'KodParlimen': 95, + 'KodKawasan': 95, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DATUK DR ZULKAFERI HANAFI', + 'parti': 'PKR', + }, + 1165: { + 'KodN': 8, + 'KodParlimen': 95, + 'KodKawasan': 9508, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD SAMSUDIN BIN LIAS', + 'parti': 'BN', + }, + 1166: { + 'KodN': 8, + 'KodParlimen': 95, + 'KodKawasan': 9508, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD ZAMRI BIN ZAINUDDIN ', + 'parti': 'PAS', + }, + 1167: { + 'KodN': 8, + 'KodParlimen': 95, + 'KodKawasan': 9508, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD AZMIL BIN MISMAN ', + 'parti': 'PKR', + }, + 1168: { + 'KodN': 8, + 'KodParlimen': 95, + 'KodKawasan': 9509, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'SULAIMAN BIN ABDUL RAZAK ', + 'parti': 'BN', + }, + 1169: { + 'KodN': 8, + 'KodParlimen': 95, + 'KodKawasan': 9509, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ROZANA ZAINAL ABIDIN ', + 'parti': 'PKR', + }, + 1170: { + 'KodN': 8, + 'KodParlimen': 95, + 'KodKawasan': 9509, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MUHAMMAD JAFARUDDIN SYEIK DAUD ', + 'parti': 'PAS', + }, + 1171: { + 'KodN': 8, + 'KodParlimen': 96, + 'KodKawasan': 96, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DATO SRI DR. IRMOHIZAM BIN IBRAHIM', + 'parti': 'BN', + }, + 1172: { + 'KodN': 8, + 'KodParlimen': 96, + 'KodKawasan': 96, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DR DZULKEFLEY BIN AHMAD', + 'parti': 'PKR', + }, + 1173: { + 'KodN': 8, + 'KodParlimen': 96, + 'KodKawasan': 96, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'FAKARUDDIN BIN ISMAIL', + 'parti': 'AKIM', + }, + 1174: { + 'KodN': 8, + 'KodParlimen': 96, + 'KodKawasan': 9610, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'JAKIRAN BIN JACOMAH', + 'parti': 'BN', + }, + 1175: { + 'KodN': 8, + 'KodParlimen': 96, + 'KodKawasan': 9610, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'JUWAIRIYA BT ZULKIFLI', + 'parti': 'PKR', + }, + 1176: { + 'KodN': 8, + 'KodParlimen': 96, + 'KodKawasan': 9610, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MUHAMMAD RASHID BIN MUHAMMAD KASIM', + 'parti': 'PAS', + }, + 1177: { + 'KodN': 8, + 'KodParlimen': 96, + 'KodKawasan': 9611, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'PARTHIBAN A/L KARUPPIAH', + 'parti': 'BN', + }, + 1178: { + 'KodN': 8, + 'KodParlimen': 96, + 'KodKawasan': 9611, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'JEFRI BIN MEJAN', + 'parti': 'PAS', + }, + 1179: { + 'KodN': 8, + 'KodParlimen': 96, + 'KodKawasan': 9611, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'KUMARAN A/L TAMIL DASSEN', + 'parti': 'PRM', + }, + 1180: { + 'KodN': 8, + 'KodParlimen': 96, + 'KodKawasan': 9611, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DR IDRIS BIN AHMAD', + 'parti': 'PKR', + }, + 1181: { + 'KodN': 8, + 'KodParlimen': 96, + 'KodKawasan': 9612, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ZAHAR AZLAN BIN ARIFIN', + 'parti': 'BN', + }, + 1182: { + 'KodN': 8, + 'KodParlimen': 96, + 'KodKawasan': 9612, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD NOOR MOHD SHAHAR', + 'parti': 'PAS', + }, + 1183: { + 'KodN': 8, + 'KodParlimen': 96, + 'KodKawasan': 9612, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD SHAHID ROSLI', + 'parti': 'PKR', + }, + 1184: { + 'KodN': 8, + 'KodParlimen': 97, + 'KodKawasan': 97, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'KANG MENG FUAT', + 'parti': 'BN', + }, + 1185: { + 'KodN': 8, + 'KodParlimen': 97, + 'KodKawasan': 97, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'BRIG. GEN HASHIM KARIM', + 'parti': 'PAS', + }, + 1186: { + 'KodN': 8, + 'KodParlimen': 97, + 'KodKawasan': 97, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'WILLIAM LEONG JEE KEEN', + 'parti': 'PKR', + }, + 1187: { + 'KodN': 8, + 'KodParlimen': 97, + 'KodKawasan': 9713, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SALLEH AMIRUDDIN', + 'parti': 'PKR', + }, + 1188: { + 'KodN': 8, + 'KodParlimen': 97, + 'KodKawasan': 9713, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ABDUL SHUKUR IDRUS', + 'parti': 'BN', + }, + 1189: { + 'KodN': 8, + 'KodParlimen': 97, + 'KodKawasan': 9713, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD FAUZAN MADZLAN', + 'parti': 'PAS', + }, + 1190: { + 'KodN': 8, + 'KodParlimen': 97, + 'KodKawasan': 9713, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'MOHD RAFIE MOHAMMAD ARIF', + 'parti': 'PRM', + }, + 1191: { + 'KodN': 8, + 'KodParlimen': 97, + 'KodKawasan': 9714, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'CHUA WEI KIAT', + 'parti': 'PKR', + }, + 1192: { + 'KodN': 8, + 'KodParlimen': 97, + 'KodKawasan': 9714, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'CHAN WUN HOONG', + 'parti': 'BN', + }, + 1193: { + 'KodN': 8, + 'KodParlimen': 97, + 'KodKawasan': 9714, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'KONG TUCK WAH', + 'parti': 'PAS', + }, + 1194: { + 'KodN': 8, + 'KodParlimen': 97, + 'KodKawasan': 9714, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AZMAN MOHD NOOR', + 'parti': 'BEBAS', + }, + 1195: { + 'KodN': 8, + 'KodParlimen': 97, + 'KodKawasan': 9715, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ZAIDY ABDUL TALIB', + 'parti': 'PAS', + }, + 1196: { + 'KodN': 8, + 'KodParlimen': 97, + 'KodKawasan': 9715, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'IR MD NASIR IBRAHIM', + 'parti': 'BN', + }, + 1197: { + 'KodN': 8, + 'KodParlimen': 97, + 'KodKawasan': 9715, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'KOH SWE YONG', + 'parti': 'PRM', + }, + 1198: { + 'KodN': 8, + 'KodParlimen': 97, + 'KodKawasan': 9715, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'MOHD SANY HAMZAN', + 'parti': 'PKR', + }, + 1199: { + 'KodN': 8, + 'KodParlimen': 97, + 'KodKawasan': 9715, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'DR. RAJANDRAN', + 'parti': 'PAP', + }, + 1200: { + 'KodN': 8, + 'KodParlimen': 98, + 'KodKawasan': 98, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DATUK ABDUL RAHIM BIN PANDAK KAMARUDIN', + 'parti': 'BN', + }, + 1201: { + 'KodN': 8, + 'KodParlimen': 98, + 'KodKawasan': 98, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DATO SERI MOHAMED AZMIN BIN ALI', + 'parti': 'PKR', + }, + 1202: { + 'KodN': 8, + 'KodParlimen': 98, + 'KodKawasan': 98, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'KHAIRIL NIZAM BIN KHIRUDIN', + 'parti': 'PAS', + }, + 1203: { + 'KodN': 8, + 'KodParlimen': 98, + 'KodKawasan': 9816, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'RAWISANDRAN A/L NARAYANAN', + 'parti': 'BN', + }, + 1204: { + 'KodN': 8, + 'KodParlimen': 98, + 'KodKawasan': 9816, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'AMIRUDDIN BIN SHARI', + 'parti': 'PKR', + }, + 1205: { + 'KodN': 8, + 'KodParlimen': 98, + 'KodKawasan': 9816, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHAMMAD BIN IBRAHIM', + 'parti': 'PAS', + }, + 1206: { + 'KodN': 8, + 'KodParlimen': 98, + 'KodKawasan': 9816, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'BADRUL HISAM BIN MD ZIN', + 'parti': 'BEBAS', + }, + 1207: { + 'KodN': 8, + 'KodParlimen': 98, + 'KodKawasan': 9817, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MEGAT ZULKARNAIN BIN OMARDIN', + 'parti': 'BN', + }, + 1208: { + 'KodN': 8, + 'KodParlimen': 98, + 'KodKawasan': 9817, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MUHAMMAD HILMAN BIN IDHAM', + 'parti': 'PKR', + }, + 1209: { + 'KodN': 8, + 'KodParlimen': 98, + 'KodKawasan': 9817, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HASBULLAH BIN MOHD RIDZWAN', + 'parti': 'PAS', + }, + 1210: { + 'KodN': 8, + 'KodParlimen': 98, + 'KodKawasan': 9818, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ISMAIL BIN AHMAD', + 'parti': 'BN', + }, + 1211: { + 'KodN': 8, + 'KodParlimen': 98, + 'KodKawasan': 9818, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SAARI BIN SUNGIB', + 'parti': 'PKR', + }, + 1212: { + 'KodN': 8, + 'KodParlimen': 98, + 'KodKawasan': 9818, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'KAMALULHYSHAM BIN MOHD SUHUT', + 'parti': 'PAS', + }, + 1213: { + 'KodN': 8, + 'KodParlimen': 99, + 'KodKawasan': 99, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': "DATO'LEONG KIM SOON", + 'parti': 'BN', + }, + 1214: { + 'KodN': 8, + 'KodParlimen': 99, + 'KodKawasan': 99, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'TAN HUA MENG', + 'parti': 'PRM', + }, + 1215: { + 'KodN': 8, + 'KodParlimen': 99, + 'KodKawasan': 99, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'NURUL ISLAM BIN MOHAMED YUSOFF', + 'parti': 'PAS', + }, + 1216: { + 'KodN': 8, + 'KodParlimen': 99, + 'KodKawasan': 99, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'ZURAIDAH BINTI KAMRUDDIN', + 'parti': 'PKR', + }, + 1217: { + 'KodN': 8, + 'KodParlimen': 99, + 'KodKawasan': 9919, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'DR. SALWA BINTI YUNUS', + 'parti': 'BN', + }, + 1218: { + 'KodN': 8, + 'KodParlimen': 99, + 'KodKawasan': 9919, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SHAHRIFAH HASLIZAH BINTI SYED ARIFFIN', + 'parti': 'PAS', + }, + 1219: { + 'KodN': 8, + 'KodParlimen': 99, + 'KodKawasan': 9919, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHAMMED AZWAN BIN ALI', + 'parti': 'BEBAS', + }, + 1220: { + 'KodN': 8, + 'KodParlimen': 99, + 'KodKawasan': 9919, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'AHMAD BIN KAMARUDIN', + 'parti': 'PRM', + }, + 1221: { + 'KodN': 8, + 'KodParlimen': 99, + 'KodKawasan': 9919, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHAMED AZMIN BIN ALI', + 'parti': 'PKR', + }, + 1222: { + 'KodN': 8, + 'KodParlimen': 99, + 'KodKawasan': 9920, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'MOHAMAD NIZAM BIN SHITH', + 'parti': 'BN', + }, + 1223: { + 'KodN': 8, + 'KodParlimen': 99, + 'KodKawasan': 9920, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'NORIZUAN BIN MOHAMED ', + 'parti': 'PRM', + }, + 1224: { + 'KodN': 8, + 'KodParlimen': 99, + 'KodKawasan': 9920, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HANIZA BINTI MOHAMED TALHA', + 'parti': 'PKR', + }, + 1225: { + 'KodN': 8, + 'KodParlimen': 99, + 'KodKawasan': 9920, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'KHASIM BIN ABDUL AZIZ', + 'parti': 'PAS', + }, + 1226: { + 'KodN': 8, + 'KodParlimen': 100, + 'KodKawasan': 100, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DATUK LEONG KOK WEE', + 'parti': 'BN', + }, + 1227: { + 'KodN': 8, + 'KodParlimen': 100, + 'KodKawasan': 100, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'MOHD KHAIRUL AZAM BIN ABDUL AZIZ', + 'parti': 'BEBAS', + }, + 1228: { + 'KodN': 8, + 'KodParlimen': 100, + 'KodKawasan': 100, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MOHAMED SUKRI BIN OMAR', + 'parti': 'PAS', + }, + 1229: { + 'KodN': 8, + 'KodParlimen': 100, + 'KodKawasan': 100, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DATIN SRI WAN AZIZAH BINTI WAN ISMAIL', + 'parti': 'PKR', + }, + 1230: { + 'KodN': 8, + 'KodParlimen': 100, + 'KodKawasan': 100, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 5, + 'NamaCalon': 'LEE YING HA', + 'parti': 'PRM', + }, + 1231: { + 'KodN': 8, + 'KodParlimen': 100, + 'KodKawasan': 10021, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DATUK HAJI MOHD HANIFF BIN HAJI KOSLAN', + 'parti': 'BN', + }, + 1232: { + 'KodN': 8, + 'KodParlimen': 100, + 'KodKawasan': 10021, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'IZHAM BIN HASHIM', + 'parti': 'PKR', + }, + 1233: { + 'KodN': 8, + 'KodParlimen': 100, + 'KodKawasan': 10021, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ISKANDAR BIN ABDUL SAMAD', + 'parti': 'PAS', + }, + 1234: { + 'KodN': 8, + 'KodParlimen': 100, + 'KodKawasan': 10022, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'BEN LIEW POK BOON', + 'parti': 'BN', + }, + 1235: { + 'KodN': 8, + 'KodParlimen': 100, + 'KodKawasan': 10022, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'LEE YING HA', + 'parti': 'PRM', + }, + 1236: { + 'KodN': 8, + 'KodParlimen': 100, + 'KodKawasan': 10022, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD IRMAN BIN ABDUL WAHAB', + 'parti': 'PAS', + }, + 1237: { + 'KodN': 8, + 'KodParlimen': 100, + 'KodKawasan': 10022, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'LAI WAI CHONG', + 'parti': 'PKR', + }, + 1238: { + 'KodN': 8, + 'KodParlimen': 101, + 'KodKawasan': 101, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'AZMAN BIN AHMAD', + 'parti': 'BN', + }, + 1239: { + 'KodN': 8, + 'KodParlimen': 101, + 'KodKawasan': 101, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DR CHE ROSLI BIN CHE MAT', + 'parti': 'PAS', + }, + 1240: { + 'KodN': 8, + 'KodParlimen': 101, + 'KodKawasan': 101, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'USTAZ HASAUDDIN BIN MOHD YUNUS', + 'parti': 'PKR', + }, + 1241: { + 'KodN': 8, + 'KodParlimen': 101, + 'KodKawasan': 10123, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD ZIN BIN ISA', + 'parti': 'BN', + }, + 1242: { + 'KodN': 8, + 'KodParlimen': 101, + 'KodKawasan': 10123, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'EDRY FAIZAL BIN EDDY YUSOF', + 'parti': 'PKR', + }, + 1243: { + 'KodN': 8, + 'KodParlimen': 101, + 'KodKawasan': 10123, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'RAZALY BIN HASAN', + 'parti': 'PAS', + }, + 1244: { + 'KodN': 8, + 'KodParlimen': 101, + 'KodKawasan': 10124, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'JOHAN BIN ABD AZIZ', + 'parti': 'BN', + }, + 1245: { + 'KodN': 8, + 'KodParlimen': 101, + 'KodKawasan': 10124, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'BAKHTIAR BIN MOHD NOR', + 'parti': 'PKR', + }, + 1246: { + 'KodN': 8, + 'KodParlimen': 101, + 'KodKawasan': 10124, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ARUTCHEVAN A/L SUBRAMANIAMS', + 'parti': 'PSM', + }, + 1247: { + 'KodN': 8, + 'KodParlimen': 101, + 'KodKawasan': 10124, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HAJI MAD SHAHMIOUR BIN MAT SOM', + 'parti': 'PAS', + }, + 1248: { + 'KodN': 8, + 'KodParlimen': 102, + 'KodKawasan': 102, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': "DATO 'LIEW YUEN KEONG", + 'parti': 'BN', + }, + 1249: { + 'KodN': 8, + 'KodParlimen': 102, + 'KodKawasan': 102, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DR ONG KIAN MIN', + 'parti': 'PKR', + }, + 1250: { + 'KodN': 8, + 'KodParlimen': 102, + 'KodKawasan': 102, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MOHD SHAFIE BIN NGAH', + 'parti': 'PAS', + }, + 1251: { + 'KodN': 8, + 'KodParlimen': 102, + 'KodKawasan': 102, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DENNIS WAN JINN WOEI', + 'parti': 'PRM', + }, + 1252: { + 'KodN': 8, + 'KodParlimen': 102, + 'KodKawasan': 10225, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'TEH YEOW MENG', + 'parti': 'BN', + }, + 1253: { + 'KodN': 8, + 'KodParlimen': 102, + 'KodKawasan': 10225, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'ZAITON BINTI AHMAD', + 'parti': 'PAS', + }, + 1254: { + 'KodN': 8, + 'KodParlimen': 102, + 'KodKawasan': 10225, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HEE LOY SIAN', + 'parti': 'PKR', + }, + 1255: { + 'KodN': 8, + 'KodParlimen': 102, + 'KodKawasan': 10225, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DENNIS WAN JINN WOEI', + 'parti': 'PRM', + }, + 1256: { + 'KodN': 8, + 'KodParlimen': 102, + 'KodKawasan': 10226, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ABD RAHIM BIN MOHD AMIN', + 'parti': 'BN', + }, + 1257: { + 'KodN': 8, + 'KodParlimen': 102, + 'KodKawasan': 10226, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MAZWAN BIN JOHAR', + 'parti': 'PKR', + }, + 1258: { + 'KodN': 8, + 'KodParlimen': 102, + 'KodKawasan': 10226, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': "NUSHI BIN DATO' MAHFODZ", + 'parti': 'PAS', + }, + 1259: { + 'KodN': 8, + 'KodParlimen': 102, + 'KodKawasan': 10227, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'LIM CHIN WAH', + 'parti': 'BN', + }, + 1260: { + 'KodN': 8, + 'KodParlimen': 102, + 'KodKawasan': 10227, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'NG TIEN CHEE', + 'parti': 'PKR', + }, + 1261: { + 'KodN': 8, + 'KodParlimen': 102, + 'KodKawasan': 10227, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD IBRAHIM BIN GHAZALI', + 'parti': 'PAS', + }, + 1262: { + 'KodN': 8, + 'KodParlimen': 103, + 'KodKawasan': 103, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'ANG CHIN TATT', + 'parti': 'BN', + }, + 1263: { + 'KodN': 8, + 'KodParlimen': 103, + 'KodKawasan': 103, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MOHAMAD ROSHARIZAN MOHD ROSLAN', + 'parti': 'PAS', + }, + 1264: { + 'KodN': 8, + 'KodParlimen': 103, + 'KodKawasan': 103, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'GOBIND SINGH DEO', + 'parti': 'PKR', + }, + 1265: { + 'KodN': 8, + 'KodParlimen': 103, + 'KodKawasan': 10328, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'CHANG TOONG WOH', + 'parti': 'BN', + }, + 1266: { + 'KodN': 8, + 'KodParlimen': 103, + 'KodKawasan': 10328, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'EAN YONG HIAN WAH', + 'parti': 'PKR', + }, + 1267: { + 'KodN': 8, + 'KodParlimen': 103, + 'KodKawasan': 10329, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHAMAD SATIM BIN DIMAN', + 'parti': 'BN', + }, + 1268: { + 'KodN': 8, + 'KodParlimen': 103, + 'KodKawasan': 10329, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'NOOR HANIM ISMAIL', + 'parti': 'PAS', + }, + 1269: { + 'KodN': 8, + 'KodParlimen': 103, + 'KodKawasan': 10329, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DR SITI MARIAH MAHMUD', + 'parti': 'PKR', + }, + 1270: { + 'KodN': 8, + 'KodParlimen': 104, + 'KodKawasan': 104, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'TAN SEONG LIM', + 'parti': 'BN', + }, + 1271: { + 'KodN': 8, + 'KodParlimen': 104, + 'KodKawasan': 104, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'WONG CHEN', + 'parti': 'PKR', + }, + 1272: { + 'KodN': 8, + 'KodParlimen': 104, + 'KodKawasan': 104, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'MOHAMAD SHAHIR BIN MOHD ADNAN', + 'parti': 'PAS', + }, + 1273: { + 'KodN': 8, + 'KodParlimen': 104, + 'KodKawasan': 104, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'TOH SIN WAH ', + 'parti': 'BEBAS', + }, + 1274: { + 'KodN': 8, + 'KodParlimen': 104, + 'KodKawasan': 10430, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'CHIEW KAI HENG', + 'parti': 'BN', + }, + 1275: { + 'KodN': 8, + 'KodParlimen': 104, + 'KodKawasan': 10430, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'NG SZE HAN', + 'parti': 'PKR', + }, + 1276: { + 'KodN': 8, + 'KodParlimen': 104, + 'KodKawasan': 10430, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'JONATHAN LIM YING RAN', + 'parti': 'PAS', + }, + 1277: { + 'KodN': 8, + 'KodParlimen': 104, + 'KodKawasan': 10431, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'CHONG AH WATT', + 'parti': 'BN', + }, + 1278: { + 'KodN': 8, + 'KodParlimen': 104, + 'KodKawasan': 10431, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MICHELLE NG MEI SZE', + 'parti': 'PKR', + }, + 1279: { + 'KodN': 8, + 'KodParlimen': 104, + 'KodKawasan': 10431, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'TOH SIN WAH', + 'parti': 'BEBAS', + }, + 1280: { + 'KodN': 8, + 'KodParlimen': 105, + 'KodKawasan': 105, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MARIA CHIN BINTI ABDULLAH', + 'parti': 'PKR', + }, + 1281: { + 'KodN': 8, + 'KodParlimen': 105, + 'KodKawasan': 105, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'CHEW HIAN TAT', + 'parti': 'BN', + }, + 1282: { + 'KodN': 8, + 'KodParlimen': 105, + 'KodKawasan': 105, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'NORAINI BINTI HUSSIN', + 'parti': 'PAS', + }, + 1283: { + 'KodN': 8, + 'KodParlimen': 105, + 'KodKawasan': 10532, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'GHAZALI BIN DAUD', + 'parti': 'PAS', + }, + 1284: { + 'KodN': 8, + 'KodParlimen': 105, + 'KodKawasan': 10532, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DR. SHAHARUDDIN BIN BADARUDDIN', + 'parti': 'PKR', + }, + 1285: { + 'KodN': 8, + 'KodParlimen': 105, + 'KodKawasan': 10532, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'YUSOFF BIN HM. HANIFF', + 'parti': 'BN', + }, + 1286: { + 'KodN': 8, + 'KodParlimen': 105, + 'KodKawasan': 10532, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'VIGWESWARAN A/L T.SUBRAMANIAM', + 'parti': 'BEBAS', + }, + 1287: { + 'KodN': 8, + 'KodParlimen': 105, + 'KodKawasan': 10533, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'SYAMSUL FIRDAUS BIN MOHAMED SUPRI', + 'parti': 'PKR', + }, + 1288: { + 'KodN': 8, + 'KodParlimen': 105, + 'KodKawasan': 10533, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ARIFFIN BIN MAHAIYUDDIN', + 'parti': 'PAS', + }, + 1289: { + 'KodN': 8, + 'KodParlimen': 105, + 'KodKawasan': 10533, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ABDUL MUTALIF BIN ABDUL RAHIM', + 'parti': 'BN', + }, + 1290: { + 'KodN': 8, + 'KodParlimen': 105, + 'KodKawasan': 10534, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'RAJIV A/L RISHYAKARAN', + 'parti': 'PKR', + }, + 1291: { + 'KodN': 8, + 'KodParlimen': 105, + 'KodKawasan': 10534, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DAVID SAU KAH HENG', + 'parti': 'PAS', + }, + 1292: { + 'KodN': 8, + 'KodParlimen': 105, + 'KodKawasan': 10534, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'CHAI KOH TING', + 'parti': 'BN', + }, + 1293: { + 'KodN': 8, + 'KodParlimen': 106, + 'KodKawasan': 106, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'HO KWOK XHENG', + 'parti': 'BN', + }, + 1294: { + 'KodN': 8, + 'KodParlimen': 106, + 'KodKawasan': 106, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'PUA KHAM WEE', + 'parti': 'PKR', + }, + 1295: { + 'KodN': 8, + 'KodParlimen': 106, + 'KodKawasan': 106, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': "DATO' WONG MUN KHEONG", + 'parti': 'PRM', + }, + 1296: { + 'KodN': 8, + 'KodParlimen': 106, + 'KodKawasan': 10635, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'TAN GIM TUAN', + 'parti': 'BN', + }, + 1297: { + 'KodN': 8, + 'KodParlimen': 106, + 'KodKawasan': 10635, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'LIM YI WEI', + 'parti': 'PKR', + }, + 1298: { + 'KodN': 8, + 'KodParlimen': 106, + 'KodKawasan': 10636, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': "CH'NG SOO CHAU", + 'parti': 'BN', + }, + 1299: { + 'KodN': 8, + 'KodParlimen': 106, + 'KodKawasan': 10636, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'CHONG FOOK MENG', + 'parti': 'BEBAS', + }, + 1300: { + 'KodN': 8, + 'KodParlimen': 106, + 'KodKawasan': 10636, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'JAMALIAH BINTI JAMALUDDIN', + 'parti': 'PKR', + }, + 1301: { + 'KodN': 8, + 'KodParlimen': 106, + 'KodKawasan': 10637, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SYED ABDUL RAZAK BIN SYED LONG ALSAGOFF', + 'parti': 'BN', + }, + 1302: { + 'KodN': 8, + 'KodParlimen': 106, + 'KodKawasan': 10637, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'WONG KEAT PING', + 'parti': 'PKR', + }, + 1303: { + 'KodN': 8, + 'KodParlimen': 107, + 'KodKawasan': 107, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'A. PRAKASH RAO A/L APPLANAIDOO', + 'parti': 'BN', + }, + 1304: { + 'KodN': 8, + 'KodParlimen': 107, + 'KodKawasan': 107, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'NURIDAH BINTI MOHD SALLEH', + 'parti': 'PAS', + }, + 1305: { + 'KodN': 8, + 'KodParlimen': 107, + 'KodKawasan': 107, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'ZAINURIZZAMAN BIN MOHARAM', + 'parti': 'PSM', + }, + 1306: { + 'KodN': 8, + 'KodParlimen': 107, + 'KodKawasan': 107, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'SIVARASA RASIAH', + 'parti': 'PKR', + }, + 1307: { + 'KodN': 8, + 'KodParlimen': 107, + 'KodKawasan': 10738, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ZEIN ISMA BIN ISMAIL', + 'parti': 'BN', + }, + 1308: { + 'KodN': 8, + 'KodParlimen': 107, + 'KodKawasan': 10738, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'KHAIRUDIN BIN OTHMAN', + 'parti': 'PKR', + }, + 1309: { + 'KodN': 8, + 'KodParlimen': 107, + 'KodKawasan': 10738, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HANAFI BIN ZULKAPLI', + 'parti': 'PAS', + }, + 1310: { + 'KodN': 8, + 'KodParlimen': 107, + 'KodKawasan': 10739, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HALIMATON SAADIAH BT BOHAN', + 'parti': 'BN', + }, + 1311: { + 'KodN': 8, + 'KodParlimen': 107, + 'KodKawasan': 10739, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'SHATIRI BIN MANSOR', + 'parti': 'PKR', + }, + 1312: { + 'KodN': 8, + 'KodParlimen': 107, + 'KodKawasan': 10739, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SITI ROHAYA BINTI AHAD ', + 'parti': 'PAS', + }, + 1313: { + 'KodN': 8, + 'KodParlimen': 107, + 'KodKawasan': 10739, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'SIVARAJAN A/L ARUMUGAM', + 'parti': 'PSM', + }, + 1314: { + 'KodN': 8, + 'KodParlimen': 108, + 'KodKawasan': 108, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'AZHARI BIN SHAARI', + 'parti': 'BN', + }, + 1315: { + 'KodN': 8, + 'KodParlimen': 108, + 'KodKawasan': 108, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MOHD ZUHDI BIN MARSUKI', + 'parti': 'PAS', + }, + 1316: { + 'KodN': 8, + 'KodParlimen': 108, + 'KodKawasan': 108, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'KHALID BIN ABDUL SAMAD', + 'parti': 'PKR', + }, + 1317: { + 'KodN': 8, + 'KodParlimen': 108, + 'KodKawasan': 10840, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD NAJWAN BIN HALIMI', + 'parti': 'PKR', + }, + 1318: { + 'KodN': 8, + 'KodParlimen': 108, + 'KodKawasan': 10840, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'JUMAEAH BINTI MASDI', + 'parti': 'BN', + }, + 1319: { + 'KodN': 8, + 'KodParlimen': 108, + 'KodKawasan': 10840, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'AHMAD DUSUKI BIN ABD RANI', + 'parti': 'PAS', + }, + 1320: { + 'KodN': 8, + 'KodParlimen': 108, + 'KodKawasan': 10841, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ABDUL HALIM BIN OMAR', + 'parti': 'PAS', + }, + 1321: { + 'KodN': 8, + 'KodParlimen': 108, + 'KodKawasan': 10841, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': "AHMAD MUA'ADZAM SHAH BIN YA'AKOP", + 'parti': 'BN', + }, + 1322: { + 'KodN': 8, + 'KodParlimen': 108, + 'KodKawasan': 10841, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'RODZIAH BINTI ISMAIL', + 'parti': 'PKR', + }, + 1323: { + 'KodN': 8, + 'KodParlimen': 109, + 'KodKawasan': 109, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': "DATO' MOHANA MUNIANDY ", + 'parti': 'BN', + }, + 1324: { + 'KodN': 8, + 'KodParlimen': 109, + 'KodKawasan': 109, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DATO ABDULLAH SANI', + 'parti': 'PKR', + }, + 1325: { + 'KodN': 8, + 'KodParlimen': 109, + 'KodKawasan': 109, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DR ABD RANI OSMAN', + 'parti': 'PAS', + }, + 1326: { + 'KodN': 8, + 'KodParlimen': 109, + 'KodKawasan': 109, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'MANIKAVASAGAM A/L SUNDRAM', + 'parti': 'PRM', + }, + 1327: { + 'KodN': 8, + 'KodParlimen': 109, + 'KodKawasan': 10942, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'KHAIRUL ANUAR BIN SAIMUN', + 'parti': 'BN', + }, + 1328: { + 'KodN': 8, + 'KodParlimen': 109, + 'KodKawasan': 10942, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MANIKAVASAGAM', + 'parti': 'PRM', + }, + 1329: { + 'KodN': 8, + 'KodParlimen': 109, + 'KodKawasan': 10942, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'NURNAJHAN SALLEH', + 'parti': 'PAS', + }, + 1330: { + 'KodN': 8, + 'KodParlimen': 109, + 'KodKawasan': 10942, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'SHEE CHEE WENG', + 'parti': 'BEBAS', + }, + 1331: { + 'KodN': 8, + 'KodParlimen': 109, + 'KodKawasan': 10942, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'MOHD FAKHRUL RAZI', + 'parti': 'PKR', + }, + 1332: { + 'KodN': 8, + 'KodParlimen': 109, + 'KodKawasan': 10943, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DAROYAH ALWI', + 'parti': 'PKR', + }, + 1333: { + 'KodN': 8, + 'KodParlimen': 109, + 'KodKawasan': 10943, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATOK SARONI BIN JUDI', + 'parti': 'BN', + }, + 1334: { + 'KodN': 8, + 'KodParlimen': 109, + 'KodKawasan': 10943, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'GANTHI A/P NAGAMUTHU', + 'parti': 'PRM', + }, + 1335: { + 'KodN': 8, + 'KodParlimen': 109, + 'KodKawasan': 10943, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'WAN ASRINA WAN HASSAN', + 'parti': 'PAS', + }, + 1336: { + 'KodN': 8, + 'KodParlimen': 109, + 'KodKawasan': 10944, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'RASHID ASARI', + 'parti': 'PKR', + }, + 1337: { + 'KodN': 8, + 'KodParlimen': 109, + 'KodKawasan': 10944, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HJ KHAIRI HUSSIN', + 'parti': 'BN', + }, + 1338: { + 'KodN': 8, + 'KodParlimen': 109, + 'KodKawasan': 10944, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'JEICHANDRAN', + 'parti': 'PRM', + }, + 1339: { + 'KodN': 8, + 'KodParlimen': 109, + 'KodKawasan': 10944, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'HALIMAH ALI', + 'parti': 'PAS', + }, + 1340: { + 'KodN': 8, + 'KodParlimen': 109, + 'KodKawasan': 10944, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'ZAINAL AZWAR', + 'parti': 'BEBAS', + }, + 1341: { + 'KodN': 8, + 'KodParlimen': 110, + 'KodKawasan': 110, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'KHAIRUL SHAH BIN ABDULLAH', + 'parti': 'PAS', + }, + 1342: { + 'KodN': 8, + 'KodParlimen': 110, + 'KodKawasan': 110, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'CHING EU BOON', + 'parti': 'BN', + }, + 1343: { + 'KodN': 8, + 'KodParlimen': 110, + 'KodKawasan': 110, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'CHARLES ANTHONY A/L R.SANTIAGO', + 'parti': 'PKR', + }, + 1344: { + 'KodN': 8, + 'KodParlimen': 110, + 'KodKawasan': 110, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'PUVANANDERAN A/L GANASAMOORTHY', + 'parti': 'BEBAS', + }, + 1345: { + 'KodN': 8, + 'KodParlimen': 110, + 'KodKawasan': 11045, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'TEOH KAH YEONG', + 'parti': 'BN', + }, + 1346: { + 'KodN': 8, + 'KodParlimen': 110, + 'KodKawasan': 11045, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'TENG CHANG KHIM', + 'parti': 'PKR', + }, + 1347: { + 'KodN': 8, + 'KodParlimen': 110, + 'KodKawasan': 11046, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SEIKH RAJESH BIN SEIKH AHMAD', + 'parti': 'BN', + }, + 1348: { + 'KodN': 8, + 'KodParlimen': 110, + 'KodKawasan': 11046, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AZMIZAM BIN ZAMAN HURI', + 'parti': 'PKR', + }, + 1349: { + 'KodN': 8, + 'KodParlimen': 110, + 'KodKawasan': 11046, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SHANMUGASUNDRAM A/L VEERAPPAN', + 'parti': 'PSM', + }, + 1350: { + 'KodN': 8, + 'KodParlimen': 110, + 'KodKawasan': 11046, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'KHALID BIN NAYAN', + 'parti': 'PAS', + }, + 1351: { + 'KodN': 8, + 'KodParlimen': 110, + 'KodKawasan': 11047, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SANTOKH SINGH A/L GURDEV SINGH', + 'parti': 'PAS', + }, + 1352: { + 'KodN': 8, + 'KodParlimen': 110, + 'KodKawasan': 11047, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'LEONG TUCK CHEE', + 'parti': 'PKR', + }, + 1353: { + 'KodN': 8, + 'KodParlimen': 110, + 'KodKawasan': 11047, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'TEE HOOI LING', + 'parti': 'BN', + }, + 1354: { + 'KodN': 8, + 'KodParlimen': 111, + 'KodKawasan': 111, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'V.GUNALAN A/L VELU', + 'parti': 'BN', + }, + 1355: { + 'KodN': 8, + 'KodParlimen': 111, + 'KodKawasan': 111, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'MOHAMAD BIN SABU', + 'parti': 'PKR', + }, + 1356: { + 'KodN': 8, + 'KodParlimen': 111, + 'KodKawasan': 111, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'HJ MOHAMED DIAH BIN BAHARUDIN', + 'parti': 'PAS', + }, + 1357: { + 'KodN': 8, + 'KodParlimen': 111, + 'KodKawasan': 11148, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SUBRAMANIAM A/L RETNAM', + 'parti': 'BN', + }, + 1358: { + 'KodN': 8, + 'KodParlimen': 111, + 'KodKawasan': 11148, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'GUNARAJ R. GEORGE', + 'parti': 'PKR', + }, + 1359: { + 'KodN': 8, + 'KodParlimen': 111, + 'KodKawasan': 11148, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'RAJAN A/L MANIKESAVAN ', + 'parti': 'PAS', + }, + 1360: { + 'KodN': 8, + 'KodParlimen': 111, + 'KodKawasan': 11149, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'KAMARUZZAMAN BIN JOHARI', + 'parti': 'BN', + }, + 1361: { + 'KodN': 8, + 'KodParlimen': 111, + 'KodKawasan': 11149, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HJ MOHD YUSUF BIN ABDULLAH', + 'parti': 'PAS', + }, + 1362: { + 'KodN': 8, + 'KodParlimen': 111, + 'KodKawasan': 11149, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HANAFIAH BIN HUSIN ', + 'parti': 'PRM', + }, + 1363: { + 'KodN': 8, + 'KodParlimen': 111, + 'KodKawasan': 11149, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'MAT SHUHAIMI BIN SHAFIEI', + 'parti': 'PKR', + }, + 1364: { + 'KodN': 8, + 'KodParlimen': 111, + 'KodKawasan': 11150, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'TIEW HOCK HUAT', + 'parti': 'BN', + }, + 1365: { + 'KodN': 8, + 'KodParlimen': 111, + 'KodKawasan': 11150, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'GANABATIRAU A/L VERAMAN', + 'parti': 'PKR', + }, + 1366: { + 'KodN': 8, + 'KodParlimen': 111, + 'KodKawasan': 11150, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HJ BURHAN BIN ADNAN', + 'parti': 'PAS', + }, + 1367: { + 'KodN': 8, + 'KodParlimen': 111, + 'KodKawasan': 11150, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'ABDUL RAZAK BIN ISMAIL', + 'parti': 'BEBAS', + }, + 1368: { + 'KodN': 8, + 'KodParlimen': 111, + 'KodKawasan': 11150, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'RAJASEKARAN A/L SUNDARAPANDY', + 'parti': 'BEBAS', + }, + 1369: { + 'KodN': 8, + 'KodParlimen': 112, + 'KodKawasan': 112, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'XAVIER JAYAKUMAR A/L ARULANANDAM', + 'parti': 'PKR', + }, + 1370: { + 'KodN': 8, + 'KodParlimen': 112, + 'KodKawasan': 112, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'SHAHRIL SUFIAN BIN HAMDAN', + 'parti': 'BN', + }, + 1371: { + 'KodN': 8, + 'KodParlimen': 112, + 'KodKawasan': 112, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DATUK DR YAHYA BIN BABA', + 'parti': 'PAS', + }, + 1372: { + 'KodN': 8, + 'KodParlimen': 112, + 'KodKawasan': 11251, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD HAMIDI BIN ABU BAKAR', + 'parti': 'PKR', + }, + 1373: { + 'KodN': 8, + 'KodParlimen': 112, + 'KodKawasan': 11251, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATO SULAIMAN BIN MOHD KARLI', + 'parti': 'BN', + }, + 1374: { + 'KodN': 8, + 'KodParlimen': 112, + 'KodKawasan': 11251, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DATO DR AHMAD YUNUS BIN HAIRI', + 'parti': 'PAS', + }, + 1375: { + 'KodN': 8, + 'KodParlimen': 112, + 'KodKawasan': 11252, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'NG SIOK HWA', + 'parti': 'BN', + }, + 1376: { + 'KodN': 8, + 'KodParlimen': 112, + 'KodKawasan': 11252, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'LAU WENG SAN', + 'parti': 'PKR', + }, + 1377: { + 'KodN': 8, + 'KodParlimen': 112, + 'KodKawasan': 11252, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'TAN CHOON SWEE @ PHILIP TAN', + 'parti': 'PRM', + }, + 1378: { + 'KodN': 8, + 'KodParlimen': 112, + 'KodKawasan': 11253, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DR MOHD SALEHUDDIN BIN HAFIZ', + 'parti': 'PAS', + }, + 1379: { + 'KodN': 8, + 'KodParlimen': 112, + 'KodKawasan': 11253, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ROZANA BINTI KAMARULZAMAN', + 'parti': 'BN', + }, + 1380: { + 'KodN': 8, + 'KodParlimen': 112, + 'KodKawasan': 11253, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HASNUL BIN BAHARUDDIN', + 'parti': 'PKR', + }, + 1381: { + 'KodN': 8, + 'KodParlimen': 113, + 'KodKawasan': 113, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'HAJI SABIRIN BIN MARSONO', + 'parti': 'PAS', + }, + 1382: { + 'KodN': 8, + 'KodParlimen': 113, + 'KodKawasan': 113, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DATO HAJI MARSUM BIN PAING', + 'parti': 'BN', + }, + 1383: { + 'KodN': 8, + 'KodParlimen': 113, + 'KodKawasan': 113, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'MOHAMED HANIPA BIN MAIDIN', + 'parti': 'PKR', + }, + 1384: { + 'KodN': 8, + 'KodParlimen': 113, + 'KodKawasan': 11354, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': "DATO' DR HAJI KARIM BIN MANSOR", + 'parti': 'BN', + }, + 1385: { + 'KodN': 8, + 'KodParlimen': 113, + 'KodKawasan': 11354, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'IR MOHD HASLIN BIN HASSAN', + 'parti': 'PAS', + }, + 1386: { + 'KodN': 8, + 'KodParlimen': 113, + 'KodKawasan': 11354, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HAJI BORHAN BIN AMAN SHAH', + 'parti': 'PKR', + }, + 1387: { + 'KodN': 8, + 'KodParlimen': 113, + 'KodKawasan': 11355, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': "SHAHRUM BIN DATO' HAJI MOHD SHARIF", + 'parti': 'BN', + }, + 1388: { + 'KodN': 8, + 'KodParlimen': 113, + 'KodKawasan': 11355, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'YUSMI HANIFF BIN ARIFFIN', + 'parti': 'PAS', + }, + 1389: { + 'KodN': 8, + 'KodParlimen': 113, + 'KodKawasan': 11355, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ADHIF SYAN BIN ABDULLAH', + 'parti': 'PKR', + }, + 1390: { + 'KodN': 8, + 'KodParlimen': 113, + 'KodKawasan': 11356, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': "DATO' NG CHOK SIN", + 'parti': 'BN', + }, + 1391: { + 'KodN': 8, + 'KodParlimen': 113, + 'KodKawasan': 11356, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': "ROHAYA BINTI DATO' MOHD SHAHIR", + 'parti': 'PAS', + }, + 1392: { + 'KodN': 8, + 'KodParlimen': 113, + 'KodKawasan': 11356, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'RONNIE LIU TIAN KHIEW', + 'parti': 'PKR', + }, + 1393: { + 'KodN': 8, + 'KodParlimen': 113, + 'KodKawasan': 11356, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HARRY ARUL RAJ A/L KRISHNAN', + 'parti': 'PAP', + }, + 1394: { + 'KodN': 9, + 'KodParlimen': 114, + 'KodKawasan': 114, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'ONG SIANG LIANG', + 'parti': 'BN', + }, + 1395: { + 'KodN': 9, + 'KodParlimen': 114, + 'KodKawasan': 114, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'LIM LIP ENG ', + 'parti': 'PKR', + }, + 1396: { + 'KodN': 9, + 'KodParlimen': 115, + 'KodKawasan': 115, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DATUK DR. DOMINIC LAU HOE CHAI', + 'parti': 'BN', + }, + 1397: { + 'KodN': 9, + 'KodParlimen': 115, + 'KodKawasan': 115, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'AZHAR BIN YAHYA', + 'parti': 'PAS', + }, + 1398: { + 'KodN': 9, + 'KodParlimen': 115, + 'KodKawasan': 115, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'VM PANJAMOTHY A/L MUTHUSAMY', + 'parti': 'BEBAS', + }, + 1399: { + 'KodN': 9, + 'KodParlimen': 115, + 'KodKawasan': 115, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'PRABAKARAN A/L PARAMESWARAN', + 'parti': 'BEBAS', + }, + 1400: { + 'KodN': 9, + 'KodParlimen': 116, + 'KodKawasan': 116, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'Yew Teong Look @ Philip Yew', + 'parti': 'BN', + }, + 1401: { + 'KodN': 9, + 'KodParlimen': 116, + 'KodKawasan': 116, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'Tan Yew Kew', + 'parti': 'PKR', + }, + 1402: { + 'KodN': 9, + 'KodParlimen': 116, + 'KodKawasan': 116, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'Razali bin Tumirin', + 'parti': 'PAS', + }, + 1403: { + 'KodN': 9, + 'KodParlimen': 117, + 'KodKawasan': 117, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DATO DR LOGA BALA A/L JAGANATHAN', + 'parti': 'BN', + }, + 1404: { + 'KodN': 9, + 'KodParlimen': 117, + 'KodKawasan': 117, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'USTAZ MOHAMAD SOLLEH BIN ABD RAZAK', + 'parti': 'PAS', + }, + 1405: { + 'KodN': 9, + 'KodParlimen': 117, + 'KodKawasan': 117, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'HANNAH YEOH', + 'parti': 'PKR', + }, + 1406: { + 'KodN': 9, + 'KodParlimen': 118, + 'KodKawasan': 118, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'ZULHASNAN BIN RAFIQUE', + 'parti': 'BN', + }, + 1407: { + 'KodN': 9, + 'KodParlimen': 118, + 'KodKawasan': 118, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'NIK NAZMI BIN NIK AHMAD', + 'parti': 'PKR', + }, + 1408: { + 'KodN': 9, + 'KodParlimen': 118, + 'KodKawasan': 118, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'UBAID BIN ABD AKLA', + 'parti': 'PAS', + }, + 1409: { + 'KodN': 9, + 'KodParlimen': 119, + 'KodKawasan': 119, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'JOHARI BIN ABDUL GHANI', + 'parti': 'BN', + }, + 1410: { + 'KodN': 9, + 'KodParlimen': 120, + 'KodKawasan': 120, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'ANN TAN EAN EAN', + 'parti': 'BN', + }, + 1411: { + 'KodN': 9, + 'KodParlimen': 120, + 'KodKawasan': 120, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'FONG KUI LUN', + 'parti': 'PKR', + }, + 1412: { + 'KodN': 9, + 'KodParlimen': 120, + 'KodKawasan': 120, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'KHAIRUL HUSNI OTHMAN', + 'parti': 'PFP', + }, + 1413: { + 'KodN': 9, + 'KodParlimen': 121, + 'KodKawasan': 121, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'RAJA NONG CHIK BIN RAJA ZAINAL ABIDIN', + 'parti': 'BN', + }, + 1414: { + 'KodN': 9, + 'KodParlimen': 121, + 'KodKawasan': 121, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'FAUZI BIN ABU BAKAR', + 'parti': 'PAS', + }, + 1415: { + 'KodN': 9, + 'KodParlimen': 121, + 'KodKawasan': 121, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'AHMAD FAHMI BIN MOHAMED FADZIL', + 'parti': 'PKR', + }, + 1416: { + 'KodN': 9, + 'KodParlimen': 122, + 'KodKawasan': 122, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'TERESA KOK SUH SIM', + 'parti': 'PKR', + }, + 1417: { + 'KodN': 9, + 'KodParlimen': 122, + 'KodKawasan': 122, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'CHAN QUIN ER', + 'parti': 'BN', + }, + 1418: { + 'KodN': 9, + 'KodParlimen': 123, + 'KodKawasan': 123, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'HENG SINN YEE', + 'parti': 'BN', + }, + 1419: { + 'KodN': 9, + 'KodParlimen': 123, + 'KodKawasan': 123, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'TAN KOK WAI', + 'parti': 'PKR', + }, + 1420: { + 'KodN': 9, + 'KodParlimen': 124, + 'KodKawasan': 124, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'KAMARUDIN BIN JAFFAR', + 'parti': 'PKR', + }, + 1421: { + 'KodN': 9, + 'KodParlimen': 124, + 'KodKawasan': 124, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'ROSNI BINTI ADAM', + 'parti': 'PAS', + }, + 1422: { + 'KodN': 9, + 'KodParlimen': 124, + 'KodKawasan': 124, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'ADNAN BIN SEMAN @ ABDULLAH', + 'parti': 'BN', + }, + 1423: { + 'KodN': 9, + 'KodParlimen': 125, + 'KodKawasan': 125, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DATUK SERI UTAMA TENGKU ADNAN BIN TENGKU MANSOR', + 'parti': 'BN', + }, + 1424: { + 'KodN': 9, + 'KodParlimen': 125, + 'KodKawasan': 125, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': "PROF DATO' DR. HAJI ZAINAL ABIDIN BIN KIDAM", + 'parti': 'PAS', + }, + 1425: { + 'KodN': 9, + 'KodParlimen': 125, + 'KodKawasan': 125, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': "PROF DATO' DR. HAJI SAMSU ADABI BIN MAMAT", + 'parti': 'PKR', + }, + 1426: { + 'KodN': 11, + 'KodParlimen': 126, + 'KodKawasan': 126, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MUSTAFAR BIN AB KADIR', + 'parti': 'PKR', + }, + 1427: { + 'KodN': 11, + 'KodParlimen': 126, + 'KodKawasan': 126, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'JALALUDDIN BIN ALIAS', + 'parti': 'BN', + }, + 1428: { + 'KodN': 11, + 'KodParlimen': 126, + 'KodKawasan': 126, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'NORMAN BIN IPIN ', + 'parti': 'PAS', + }, + 1429: { + 'KodN': 11, + 'KodParlimen': 126, + 'KodKawasan': 12601, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SEET TEE GEE', + 'parti': 'BN', + }, + 1430: { + 'KodN': 11, + 'KodParlimen': 126, + 'KodKawasan': 12601, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'LOKE SIEW FOOK', + 'parti': 'PKR', + }, + 1431: { + 'KodN': 11, + 'KodParlimen': 126, + 'KodKawasan': 12601, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'JAMALUS BIN MANSOR', + 'parti': 'PAS', + }, + 1432: { + 'KodN': 11, + 'KodParlimen': 126, + 'KodKawasan': 12602, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'NOOR AZMI BIN YUSOF', + 'parti': 'BN', + }, + 1433: { + 'KodN': 11, + 'KodParlimen': 126, + 'KodKawasan': 12602, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HAMRAN BIN ABU HASSAN', + 'parti': 'PAS', + }, + 1434: { + 'KodN': 11, + 'KodParlimen': 126, + 'KodKawasan': 12602, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'OSMAN BIN DUSA', + 'parti': 'PKR', + }, + 1435: { + 'KodN': 11, + 'KodParlimen': 126, + 'KodKawasan': 12603, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ABDUL KARIM SHAHIMI BIN ABDUL RAZAK', + 'parti': 'PAS', + }, + 1436: { + 'KodN': 11, + 'KodParlimen': 126, + 'KodKawasan': 12603, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD RAZI BIN MODH ALI', + 'parti': 'BN', + }, + 1437: { + 'KodN': 11, + 'KodParlimen': 126, + 'KodKawasan': 12603, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ZAINAL FIKRI BIN ABD KADIR', + 'parti': 'PKR', + }, + 1438: { + 'KodN': 11, + 'KodParlimen': 126, + 'KodKawasan': 12604, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'BAKRI BIN SAWIR', + 'parti': 'PKR', + }, + 1439: { + 'KodN': 11, + 'KodParlimen': 126, + 'KodKawasan': 12604, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MAZLY BIN YASIN', + 'parti': 'PAS', + }, + 1440: { + 'KodN': 11, + 'KodParlimen': 126, + 'KodKawasan': 12604, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'BAHARUDIN BIN JALI', + 'parti': 'BN', + }, + 1441: { + 'KodN': 11, + 'KodParlimen': 127, + 'KodKawasan': 127, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'KAMARULZAMAN BIN KAMDIAS', + 'parti': 'PKR', + }, + 1442: { + 'KodN': 11, + 'KodParlimen': 127, + 'KodKawasan': 127, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'MUSTAFFA BIN DAHARUN', + 'parti': 'PAS', + }, + 1443: { + 'KodN': 11, + 'KodParlimen': 127, + 'KodKawasan': 127, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': "DATO' HJ. MOHD SALIM BIN SHARIF", + 'parti': 'BN', + }, + 1444: { + 'KodN': 11, + 'KodParlimen': 127, + 'KodKawasan': 12705, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ABD RAHMAN BIN RAMLI', + 'parti': 'PKR', + }, + 1445: { + 'KodN': 11, + 'KodParlimen': 127, + 'KodKawasan': 12705, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': "DATO' HJ. SHAMSHULKAHAR BIN HJ. MOHD DELI", + 'parti': 'BN', + }, + 1446: { + 'KodN': 11, + 'KodParlimen': 127, + 'KodKawasan': 12705, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MUHAMMAD AL-ZUKRI BIN MUHAMAT YASSIN', + 'parti': 'PAS', + }, + 1447: { + 'KodN': 11, + 'KodParlimen': 127, + 'KodKawasan': 12706, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MASDI BIN MUSA', + 'parti': 'PAS', + }, + 1448: { + 'KodN': 11, + 'KodParlimen': 127, + 'KodKawasan': 12706, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MUSTAPHA BIN NAGOOR', + 'parti': 'BN', + }, + 1449: { + 'KodN': 11, + 'KodParlimen': 127, + 'KodKawasan': 12706, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': "DATO' ABDUL RAHMAN BIN JAAFAR", + 'parti': 'PKR', + }, + 1450: { + 'KodN': 11, + 'KodParlimen': 127, + 'KodKawasan': 12707, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': "DATO' MANICKAM A/L LETCHUMAN", + 'parti': 'BN', + }, + 1451: { + 'KodN': 11, + 'KodParlimen': 127, + 'KodKawasan': 12707, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD FAIRUZ BIN ISA', + 'parti': 'PAS', + }, + 1452: { + 'KodN': 11, + 'KodParlimen': 127, + 'KodKawasan': 12707, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'S. MULIA DI BIN SABTU', + 'parti': 'PKR', + }, + 1453: { + 'KodN': 11, + 'KodParlimen': 127, + 'KodKawasan': 12707, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': "DATO' DR. SURESH A/L SREENIVASAN", + 'parti': 'BEBAS', + }, + 1454: { + 'KodN': 11, + 'KodParlimen': 127, + 'KodKawasan': 12708, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MUSTAFAR BAKRI BIN ABDUL AZIZ', + 'parti': 'PAS', + }, + 1455: { + 'KodN': 11, + 'KodParlimen': 127, + 'KodKawasan': 12708, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'TEO KOK SIONG', + 'parti': 'PKR', + }, + 1456: { + 'KodN': 11, + 'KodParlimen': 127, + 'KodKawasan': 12708, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'CHONG WAN YU', + 'parti': 'BN', + }, + 1457: { + 'KodN': 11, + 'KodParlimen': 128, + 'KodKawasan': 128, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'LOKE SIEW FOOK', + 'parti': 'PKR', + }, + 1458: { + 'KodN': 11, + 'KodParlimen': 128, + 'KodKawasan': 128, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'CHONG SIN WOON', + 'parti': 'BN', + }, + 1459: { + 'KodN': 11, + 'KodParlimen': 128, + 'KodKawasan': 128, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'SHARIFFUDDIN BIN AHMAD', + 'parti': 'PAS', + }, + 1460: { + 'KodN': 11, + 'KodParlimen': 128, + 'KodKawasan': 12809, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHAMMAD GHAZALI BIN ABU BAKAR', + 'parti': 'PAS', + }, + 1461: { + 'KodN': 11, + 'KodParlimen': 128, + 'KodKawasan': 12809, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': ' SUHAIMI BIN KASSIM', + 'parti': 'PKR', + }, + 1462: { + 'KodN': 11, + 'KodParlimen': 128, + 'KodKawasan': 12809, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MAZALAN BIN MAAROP ', + 'parti': 'BN', + }, + 1463: { + 'KodN': 11, + 'KodParlimen': 128, + 'KodKawasan': 12810, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ARUL KUMAR A/L JAMBUNATHAN ', + 'parti': 'PKR', + }, + 1464: { + 'KodN': 11, + 'KodParlimen': 128, + 'KodKawasan': 12810, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD ABU ZARIM BIN ABDUL RAHMAN ', + 'parti': 'PAS', + }, + 1465: { + 'KodN': 11, + 'KodParlimen': 128, + 'KodKawasan': 12810, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'LEAW KOK CHAN', + 'parti': 'BN', + }, + 1466: { + 'KodN': 11, + 'KodParlimen': 128, + 'KodKawasan': 12811, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'BALAMURUGAN AL SANMUGAM', + 'parti': 'PAP', + }, + 1467: { + 'KodN': 11, + 'KodParlimen': 128, + 'KodKawasan': 12811, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'LIM KOK KIAN', + 'parti': 'BN', + }, + 1468: { + 'KodN': 11, + 'KodParlimen': 128, + 'KodKawasan': 12811, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'CHEW SEH YONG', + 'parti': 'PKR', + }, + 1469: { + 'KodN': 11, + 'KodParlimen': 128, + 'KodKawasan': 12812, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'YAU CON SENG ', + 'parti': 'PAS', + }, + 1470: { + 'KodN': 11, + 'KodParlimen': 128, + 'KodKawasan': 12812, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'NG CHIN TSAI ', + 'parti': 'PKR', + }, + 1471: { + 'KodN': 11, + 'KodParlimen': 128, + 'KodKawasan': 12812, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'SIOW KOI VOON ', + 'parti': 'BN', + }, + 1472: { + 'KodN': 11, + 'KodParlimen': 128, + 'KodKawasan': 12813, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'RAHIM BIN YUSOF ', + 'parti': 'PAS', + }, + 1473: { + 'KodN': 11, + 'KodParlimen': 128, + 'KodKawasan': 12813, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'AMINUDDIN BIN HARUN ', + 'parti': 'PKR', + }, + 1474: { + 'KodN': 11, + 'KodParlimen': 128, + 'KodKawasan': 12813, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SYAMSUL AMRI BIN ISMAIL', + 'parti': 'BN', + }, + 1475: { + 'KodN': 11, + 'KodParlimen': 128, + 'KodKawasan': 12813, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'BUJANG BIN ABU', + 'parti': 'BEBAS', + }, + 1476: { + 'KodN': 11, + 'KodParlimen': 128, + 'KodKawasan': 12814, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHAMAD RAFIE BIN AB MALEK', + 'parti': 'PKR', + }, + 1477: { + 'KodN': 11, + 'KodParlimen': 128, + 'KodKawasan': 12814, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MUSTAFFA BIN DAHARUN', + 'parti': 'PAS', + }, + 1478: { + 'KodN': 11, + 'KodParlimen': 128, + 'KodKawasan': 12814, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ABU UBAIDAH BIN HJ REDZA', + 'parti': 'BN', + }, + 1479: { + 'KodN': 11, + 'KodParlimen': 129, + 'KodKawasan': 129, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'RAFIEI BIN MUSTPHA', + 'parti': 'PAS', + }, + 1480: { + 'KodN': 11, + 'KodParlimen': 129, + 'KodKawasan': 129, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'EDDIN SYAZLEE BIN SHITH', + 'parti': 'PKR', + }, + 1481: { + 'KodN': 11, + 'KodParlimen': 129, + 'KodKawasan': 129, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'HASAN BIN MALEK', + 'parti': 'BN', + }, + 1482: { + 'KodN': 11, + 'KodParlimen': 129, + 'KodKawasan': 12915, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATO HJ ISMAIL B LASIM', + 'parti': 'BN', + }, + 1483: { + 'KodN': 11, + 'KodParlimen': 129, + 'KodKawasan': 12915, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ROSLI BIN OMAR', + 'parti': 'PKR', + }, + 1484: { + 'KodN': 11, + 'KodParlimen': 129, + 'KodKawasan': 12915, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HASSAN BIN MOHAMED', + 'parti': 'PAS', + }, + 1485: { + 'KodN': 11, + 'KodParlimen': 129, + 'KodKawasan': 12916, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATO ABDUL SAMAD BIN IBRAHIM', + 'parti': 'BN', + }, + 1486: { + 'KodN': 11, + 'KodParlimen': 129, + 'KodKawasan': 12916, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'RAFIEI BIN MUSTPHA', + 'parti': 'PAS', + }, + 1487: { + 'KodN': 11, + 'KodParlimen': 129, + 'KodKawasan': 12916, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'JAMALI BIN SALAM', + 'parti': 'PKR', + }, + 1488: { + 'KodN': 11, + 'KodParlimen': 129, + 'KodKawasan': 12917, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATO HJ ADNAN BIN ABU HASSAN', + 'parti': 'BN', + }, + 1489: { + 'KodN': 11, + 'KodParlimen': 129, + 'KodKawasan': 12917, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'FAZILAH BINTI ABU SAMAH', + 'parti': 'PAS', + }, + 1490: { + 'KodN': 11, + 'KodParlimen': 129, + 'KodKawasan': 12917, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MD RAIS BIN MOHAMAD@BASIRON', + 'parti': 'PKR', + }, + 1491: { + 'KodN': 11, + 'KodParlimen': 129, + 'KodKawasan': 12918, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATO NORHAYATI BINTI OMAR', + 'parti': 'BN', + }, + 1492: { + 'KodN': 11, + 'KodParlimen': 129, + 'KodKawasan': 12918, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHAMAD NAZARUDIN BIN SABTU', + 'parti': 'PKR', + }, + 1493: { + 'KodN': 11, + 'KodParlimen': 129, + 'KodKawasan': 12918, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'AHMAD FADZIL BIN OTHMAN', + 'parti': 'PAS', + }, + 1494: { + 'KodN': 11, + 'KodParlimen': 129, + 'KodKawasan': 12919, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SAIFUL YAZAN B SULAIMAN', + 'parti': 'BN', + }, + 1495: { + 'KodN': 11, + 'KodParlimen': 129, + 'KodKawasan': 12919, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ZULKEFLY MOHAMAD BIN OMAR', + 'parti': 'PKR', + }, + 1496: { + 'KodN': 11, + 'KodParlimen': 129, + 'KodKawasan': 12919, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'KAMARUDIN BIN MD.TAHIR', + 'parti': 'PAS', + }, + 1497: { + 'KodN': 11, + 'KodParlimen': 130, + 'KodKawasan': 130, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'NG KIAN NAM', + 'parti': 'BN', + }, + 1498: { + 'KodN': 11, + 'KodParlimen': 130, + 'KodKawasan': 130, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MOHD KHAIRIL ANUAR BIN MOHD WAFA', + 'parti': 'PAS', + }, + 1499: { + 'KodN': 11, + 'KodParlimen': 130, + 'KodKawasan': 130, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DAVID DASS A/L ASEERPATHAM', + 'parti': 'PAP', + }, + 1500: { + 'KodN': 11, + 'KodParlimen': 130, + 'KodKawasan': 130, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'CHA KEE CHIN', + 'parti': 'PKR', + }, + 1501: { + 'KodN': 11, + 'KodParlimen': 130, + 'KodKawasan': 13020, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ISMAIL BIN AHMAD', + 'parti': 'PKR', + }, + 1502: { + 'KodN': 11, + 'KodParlimen': 130, + 'KodKawasan': 13020, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD KHAIRIL ANUAR BIN MOHD WAFA', + 'parti': 'PAS', + }, + 1503: { + 'KodN': 11, + 'KodParlimen': 130, + 'KodKawasan': 13020, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HASIM BIN RUSDI', + 'parti': 'BN', + }, + 1504: { + 'KodN': 11, + 'KodParlimen': 130, + 'KodKawasan': 13020, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'DAVID DASS A/L ASEERPATHAM', + 'parti': 'PAP', + }, + 1505: { + 'KodN': 11, + 'KodParlimen': 130, + 'KodKawasan': 13021, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MAK KAH KEONG', + 'parti': 'BN', + }, + 1506: { + 'KodN': 11, + 'KodParlimen': 130, + 'KodKawasan': 13021, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'TAN LEE KOON', + 'parti': 'PKR', + }, + 1507: { + 'KodN': 11, + 'KodParlimen': 130, + 'KodKawasan': 13022, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'YAP SIOK MOY', + 'parti': 'BN', + }, + 1508: { + 'KodN': 11, + 'KodParlimen': 130, + 'KodKawasan': 13022, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SARASWATHY A/P PARAGAZUM', + 'parti': 'PAP', + }, + 1509: { + 'KodN': 11, + 'KodParlimen': 130, + 'KodKawasan': 13022, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MARY JOSEPHINE PRITTAM SINGH', + 'parti': 'PKR', + }, + 1510: { + 'KodN': 11, + 'KodParlimen': 130, + 'KodKawasan': 13023, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'PARIMALA DEVI A/P THEYAGASON', + 'parti': 'PAP', + }, + 1511: { + 'KodN': 11, + 'KodParlimen': 130, + 'KodKawasan': 13023, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HO CHOY SHIN', + 'parti': 'BN', + }, + 1512: { + 'KodN': 11, + 'KodParlimen': 130, + 'KodKawasan': 13023, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'YAP YEW WENG', + 'parti': 'PKR', + }, + 1513: { + 'KodN': 11, + 'KodParlimen': 130, + 'KodKawasan': 13024, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'CHOONG VEE HING', + 'parti': 'BN', + }, + 1514: { + 'KodN': 11, + 'KodParlimen': 130, + 'KodKawasan': 13024, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'GUNASEKAREN A/L PALASAMY', + 'parti': 'PKR', + }, + 1515: { + 'KodN': 11, + 'KodParlimen': 130, + 'KodKawasan': 13024, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'SAGAYA RAJAN A/L XAVIER', + 'parti': 'PAP', + }, + 1516: { + 'KodN': 11, + 'KodParlimen': 131, + 'KodKawasan': 131, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'KHAIRY JAMALUDDIN ABU BAKAR ', + 'parti': 'BN', + }, + 1517: { + 'KodN': 11, + 'KodParlimen': 131, + 'KodKawasan': 131, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MUSTAFA BIN DOLAH ', + 'parti': 'PAS', + }, + 1518: { + 'KodN': 11, + 'KodParlimen': 131, + 'KodKawasan': 131, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'KOLONEL (B) ROSELI BIN ABDUL GANI', + 'parti': 'PKR', + }, + 1519: { + 'KodN': 11, + 'KodParlimen': 131, + 'KodKawasan': 13125, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MASITA BINTI MOHAMED ALI', + 'parti': 'PAS', + }, + 1520: { + 'KodN': 11, + 'KodParlimen': 131, + 'KodKawasan': 13125, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD GHAZALI BIN ABD WAHID', + 'parti': 'BN', + }, + 1521: { + 'KodN': 11, + 'KodParlimen': 131, + 'KodKawasan': 13125, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHAMAD TAUFEK BIN ABDUL GHANI ', + 'parti': 'PKR', + }, + 1522: { + 'KodN': 11, + 'KodParlimen': 131, + 'KodKawasan': 13126, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ROSMIN BIN ADAM ', + 'parti': 'PAS', + }, + 1523: { + 'KodN': 11, + 'KodParlimen': 131, + 'KodKawasan': 13126, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ZAIFULBAHRI BIN IDRIS ', + 'parti': 'BN', + }, + 1524: { + 'KodN': 11, + 'KodParlimen': 131, + 'KodKawasan': 13126, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'AZIZAN BIN MARZUKI ', + 'parti': 'PKR', + }, + 1525: { + 'KodN': 11, + 'KodParlimen': 131, + 'KodKawasan': 13127, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHAMAD BIN HAJI HASAN ', + 'parti': 'BN', + }, + 1526: { + 'KodN': 11, + 'KodParlimen': 131, + 'KodKawasan': 13128, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ISHAK BIN OMAR ', + 'parti': 'PAS', + }, + 1527: { + 'KodN': 11, + 'KodParlimen': 131, + 'KodKawasan': 13128, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AWALUDIN BIN SAID ', + 'parti': 'BN', + }, + 1528: { + 'KodN': 11, + 'KodParlimen': 131, + 'KodKawasan': 13128, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SAHRIZAL BIN MASRUDIN ', + 'parti': 'PKR', + }, + 1529: { + 'KodN': 11, + 'KodParlimen': 132, + 'KodKawasan': 132, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MAHFUZ BIN ROSLAN', + 'parti': 'PAS', + }, + 1530: { + 'KodN': 11, + 'KodParlimen': 132, + 'KodKawasan': 132, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DANYAL BALAGOPAL ABDULLAH', + 'parti': 'PKR', + }, + 1531: { + 'KodN': 11, + 'KodParlimen': 132, + 'KodKawasan': 132, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'MOGAN A/L VELAVATHAM', + 'parti': 'BN', + }, + 1532: { + 'KodN': 11, + 'KodParlimen': 132, + 'KodKawasan': 13229, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'LIM CHIN FUI', + 'parti': 'BN', + }, + 1533: { + 'KodN': 11, + 'KodParlimen': 132, + 'KodKawasan': 13229, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'YEK DIEW CHING', + 'parti': 'PKR', + }, + 1534: { + 'KodN': 11, + 'KodParlimen': 132, + 'KodKawasan': 13230, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'YEONG KUN YOU', + 'parti': 'BN', + }, + 1535: { + 'KodN': 11, + 'KodParlimen': 132, + 'KodKawasan': 13230, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'CHOO KEN HWA', + 'parti': 'PKR', + }, + 1536: { + 'KodN': 11, + 'KodParlimen': 132, + 'KodKawasan': 13231, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'TUN HAIRUDIN BIN ABU BAKAR', + 'parti': 'BN', + }, + 1537: { + 'KodN': 11, + 'KodParlimen': 132, + 'KodKawasan': 13231, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD IBRAHIM KHAN BIN AMANULLA KHAN', + 'parti': 'PKR', + }, + 1538: { + 'KodN': 11, + 'KodParlimen': 132, + 'KodKawasan': 13232, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ABDUL RAHMAN BIN MOHD REDZA', + 'parti': 'BN', + }, + 1539: { + 'KodN': 11, + 'KodParlimen': 132, + 'KodKawasan': 13232, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'NOOR MOHAMMAD RIZAL BIN ISHAK', + 'parti': 'PAS', + }, + 1540: { + 'KodN': 11, + 'KodParlimen': 132, + 'KodKawasan': 13232, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'RUSLI BIN ABDULLAH', + 'parti': 'PKR', + }, + 1541: { + 'KodN': 11, + 'KodParlimen': 132, + 'KodKawasan': 13233, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'THINALAN A/L T. RAJAGOPALU', + 'parti': 'BN', + }, + 1542: { + 'KodN': 11, + 'KodParlimen': 132, + 'KodKawasan': 13233, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'RAVI A/L MUNUSAMY', + 'parti': 'PKR', + }, + 1543: { + 'KodN': 11, + 'KodParlimen': 132, + 'KodKawasan': 13233, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'KAMAROL RIDZUAN BIN MOHD ZAIN', + 'parti': 'PAS', + }, + 1544: { + 'KodN': 11, + 'KodParlimen': 133, + 'KodKawasan': 133, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'ABD HALIM B ABU BAKAR', + 'parti': 'PAS', + }, + 1545: { + 'KodN': 11, + 'KodParlimen': 133, + 'KodKawasan': 133, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'SHAZIMAN BIN ABU MANSOR', + 'parti': 'BN', + }, + 1546: { + 'KodN': 11, + 'KodParlimen': 133, + 'KodKawasan': 133, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'HASAN BIN BAHAROM', + 'parti': 'PKR', + }, + 1547: { + 'KodN': 11, + 'KodParlimen': 133, + 'KodKawasan': 13334, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ABD HALIM BIN ABU BAKAR', + 'parti': 'PAS', + }, + 1548: { + 'KodN': 11, + 'KodParlimen': 133, + 'KodKawasan': 13334, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'BAHARUDDIN ARIF BIN SIRI', + 'parti': 'PKR', + }, + 1549: { + 'KodN': 11, + 'KodParlimen': 133, + 'KodKawasan': 13334, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ABD RAZAK BIN AB SAID', + 'parti': 'BN', + }, + 1550: { + 'KodN': 11, + 'KodParlimen': 133, + 'KodKawasan': 13335, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ISHAK BIN MAASIN', + 'parti': 'PAS', + }, + 1551: { + 'KodN': 11, + 'KodParlimen': 133, + 'KodKawasan': 13335, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD ISAM BIN MOHD ISA', + 'parti': 'BN', + }, + 1552: { + 'KodN': 11, + 'KodParlimen': 133, + 'KodKawasan': 13335, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SAIFUL ADLY BIN ABD WAHAB', + 'parti': 'PKR', + }, + 1553: { + 'KodN': 11, + 'KodParlimen': 133, + 'KodKawasan': 13336, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ABD RAZAKEK BIN ABD RAHIM', + 'parti': 'PAS', + }, + 1554: { + 'KodN': 11, + 'KodParlimen': 133, + 'KodKawasan': 13336, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'VEERAPAN A/L SUPERAMANIAM', + 'parti': 'PKR', + }, + 1555: { + 'KodN': 11, + 'KodParlimen': 133, + 'KodKawasan': 13336, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'KOH KIM SWEE', + 'parti': 'BN', + }, + 1556: { + 'KodN': 12, + 'KodParlimen': 134, + 'KodKawasan': 134, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'MOHD NASIR BIN OTHMAN', + 'parti': 'PAS', + }, + 1557: { + 'KodN': 12, + 'KodParlimen': 134, + 'KodKawasan': 134, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'SABIRIN BIN JAAFAR', + 'parti': 'PKR', + }, + 1558: { + 'KodN': 12, + 'KodParlimen': 134, + 'KodKawasan': 134, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'MAS ERMIEYATI BINTI SAMSUDIN', + 'parti': 'BN', + }, + 1559: { + 'KodN': 12, + 'KodParlimen': 134, + 'KodKawasan': 13401, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ISMAIL BIN OTHMAN', + 'parti': 'BN', + }, + 1560: { + 'KodN': 12, + 'KodParlimen': 134, + 'KodKawasan': 13401, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HASMORNI BINTI TAMBY', + 'parti': 'PKR', + }, + 1561: { + 'KodN': 12, + 'KodParlimen': 134, + 'KodKawasan': 13401, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'AZMI BIN SAMBUL', + 'parti': 'PAS', + }, + 1562: { + 'KodN': 12, + 'KodParlimen': 134, + 'KodKawasan': 13402, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MD RAWI BIN MAHMUD', + 'parti': 'BN', + }, + 1563: { + 'KodN': 12, + 'KodParlimen': 134, + 'KodKawasan': 13402, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HALIM BIN BACHIK', + 'parti': 'PKR', + }, + 1564: { + 'KodN': 12, + 'KodParlimen': 134, + 'KodKawasan': 13402, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'IMRAN BIN ABDUL RAHMAN', + 'parti': 'PAS', + }, + 1565: { + 'KodN': 12, + 'KodParlimen': 134, + 'KodKawasan': 13403, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'AMIRUDIN BIN YUSOF', + 'parti': 'BN', + }, + 1566: { + 'KodN': 12, + 'KodParlimen': 134, + 'KodKawasan': 13403, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'JAMARUDIN BIN AHMAD', + 'parti': 'PAS', + }, + 1567: { + 'KodN': 12, + 'KodParlimen': 134, + 'KodKawasan': 13403, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'RUSLIN BIN HASAN', + 'parti': 'PKR', + }, + 1568: { + 'KodN': 12, + 'KodParlimen': 134, + 'KodKawasan': 13404, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'RIDHUAN AFFANDI BIN ABU BAKAR', + 'parti': 'PKR', + }, + 1569: { + 'KodN': 12, + 'KodParlimen': 134, + 'KodKawasan': 13404, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ARSHAD BIN MOHAMAD SOM', + 'parti': 'PAS', + }, + 1570: { + 'KodN': 12, + 'KodParlimen': 134, + 'KodKawasan': 13404, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SULAIMAN BIN MD ALI', + 'parti': 'BN', + }, + 1571: { + 'KodN': 12, + 'KodParlimen': 134, + 'KodKawasan': 13405, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ASRI BIN SHAIK ABDUL AZIZ', + 'parti': 'PAS', + }, + 1572: { + 'KodN': 12, + 'KodParlimen': 134, + 'KodKawasan': 13405, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ZAIRI BIN SUBOH', + 'parti': 'PKR', + }, + 1573: { + 'KodN': 12, + 'KodParlimen': 134, + 'KodKawasan': 13405, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'LATIPAH BINTI OMAR', + 'parti': 'BN', + }, + 1574: { + 'KodN': 12, + 'KodParlimen': 135, + 'KodKawasan': 135, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DATUK WONG NAI CHEE', + 'parti': 'BN', + }, + 1575: { + 'KodN': 12, + 'KodParlimen': 135, + 'KodKawasan': 135, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MOHD NAZREE BIN MOHD ARIS', + 'parti': 'PAS', + }, + 1576: { + 'KodN': 12, + 'KodParlimen': 135, + 'KodKawasan': 135, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'MOHD REDZUAN BIN MD. YUSOF', + 'parti': 'PKR', + }, + 1577: { + 'KodN': 12, + 'KodParlimen': 135, + 'KodKawasan': 13506, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATUK WIRA HAJAH NORPIPAH BTE ABDOL', + 'parti': 'BN', + }, + 1578: { + 'KodN': 12, + 'KodParlimen': 135, + 'KodKawasan': 13506, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MUHAMMAD JAILANI BIN KHAMIS', + 'parti': 'PKR', + }, + 1579: { + 'KodN': 12, + 'KodParlimen': 135, + 'KodKawasan': 13506, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHAMMAD RASHIDI BIN ABD RAZAK', + 'parti': 'PAS', + }, + 1580: { + 'KodN': 12, + 'KodParlimen': 135, + 'KodKawasan': 13507, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATUK PANIRCHELVAM A/L PICHAMUTHU', + 'parti': 'BN', + }, + 1581: { + 'KodN': 12, + 'KodParlimen': 135, + 'KodKawasan': 13507, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SAMINATHAN A/L GANESAN', + 'parti': 'PKR', + }, + 1582: { + 'KodN': 12, + 'KodParlimen': 135, + 'KodKawasan': 13507, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'EMRANSYAH BIN ISMAIL', + 'parti': 'PAS', + }, + 1583: { + 'KodN': 12, + 'KodParlimen': 135, + 'KodKawasan': 13508, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': ' DATUK WIRA KOH NAI KWONG', + 'parti': 'BN', + }, + 1584: { + 'KodN': 12, + 'KodParlimen': 135, + 'KodKawasan': 13508, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'GINNIE LIM SIEW LIN', + 'parti': 'PKR', + }, + 1585: { + 'KodN': 12, + 'KodParlimen': 135, + 'KodKawasan': 13508, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'WAN ZAHIDI BIN WAN ISMAIL', + 'parti': 'PAS', + }, + 1586: { + 'KodN': 12, + 'KodParlimen': 135, + 'KodKawasan': 13509, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DATUK WIRA HJ AB WAHAB BIN HJ AB LATIP', + 'parti': 'BN', + }, + 1587: { + 'KodN': 12, + 'KodParlimen': 135, + 'KodKawasan': 13509, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD SOFI BIN ABD WAHAB', + 'parti': 'PKR', + }, + 1588: { + 'KodN': 12, + 'KodParlimen': 135, + 'KodKawasan': 13509, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHSIN BIN IBRAHIM', + 'parti': 'PAS', + }, + 1589: { + 'KodN': 12, + 'KodParlimen': 135, + 'KodKawasan': 13510, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATUK SERI HJ ABDUL GHAFFAR BIN ATAN', + 'parti': 'BN', + }, + 1590: { + 'KodN': 12, + 'KodParlimen': 135, + 'KodKawasan': 13510, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ZAMZURI BIN ARIFIN', + 'parti': 'PKR', + }, + 1591: { + 'KodN': 12, + 'KodParlimen': 135, + 'KodKawasan': 13510, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'AZLAN BIN MADDIN', + 'parti': 'PAS', + }, + 1592: { + 'KodN': 12, + 'KodParlimen': 136, + 'KodKawasan': 136, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'ZALI BIN MAT YASIN', + 'parti': 'BN', + }, + 1593: { + 'KodN': 12, + 'KodParlimen': 136, + 'KodKawasan': 136, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'RUSNAH BINTI ALUAI', + 'parti': 'PKR', + }, + 1594: { + 'KodN': 12, + 'KodParlimen': 136, + 'KodKawasan': 136, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'ZULKIFLI BIN ISMAIL', + 'parti': 'PAS', + }, + 1595: { + 'KodN': 12, + 'KodParlimen': 136, + 'KodKawasan': 13611, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'IDRIS BIN HARON', + 'parti': 'BN', + }, + 1596: { + 'KodN': 12, + 'KodParlimen': 136, + 'KodKawasan': 13611, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD LOKMAN BIN ABDUL GANI', + 'parti': 'PKR', + }, + 1597: { + 'KodN': 12, + 'KodParlimen': 136, + 'KodKawasan': 13612, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'NORAZMAN BIN HASSAN', + 'parti': 'BN', + }, + 1598: { + 'KodN': 12, + 'KodParlimen': 136, + 'KodKawasan': 13612, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ABDUL HALIM BIN MAIDIN', + 'parti': 'PAS', + }, + 1599: { + 'KodN': 12, + 'KodParlimen': 136, + 'KodKawasan': 13612, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'JUHARI BIN OSMAN', + 'parti': 'PKR', + }, + 1600: { + 'KodN': 12, + 'KodParlimen': 136, + 'KodKawasan': 13613, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ABU BAKAR BIN MOHD DIAH', + 'parti': 'BN', + }, + 1601: { + 'KodN': 12, + 'KodParlimen': 136, + 'KodKawasan': 13613, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'RAFIE BIN AHMAD', + 'parti': 'PAS', + }, + 1602: { + 'KodN': 12, + 'KodParlimen': 136, + 'KodKawasan': 13613, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD RAFIQ BIN NAIZAMOHIDEEN', + 'parti': 'PKR', + }, + 1603: { + 'KodN': 12, + 'KodParlimen': 136, + 'KodKawasan': 13614, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'GUE TECK', + 'parti': 'PKR', + }, + 1604: { + 'KodN': 12, + 'KodParlimen': 136, + 'KodKawasan': 13614, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD SHAFIQ BIN ISMAIL', + 'parti': 'PAS', + }, + 1605: { + 'KodN': 12, + 'KodParlimen': 136, + 'KodKawasan': 13614, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'LIM BAN HONG', + 'parti': 'BN', + }, + 1606: { + 'KodN': 12, + 'KodParlimen': 137, + 'KodKawasan': 137, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'TAN SRI HJ MOHD ALI BIN MOHD RUSTAM', + 'parti': 'BN', + }, + 1607: { + 'KodN': 12, + 'KodParlimen': 137, + 'KodKawasan': 137, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DR MD. KHALID BIN KASSIM', + 'parti': 'PAS', + }, + 1608: { + 'KodN': 12, + 'KodParlimen': 137, + 'KodKawasan': 137, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'SHAMSUL ISKANDAR BIN MD AKIN', + 'parti': 'PKR', + }, + 1609: { + 'KodN': 12, + 'KodParlimen': 137, + 'KodKawasan': 13715, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATUK CHUA LIAN CHYE', + 'parti': 'BN', + }, + 1610: { + 'KodN': 12, + 'KodParlimen': 137, + 'KodKawasan': 13715, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'RAMLI BIN DALIP', + 'parti': 'PAS', + }, + 1611: { + 'KodN': 12, + 'KodParlimen': 137, + 'KodKawasan': 13715, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HORHIZAM BIN HASSAN BAKTEE', + 'parti': 'PKR', + }, + 1612: { + 'KodN': 12, + 'KodParlimen': 137, + 'KodKawasan': 13716, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATUK CHUA KHENG HWA', + 'parti': 'BN', + }, + 1613: { + 'KodN': 12, + 'KodParlimen': 137, + 'KodKawasan': 13716, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HJ SEPRI BIN RAHMAN', + 'parti': 'PAS', + }, + 1614: { + 'KodN': 12, + 'KodParlimen': 137, + 'KodKawasan': 13716, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'KERK CHEE YEE', + 'parti': 'PKR', + }, + 1615: { + 'KodN': 12, + 'KodParlimen': 137, + 'KodKawasan': 13717, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATUK HJ YUNUS BIN HITAM', + 'parti': 'BN', + }, + 1616: { + 'KodN': 12, + 'KodParlimen': 137, + 'KodKawasan': 13717, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ADLY BIN ZAHARI', + 'parti': 'PKR', + }, + 1617: { + 'KodN': 12, + 'KodParlimen': 137, + 'KodKawasan': 13717, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MUHAMAT PUHAT BIN BEDOL', + 'parti': 'PAS', + }, + 1618: { + 'KodN': 12, + 'KodParlimen': 137, + 'KodKawasan': 13718, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'RAHMAD BIN MARIMAN', + 'parti': 'BN', + }, + 1619: { + 'KodN': 12, + 'KodParlimen': 137, + 'KodKawasan': 13718, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'FARHAN BIN IBRAHIM @ ALIAS', + 'parti': 'PKR', + }, + 1620: { + 'KodN': 12, + 'KodParlimen': 137, + 'KodKawasan': 13718, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'JANTAN BIN ABDULLAH', + 'parti': 'PAS', + }, + 1621: { + 'KodN': 12, + 'KodParlimen': 137, + 'KodKawasan': 13718, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'PROF. MADYA DR KAMAROLZAMAN BIN HJ MOHD JIDI', + 'parti': 'BEBAS', + }, + 1622: { + 'KodN': 12, + 'KodParlimen': 138, + 'KodKawasan': 138, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'CHOO WEI SERN', + 'parti': 'BN', + }, + 1623: { + 'KodN': 12, + 'KodParlimen': 138, + 'KodKawasan': 138, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'KHOO POAY TIONG', + 'parti': 'PKR', + }, + 1624: { + 'KodN': 12, + 'KodParlimen': 138, + 'KodKawasan': 138, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'GOH LEONG SAN', + 'parti': 'BEBAS', + }, + 1625: { + 'KodN': 12, + 'KodParlimen': 138, + 'KodKawasan': 13819, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'NG CHOON KOON', + 'parti': 'BN', + }, + 1626: { + 'KodN': 12, + 'KodParlimen': 138, + 'KodKawasan': 13819, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SEAH SHOO CHIN', + 'parti': 'PKR', + }, + 1627: { + 'KodN': 12, + 'KodParlimen': 138, + 'KodKawasan': 13819, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'GOH LEONG SAN', + 'parti': 'BEBAS', + }, + 1628: { + 'KodN': 12, + 'KodParlimen': 138, + 'KodKawasan': 13820, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MELVIN CHUA KEW WEI', + 'parti': 'BN', + }, + 1629: { + 'KodN': 12, + 'KodParlimen': 138, + 'KodKawasan': 13820, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'LOW CHEE LEONG', + 'parti': 'PKR', + }, + 1630: { + 'KodN': 12, + 'KodParlimen': 138, + 'KodKawasan': 13820, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SIM TONG HIM', + 'parti': 'BEBAS', + }, + 1631: { + 'KodN': 12, + 'KodParlimen': 138, + 'KodKawasan': 13821, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'KAMARUDIN BIN SEDIK', + 'parti': 'PAS', + }, + 1632: { + 'KodN': 12, + 'KodParlimen': 138, + 'KodKawasan': 13821, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'LEE KIAT LEE', + 'parti': 'BN', + }, + 1633: { + 'KodN': 12, + 'KodParlimen': 138, + 'KodKawasan': 13821, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'DAMIEN YEO SHEN LI', + 'parti': 'PKR', + }, + 1634: { + 'KodN': 12, + 'KodParlimen': 138, + 'KodKawasan': 13821, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'LIM JAK WONG', + 'parti': 'BEBAS', + }, + 1635: { + 'KodN': 12, + 'KodParlimen': 138, + 'KodKawasan': 13822, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'LEE CHONG LENG', + 'parti': 'BN', + }, + 1636: { + 'KodN': 12, + 'KodParlimen': 138, + 'KodKawasan': 13822, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'TEY KOK KIEW', + 'parti': 'PKR', + }, + 1637: { + 'KodN': 12, + 'KodParlimen': 138, + 'KodKawasan': 13822, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'CHIN CHOONG SENG', + 'parti': 'BEBAS', + }, + 1638: { + 'KodN': 12, + 'KodParlimen': 138, + 'KodKawasan': 13823, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ABDUL RAZAK BIN ABDUL RAHMAN', + 'parti': 'BN', + }, + 1639: { + 'KodN': 12, + 'KodParlimen': 138, + 'KodKawasan': 13823, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'NOOR EFFANDI BIN AHMAD', + 'parti': 'PKR', + }, + 1640: { + 'KodN': 12, + 'KodParlimen': 138, + 'KodKawasan': 13823, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ROSAZALI BIN MD YASSIN', + 'parti': 'PAS', + }, + 1641: { + 'KodN': 12, + 'KodParlimen': 139, + 'KodKawasan': 139, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DATUK PADUKA KHAIRUDDIN BIN ABU HASAN', + 'parti': 'PKR', + }, + 1642: { + 'KodN': 12, + 'KodParlimen': 139, + 'KodKawasan': 139, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'HAJI ABDUL ALIM BIN SHAPIE', + 'parti': 'PAS', + }, + 1643: { + 'KodN': 12, + 'KodParlimen': 139, + 'KodKawasan': 139, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DATUK SERI WIRA HJ AHMAD BIN HAMZAH', + 'parti': 'BN', + }, + 1644: { + 'KodN': 12, + 'KodParlimen': 139, + 'KodKawasan': 13924, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATUK KOH CHIN HAN', + 'parti': 'BN', + }, + 1645: { + 'KodN': 12, + 'KodParlimen': 139, + 'KodKawasan': 13924, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HJ SUHAIMI BIN HARUN', + 'parti': 'PAS', + }, + 1646: { + 'KodN': 12, + 'KodParlimen': 139, + 'KodKawasan': 13924, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DR WONG FORT-PIN', + 'parti': 'PKR', + }, + 1647: { + 'KodN': 12, + 'KodParlimen': 139, + 'KodKawasan': 13925, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HAJAH KINTAN BTE MAN', + 'parti': 'PAS', + }, + 1648: { + 'KodN': 12, + 'KodParlimen': 139, + 'KodKawasan': 13925, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATUK WIRA HJ GHAZALE BIN MUHAMAD', + 'parti': 'BN', + }, + 1649: { + 'KodN': 12, + 'KodParlimen': 139, + 'KodKawasan': 13925, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SHAMSUL ISKANDAR @ YUSRIE MOHD AKIN', + 'parti': 'PKR', + }, + 1650: { + 'KodN': 12, + 'KodParlimen': 139, + 'KodKawasan': 13926, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'AHMAD BILAL BIN RAHUDIN', + 'parti': 'PAS', + }, + 1651: { + 'KodN': 12, + 'KodParlimen': 139, + 'KodKawasan': 13926, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATUK ZAIDI BIN ATTAN', + 'parti': 'BN', + }, + 1652: { + 'KodN': 12, + 'KodParlimen': 139, + 'KodKawasan': 13926, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'NOR KHAIRI BIN YUSOF', + 'parti': 'PKR', + }, + 1653: { + 'KodN': 12, + 'KodParlimen': 139, + 'KodKawasan': 13927, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATUK ROSLAN BIN AHMAD', + 'parti': 'BN', + }, + 1654: { + 'KodN': 12, + 'KodParlimen': 139, + 'KodKawasan': 13927, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HAJI YUHAIZAD BIN ABDULLAH', + 'parti': 'PKR', + }, + 1655: { + 'KodN': 12, + 'KodParlimen': 139, + 'KodKawasan': 13927, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HAJI ABDUL MALEK BIN YUSOF', + 'parti': 'PAS', + }, + 1656: { + 'KodN': 12, + 'KodParlimen': 139, + 'KodKawasan': 13928, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'AZALINA BIN ABDUL RAHMAN', + 'parti': 'PKR', + }, + 1657: { + 'KodN': 12, + 'KodParlimen': 139, + 'KodKawasan': 13928, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATUK HASAN BIN ABD RAHMAN', + 'parti': 'BN', + }, + 1658: { + 'KodN': 12, + 'KodParlimen': 139, + 'KodKawasan': 13928, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HAJI ZAKARIYA BIN KASNIN', + 'parti': 'PAS', + }, + 1659: { + 'KodN': 13, + 'KodParlimen': 140, + 'KodKawasan': 140, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DATUK SERI S SUBRAMANIAM', + 'parti': 'BN', + }, + 1660: { + 'KodN': 13, + 'KodParlimen': 140, + 'KodKawasan': 140, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'R SANHTARA KUMAR', + 'parti': 'PKR', + }, + 1661: { + 'KodN': 13, + 'KodParlimen': 140, + 'KodKawasan': 140, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'KHAIRUL FAIZI AHMAD KAMIL', + 'parti': 'PAS', + }, + 1662: { + 'KodN': 13, + 'KodParlimen': 140, + 'KodKawasan': 14001, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATUK ZAHARI BIN SARIP', + 'parti': 'BN', + }, + 1663: { + 'KodN': 13, + 'KodParlimen': 140, + 'KodKawasan': 14001, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'NORSAMSU BIN MOHD YUSOF', + 'parti': 'PKR', + }, + 1664: { + 'KodN': 13, + 'KodParlimen': 140, + 'KodKawasan': 14002, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'CHIAM YOK MENG', + 'parti': 'BN', + }, + 1665: { + 'KodN': 13, + 'KodParlimen': 140, + 'KodKawasan': 14002, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'TAN CHENG CHOON', + 'parti': 'PKR', + }, + 1666: { + 'KodN': 13, + 'KodParlimen': 140, + 'KodKawasan': 14002, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'KHAIRUL FAIZI AHMAD KAMIL', + 'parti': 'PAS', + }, + 1667: { + 'KodN': 13, + 'KodParlimen': 141, + 'KodKawasan': 141, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DATUK HJ. AYUB BIN RAHMAT', + 'parti': 'BN', + }, + 1668: { + 'KodN': 13, + 'KodParlimen': 141, + 'KodKawasan': 141, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'HJH NATRAH BINTI ISMAIL', + 'parti': 'PKR', + }, + 1669: { + 'KodN': 13, + 'KodParlimen': 141, + 'KodKawasan': 14103, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'KHOO SHIAW LEE', + 'parti': 'BN', + }, + 1670: { + 'KodN': 13, + 'KodParlimen': 141, + 'KodKawasan': 14103, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'NORMALA BT SUDIRMAN', + 'parti': 'PAS', + }, + 1671: { + 'KodN': 13, + 'KodParlimen': 141, + 'KodKawasan': 14103, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DR. CHONG FAT FULL', + 'parti': 'PKR', + }, + 1672: { + 'KodN': 13, + 'KodParlimen': 141, + 'KodKawasan': 14104, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ANUAR BIN ABD MANAP', + 'parti': 'BN', + }, + 1673: { + 'KodN': 13, + 'KodParlimen': 141, + 'KodKawasan': 14104, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DR. SULAIMAN BIN MOHD NOR', + 'parti': 'PKR', + }, + 1674: { + 'KodN': 13, + 'KodParlimen': 142, + 'KodKawasan': 142, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DATUK SARCHU BIN SAWAL', + 'parti': 'PAS', + }, + 1675: { + 'KodN': 13, + 'KodParlimen': 142, + 'KodKawasan': 142, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'PANG HOCK LIONG', + 'parti': 'PKR', + }, + 1676: { + 'KodN': 13, + 'KodParlimen': 142, + 'KodKawasan': 142, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DATUK CHUA TEE YONG', + 'parti': 'BN', + }, + 1677: { + 'KodN': 13, + 'KodParlimen': 142, + 'KodKawasan': 14205, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'NASHARUDIN BIN AWANG', + 'parti': 'PAS', + }, + 1678: { + 'KodN': 13, + 'KodParlimen': 142, + 'KodKawasan': 14205, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD SOLIHAN BIN BADRI', + 'parti': 'PKR', + }, + 1679: { + 'KodN': 13, + 'KodParlimen': 142, + 'KodKawasan': 14205, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD AZAHAR BINIBRAHIM', + 'parti': 'BN', + }, + 1680: { + 'KodN': 13, + 'KodParlimen': 142, + 'KodKawasan': 14206, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'TAN CHONG', + 'parti': 'BN', + }, + 1681: { + 'KodN': 13, + 'KodParlimen': 142, + 'KodKawasan': 14206, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'RAMAKRISHNAN A/L SUPPIAH', + 'parti': 'PKR', + }, + 1682: { + 'KodN': 13, + 'KodParlimen': 143, + 'KodKawasan': 143, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'HAJI ISMAIL BIN MOHAMED', + 'parti': 'BN', + }, + 1683: { + 'KodN': 13, + 'KodParlimen': 143, + 'KodKawasan': 143, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'TAN SRI MAHIADDIN BIN MD YASIN', + 'parti': 'PKR', + }, + 1684: { + 'KodN': 13, + 'KodParlimen': 143, + 'KodKawasan': 143, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'AHMAD NAWFAL BIN MAHFODZ', + 'parti': 'PAS', + }, + 1685: { + 'KodN': 13, + 'KodParlimen': 143, + 'KodKawasan': 14307, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SAHRUDDIN BIN JAMAL', + 'parti': 'PKR', + }, + 1686: { + 'KodN': 13, + 'KodParlimen': 143, + 'KodKawasan': 14307, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD NOOR BIN TAIB', + 'parti': 'BN', + }, + 1687: { + 'KodN': 13, + 'KodParlimen': 143, + 'KodKawasan': 14307, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MUHAMAD NUR IQBAL BIN ABD RAZAK', + 'parti': 'PAS', + }, + 1688: { + 'KodN': 13, + 'KodParlimen': 143, + 'KodKawasan': 14308, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'NAJIB BIN LEP', + 'parti': 'PAS', + }, + 1689: { + 'KodN': 13, + 'KodParlimen': 143, + 'KodKawasan': 14308, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATUK NORIAH BTE MAHAT', + 'parti': 'BN', + }, + 1690: { + 'KodN': 13, + 'KodParlimen': 144, + 'KodKawasan': 144, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DATUK IR. DR. HJ HAMIM BIN SAMURI', + 'parti': 'BN', + }, + 1691: { + 'KodN': 13, + 'KodParlimen': 144, + 'KodKawasan': 144, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'SYED IBRAHIM BIN SYED NUH', + 'parti': 'PKR', + }, + 1692: { + 'KodN': 13, + 'KodParlimen': 144, + 'KodKawasan': 144, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'RUSMAN BIN KEMIN', + 'parti': 'PAS', + }, + 1693: { + 'KodN': 13, + 'KodParlimen': 144, + 'KodKawasan': 14409, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATUK M ASOJAN A/L MUNIYANDY', + 'parti': 'BN', + }, + 1694: { + 'KodN': 13, + 'KodParlimen': 144, + 'KodKawasan': 14409, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'TAN SRI DATO’ HJ. MUHYIDDIN BIN HJ MOHD YASSIN', + 'parti': 'PKR', + }, + 1695: { + 'KodN': 13, + 'KodParlimen': 144, + 'KodKawasan': 14409, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DATUK DR. MAHFODZ BIN MOHAMED', + 'parti': 'PAS', + }, + 1696: { + 'KodN': 13, + 'KodParlimen': 144, + 'KodKawasan': 14410, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATUK GOH TEE TEE', + 'parti': 'BN', + }, + 1697: { + 'KodN': 13, + 'KodParlimen': 144, + 'KodKawasan': 14410, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'EE CHIN LI', + 'parti': 'PKR', + }, + 1698: { + 'KodN': 13, + 'KodParlimen': 144, + 'KodKawasan': 14411, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATUK HJ ABDULL RAHIM BIN HJ TALIB', + 'parti': 'BN', + }, + 1699: { + 'KodN': 13, + 'KodParlimen': 144, + 'KodKawasan': 14411, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DR. FAIZUL AMRI BIN ADNAN', + 'parti': 'PKR', + }, + 1700: { + 'KodN': 13, + 'KodParlimen': 144, + 'KodKawasan': 14411, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HJ MUSTAFFA BIN SALLEH', + 'parti': 'PAS', + }, + 1701: { + 'KodN': 13, + 'KodParlimen': 145, + 'KodKawasan': 145, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'KOH CHON CHAI ', + 'parti': 'BN', + }, + 1702: { + 'KodN': 13, + 'KodParlimen': 145, + 'KodKawasan': 145, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'YEO BEE YIN ', + 'parti': 'PKR', + }, + 1703: { + 'KodN': 13, + 'KodParlimen': 145, + 'KodKawasan': 145, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'ZARUL @ MOHD ZAHRUL BIN SALLEH ', + 'parti': 'PAS', + }, + 1704: { + 'KodN': 13, + 'KodParlimen': 145, + 'KodKawasan': 14512, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'LEE KIM HENG ', + 'parti': 'BN', + }, + 1705: { + 'KodN': 13, + 'KodParlimen': 145, + 'KodKawasan': 14512, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'NG YAK HOWE ', + 'parti': 'PKR', + }, + 1706: { + 'KodN': 13, + 'KodParlimen': 145, + 'KodKawasan': 14513, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'MOHD RADZI BIN AMIN ', + 'parti': 'BN', + }, + 1707: { + 'KodN': 13, + 'KodParlimen': 145, + 'KodKawasan': 14513, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'AHMAD BIN HASHIM ', + 'parti': 'BEBAS', + }, + 1708: { + 'KodN': 13, + 'KodParlimen': 145, + 'KodKawasan': 14513, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SALAHUDDIN BIN AYUB ', + 'parti': 'PKR', + }, + 1709: { + 'KodN': 13, + 'KodParlimen': 145, + 'KodKawasan': 14513, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD MAZRI BIN YAHYA ', + 'parti': 'PAS', + }, + 1710: { + 'KodN': 13, + 'KodParlimen': 145, + 'KodKawasan': 14514, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HASSAN BIN JOHARI ', + 'parti': 'BN', + }, + 1711: { + 'KodN': 13, + 'KodParlimen': 145, + 'KodKawasan': 14514, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'S.JEGANATHAN A/L SUBTAMANIAM ', + 'parti': 'BEBAS', + }, + 1712: { + 'KodN': 13, + 'KodParlimen': 145, + 'KodKawasan': 14514, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AZMAN BIN IBRAHIM ', + 'parti': 'PAS', + }, + 1713: { + 'KodN': 13, + 'KodParlimen': 145, + 'KodKawasan': 14514, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'MD YSAHRUDIN BIN KUSNI ', + 'parti': 'PKR', + }, + 1714: { + 'KodN': 13, + 'KodParlimen': 146, + 'KodKawasan': 146, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DATUK SERI RAZALI BIN IBRAHIM', + 'parti': 'BN', + }, + 1715: { + 'KodN': 13, + 'KodParlimen': 146, + 'KodKawasan': 146, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'SYED SADDIQ BIN SYED ABDUL RAHMAN', + 'parti': 'PKR', + }, + 1716: { + 'KodN': 13, + 'KodParlimen': 146, + 'KodKawasan': 146, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'ABDUL AZIZ BIN TALIB ', + 'parti': 'PAS', + }, + 1717: { + 'KodN': 13, + 'KodParlimen': 146, + 'KodKawasan': 14615, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': "DATO' ASHARI BIN MD SARIP", + 'parti': 'BN', + }, + 1718: { + 'KodN': 13, + 'KodParlimen': 146, + 'KodKawasan': 14615, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'NORHAYATI BINTI BACHOK ', + 'parti': 'PKR', + }, + 1719: { + 'KodN': 13, + 'KodParlimen': 146, + 'KodKawasan': 14615, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DR. MOHAMAD BIN TASLIM ', + 'parti': 'PAS', + }, + 1720: { + 'KodN': 13, + 'KodParlimen': 146, + 'KodKawasan': 14616, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ZAITON BINTI ISMAIL', + 'parti': 'BN', + }, + 1721: { + 'KodN': 13, + 'KodParlimen': 146, + 'KodKawasan': 14616, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'NAIM BIN JUSRI', + 'parti': 'PKR', + }, + 1722: { + 'KodN': 13, + 'KodParlimen': 146, + 'KodKawasan': 14616, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HJ CHEMAN BIN YUSOH', + 'parti': 'PAS', + }, + 1723: { + 'KodN': 13, + 'KodParlimen': 147, + 'KodKawasan': 147, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'NORAINI BINTI AHMAD', + 'parti': 'BN', + }, + 1724: { + 'KodN': 13, + 'KodParlimen': 147, + 'KodKawasan': 147, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'ANIS AFIDA BINTI MOHD AZLI', + 'parti': 'PKR', + }, + 1725: { + 'KodN': 13, + 'KodParlimen': 147, + 'KodKawasan': 147, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'AHMAD ROSDI BIN BAHARI', + 'parti': 'PAS', + }, + 1726: { + 'KodN': 13, + 'KodParlimen': 147, + 'KodKawasan': 14717, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ADNAN BIN OTHMAN', + 'parti': 'PAS', + }, + 1727: { + 'KodN': 13, + 'KodParlimen': 147, + 'KodKawasan': 14717, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD ISMAIL BIN ROSLAN', + 'parti': 'BN', + }, + 1728: { + 'KodN': 13, + 'KodParlimen': 147, + 'KodKawasan': 14717, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD KHUZZAN BIN ABU BAKAR', + 'parti': 'PKR', + }, + 1729: { + 'KodN': 13, + 'KodParlimen': 147, + 'KodKawasan': 14718, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ZULKURNAIN BIN KAMISAN', + 'parti': 'BN', + }, + 1730: { + 'KodN': 13, + 'KodParlimen': 147, + 'KodKawasan': 14718, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD AJIB BIN OMAR', + 'parti': 'PKR', + }, + 1731: { + 'KodN': 13, + 'KodParlimen': 147, + 'KodKawasan': 14718, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SALEHUDIN AB RASHID', + 'parti': 'PAS', + }, + 1732: { + 'KodN': 13, + 'KodParlimen': 148, + 'KodKawasan': 148, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'MARDI BIN MARWAN', + 'parti': 'PAS', + }, + 1733: { + 'KodN': 13, + 'KodParlimen': 148, + 'KodKawasan': 148, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DATUK DR. IR. WEE KA SIONG', + 'parti': 'BN', + }, + 1734: { + 'KodN': 13, + 'KodParlimen': 148, + 'KodKawasan': 148, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'LIEW CHIN TONG', + 'parti': 'PKR', + }, + 1735: { + 'KodN': 13, + 'KodParlimen': 148, + 'KodKawasan': 14819, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'CHEW PECK CHOO', + 'parti': 'PKR', + }, + 1736: { + 'KodN': 13, + 'KodParlimen': 148, + 'KodKawasan': 14819, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'LING TIAN SOON', + 'parti': 'BN', + }, + 1737: { + 'KodN': 13, + 'KodParlimen': 148, + 'KodKawasan': 14819, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MUHAMMAD BIN ABDULLAH', + 'parti': 'PAS', + }, + 1738: { + 'KodN': 13, + 'KodParlimen': 148, + 'KodKawasan': 14820, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATUK SAMSOLBARI BIN JAMALI', + 'parti': 'BN', + }, + 1739: { + 'KodN': 13, + 'KodParlimen': 148, + 'KodKawasan': 14820, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD BAKRI BIN SAMIAN', + 'parti': 'PAS', + }, + 1740: { + 'KodN': 13, + 'KodParlimen': 148, + 'KodKawasan': 14820, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ZAIS BIN MOHD AKIL', + 'parti': 'PKR', + }, + 1741: { + 'KodN': 13, + 'KodParlimen': 149, + 'KodKawasan': 149, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DATUK DR SHAHRUDDIN SALLEH', + 'parti': 'PKR', + }, + 1742: { + 'KodN': 13, + 'KodParlimen': 149, + 'KodKawasan': 149, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'LT KOL HJ M ASHARI SIDON', + 'parti': 'PAS', + }, + 1743: { + 'KodN': 13, + 'KodParlimen': 149, + 'KodKawasan': 149, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DATUK AZIZ KAPRAWI', + 'parti': 'BN', + }, + 1744: { + 'KodN': 13, + 'KodParlimen': 149, + 'KodKawasan': 14921, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SOH LIP YAN', + 'parti': 'BN', + }, + 1745: { + 'KodN': 13, + 'KodParlimen': 149, + 'KodKawasan': 14921, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'CIKGU HAJI NASIR', + 'parti': 'PAS', + }, + 1746: { + 'KodN': 13, + 'KodParlimen': 149, + 'KodKawasan': 14921, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'CIKGU AMINOLHUDA', + 'parti': 'PKR', + }, + 1747: { + 'KodN': 13, + 'KodParlimen': 149, + 'KodKawasan': 14922, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'CIKGU ABDUL HADI BIN HARUN', + 'parti': 'PAS', + }, + 1748: { + 'KodN': 13, + 'KodParlimen': 149, + 'KodKawasan': 14922, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'FERDAUS BIN KAYAU', + 'parti': 'PKR', + }, + 1749: { + 'KodN': 13, + 'KodParlimen': 149, + 'KodKawasan': 14922, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'RASHIDAH RAMLI', + 'parti': 'BN', + }, + 1750: { + 'KodN': 13, + 'KodParlimen': 150, + 'KodKawasan': 150, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'HALIZA BINTI ABDULLAH', + 'parti': 'BN', + }, + 1751: { + 'KodN': 13, + 'KodParlimen': 150, + 'KodKawasan': 150, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'MOHD RASHID BIN HASNON', + 'parti': 'PKR', + }, + 1752: { + 'KodN': 13, + 'KodParlimen': 150, + 'KodKawasan': 150, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MAHFODZ BIN MOHAMED', + 'parti': 'PAS', + }, + 1753: { + 'KodN': 13, + 'KodParlimen': 150, + 'KodKawasan': 15023, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'GAN PECK CHENG ', + 'parti': 'PKR', + }, + 1754: { + 'KodN': 13, + 'KodParlimen': 150, + 'KodKawasan': 15023, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'KANG BENG KUAN ', + 'parti': 'BN', + }, + 1755: { + 'KodN': 13, + 'KodParlimen': 150, + 'KodKawasan': 15023, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MISRAN BIN SAMIAN ', + 'parti': 'PAS', + }, + 1756: { + 'KodN': 13, + 'KodParlimen': 150, + 'KodKawasan': 15024, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ZAIDI BIN JAPAR', + 'parti': 'BN', + }, + 1757: { + 'KodN': 13, + 'KodParlimen': 150, + 'KodKawasan': 15024, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'KHAIRUDDIN BIN A RAHIM', + 'parti': 'PKR', + }, + 1758: { + 'KodN': 13, + 'KodParlimen': 150, + 'KodKawasan': 15024, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD RAMLI BIN MD KARI', + 'parti': 'PAS', + }, + 1759: { + 'KodN': 13, + 'KodParlimen': 150, + 'KodKawasan': 15025, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD TUKIRAN @ MOHD TUMIRAN BIN AHMAD', + 'parti': 'PAS', + }, + 1760: { + 'KodN': 13, + 'KodParlimen': 150, + 'KodKawasan': 15025, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MALIK FAISHAL BIN AHMAD ', + 'parti': 'PKR', + }, + 1761: { + 'KodN': 13, + 'KodParlimen': 150, + 'KodKawasan': 15025, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AYUB BIN JAMIL', + 'parti': 'BN', + }, + 1762: { + 'KodN': 13, + 'KodParlimen': 151, + 'KodKawasan': 151, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'R. MASZLEE BIN MALIK', + 'parti': 'PKR', + }, + 1763: { + 'KodN': 13, + 'KodParlimen': 151, + 'KodKawasan': 151, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DATUK LIANG TECK MENG', + 'parti': 'BN', + }, + 1764: { + 'KodN': 13, + 'KodParlimen': 151, + 'KodKawasan': 151, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'MOHD JUBRI BIN SELAMAT', + 'parti': 'PAS', + }, + 1765: { + 'KodN': 13, + 'KodParlimen': 151, + 'KodKawasan': 15126, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HJ AHMAD BIN AHEM', + 'parti': 'PKR', + }, + 1766: { + 'KodN': 13, + 'KodParlimen': 151, + 'KodKawasan': 15126, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AZLISHAM BIN AZAHAR', + 'parti': 'PAS', + }, + 1767: { + 'KodN': 13, + 'KodParlimen': 151, + 'KodKawasan': 15126, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HJ ABD TAIB BIN ABU BAKAR', + 'parti': 'BN', + }, + 1768: { + 'KodN': 13, + 'KodParlimen': 151, + 'KodKawasan': 15127, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MURUGAN A/L MUTHUSAMY@RONY MURUGAN', + 'parti': 'PKR', + }, + 1769: { + 'KodN': 13, + 'KodParlimen': 151, + 'KodKawasan': 15127, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATUK ONN HAFIZ BIN GHAZI', + 'parti': 'BN', + }, + 1770: { + 'KodN': 13, + 'KodParlimen': 151, + 'KodKawasan': 15127, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD JUBRI BIN SELAMAT ', + 'parti': 'PAS', + }, + 1771: { + 'KodN': 13, + 'KodParlimen': 152, + 'KodKawasan': 152, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MUHAMMAD HASBULLAH BIN MD NAJIB', + 'parti': 'PAS', + }, + 1772: { + 'KodN': 13, + 'KodParlimen': 152, + 'KodKawasan': 152, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'GAN PING SIEU', + 'parti': 'BN', + }, + 1773: { + 'KodN': 13, + 'KodParlimen': 152, + 'KodKawasan': 152, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'WONG SHU QI', + 'parti': 'PKR', + }, + 1774: { + 'KodN': 13, + 'KodParlimen': 152, + 'KodKawasan': 15228, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'CHIN SIM LAI', + 'parti': 'BN', + }, + 1775: { + 'KodN': 13, + 'KodParlimen': 152, + 'KodKawasan': 15228, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'CHEW CHONG SIN', + 'parti': 'PKR', + }, + 1776: { + 'KodN': 13, + 'KodParlimen': 152, + 'KodKawasan': 15229, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MD JAIS BIN SARDAY', + 'parti': 'BN', + }, + 1777: { + 'KodN': 13, + 'KodParlimen': 152, + 'KodKawasan': 15229, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MUHAMMAD HASBULLAH BIN MD NAJIB', + 'parti': 'PAS', + }, + 1778: { + 'KodN': 13, + 'KodParlimen': 152, + 'KodKawasan': 15229, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MUHAMAD SAID BIN JONET', + 'parti': 'PKR', + }, + 1779: { + 'KodN': 13, + 'KodParlimen': 153, + 'KodKawasan': 153, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'HISHAMMUDDIN TUN HUSSEIN', + 'parti': 'BN', + }, + 1780: { + 'KodN': 13, + 'KodParlimen': 153, + 'KodKawasan': 153, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'ONN ABU BAKAR', + 'parti': 'PKR', + }, + 1781: { + 'KodN': 13, + 'KodParlimen': 153, + 'KodKawasan': 15330, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'TEOH YAP KUN', + 'parti': 'BN', + }, + 1782: { + 'KodN': 13, + 'KodParlimen': 153, + 'KodKawasan': 15330, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SHEIKH OMAR ALI', + 'parti': 'PKR', + }, + 1783: { + 'KodN': 13, + 'KodParlimen': 153, + 'KodKawasan': 15330, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'SHAMUGAM A/L MUNISAMY', + 'parti': 'BEBAS', + }, + 1784: { + 'KodN': 13, + 'KodParlimen': 153, + 'KodKawasan': 15331, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'VIDYANANTHAN A/L RAMANADHAN', + 'parti': 'BN', + }, + 1785: { + 'KodN': 13, + 'KodParlimen': 153, + 'KodKawasan': 15331, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'NOORLIHAN BINTI ARIFFIN', + 'parti': 'PKR', + }, + 1786: { + 'KodN': 13, + 'KodParlimen': 154, + 'KodKawasan': 154, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'ABD LATIFF BIN AHMAD', + 'parti': 'BN', + }, + 1787: { + 'KodN': 13, + 'KodParlimen': 154, + 'KodKawasan': 154, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'A. RAHMAN BIN A HAMID', + 'parti': 'PAS', + }, + 1788: { + 'KodN': 13, + 'KodParlimen': 154, + 'KodKawasan': 154, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MD NASIR BIN HASHIM', + 'parti': 'PKR', + }, + 1789: { + 'KodN': 13, + 'KodParlimen': 154, + 'KodKawasan': 15432, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ALWIYAH BINTI TALIB', + 'parti': 'BN', + }, + 1790: { + 'KodN': 13, + 'KodParlimen': 154, + 'KodKawasan': 15432, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ROSLAN BIN NIKMAT', + 'parti': 'PAS', + }, + 1791: { + 'KodN': 13, + 'KodParlimen': 154, + 'KodKawasan': 15432, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'NORUL HASZARUL BIN ABU SAMAH', + 'parti': 'PKR', + }, + 1792: { + 'KodN': 13, + 'KodParlimen': 154, + 'KodKawasan': 15433, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'RAVEN KUMAR A/L KRISHNASAMY', + 'parti': 'BN', + }, + 1793: { + 'KodN': 13, + 'KodParlimen': 154, + 'KodKawasan': 15433, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'A. RAHMAN BIN A HAMID', + 'parti': 'PAS', + }, + 1794: { + 'KodN': 13, + 'KodParlimen': 154, + 'KodKawasan': 15433, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'RAHAMIZON BINTI ABDUL GHANI', + 'parti': 'PKR', + }, + 1795: { + 'KodN': 13, + 'KodParlimen': 155, + 'KodKawasan': 155, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'ADHAM BIN BABA', + 'parti': 'BN', + }, + 1796: { + 'KodN': 13, + 'KodParlimen': 155, + 'KodKawasan': 155, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'NORJEPRI BIN MOHD JELANI', + 'parti': 'PKR', + }, + 1797: { + 'KodN': 13, + 'KodParlimen': 155, + 'KodKawasan': 155, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'YUHANITA BINTI YUNAN', + 'parti': 'PAS', + }, + 1798: { + 'KodN': 13, + 'KodParlimen': 155, + 'KodKawasan': 15534, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'JAWAHIR BINTI HUSEIN', + 'parti': 'PKR', + }, + 1799: { + 'KodN': 13, + 'KodParlimen': 155, + 'KodKawasan': 15534, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HAHASRIN BIN HASHIM', + 'parti': 'BN', + }, + 1800: { + 'KodN': 13, + 'KodParlimen': 155, + 'KodKawasan': 15534, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD NAZARI BIN MOKHTAR', + 'parti': 'PAS', + }, + 1801: { + 'KodN': 13, + 'KodParlimen': 155, + 'KodKawasan': 15535, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'RASHIDAH BINTI ISMAIL', + 'parti': 'BN', + }, + 1802: { + 'KodN': 13, + 'KodParlimen': 155, + 'KodKawasan': 15535, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ABRARY BIN RAMLY', + 'parti': 'PKR', + }, + 1803: { + 'KodN': 13, + 'KodParlimen': 155, + 'KodKawasan': 15535, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'BAHRIN BIN ALIAS', + 'parti': 'PAS', + }, + 1804: { + 'KodN': 13, + 'KodParlimen': 156, + 'KodKawasan': 156, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'HALIMAH BINTI MOHD SADIQUE', + 'parti': 'BN', + }, + 1805: { + 'KodN': 13, + 'KodParlimen': 156, + 'KodKawasan': 156, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'AZLINDA BINTI ABDUL LATIF', + 'parti': 'PKR', + }, + 1806: { + 'KodN': 13, + 'KodParlimen': 156, + 'KodKawasan': 15636, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ABD RAZAK BIN ISA', + 'parti': 'PKR', + }, + 1807: { + 'KodN': 13, + 'KodParlimen': 156, + 'KodKawasan': 15636, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'RASMAN BIN ITHNAIN', + 'parti': 'BN', + }, + 1808: { + 'KodN': 13, + 'KodParlimen': 156, + 'KodKawasan': 15637, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'NOR ASIDAH BINTI IBRAHIM', + 'parti': 'PKR', + }, + 1809: { + 'KodN': 13, + 'KodParlimen': 156, + 'KodKawasan': 15637, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ROSLELI BIN JAHARI', + 'parti': 'BN', + }, + 1810: { + 'KodN': 13, + 'KodParlimen': 156, + 'KodKawasan': 15637, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SITI ZAHARAH BINTI OTHMAN', + 'parti': 'PAS', + }, + 1811: { + 'KodN': 13, + 'KodParlimen': 157, + 'KodKawasan': 157, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': "DATO' SRI AZALINA BINTI DATO' OTHMAN SAID", + 'parti': 'BN', + }, + 1812: { + 'KodN': 13, + 'KodParlimen': 157, + 'KodKawasan': 157, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'NORLIZA BINTI NGADIRAN', + 'parti': 'PKR', + }, + 1813: { + 'KodN': 13, + 'KodParlimen': 157, + 'KodKawasan': 15738, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': "DATO 'SHARIFAH AZIZAH BINTI DATO' SYED ZAIN", + 'parti': 'BN', + }, + 1814: { + 'KodN': 13, + 'KodParlimen': 157, + 'KodKawasan': 15738, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'AHMAD KAMAH BIN NOR', + 'parti': 'PKR', + }, + 1815: { + 'KodN': 13, + 'KodParlimen': 157, + 'KodKawasan': 15739, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': "DATO' IR SYED SIS BIN A.RAHMAN", + 'parti': 'BN', + }, + 1816: { + 'KodN': 13, + 'KodParlimen': 157, + 'KodKawasan': 15739, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ZAMIL NAJWAH BIN ARBAAIN', + 'parti': 'PKR', + }, + 1817: { + 'KodN': 13, + 'KodParlimen': 158, + 'KodKawasan': 158, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'CHOONG SHIAU YOON', + 'parti': 'PKR', + }, + 1818: { + 'KodN': 13, + 'KodParlimen': 158, + 'KodKawasan': 158, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'HOU KOK CHUNG', + 'parti': 'BN', + }, + 1819: { + 'KodN': 13, + 'KodParlimen': 158, + 'KodKawasan': 158, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'ABDULLAH BIN HUSSIN', + 'parti': 'PAS', + }, + 1820: { + 'KodN': 13, + 'KodParlimen': 158, + 'KodKawasan': 15840, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'GOPALAKRISHNAN A/L SUBRAMANIAM', + 'parti': 'PKR', + }, + 1821: { + 'KodN': 13, + 'KodParlimen': 158, + 'KodKawasan': 15840, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AZMAN BIN ATMIN', + 'parti': 'PAS', + }, + 1822: { + 'KodN': 13, + 'KodParlimen': 158, + 'KodKawasan': 15840, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MAULIZAN BIN BUJANG', + 'parti': 'BN', + }, + 1823: { + 'KodN': 13, + 'KodParlimen': 158, + 'KodKawasan': 15841, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ABDUL AZIZ BIN TOHAK', + 'parti': 'BN', + }, + 1824: { + 'KodN': 13, + 'KodParlimen': 158, + 'KodKawasan': 15841, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MAZLAN BIN BUJANG', + 'parti': 'BERSATU', + }, + 1825: { + 'KodN': 13, + 'KodParlimen': 158, + 'KodKawasan': 15841, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'LIM YAK HONG', + 'parti': 'BEBAS', + }, + 1826: { + 'KodN': 13, + 'KodParlimen': 158, + 'KodKawasan': 15841, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'ABDULLAH BIN HUSSIN', + 'parti': 'PAS', + }, + 1827: { + 'KodN': 13, + 'KodParlimen': 158, + 'KodKawasan': 15841, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'TING CHOON CHAI', + 'parti': 'BEBAS', + }, + 1828: { + 'KodN': 13, + 'KodParlimen': 159, + 'KodKawasan': 159, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'AB. AZIZ BIN ABDULLAH', + 'parti': 'PAS', + }, + 1829: { + 'KodN': 13, + 'KodParlimen': 159, + 'KodKawasan': 159, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'MOHAMED KHALED NORDIN', + 'parti': 'BN', + }, + 1830: { + 'KodN': 13, + 'KodParlimen': 159, + 'KodKawasan': 159, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'CHEE JOCK', + 'parti': 'BEBAS', + }, + 1831: { + 'KodN': 13, + 'KodParlimen': 159, + 'KodKawasan': 159, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'HASSAN BIN ABDUL KARIM', + 'parti': 'PKR', + }, + 1832: { + 'KodN': 13, + 'KodParlimen': 159, + 'KodKawasan': 15942, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'TAN CHER PUK', + 'parti': 'BN', + }, + 1833: { + 'KodN': 13, + 'KodParlimen': 159, + 'KodKawasan': 15942, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'KUMUTHA A/P RAHMAN', + 'parti': 'PAS', + }, + 1834: { + 'KodN': 13, + 'KodParlimen': 159, + 'KodKawasan': 15942, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'LIOW CAI TUNG', + 'parti': 'DAP', + }, + 1835: { + 'KodN': 13, + 'KodParlimen': 159, + 'KodKawasan': 15943, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHAMED KHALED NORDIN', + 'parti': 'BN', + }, + 1836: { + 'KodN': 13, + 'KodParlimen': 159, + 'KodKawasan': 15943, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AB. AZIZ BIN ABDULLAH', + 'parti': 'PAS', + }, + 1837: { + 'KodN': 13, + 'KodParlimen': 159, + 'KodKawasan': 15943, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ROHANI BINTI YAACOB', + 'parti': 'BEBAS', + }, + 1838: { + 'KodN': 13, + 'KodParlimen': 159, + 'KodKawasan': 15943, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'CHE ZAKARIA BIN MOHD SALLEH', + 'parti': 'BERSATU', + }, + 1839: { + 'KodN': 13, + 'KodParlimen': 160, + 'KodKawasan': 160, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'SHAHRIR BIN ABDUL SAMAD', + 'parti': 'BN', + }, + 1840: { + 'KodN': 13, + 'KodParlimen': 160, + 'KodKawasan': 160, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'AKMAL NASIR', + 'parti': 'PKR', + }, + 1841: { + 'KodN': 13, + 'KodParlimen': 160, + 'KodKawasan': 16044, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'YAHYA BIN JAAFAR', + 'parti': 'BN', + }, + 1842: { + 'KodN': 13, + 'KodParlimen': 160, + 'KodKawasan': 16044, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD IZHAR BIN AHMAD', + 'parti': 'PKR', + }, + 1843: { + 'KodN': 13, + 'KodParlimen': 160, + 'KodKawasan': 16044, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ZAKIAH BINTI TUKIRIN', + 'parti': 'PAS', + }, + 1844: { + 'KodN': 13, + 'KodParlimen': 160, + 'KodKawasan': 16045, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ANG BOON HENG', + 'parti': 'BN', + }, + 1845: { + 'KodN': 13, + 'KodParlimen': 160, + 'KodKawasan': 16045, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ANDREW CHEN KAH ENG', + 'parti': 'PKR', + }, + 1846: { + 'KodN': 13, + 'KodParlimen': 161, + 'KodKawasan': 161, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'SALAHUDDIN BIN AYUB', + 'parti': 'PKR', + }, + 1847: { + 'KodN': 13, + 'KodParlimen': 161, + 'KodKawasan': 161, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'NUR JAZLAN BIN TAN SRI MOHAMED', + 'parti': 'BN', + }, + 1848: { + 'KodN': 13, + 'KodParlimen': 161, + 'KodKawasan': 161, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'MOHD MAZRI BIN YAHYA', + 'parti': 'PAS', + }, + 1849: { + 'KodN': 13, + 'KodParlimen': 161, + 'KodKawasan': 161, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'YAP KENG TAK', + 'parti': 'BEBAS', + }, + 1850: { + 'KodN': 13, + 'KodParlimen': 161, + 'KodKawasan': 16146, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'WONG YOU FONG', + 'parti': 'BN', + }, + 1851: { + 'KodN': 13, + 'KodParlimen': 161, + 'KodKawasan': 16146, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'CHEO YEE HOW', + 'parti': 'PKR', + }, + 1852: { + 'KodN': 13, + 'KodParlimen': 161, + 'KodKawasan': 16146, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD NAZRIN BIN IHSAN', + 'parti': 'PAS', + }, + 1853: { + 'KodN': 13, + 'KodParlimen': 161, + 'KodKawasan': 16147, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'RAMLEE BIN BOHANI', + 'parti': 'BN', + }, + 1854: { + 'KodN': 13, + 'KodParlimen': 161, + 'KodKawasan': 16147, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'OSMAN BIN SAPIAN', + 'parti': 'PKR', + }, + 1855: { + 'KodN': 13, + 'KodParlimen': 161, + 'KodKawasan': 16147, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DZULKIFLI BIN SULAIMAN', + 'parti': 'PAS', + }, + 1856: { + 'KodN': 13, + 'KodParlimen': 162, + 'KodKawasan': 162, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'JASON TEOH SEW HOCK', + 'parti': 'BN', + }, + 1857: { + 'KodN': 13, + 'KodParlimen': 162, + 'KodKawasan': 162, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'LIM KIT SIANG', + 'parti': 'PKR', + }, + 1858: { + 'KodN': 13, + 'KodParlimen': 162, + 'KodKawasan': 16248, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'S KANAN', + 'parti': 'BN', + }, + 1859: { + 'KodN': 13, + 'KodParlimen': 162, + 'KodKawasan': 16248, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'TAN HONG PIN', + 'parti': 'PKR', + }, + 1860: { + 'KodN': 13, + 'KodParlimen': 162, + 'KodKawasan': 16249, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHAMMAD KHAIRI BIN A.MALIK', + 'parti': 'BN', + }, + 1861: { + 'KodN': 13, + 'KodParlimen': 162, + 'KodKawasan': 16249, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DZULKEFLY AHMAD', + 'parti': 'PKR', + }, + 1862: { + 'KodN': 13, + 'KodParlimen': 162, + 'KodKawasan': 16249, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HJ SALLEHUDDIN BIN MOHD DAHIRAN', + 'parti': 'PAS', + }, + 1863: { + 'KodN': 13, + 'KodParlimen': 163, + 'KodKawasan': 163, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'TANG NAI SOON', + 'parti': 'BN', + }, + 1864: { + 'KodN': 13, + 'KodParlimen': 163, + 'KodKawasan': 163, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'JUWAHIR BIN AMIN', + 'parti': 'PAS', + }, + 1865: { + 'KodN': 13, + 'KodParlimen': 163, + 'KodKawasan': 163, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'TEO NIE CHING', + 'parti': 'PKR', + }, + 1866: { + 'KodN': 13, + 'KodParlimen': 163, + 'KodKawasan': 16350, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': "ABD AZIZ BIN JA'AFAR", + 'parti': 'PAS', + }, + 1867: { + 'KodN': 13, + 'KodParlimen': 163, + 'KodKawasan': 16350, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ALI MAZAT BIN SALLEH', + 'parti': 'BN', + }, + 1868: { + 'KodN': 13, + 'KodParlimen': 163, + 'KodKawasan': 16350, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'TOSRIN BIN JARVANTHI', + 'parti': 'PKR', + }, + 1869: { + 'KodN': 13, + 'KodParlimen': 163, + 'KodKawasan': 16351, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'JIMMY PUAH WEE TSE', + 'parti': 'PKR', + }, + 1870: { + 'KodN': 13, + 'KodParlimen': 163, + 'KodKawasan': 16351, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'TEO LEE HO', + 'parti': 'BN', + }, + 1871: { + 'KodN': 13, + 'KodParlimen': 163, + 'KodKawasan': 16351, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'JUWAHIR BIN AMIN', + 'parti': 'PAS', + }, + 1872: { + 'KodN': 13, + 'KodParlimen': 163, + 'KodKawasan': 16352, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'SHEN POH KUAN', + 'parti': 'BN', + }, + 1873: { + 'KodN': 13, + 'KodParlimen': 163, + 'KodKawasan': 16352, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'TEE BOON TSONG', + 'parti': 'PKR', + }, + 1874: { + 'KodN': 13, + 'KodParlimen': 164, + 'KodKawasan': 164, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'AHMAD BIN MASLAN', + 'parti': 'BN', + }, + 1875: { + 'KodN': 13, + 'KodParlimen': 164, + 'KodKawasan': 164, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'KARMAIN BIN SARDINI', + 'parti': 'BERSEKUTU', + }, + 1876: { + 'KodN': 13, + 'KodParlimen': 164, + 'KodKawasan': 164, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'BAHAROM BIN MOHAMAD', + 'parti': 'PAS', + }, + 1877: { + 'KodN': 13, + 'KodParlimen': 164, + 'KodKawasan': 16453, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HASNI BIN MOHAMMAD', + 'parti': 'BN', + }, + 1878: { + 'KodN': 13, + 'KodParlimen': 164, + 'KodKawasan': 16453, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ZULKIFLI BIN TASREP', + 'parti': 'PKR', + }, + 1879: { + 'KodN': 13, + 'KodParlimen': 164, + 'KodKawasan': 16453, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHD FIRDAUS BIN JAFFAR', + 'parti': 'PAS', + }, + 1880: { + 'KodN': 13, + 'KodParlimen': 164, + 'KodKawasan': 16454, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'TEE SIEW KIONG', + 'parti': 'BN', + }, + 1881: { + 'KodN': 13, + 'KodParlimen': 164, + 'KodKawasan': 16454, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'BAHAROM BIN MOHAMAD', + 'parti': 'PAS', + }, + 1882: { + 'KodN': 13, + 'KodParlimen': 164, + 'KodKawasan': 16454, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'TAQIUDDIN BIN CHE MAN', + 'parti': 'PKR', + }, + 1883: { + 'KodN': 13, + 'KodParlimen': 165, + 'KodKawasan': 165, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'WEE JECK SENG', + 'parti': 'BN', + }, + 1884: { + 'KodN': 13, + 'KodParlimen': 165, + 'KodKawasan': 165, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'NORDIN BIN OTHMAN', + 'parti': 'PAS', + }, + 1885: { + 'KodN': 13, + 'KodParlimen': 165, + 'KodKawasan': 165, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DR MD FARID BIN MD RAFIQ', + 'parti': 'PKR', + }, + 1886: { + 'KodN': 13, + 'KodParlimen': 165, + 'KodKawasan': 16555, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'TAN ENG MENG', + 'parti': 'BN', + }, + 1887: { + 'KodN': 13, + 'KodParlimen': 165, + 'KodKawasan': 16555, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'YEO TUNG SIONG', + 'parti': 'PKR', + }, + 1888: { + 'KodN': 13, + 'KodParlimen': 165, + 'KodKawasan': 16556, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'SUHAIZAN BIN KAYAT', + 'parti': 'PKR', + }, + 1889: { + 'KodN': 13, + 'KodParlimen': 165, + 'KodKawasan': 16556, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MD OTHMAN BIN YUSOF', + 'parti': 'BN', + }, + 1890: { + 'KodN': 13, + 'KodParlimen': 165, + 'KodKawasan': 16556, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'KARIM BIN DERAMAN ', + 'parti': 'PAS', + }, + 1891: { + 'KodN': 9, + 'KodParlimen': 166, + 'KodKawasan': 166, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'ROZMAN BIN ISLI', + 'parti': 'BN', + }, + 1892: { + 'KodN': 9, + 'KodParlimen': 166, + 'KodKawasan': 166, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'SITI ZALEHA S.W. IBRAHIM', + 'parti': 'PHRS', + }, + 1893: { + 'KodN': 9, + 'KodParlimen': 166, + 'KodKawasan': 166, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'AHMAD JUNID @ JUNIT BIN MOHD ALING @ ALING', + 'parti': 'PAS', + }, + 1894: { + 'KodN': 9, + 'KodParlimen': 166, + 'KodKawasan': 166, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'NOOR HALIM BIN ZAINI', + 'parti': 'WARISAN', + }, + 1895: { + 'KodN': 15, + 'KodParlimen': 167, + 'KodKawasan': 167, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DATUK ABDUL RAHIM BAKRI', + 'parti': 'BN', + }, + 1896: { + 'KodN': 15, + 'KodParlimen': 167, + 'KodKawasan': 167, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'MOHD ASHRAF CHIN ABDULLAH', + 'parti': 'PCS', + }, + 1897: { + 'KodN': 15, + 'KodParlimen': 167, + 'KodKawasan': 167, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'SH AZMAN BIN SH ALONG', + 'parti': 'WARISAN', + }, + 1898: { + 'KodN': 15, + 'KodParlimen': 167, + 'KodKawasan': 16701, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATUK ABDUL MIJUL BIN UNAINI', + 'parti': 'BN', + }, + 1899: { + 'KodN': 15, + 'KodParlimen': 167, + 'KodKawasan': 16701, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ABIDULA BIN AMSANA', + 'parti': 'PHRS', + }, + 1900: { + 'KodN': 15, + 'KodParlimen': 167, + 'KodKawasan': 16701, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOHAMMAD MOHARMIN', + 'parti': 'WARISAN', + }, + 1901: { + 'KodN': 15, + 'KodParlimen': 167, + 'KodKawasan': 16701, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'NORLAJI BIN AMIR HASSAN', + 'parti': 'STAR', + }, + 1902: { + 'KodN': 15, + 'KodParlimen': 167, + 'KodKawasan': 16701, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'ABDUL NASIR BIN JAMALUDDIN', + 'parti': 'PKS', + }, + 1903: { + 'KodN': 15, + 'KodParlimen': 167, + 'KodKawasan': 16701, + 'JenisKawasan': 'DUN', + 'susunan': 6, + 'NamaCalon': 'KUSUGAN BIN ALI ( PPRS )', + 'parti': 'BEBAS', + }, + 1904: { + 'KodN': 15, + 'KodParlimen': 167, + 'KodKawasan': 16702, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATUK SERI PANGLIMA TEO CHEE KANG', + 'parti': 'BN', + }, + 1905: { + 'KodN': 15, + 'KodParlimen': 167, + 'KodKawasan': 16702, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'TSEN CHOU YIN@THOMAS TSEN CHAU YIN', + 'parti': 'PCS', + }, + 1906: { + 'KodN': 15, + 'KodParlimen': 167, + 'KodKawasan': 16702, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'CHONG CHEN BIN', + 'parti': 'WARISAN', + }, + 1907: { + 'KodN': 15, + 'KodParlimen': 167, + 'KodKawasan': 16702, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'ALIASGAR BIN OMOLONG', + 'parti': 'PAS', + }, + 1908: { + 'KodN': 15, + 'KodParlimen': 167, + 'KodKawasan': 16702, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'ALLAIDLY BINTI POYON (PPRS)', + 'parti': 'BEBAS', + }, + 1909: { + 'KodN': 15, + 'KodParlimen': 167, + 'KodKawasan': 16703, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DAUSIEH BINTI QUECK @ PARAMAN', + 'parti': 'PAS', + }, + 1910: { + 'KodN': 15, + 'KodParlimen': 167, + 'KodKawasan': 16703, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATUK BOLKIAH BIN ISMAIL', + 'parti': 'BN', + }, + 1911: { + 'KodN': 15, + 'KodParlimen': 167, + 'KodKawasan': 16703, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'PRANSOL TIYING ( ANAK NEGERI )', + 'parti': 'BEBAS', + }, + 1912: { + 'KodN': 15, + 'KodParlimen': 167, + 'KodKawasan': 16703, + 'JenisKawasan': 'DUN', + 'susunan': 7, + 'NamaCalon': 'BAKIR BIN MANCAING', + 'parti': 'BEBAS', + }, + 1913: { + 'KodN': 15, + 'KodParlimen': 167, + 'KodKawasan': 16703, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'RAMLAH BINTI NASIR', + 'parti': 'PKS', + }, + 1914: { + 'KodN': 15, + 'KodParlimen': 167, + 'KodKawasan': 16703, + 'JenisKawasan': 'DUN', + 'susunan': 6, + 'NamaCalon': 'MAKLIN BIN MASIAU', + 'parti': 'WARISAN', + }, + 1915: { + 'KodN': 15, + 'KodParlimen': 168, + 'KodKawasan': 168, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DSP DR MAXIMUS J.ONGKILI', + 'parti': 'BN', + }, + 1916: { + 'KodN': 15, + 'KodParlimen': 168, + 'KodKawasan': 168, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'DR PAUL PORODONG', + 'parti': 'PCS', + }, + 1917: { + 'KodN': 15, + 'KodParlimen': 168, + 'KodKawasan': 168, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DATUK MAIJOL MAHAP', + 'parti': 'PKR', + }, + 1918: { + 'KodN': 15, + 'KodParlimen': 168, + 'KodKawasan': 168, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'BARLUS MANGABIS', + 'parti': 'WARISAN', + }, + 1919: { + 'KodN': 15, + 'KodParlimen': 168, + 'KodKawasan': 16804, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'JULITA MOJUNGKI', + 'parti': 'BN', + }, + 1920: { + 'KodN': 15, + 'KodParlimen': 168, + 'KodKawasan': 16804, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'JORNAH MOZIHIM', + 'parti': 'PCS', + }, + 1921: { + 'KodN': 15, + 'KodParlimen': 168, + 'KodKawasan': 16804, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'SAZALYE DONOL ABDULLAH', + 'parti': 'PKR', + }, + 1922: { + 'KodN': 15, + 'KodParlimen': 168, + 'KodKawasan': 16804, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MARUNSAI DAWAI', + 'parti': 'STAR', + }, + 1923: { + 'KodN': 15, + 'KodParlimen': 168, + 'KodKawasan': 16804, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'RAHIM MADHAKONG', + 'parti': 'PKS', + }, + 1924: { + 'KodN': 15, + 'KodParlimen': 168, + 'KodKawasan': 16805, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATUK ANITA BARANTING', + 'parti': 'BN', + }, + 1925: { + 'KodN': 15, + 'KodParlimen': 168, + 'KodKawasan': 16805, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATO BAINTIN ADUN', + 'parti': 'WARISAN', + }, + 1926: { + 'KodN': 15, + 'KodParlimen': 168, + 'KodKawasan': 16805, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'JOEL MASILUNG', + 'parti': 'STAR', + }, + 1927: { + 'KodN': 15, + 'KodParlimen': 168, + 'KodKawasan': 16805, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'JOHNSON GABAN', + 'parti': 'PCS', + }, + 1928: { + 'KodN': 15, + 'KodParlimen': 169, + 'KodKawasan': 169, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'LAIMAN BIN IKIN @ AG LAIMAN B. KAKIMIN', + 'parti': 'PAS', + }, + 1929: { + 'KodN': 15, + 'KodParlimen': 169, + 'KodKawasan': 169, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DATUK SERI PANGLIMA MD SALLEH TUN SAID', + 'parti': 'BN', + }, + 1930: { + 'KodN': 15, + 'KodParlimen': 169, + 'KodKawasan': 169, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'MIASIN @ AIMADUDDIN BIN MION', + 'parti': 'PHRS', + }, + 1931: { + 'KodN': 15, + 'KodParlimen': 169, + 'KodKawasan': 169, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'ISNARAISAH MUNIRAH BINTI MAJILIS @ FAKHARUDY', + 'parti': 'WARISAN', + }, + 1932: { + 'KodN': 15, + 'KodParlimen': 169, + 'KodKawasan': 16906, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SUWAH BIN BULLEH', + 'parti': 'STAR', + }, + 1933: { + 'KodN': 15, + 'KodParlimen': 169, + 'KodKawasan': 16906, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MUSTAQIM BIN ALING', + 'parti': 'PAS', + }, + 1934: { + 'KodN': 15, + 'KodParlimen': 169, + 'KodKawasan': 16906, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DATUK HJ. MUSBAH BIN HJ. JAMLI', + 'parti': 'BN', + }, + 1935: { + 'KodN': 15, + 'KodParlimen': 169, + 'KodKawasan': 16906, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'MUSTAPHA @ MOHD YUNUS BIN SAKMUD', + 'parti': 'PKR', + }, + 1936: { + 'KodN': 15, + 'KodParlimen': 169, + 'KodKawasan': 16907, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MAIL BIN BALINU', + 'parti': 'PCS', + }, + 1937: { + 'KodN': 15, + 'KodParlimen': 169, + 'KodKawasan': 16907, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'RUBIN GURIBAH', + 'parti': 'STAR', + }, + 1938: { + 'KodN': 15, + 'KodParlimen': 169, + 'KodKawasan': 16907, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'LUKIAH BINTI INDAN', + 'parti': 'PKR', + }, + 1939: { + 'KodN': 15, + 'KodParlimen': 169, + 'KodKawasan': 16907, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'SATAIL BIN MAJUNGKAT', + 'parti': 'PAS', + }, + 1940: { + 'KodN': 15, + 'KodParlimen': 169, + 'KodKawasan': 16907, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'EWON BENEDICK', + 'parti': 'BN', + }, + 1941: { + 'KodN': 15, + 'KodParlimen': 169, + 'KodKawasan': 16908, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'AMSOR BIN TUAH', + 'parti': 'BEBAS', + }, + 1942: { + 'KodN': 15, + 'KodParlimen': 169, + 'KodKawasan': 16908, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATUK JAPLIN BIN AKIM @ ABD HAMID', + 'parti': 'BN', + }, + 1943: { + 'KodN': 15, + 'KodParlimen': 169, + 'KodKawasan': 16908, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ABD BATHRIN @ ABD BAHKRIN BIN MOHD YUSOF', + 'parti': 'WARISAN', + }, + 1944: { + 'KodN': 15, + 'KodParlimen': 169, + 'KodKawasan': 16908, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'ADZMIN BIN AWANG', + 'parti': 'PAS', + }, + 1945: { + 'KodN': 15, + 'KodParlimen': 170, + 'KodKawasan': 170, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MADIUS BIN TANGAU', + 'parti': 'BN', + }, + 1946: { + 'KodN': 15, + 'KodParlimen': 170, + 'KodKawasan': 170, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'CHRISNADIA BINTI SINAM', + 'parti': 'PKR', + }, + 1947: { + 'KodN': 15, + 'KodParlimen': 170, + 'KodKawasan': 170, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'SYRA PETER @ P GOM', + 'parti': 'PHRS', + }, + 1948: { + 'KodN': 15, + 'KodParlimen': 170, + 'KodKawasan': 170, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'KALAKAU @ KALAKAN BIN UNTOL @ ENTOL', + 'parti': 'PCS', + }, + 1949: { + 'KodN': 15, + 'KodParlimen': 170, + 'KodKawasan': 170, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 5, + 'NamaCalon': 'PAUMIN @ MOHD AMINUDDIN BIN ALING', + 'parti': 'PAS', + }, + 1950: { + 'KodN': 15, + 'KodParlimen': 170, + 'KodKawasan': 17009, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'SAMIN @ JASMIN BIN DULIN', + 'parti': 'STAR', + }, + 1951: { + 'KodN': 15, + 'KodParlimen': 170, + 'KodKawasan': 17009, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'JAHID @ NOORDIN BIN JAHIM', + 'parti': 'BN', + }, + 1952: { + 'KodN': 15, + 'KodParlimen': 170, + 'KodKawasan': 17009, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DAUSIL BIN KUNDAYONG', + 'parti': 'PKR', + }, + 1953: { + 'KodN': 15, + 'KodParlimen': 170, + 'KodKawasan': 17009, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MOJILIP BIN BUMBURING @ WILFRED', + 'parti': 'PCS', + }, + 1954: { + 'KodN': 15, + 'KodParlimen': 170, + 'KodKawasan': 17010, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'HAJIJI BIN HAJI NOOR', + 'parti': 'BN', + }, + 1955: { + 'KodN': 15, + 'KodParlimen': 170, + 'KodKawasan': 17010, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ABDULLAH SANI BIN DAUD', + 'parti': 'WARISAN', + }, + 1956: { + 'KodN': 15, + 'KodParlimen': 170, + 'KodKawasan': 17010, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ARIFIN BIN HARITH', + 'parti': 'PHRS', + }, + 1957: { + 'KodN': 15, + 'KodParlimen': 170, + 'KodKawasan': 17011, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'JONISTON BIN LUMAI @ BANGKUAI', + 'parti': 'BN', + }, + 1958: { + 'KodN': 15, + 'KodParlimen': 170, + 'KodKawasan': 17011, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'JO-ANNA SUE HENLEY RAMPAS', + 'parti': 'WARISAN', + }, + 1959: { + 'KodN': 15, + 'KodParlimen': 170, + 'KodKawasan': 17011, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'GAIBIN BIN RANSOI', + 'parti': 'PCS', + }, + 1960: { + 'KodN': 15, + 'KodParlimen': 170, + 'KodKawasan': 17011, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'TERENCE SINTI', + 'parti': 'STAR', + }, + 1961: { + 'KodN': 15, + 'KodParlimen': 171, + 'KodKawasan': 171, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'JEFFRY KUMIN', + 'parti': 'SAPP', + }, + 1962: { + 'KodN': 15, + 'KodParlimen': 171, + 'KodKawasan': 171, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'ROBERT SOPINING', + 'parti': 'PCS', + }, + 1963: { + 'KodN': 15, + 'KodParlimen': 171, + 'KodKawasan': 171, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'ABDUL RAHMAN BIN DAHLAN', + 'parti': 'BN', + }, + 1964: { + 'KodN': 15, + 'KodParlimen': 171, + 'KodKawasan': 171, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'AZIS JAMMAN', + 'parti': 'WARISAN', + }, + 1965: { + 'KodN': 15, + 'KodParlimen': 171, + 'KodKawasan': 17112, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'AZHAR MATUSSIN', + 'parti': 'WARISAN', + }, + 1966: { + 'KodN': 15, + 'KodParlimen': 171, + 'KodKawasan': 17112, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'JAINAB DSP AHMAD AYID', + 'parti': 'BN', + }, + 1967: { + 'KodN': 15, + 'KodParlimen': 171, + 'KodKawasan': 17112, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ASPAR BIN OYET @ AKBAR', + 'parti': 'PAS', + }, + 1968: { + 'KodN': 15, + 'KodParlimen': 171, + 'KodKawasan': 17112, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'ASHIM JAMAT', + 'parti': 'SAPP', + }, + 1969: { + 'KodN': 15, + 'KodParlimen': 171, + 'KodKawasan': 17113, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'JAKARIAH JANIT', + 'parti': 'PKS', + }, + 1970: { + 'KodN': 15, + 'KodParlimen': 171, + 'KodKawasan': 17113, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'JOHNNY GOH CHIN LOK', + 'parti': 'BN', + }, + 1971: { + 'KodN': 15, + 'KodParlimen': 171, + 'KodKawasan': 17113, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SITUL MINTOW', + 'parti': 'BEBAS', + }, + 1972: { + 'KodN': 15, + 'KodParlimen': 171, + 'KodKawasan': 17113, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'TERENCE TSEN KIM FATT', + 'parti': 'PKAN', + }, + 1973: { + 'KodN': 15, + 'KodParlimen': 171, + 'KodKawasan': 17113, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'KENNY CHUA TECK HO', + 'parti': 'PKR', + }, + 1974: { + 'KodN': 15, + 'KodParlimen': 171, + 'KodKawasan': 17113, + 'JenisKawasan': 'DUN', + 'susunan': 6, + 'NamaCalon': 'JOHN STEPHEN DIONYSIUS', + 'parti': 'SAPP', + }, + 1975: { + 'KodN': 15, + 'KodParlimen': 172, + 'KodKawasan': 172, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'LEE HAN KYUN @ JOSEPH LEE', + 'parti': 'BN', + }, + 1976: { + 'KodN': 15, + 'KodParlimen': 172, + 'KodKawasan': 172, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'YONG TECK LEE', + 'parti': 'SAPP', + }, + 1977: { + 'KodN': 15, + 'KodParlimen': 172, + 'KodKawasan': 172, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'CHAN FOONG HIN', + 'parti': 'DAP', + }, + 1978: { + 'KodN': 15, + 'KodParlimen': 172, + 'KodKawasan': 17214, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'CHIN SHU YING', + 'parti': 'BN', + }, + 1979: { + 'KodN': 15, + 'KodParlimen': 172, + 'KodKawasan': 17214, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'YONG WE KONG', + 'parti': 'SAPP', + }, + 1980: { + 'KodN': 15, + 'KodParlimen': 172, + 'KodKawasan': 17214, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'TAN LEE FATT', + 'parti': 'DAP', + }, + 1981: { + 'KodN': 15, + 'KodParlimen': 172, + 'KodKawasan': 17215, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'YEE MOH CHAI', + 'parti': 'BN', + }, + 1982: { + 'KodN': 15, + 'KodParlimen': 172, + 'KodKawasan': 17215, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'CHAN CHEE CHING', + 'parti': 'BEBAS', + }, + 1983: { + 'KodN': 15, + 'KodParlimen': 172, + 'KodKawasan': 17215, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'LEN LIP FONG @ LAND LIP FONG', + 'parti': 'PKAN', + }, + 1984: { + 'KodN': 15, + 'KodParlimen': 172, + 'KodKawasan': 17215, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'LIEW CHIN JIN', + 'parti': 'PKR', + }, + 1985: { + 'KodN': 15, + 'KodParlimen': 172, + 'KodKawasan': 17215, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'LIM KAT CHUNG', + 'parti': 'SAPP', + }, + 1986: { + 'KodN': 15, + 'KodParlimen': 172, + 'KodKawasan': 17216, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'PAMELA YONG', + 'parti': 'BN', + }, + 1987: { + 'KodN': 15, + 'KodParlimen': 172, + 'KodKawasan': 17216, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'GEE TIEN SIONG', + 'parti': 'SAPP', + }, + 1988: { + 'KodN': 15, + 'KodParlimen': 172, + 'KodKawasan': 17216, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'PHOONG JIN ZHE', + 'parti': 'DAP', + }, + 1989: { + 'KodN': 15, + 'KodParlimen': 173, + 'KodKawasan': 173, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'marcus m mojigoh', + 'parti': 'BN', + }, + 1990: { + 'KodN': 15, + 'KodParlimen': 173, + 'KodKawasan': 173, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'awang husaini bin sahari', + 'parti': 'PKR', + }, + 1991: { + 'KodN': 15, + 'KodParlimen': 173, + 'KodKawasan': 173, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'mil kusin bin abdillah', + 'parti': 'PKAN', + }, + 1992: { + 'KodN': 15, + 'KodParlimen': 173, + 'KodKawasan': 173, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'jivol@edmund bin poupolin', + 'parti': 'PHRS', + }, + 1993: { + 'KodN': 15, + 'KodParlimen': 173, + 'KodKawasan': 173, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 5, + 'NamaCalon': 'zulzaim hilmee bin abidin', + 'parti': 'PAS', + }, + 1994: { + 'KodN': 15, + 'KodParlimen': 173, + 'KodKawasan': 17317, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'edward yong oui fah', + 'parti': 'BN', + }, + 1995: { + 'KodN': 15, + 'KodParlimen': 173, + 'KodKawasan': 17317, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'chong wei leung', + 'parti': 'PKAN', + }, + 1996: { + 'KodN': 15, + 'KodParlimen': 173, + 'KodKawasan': 17317, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'noraiza binti hj mohammad noor', + 'parti': 'PHRS', + }, + 1997: { + 'KodN': 15, + 'KodParlimen': 173, + 'KodKawasan': 17317, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'hamid bin ismail', + 'parti': 'PAS', + }, + 1998: { + 'KodN': 15, + 'KodParlimen': 173, + 'KodKawasan': 17317, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'wong hong junz', + 'parti': 'WARISAN', + }, + 1999: { + 'KodN': 15, + 'KodParlimen': 173, + 'KodKawasan': 17318, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'yahya hussin', + 'parti': 'BN', + }, + 2000: { + 'KodN': 15, + 'KodParlimen': 173, + 'KodKawasan': 17318, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ester otion', + 'parti': 'PHRS', + }, + 2001: { + 'KodN': 15, + 'KodParlimen': 173, + 'KodKawasan': 17318, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'uda bin sulai', + 'parti': 'WARISAN', + }, + 2002: { + 'KodN': 15, + 'KodParlimen': 174, + 'KodKawasan': 174, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'CEASER MANDELA MALAKUN', + 'parti': 'BN', + }, + 2003: { + 'KodN': 15, + 'KodParlimen': 174, + 'KodKawasan': 174, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'EDWIN @ JACK BOSI', + 'parti': 'PKAN', + }, + 2004: { + 'KodN': 15, + 'KodParlimen': 174, + 'KodKawasan': 174, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'CLEFTUS STEPHEN SPINE', + 'parti': 'STAR', + }, + 2005: { + 'KodN': 15, + 'KodParlimen': 174, + 'KodKawasan': 174, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'IGNATIUS DARELL LEIKING', + 'parti': 'WARISAN', + }, + 2006: { + 'KodN': 15, + 'KodParlimen': 174, + 'KodKawasan': 17419, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'GOH FAH SHUN', + 'parti': 'BN', + }, + 2007: { + 'KodN': 15, + 'KodParlimen': 174, + 'KodKawasan': 17419, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'CHONG PIT FAH', + 'parti': 'STAR', + }, + 2008: { + 'KodN': 15, + 'KodParlimen': 174, + 'KodKawasan': 17419, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'JANNIE LASIMBANG', + 'parti': 'DAP', + }, + 2009: { + 'KodN': 15, + 'KodParlimen': 174, + 'KodKawasan': 17420, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'BANDASAN @ DIONISIUS DENNIS J TUNDING', + 'parti': 'PCS', + }, + 2010: { + 'KodN': 15, + 'KodParlimen': 174, + 'KodKawasan': 17420, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DONALD PETER MAJUNTIN', + 'parti': 'BN', + }, + 2011: { + 'KodN': 15, + 'KodParlimen': 174, + 'KodKawasan': 17420, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'JENIFER LASIMBANG', + 'parti': 'WARISAN', + }, + 2012: { + 'KodN': 15, + 'KodParlimen': 174, + 'KodKawasan': 17420, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'DANIM @ ALOYSIUS SIAP', + 'parti': 'STAR', + }, + 2013: { + 'KodN': 15, + 'KodParlimen': 175, + 'KodKawasan': 175, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DATUK ROSNAH BINTI HJ ABD RASHID SHIRLIN', + 'parti': 'BN', + }, + 2014: { + 'KodN': 15, + 'KodParlimen': 175, + 'KodKawasan': 175, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'AHMAD BIN HASSAN', + 'parti': 'WARISAN', + }, + 2015: { + 'KodN': 15, + 'KodParlimen': 175, + 'KodKawasan': 175, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'JAMIL BIN WILLIAM CORE', + 'parti': 'STAR', + }, + 2016: { + 'KodN': 15, + 'KodParlimen': 175, + 'KodKawasan': 175, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'ELBEAT BIN SIKUIL', + 'parti': 'PCS', + }, + 2017: { + 'KodN': 15, + 'KodParlimen': 175, + 'KodKawasan': 17521, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MATLIN BIN JILON', + 'parti': 'PKS', + }, + 2018: { + 'KodN': 15, + 'KodParlimen': 175, + 'KodKawasan': 17521, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATUK GHULAMHAIDAR@YUSOF BIN KHAN', + 'parti': 'BN', + }, + 2019: { + 'KodN': 15, + 'KodParlimen': 175, + 'KodKawasan': 17521, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': ' SALLEH IDRIS', + 'parti': 'WARISAN', + }, + 2020: { + 'KodN': 15, + 'KodParlimen': 175, + 'KodKawasan': 17521, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'WAHID @HARITH BIN ISMAIL', + 'parti': 'PKAN', + }, + 2021: { + 'KodN': 15, + 'KodParlimen': 175, + 'KodKawasan': 17522, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATUK SERI PANGLIMA HJ ABDUL RAHIM ISMAIL', + 'parti': 'BN', + }, + 2022: { + 'KodN': 15, + 'KodParlimen': 175, + 'KodKawasan': 17522, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'DATUK HAIDI BIN MOKTHAR', + 'parti': 'WARISAN', + }, + 2023: { + 'KodN': 15, + 'KodParlimen': 175, + 'KodKawasan': 17522, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'JAWASING BIN MAINUS@HERMAN I MIANAS', + 'parti': 'PCS', + }, + 2024: { + 'KodN': 15, + 'KodParlimen': 175, + 'KodKawasan': 17522, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DATUK JAMES @ EBI GHANI', + 'parti': 'PKS', + }, + 2025: { + 'KodN': 15, + 'KodParlimen': 176, + 'KodKawasan': 176, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'ANIFAH AMAN', + 'parti': 'BN', + }, + 2026: { + 'KodN': 15, + 'KodParlimen': 176, + 'KodKawasan': 176, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'JAAFAR BIN ISMAIL', + 'parti': 'PHRS', + }, + 2027: { + 'KodN': 15, + 'KodParlimen': 176, + 'KodKawasan': 176, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'KARIM BIN BUJANG', + 'parti': 'WARISAN', + }, + 2028: { + 'KodN': 15, + 'KodParlimen': 176, + 'KodKawasan': 17623, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATUK MOHAMAD BIN ALAMIN', + 'parti': 'BN', + }, + 2029: { + 'KodN': 15, + 'KodParlimen': 176, + 'KodKawasan': 17623, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DAUD BIN YUSOF', + 'parti': 'WARISAN', + }, + 2030: { + 'KodN': 15, + 'KodParlimen': 176, + 'KodKawasan': 17623, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'JAAFAR BIN ISMAIL', + 'parti': 'PHRS', + }, + 2031: { + 'KodN': 15, + 'KodParlimen': 176, + 'KodKawasan': 17624, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ROSJELEN BINTI SALIMAT', + 'parti': 'PCS', + }, + 2032: { + 'KodN': 15, + 'KodParlimen': 176, + 'KodKawasan': 17624, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MOHD ARIFIN BIN MOHD ARIF', + 'parti': 'BN', + }, + 2033: { + 'KodN': 15, + 'KodParlimen': 176, + 'KodKawasan': 17624, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ALI OMAR BIN MOHD IDRIS', + 'parti': 'PHRS', + }, + 2034: { + 'KodN': 15, + 'KodParlimen': 176, + 'KodKawasan': 17624, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'HAJI YAHYA BIN AHMAD', + 'parti': 'BEBAS', + }, + 2035: { + 'KodN': 15, + 'KodParlimen': 176, + 'KodKawasan': 17624, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'ABD SANI BIN MARIP @ MARIF', + 'parti': 'WARISAN', + }, + 2036: { + 'KodN': 15, + 'KodParlimen': 177, + 'KodKawasan': 177, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DATUK HJH AZIZAH DSP MOHD DUN', + 'parti': 'BN', + }, + 2037: { + 'KodN': 15, + 'KodParlimen': 177, + 'KodKawasan': 177, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DATUK JOHN GHANI', + 'parti': 'PKR', + }, + 2038: { + 'KodN': 15, + 'KodParlimen': 177, + 'KodKawasan': 177, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'DSP HJ LAJIM UKIN', + 'parti': 'PHRS', + }, + 2039: { + 'KodN': 15, + 'KodParlimen': 177, + 'KodKawasan': 17725, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATUK ISNIN BIN ALIASNIH ', + 'parti': 'BN', + }, + 2040: { + 'KodN': 15, + 'KodParlimen': 177, + 'KodKawasan': 17725, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HJH JOHAIR MATLANI', + 'parti': 'WARISAN', + }, + 2041: { + 'KodN': 15, + 'KodParlimen': 177, + 'KodKawasan': 17725, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DSP HJ LAJIM BIN UKIN', + 'parti': 'PHRS', + }, + 2042: { + 'KodN': 15, + 'KodParlimen': 177, + 'KodKawasan': 17726, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'LIMUS BIN JURI', + 'parti': 'BN', + }, + 2043: { + 'KodN': 15, + 'KodParlimen': 177, + 'KodKawasan': 17726, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'EN JONAS SUNGGIM', + 'parti': 'PHRS', + }, + 2044: { + 'KodN': 15, + 'KodParlimen': 177, + 'KodKawasan': 17726, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'EN DIKIN HJ MUSAH', + 'parti': 'PKR', + }, + 2045: { + 'KodN': 15, + 'KodParlimen': 177, + 'KodKawasan': 17726, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DATUK HERMAN TIONGSUH', + 'parti': 'PCS', + }, + 2046: { + 'KodN': 15, + 'KodParlimen': 178, + 'KodKawasan': 178, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'YAMANI HAFEZ BIN MUSA', + 'parti': 'BN', + }, + 2047: { + 'KodN': 15, + 'KodParlimen': 178, + 'KodKawasan': 178, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'NOOR HAYATY BINTI MUSTAPHA', + 'parti': 'BEBAS', + }, + 2048: { + 'KodN': 15, + 'KodParlimen': 178, + 'KodKawasan': 178, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DAYANG AEZZY BINTI LIMAN', + 'parti': 'BEBAS', + }, + 2049: { + 'KodN': 15, + 'KodParlimen': 178, + 'KodKawasan': 17827, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MATBALI BIN MUSAH', + 'parti': 'BN', + }, + 2050: { + 'KodN': 15, + 'KodParlimen': 178, + 'KodKawasan': 17827, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MD SAMLIH BIN JUAISIN', + 'parti': 'WARISAN', + }, + 2051: { + 'KodN': 15, + 'KodParlimen': 178, + 'KodKawasan': 17827, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ASMAT BIN JAPAR', + 'parti': 'PHRS', + }, + 2052: { + 'KodN': 15, + 'KodParlimen': 178, + 'KodKawasan': 17828, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SAPAWI BIN AMAT WASLI@AHMAD', + 'parti': 'BN', + }, + 2053: { + 'KodN': 15, + 'KodParlimen': 178, + 'KodKawasan': 17828, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'YUSOF@JOSREE BIN YACOB', + 'parti': 'BEBAS', + }, + 2054: { + 'KodN': 15, + 'KodParlimen': 178, + 'KodKawasan': 17828, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'PATRICK SADOM', + 'parti': 'BEBAS', + }, + 2055: { + 'KodN': 15, + 'KodParlimen': 179, + 'KodKawasan': 179, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'EWON BIN EBIN', + 'parti': 'BN', + }, + 2056: { + 'KodN': 15, + 'KodParlimen': 179, + 'KodKawasan': 179, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'JONATHAN YASIN', + 'parti': 'PKR', + }, + 2057: { + 'KodN': 15, + 'KodParlimen': 179, + 'KodKawasan': 179, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'ANDAU BIN YASUN @ BRUNO', + 'parti': 'PCS', + }, + 2058: { + 'KodN': 15, + 'KodParlimen': 179, + 'KodKawasan': 17929, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'JOACHIM GUNSALAM', + 'parti': 'BN', + }, + 2059: { + 'KodN': 15, + 'KodParlimen': 179, + 'KodKawasan': 17929, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'JAPIRIL SUHAIMIN', + 'parti': 'STAR', + }, + 2060: { + 'KodN': 15, + 'KodParlimen': 179, + 'KodKawasan': 17929, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'JINUS SODIONG', + 'parti': 'PKS', + }, + 2061: { + 'KodN': 15, + 'KodParlimen': 179, + 'KodKawasan': 17929, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'HENRYNUS AMIN', + 'parti': 'PKAN', + }, + 2062: { + 'KodN': 15, + 'KodParlimen': 179, + 'KodKawasan': 17930, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AMAN @ AZMAN MANAF', + 'parti': 'STAR', + }, + 2063: { + 'KodN': 15, + 'KodParlimen': 179, + 'KodKawasan': 17930, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MASIDI MANJUN @ MASDI', + 'parti': 'BN', + }, + 2064: { + 'KodN': 15, + 'KodParlimen': 179, + 'KodKawasan': 17930, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'CHONG PECK HING@CHONG POH SING', + 'parti': 'PKR', + }, + 2065: { + 'KodN': 15, + 'KodParlimen': 179, + 'KodKawasan': 17930, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'JUHAILI SIDEK', + 'parti': 'PKAN', + }, + 2066: { + 'KodN': 15, + 'KodParlimen': 179, + 'KodKawasan': 17931, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ABIDIN MADINGKIR', + 'parti': 'BN', + }, + 2067: { + 'KodN': 15, + 'KodParlimen': 179, + 'KodKawasan': 17931, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'PEDDRIN @ FEDDRIN TUUANG @ TULING', + 'parti': 'STAR', + }, + 2068: { + 'KodN': 15, + 'KodParlimen': 179, + 'KodKawasan': 17931, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'JULIAN @ PAUL SIDIN', + 'parti': 'WARISAN', + }, + 2069: { + 'KodN': 15, + 'KodParlimen': 179, + 'KodKawasan': 17931, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'MAT JAILI BIN SAMAT', + 'parti': 'PRS', + }, + 2070: { + 'KodN': 15, + 'KodParlimen': 179, + 'KodKawasan': 17931, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'SATIOL BIN INDONG', + 'parti': 'PCS', + }, + 2071: { + 'KodN': 15, + 'KodParlimen': 180, + 'KodKawasan': 180, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'JIUS BIN AWANG', + 'parti': 'PCS', + }, + 2072: { + 'KodN': 15, + 'KodParlimen': 180, + 'KodKawasan': 180, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'MAIMIN BIN RIJAN@JEFFRUS RIJAN', + 'parti': 'BEBAS', + }, + 2073: { + 'KodN': 15, + 'KodParlimen': 180, + 'KodKawasan': 180, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'DATUK DANIEL KINSIK', + 'parti': 'BN', + }, + 2074: { + 'KodN': 15, + 'KodParlimen': 180, + 'KodKawasan': 180, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'DATUK JUSTIN GUKA', + 'parti': 'BEBAS', + }, + 2075: { + 'KodN': 15, + 'KodParlimen': 180, + 'KodKawasan': 180, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 5, + 'NamaCalon': 'JAKE NOINTIN', + 'parti': 'WARISAN', + }, + 2076: { + 'KodN': 15, + 'KodParlimen': 180, + 'KodKawasan': 18032, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'JUSTIN BIN ALIP', + 'parti': 'WARISAN', + }, + 2077: { + 'KodN': 15, + 'KodParlimen': 180, + 'KodKawasan': 18032, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DATUK DR JEFFREY KITINGAN', + 'parti': 'STAR', + }, + 2078: { + 'KodN': 15, + 'KodParlimen': 180, + 'KodKawasan': 18032, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'NESTOR BIN JOANNES', + 'parti': 'PCS', + }, + 2079: { + 'KodN': 15, + 'KodParlimen': 180, + 'KodKawasan': 18032, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'JOSEPH PAIRIN KITINGAN', + 'parti': 'BN', + }, + 2080: { + 'KodN': 15, + 'KodParlimen': 180, + 'KodKawasan': 18033, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'PETER JINO ALLION', + 'parti': 'BN', + }, + 2081: { + 'KodN': 15, + 'KodParlimen': 180, + 'KodKawasan': 18033, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATUK JUSTIN GUKA', + 'parti': 'BEBAS', + }, + 2082: { + 'KodN': 15, + 'KodParlimen': 180, + 'KodKawasan': 18033, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ROBERT TAWIK', + 'parti': 'STAR', + }, + 2083: { + 'KodN': 15, + 'KodParlimen': 180, + 'KodKawasan': 18033, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'PETER SAILT', + 'parti': 'DAP', + }, + 2084: { + 'KodN': 15, + 'KodParlimen': 180, + 'KodKawasan': 18033, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'THOMAS ANGGAN', + 'parti': 'PKS', + }, + 2085: { + 'KodN': 15, + 'KodParlimen': 180, + 'KodKawasan': 18033, + 'JenisKawasan': 'DUN', + 'susunan': 6, + 'NamaCalon': 'DR AISAT ELLIK BIN IGAU@OSWOLD IGGAN', + 'parti': 'PKAN', + }, + 2086: { + 'KodN': 15, + 'KodParlimen': 180, + 'KodKawasan': 18034, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'RASININ BIN KOUTIS@KAUTIS', + 'parti': 'WARISAN', + }, + 2087: { + 'KodN': 15, + 'KodParlimen': 180, + 'KodKawasan': 18034, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DATUK SAPIN@SAIRIN BIN KARANO@KARNO', + 'parti': 'BN', + }, + 2088: { + 'KodN': 15, + 'KodParlimen': 180, + 'KodKawasan': 18034, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'KONG FUI SENG', + 'parti': 'STAR', + }, + 2089: { + 'KodN': 15, + 'KodParlimen': 180, + 'KodKawasan': 18034, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HUSSEIN@JAIMIS BIN KASSIM@MADATIN', + 'parti': 'PCS', + }, + 2090: { + 'KodN': 15, + 'KodParlimen': 181, + 'KodKawasan': 181, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'RUBIN BIN BALANG', + 'parti': 'BN', + }, + 2091: { + 'KodN': 15, + 'KodParlimen': 181, + 'KodKawasan': 181, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'NOORITA SUAL', + 'parti': 'DAP', + }, + 2092: { + 'KodN': 15, + 'KodParlimen': 181, + 'KodKawasan': 181, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'LAIMOI YUSLINAH BIN LAIKIM', + 'parti': 'PHRS', + }, + 2093: { + 'KodN': 15, + 'KodParlimen': 181, + 'KodKawasan': 18135, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'JAINEH BIN JUAYA@JIMMY JAWATAH', + 'parti': 'STAR', + }, + 2094: { + 'KodN': 15, + 'KodParlimen': 181, + 'KodKawasan': 18135, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'RADIN MALLEH', + 'parti': 'BN', + }, + 2095: { + 'KodN': 15, + 'KodParlimen': 181, + 'KodKawasan': 18135, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'PETER ANTHONY', + 'parti': 'WARISAN', + }, + 2096: { + 'KodN': 15, + 'KodParlimen': 181, + 'KodKawasan': 18135, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'CHINLY BIN MONIU@MAH TSEN LI', + 'parti': 'PCS', + }, + 2097: { + 'KodN': 15, + 'KodParlimen': 181, + 'KodKawasan': 18135, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'LIDOS RABIH@GEORGE REJOS', + 'parti': 'PKS', + }, + 2098: { + 'KodN': 15, + 'KodParlimen': 181, + 'KodKawasan': 18136, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'YAHIA@YAHYA BIN RAIMAH', + 'parti': 'PHRS', + }, + 2099: { + 'KodN': 15, + 'KodParlimen': 181, + 'KodKawasan': 18136, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HARRIS BOLOS', + 'parti': 'WARISAN', + }, + 2100: { + 'KodN': 15, + 'KodParlimen': 181, + 'KodKawasan': 18136, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'TAY JIN KIONG @ ALFRED', + 'parti': 'PCS', + }, + 2101: { + 'KodN': 15, + 'KodParlimen': 181, + 'KodKawasan': 18136, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'JAMAWI BIN JAAFAR', + 'parti': 'BN', + }, + 2102: { + 'KodN': 15, + 'KodParlimen': 182, + 'KodKawasan': 182, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 5, + 'NamaCalon': 'JOH JIMMY @ RICHARD JOE', + 'parti': 'STAR', + }, + 2103: { + 'KodN': 15, + 'KodParlimen': 182, + 'KodKawasan': 182, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'ARTHUR JOSEPH KURUP', + 'parti': 'BN', + }, + 2104: { + 'KodN': 15, + 'KodParlimen': 182, + 'KodKawasan': 182, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'RAYMOND AHUAR', + 'parti': 'PKR', + }, + 2105: { + 'KodN': 15, + 'KodParlimen': 182, + 'KodKawasan': 182, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'MAIDIN ATAK', + 'parti': 'PCS', + }, + 2106: { + 'KodN': 15, + 'KodParlimen': 182, + 'KodKawasan': 182, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'ENGAH SINTAN', + 'parti': 'BEBAS', + }, + 2107: { + 'KodN': 15, + 'KodParlimen': 182, + 'KodKawasan': 18237, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ELLRON ANGIN', + 'parti': 'BN', + }, + 2108: { + 'KodN': 15, + 'KodParlimen': 182, + 'KodKawasan': 18237, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MARTIN TOMMY', + 'parti': 'WARISAN', + }, + 2109: { + 'KodN': 15, + 'KodParlimen': 182, + 'KodKawasan': 18237, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'BARITUS GUNGKIT', + 'parti': 'STAR', + }, + 2110: { + 'KodN': 15, + 'KodParlimen': 182, + 'KodKawasan': 18237, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'PETER BEATY', + 'parti': 'PKAN', + }, + 2111: { + 'KodN': 15, + 'KodParlimen': 182, + 'KodKawasan': 18238, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'BOBBEY AH FANG SUAN', + 'parti': 'BN', + }, + 2112: { + 'KodN': 15, + 'KodParlimen': 182, + 'KodKawasan': 18238, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'ANGIN@NASARUDIN LAMBAHAN', + 'parti': 'PCS', + }, + 2113: { + 'KodN': 15, + 'KodParlimen': 182, + 'KodKawasan': 18238, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AHUAR RASAM', + 'parti': 'WARISAN', + }, + 2114: { + 'KodN': 15, + 'KodParlimen': 182, + 'KodKawasan': 18238, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'APANDY@LUKAN AGINDI', + 'parti': 'PHRS', + }, + 2115: { + 'KodN': 15, + 'KodParlimen': 183, + 'KodKawasan': 183, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DATUK RONALD KIANDEE', + 'parti': 'BN', + }, + 2116: { + 'KodN': 15, + 'KodParlimen': 183, + 'KodKawasan': 183, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'SALIMAH BINTI OYONG', + 'parti': 'BEBAS', + }, + 2117: { + 'KodN': 15, + 'KodParlimen': 183, + 'KodKawasan': 183, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'TOIDY LUIT', + 'parti': 'PCS', + }, + 2118: { + 'KodN': 15, + 'KodParlimen': 183, + 'KodKawasan': 183, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'SIPIN BIN KADANDI', + 'parti': 'PHRS', + }, + 2119: { + 'KodN': 15, + 'KodParlimen': 183, + 'KodKawasan': 183, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 5, + 'NamaCalon': 'JAPAR BIN ZAIRUN', + 'parti': 'WARISAN', + }, + 2120: { + 'KodN': 15, + 'KodParlimen': 183, + 'KodKawasan': 183, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 6, + 'NamaCalon': 'LEM @ SALIM BIN MATIN', + 'parti': 'PPRS', + }, + 2121: { + 'KodN': 15, + 'KodParlimen': 183, + 'KodKawasan': 18339, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATUK JAMES RATIB', + 'parti': 'BN', + }, + 2122: { + 'KodN': 15, + 'KodParlimen': 183, + 'KodKawasan': 18339, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ASPAH ABDULLAH SANI', + 'parti': 'WARISAN', + }, + 2123: { + 'KodN': 15, + 'KodParlimen': 183, + 'KodKawasan': 18339, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD ARSHAD BIN ABDUL', + 'parti': 'PPRS', + }, + 2124: { + 'KodN': 15, + 'KodParlimen': 183, + 'KodKawasan': 18339, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'AG OSMAN ASIBIH', + 'parti': 'PKS', + }, + 2125: { + 'KodN': 15, + 'KodParlimen': 183, + 'KodKawasan': 18340, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ABDUL RAHMAN BIN KONGKAWANG', + 'parti': 'BN', + }, + 2126: { + 'KodN': 15, + 'KodParlimen': 183, + 'KodKawasan': 18340, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ALBERT THOMAS ENTI', + 'parti': 'PKS', + }, + 2127: { + 'KodN': 15, + 'KodParlimen': 183, + 'KodKawasan': 18340, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'RAMSAH TASIM', + 'parti': 'WARISAN', + }, + 2128: { + 'KodN': 15, + 'KodParlimen': 183, + 'KodKawasan': 18340, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'JAMES MIKI', + 'parti': 'PCS', + }, + 2129: { + 'KodN': 15, + 'KodParlimen': 183, + 'KodKawasan': 18340, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'RAINUS AWANG', + 'parti': 'STAR', + }, + 2130: { + 'KodN': 15, + 'KodParlimen': 184, + 'KodKawasan': 184, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'ZAKARIA HJ MOHD EDRIS', + 'parti': 'BN', + }, + 2131: { + 'KodN': 15, + 'KodParlimen': 184, + 'KodKawasan': 184, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'ALFIAN BIN MANSYUR ', + 'parti': 'PHRS', + }, + 2132: { + 'KodN': 15, + 'KodParlimen': 184, + 'KodKawasan': 184, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'IRWANSHAH BIN MUSTAFA', + 'parti': 'WARISAN', + }, + 2133: { + 'KodN': 15, + 'KodParlimen': 184, + 'KodKawasan': 18441, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'JUSLIEE BIN AJIROL', + 'parti': 'BN', + }, + 2134: { + 'KodN': 15, + 'KodParlimen': 184, + 'KodKawasan': 18441, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'JOILIN @ CHIRISTIN BTE BUGUNG', + 'parti': 'PKS', + }, + 2135: { + 'KodN': 15, + 'KodParlimen': 184, + 'KodKawasan': 18441, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ARUNARNSIN BIN TAIB', + 'parti': 'WARISAN', + }, + 2136: { + 'KodN': 15, + 'KodParlimen': 184, + 'KodKawasan': 18441, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'JAMALUDDIN BIN LAMBA', + 'parti': 'PKAN', + }, + 2137: { + 'KodN': 15, + 'KodParlimen': 184, + 'KodKawasan': 18441, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'DAHIL MASDIK', + 'parti': 'PHRS', + }, + 2138: { + 'KodN': 15, + 'KodParlimen': 184, + 'KodKawasan': 18442, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MUSA HJ AMAN', + 'parti': 'BN', + }, + 2139: { + 'KodN': 15, + 'KodParlimen': 184, + 'KodKawasan': 18442, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'HJ ASMARA BIN ABD RAHMAN', + 'parti': 'WARISAN', + }, + 2140: { + 'KodN': 15, + 'KodParlimen': 184, + 'KodKawasan': 18442, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'OSMAN BIN ENTING', + 'parti': 'PKS', + }, + 2141: { + 'KodN': 15, + 'KodParlimen': 185, + 'KodKawasan': 185, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'LINDA TSEN THAU LIN', + 'parti': 'BN', + }, + 2142: { + 'KodN': 15, + 'KodParlimen': 185, + 'KodKawasan': 185, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'NORSAH BINTI BUNGSO', + 'parti': 'PAS', + }, + 2143: { + 'KodN': 15, + 'KodParlimen': 185, + 'KodKawasan': 185, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'LIEW VUI KEONG', + 'parti': 'WARISAN', + }, + 2144: { + 'KodN': 15, + 'KodParlimen': 185, + 'KodKawasan': 185, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'HAMZAH ABDULLAH', + 'parti': 'AMANAH', + }, + 2145: { + 'KodN': 15, + 'KodParlimen': 185, + 'KodKawasan': 18543, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SAMSUDIN YAHYA', + 'parti': 'BN', + }, + 2146: { + 'KodN': 15, + 'KodParlimen': 185, + 'KodKawasan': 18543, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'ABDUL RASHID BIN ABDUL RAHMAN', + 'parti': 'STAR', + }, + 2147: { + 'KodN': 15, + 'KodParlimen': 185, + 'KodKawasan': 18543, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ARIFFIN BIN ASGALI', + 'parti': 'WARISAN', + }, + 2148: { + 'KodN': 15, + 'KodParlimen': 185, + 'KodKawasan': 18543, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'SAHAR ABDUL MAJID', + 'parti': 'PAS', + }, + 2149: { + 'KodN': 15, + 'KodParlimen': 185, + 'KodKawasan': 18543, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'ALIAS RAHMAD BIN BENJAMIN', + 'parti': 'PKS', + }, + 2150: { + 'KodN': 15, + 'KodParlimen': 185, + 'KodKawasan': 18543, + 'JenisKawasan': 'DUN', + 'susunan': 6, + 'NamaCalon': 'DATU MOHD FAIZAL DATU BACHTIAL', + 'parti': 'BEBAS', + }, + 2151: { + 'KodN': 15, + 'KodParlimen': 185, + 'KodKawasan': 18544, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'LIM KAI MIN', + 'parti': 'BN', + }, + 2152: { + 'KodN': 15, + 'KodParlimen': 185, + 'KodKawasan': 18544, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'NORSAH BINTI BUNGSO', + 'parti': 'PAS', + }, + 2153: { + 'KodN': 15, + 'KodParlimen': 185, + 'KodKawasan': 18544, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'BESARUN BIN KECHA', + 'parti': 'STAR', + }, + 2154: { + 'KodN': 15, + 'KodParlimen': 185, + 'KodKawasan': 18544, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'HIEW VUN ZIN', + 'parti': 'WARISAN', + }, + 2155: { + 'KodN': 15, + 'KodParlimen': 186, + 'KodKawasan': 186, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'LIM MING HOO', + 'parti': 'BN', + }, + 2156: { + 'KodN': 15, + 'KodParlimen': 186, + 'KodKawasan': 186, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'WONG CHEN FATT', + 'parti': 'DAP', + }, + 2157: { + 'KodN': 15, + 'KodParlimen': 186, + 'KodKawasan': 18645, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'CHAN TZUN HEI', + 'parti': 'BN', + }, + 2158: { + 'KodN': 15, + 'KodParlimen': 186, + 'KodKawasan': 18645, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'CALVIN CHONG', + 'parti': 'DAP', + }, + 2159: { + 'KodN': 15, + 'KodParlimen': 186, + 'KodKawasan': 18646, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'JUFAZLI SH AHMAD ', + 'parti': 'BEBAS', + }, + 2160: { + 'KodN': 15, + 'KodParlimen': 186, + 'KodKawasan': 18646, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'RAYMON TAN', + 'parti': 'BN', + }, + 2161: { + 'KodN': 15, + 'KodParlimen': 186, + 'KodKawasan': 18646, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'FRANKIE POON MING FUNG', + 'parti': 'DAP', + }, + 2162: { + 'KodN': 15, + 'KodParlimen': 187, + 'KodKawasan': 187, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MUSTAPA BIN DATU TAMBUYONG', + 'parti': 'PHRS', + }, + 2163: { + 'KodN': 15, + 'KodParlimen': 187, + 'KodKawasan': 187, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'MOKTAR BIN RADIN', + 'parti': 'BN', + }, + 2164: { + 'KodN': 15, + 'KodParlimen': 187, + 'KodKawasan': 187, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'M.A GHAZALI BIN ABDUL GHANI', + 'parti': 'WARISAN', + }, + 2165: { + 'KodN': 15, + 'KodParlimen': 187, + 'KodKawasan': 18747, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MASIUNG BANAH', + 'parti': 'BN', + }, + 2166: { + 'KodN': 15, + 'KodParlimen': 187, + 'KodKawasan': 18747, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'EDWARD PODOK ', + 'parti': 'PCS', + }, + 2167: { + 'KodN': 15, + 'KodParlimen': 187, + 'KodKawasan': 18747, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'NURFAEZAH CHUA@ KIAT KANG', + 'parti': 'WARISAN', + }, + 2168: { + 'KodN': 15, + 'KodParlimen': 187, + 'KodKawasan': 18747, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'JUMAIDIN BIN LAKALIA', + 'parti': 'PAS', + }, + 2169: { + 'KodN': 15, + 'KodParlimen': 187, + 'KodKawasan': 18747, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'JAMES BIN AIT', + 'parti': 'STAR', + }, + 2170: { + 'KodN': 15, + 'KodParlimen': 187, + 'KodKawasan': 18748, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'MUARIFFIDDIN BIN ABDUL MALEK', + 'parti': 'PHRS', + }, + 2171: { + 'KodN': 15, + 'KodParlimen': 187, + 'KodKawasan': 18748, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'MOHD ISMAIL BIN AYOB', + 'parti': 'WARISAN', + }, + 2172: { + 'KodN': 15, + 'KodParlimen': 187, + 'KodKawasan': 18748, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SADDI BIN ABDUL RAHMAN', + 'parti': 'BN', + }, + 2173: { + 'KodN': 15, + 'KodParlimen': 187, + 'KodKawasan': 18748, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'ABDUL GHANI KUSOI', + 'parti': 'PPRS', + }, + 2174: { + 'KodN': 15, + 'KodParlimen': 188, + 'KodKawasan': 188, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DATU NASRUN BIN DATU MANSUR', + 'parti': 'BN', + }, + 2175: { + 'KodN': 15, + 'KodParlimen': 188, + 'KodKawasan': 188, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'MOHAMMADIN BIN KETAPI', + 'parti': 'WARISAN', + }, + 2176: { + 'KodN': 15, + 'KodParlimen': 188, + 'KodKawasan': 188, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'RAMLI BIN PATARUDDIN', + 'parti': 'PAS', + }, + 2177: { + 'KodN': 15, + 'KodParlimen': 188, + 'KodKawasan': 188, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'SITI SHAZIANTI BINTI AJAK', + 'parti': 'PHRS', + }, + 2178: { + 'KodN': 15, + 'KodParlimen': 188, + 'KodKawasan': 18849, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'BULANGAN PANASI', + 'parti': 'PHRS', + }, + 2179: { + 'KodN': 15, + 'KodParlimen': 188, + 'KodKawasan': 18849, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ABD RAHMAN BIN TAGGOH', + 'parti': 'PKS', + }, + 2180: { + 'KodN': 15, + 'KodParlimen': 188, + 'KodKawasan': 18849, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'MIZMA BINTI APPEHDULLAH', + 'parti': 'BN', + }, + 2181: { + 'KodN': 15, + 'KodParlimen': 188, + 'KodKawasan': 18849, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'ASSAFFAL P.ALIAN', + 'parti': 'WARISAN', + }, + 2182: { + 'KodN': 15, + 'KodParlimen': 188, + 'KodKawasan': 18850, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': "DATO' HJ MOHAMMAD YUSOF HJ APDAL", + 'parti': 'BN', + }, + 2183: { + 'KodN': 15, + 'KodParlimen': 188, + 'KodKawasan': 18850, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DUMI BIN PG MASDAL', + 'parti': 'WARISAN', + }, + 2184: { + 'KodN': 15, + 'KodParlimen': 188, + 'KodKawasan': 18850, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'WONG YU CHIN', + 'parti': 'PHRS', + }, + 2185: { + 'KodN': 15, + 'KodParlimen': 188, + 'KodKawasan': 18851, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'NILWAN BIN KABANG', + 'parti': 'BN', + }, + 2186: { + 'KodN': 15, + 'KodParlimen': 188, + 'KodKawasan': 18851, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SAHING BIN TAKING', + 'parti': 'PHRS', + }, + 2187: { + 'KodN': 15, + 'KodParlimen': 188, + 'KodKawasan': 18851, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'NORAZLINAH BINTI ARIF', + 'parti': 'WARISAN', + }, + 2188: { + 'KodN': 15, + 'KodParlimen': 188, + 'KodKawasan': 18851, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'KASMAN BIN KARATE', + 'parti': 'PAS', + }, + 2189: { + 'KodN': 15, + 'KodParlimen': 189, + 'KodKawasan': 189, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'ASMARA BIN AHMAD', + 'parti': 'PRM', + }, + 2190: { + 'KodN': 15, + 'KodParlimen': 189, + 'KodKawasan': 189, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'ABDUL NASIR BIN RAUF', + 'parti': 'PAS', + }, + 2191: { + 'KodN': 15, + 'KodParlimen': 189, + 'KodKawasan': 189, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'DATUK RAMLEE BIN MARHABAN', + 'parti': 'BN', + }, + 2192: { + 'KodN': 15, + 'KodParlimen': 189, + 'KodKawasan': 189, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'DATUK SERI SHAFIE BIN APDAL', + 'parti': 'WARISAN', + }, + 2193: { + 'KodN': 15, + 'KodParlimen': 189, + 'KodKawasan': 18952, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATUK HERMAN BIN MOHAMMAD', + 'parti': 'BN', + }, + 2194: { + 'KodN': 15, + 'KodParlimen': 189, + 'KodKawasan': 18952, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ABDUL NASIR BIN RAUF', + 'parti': 'PAS', + }, + 2195: { + 'KodN': 15, + 'KodParlimen': 189, + 'KodKawasan': 18952, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DATUK JAUJAN BIN SAMBAKONG', + 'parti': 'WARISAN', + }, + 2196: { + 'KodN': 15, + 'KodParlimen': 189, + 'KodKawasan': 18952, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'UTUNG BIN TANJONG BARU', + 'parti': 'BEBAS', + }, + 2197: { + 'KodN': 15, + 'KodParlimen': 189, + 'KodKawasan': 18953, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATUK SERI NASIR BIN TUN SAKARAN', + 'parti': 'BN', + }, + 2198: { + 'KodN': 15, + 'KodParlimen': 189, + 'KodKawasan': 18953, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'DATUK SERI SHAFIE BIN APDAL', + 'parti': 'WARISAN', + }, + 2199: { + 'KodN': 15, + 'KodParlimen': 189, + 'KodKawasan': 18954, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATUK RAZAK BIN TUN SAKARAN', + 'parti': 'BN', + }, + 2200: { + 'KodN': 15, + 'KodParlimen': 189, + 'KodKawasan': 18954, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ABDUL MUKSIN BIN MOHAMMAD HASSAN', + 'parti': 'BEBAS', + }, + 2201: { + 'KodN': 15, + 'KodParlimen': 189, + 'KodKawasan': 18954, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'HJH MANIS MUKA BINTI HJ MOHD DARA', + 'parti': 'WARISAN', + }, + 2202: { + 'KodN': 15, + 'KodParlimen': 189, + 'KodKawasan': 18954, + 'JenisKawasan': 'DUN', + 'susunan': 6, + 'NamaCalon': 'MOHAMAD BIN SARAHIL', + 'parti': 'PAS', + }, + 2203: { + 'KodN': 15, + 'KodParlimen': 189, + 'KodKawasan': 18954, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'KULI BIN MARALAM', + 'parti': 'PKS', + }, + 2204: { + 'KodN': 15, + 'KodParlimen': 189, + 'KodKawasan': 18954, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'MOHD SAID BIN TIBLAN', + 'parti': 'PHRS', + }, + 2205: { + 'KodN': 15, + 'KodParlimen': 190, + 'KodKawasan': 190, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': 'MARY YAP KAIN CHING', + 'parti': 'BN', + }, + 2206: { + 'KodN': 15, + 'KodParlimen': 190, + 'KodKawasan': 190, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'ALIZAMAN BIN JIJURAHMAN', + 'parti': 'PHRS', + }, + 2207: { + 'KodN': 15, + 'KodParlimen': 190, + 'KodKawasan': 190, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'MOHAMAD BIN HUSAIN', + 'parti': 'PAS', + }, + 2208: { + 'KodN': 15, + 'KodParlimen': 190, + 'KodKawasan': 190, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'CHRISTINA LIEW', + 'parti': 'PKR', + }, + 2209: { + 'KodN': 15, + 'KodParlimen': 190, + 'KodKawasan': 19055, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'RAZALI BIN HAMZAH', + 'parti': 'PHRS', + }, + 2210: { + 'KodN': 15, + 'KodParlimen': 190, + 'KodKawasan': 19055, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'AMBOASE BIN RAMANO', + 'parti': 'PAS', + }, + 2211: { + 'KodN': 15, + 'KodParlimen': 190, + 'KodKawasan': 19055, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'HAJI ALIPA JACKERY', + 'parti': 'BEBAS', + }, + 2212: { + 'KodN': 15, + 'KodParlimen': 190, + 'KodKawasan': 19055, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DATUK OSMAN BIN JAMAL', + 'parti': 'BN', + }, + 2213: { + 'KodN': 15, + 'KodParlimen': 190, + 'KodKawasan': 19055, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'ANDI RUS DIANA BT ANDI PALADJARENG', + 'parti': 'WARISAN', + }, + 2214: { + 'KodN': 15, + 'KodParlimen': 190, + 'KodKawasan': 19056, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'ABDUL SALIP BIN EJAL', + 'parti': 'WARISAN', + }, + 2215: { + 'KodN': 15, + 'KodParlimen': 190, + 'KodKawasan': 19056, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ALIZAMAN BIN JIJURAHMAN', + 'parti': 'PHRS', + }, + 2216: { + 'KodN': 15, + 'KodParlimen': 190, + 'KodKawasan': 19056, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DAUD BIN JALALUDDIN', + 'parti': 'PAS', + }, + 2217: { + 'KodN': 15, + 'KodParlimen': 190, + 'KodKawasan': 19056, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'NIZAM BIN DATUK ABU BAKAR TITINGAN', + 'parti': 'BN', + }, + 2218: { + 'KodN': 15, + 'KodParlimen': 190, + 'KodKawasan': 19057, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'PANG THOU CHUNG', + 'parti': 'PHRS', + }, + 2219: { + 'KodN': 15, + 'KodParlimen': 190, + 'KodKawasan': 19057, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'WONG SZE PHIN @ JIMMY', + 'parti': 'DAP', + }, + 2220: { + 'KodN': 15, + 'KodParlimen': 190, + 'KodKawasan': 19057, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'LO SU FUI', + 'parti': 'BN', + }, + 2221: { + 'KodN': 15, + 'KodParlimen': 190, + 'KodKawasan': 19057, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'LEONG YUN FUI', + 'parti': 'PKS', + }, + 2222: { + 'KodN': 15, + 'KodParlimen': 191, + 'KodKawasan': 191, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 2, + 'NamaCalon': 'YB DSP HJ ABDUL GHAPUR BIN HJ SALLEH', + 'parti': 'BN', + }, + 2223: { + 'KodN': 15, + 'KodParlimen': 191, + 'KodKawasan': 191, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 4, + 'NamaCalon': 'AHMAD BIN LAHAMA', + 'parti': 'PHRS', + }, + 2224: { + 'KodN': 15, + 'KodParlimen': 191, + 'KodKawasan': 191, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 3, + 'NamaCalon': 'NORBIN BIN ALOH', + 'parti': 'PAS', + }, + 2225: { + 'KodN': 15, + 'KodParlimen': 191, + 'KodKawasan': 191, + 'JenisKawasan': 'PARLIMEN', + 'susunan': 1, + 'NamaCalon': "MA'MUN BIN SULAIMAN", + 'parti': 'WARISAN', + }, + 2226: { + 'KodN': 15, + 'KodParlimen': 191, + 'KodKawasan': 19158, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'AHMAD BIN DULLAH', + 'parti': 'PAS', + }, + 2227: { + 'KodN': 15, + 'KodParlimen': 191, + 'KodKawasan': 19158, + 'JenisKawasan': 'DUN', + 'susunan': 6, + 'NamaCalon': 'AZIZUL BIN TANDEK', + 'parti': 'PKS', + }, + 2228: { + 'KodN': 15, + 'KodParlimen': 191, + 'KodKawasan': 19158, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'SHARATHA MASYAROH BINTI JOHN RIDWAN LINCON', + 'parti': 'PHRS', + }, + 2229: { + 'KodN': 15, + 'KodParlimen': 191, + 'KodKawasan': 19158, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'LIM TING KHAI', + 'parti': 'BN', + }, + 2230: { + 'KodN': 15, + 'KodParlimen': 191, + 'KodKawasan': 19158, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'ARMANI BIN AKUM', + 'parti': 'AMANAH', + }, + 2231: { + 'KodN': 15, + 'KodParlimen': 191, + 'KodKawasan': 19158, + 'JenisKawasan': 'DUN', + 'susunan': 5, + 'NamaCalon': 'SARIFUDDIN BIN HATA', + 'parti': 'WARISAN', + }, + 2232: { + 'KodN': 15, + 'KodParlimen': 191, + 'KodKawasan': 19159, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'USMAN BIN MADEAMING', + 'parti': 'PAS', + }, + 2233: { + 'KodN': 15, + 'KodParlimen': 191, + 'KodKawasan': 19159, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'ARDI BIN ARSAH @ SAMSI', + 'parti': 'PHRS', + }, + 2234: { + 'KodN': 15, + 'KodParlimen': 191, + 'KodKawasan': 19159, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'DATUK HAMISA BINTI SAMAT', + 'parti': 'BN', + }, + 2235: { + 'KodN': 15, + 'KodParlimen': 191, + 'KodKawasan': 19160, + 'JenisKawasan': 'DUN', + 'susunan': 2, + 'NamaCalon': 'ROSLAN BIN RAMLI', + 'parti': 'PAS', + }, + 2236: { + 'KodN': 15, + 'KodParlimen': 191, + 'KodKawasan': 19160, + 'JenisKawasan': 'DUN', + 'susunan': 1, + 'NamaCalon': 'YUSRI BIN YUNUS', + 'parti': 'PHRS', + }, + 2237: { + 'KodN': 15, + 'KodParlimen': 191, + 'KodKawasan': 19160, + 'JenisKawasan': 'DUN', + 'susunan': 3, + 'NamaCalon': 'DATUK ABD MUIS BIN PICHO', + 'parti': 'BN', + }, + 2238: { + 'KodN': 15, + 'KodParlimen': 191, + 'KodKawasan': 19160, + 'JenisKawasan': 'DUN', + 'susunan': 4, + 'NamaCalon': 'HASSAN A. GANI PG AMIR', + 'parti': 'WARISAN', + }, +} diff --git a/malaya/topic/influencer.py b/malaya/topic/influencer.py new file mode 100644 index 00000000..09139495 --- /dev/null +++ b/malaya/topic/influencer.py @@ -0,0 +1,121 @@ +influencer = { + 'mahathir': [ + 'tun mahathir', + 'madey', + 'dr mahathir', + 'tun m', + 'mahathir', + 'madir', + 'dr m', + 'mahathir muhamad', + ], + 'anwar ibrahim': ['anwar ibrahim', 'anwar'], + 'najib razak': [ + 'najib razak', + 'ajib', + 'pakjib', + 'pok jib', + 'pak jib', + 'najib', + 'tan sri najib', + ], + 'pakatan harapan': ['harapan', 'pakatan harapan', 'pakatan'], + 'syed saddiq': ['syed saddiq', 'syedsaddiq', 'syed', 'saddiq'], + 'parti keadilan rakyat': [ + 'parti keadilan rakyat', + 'people justice party', + 'pkr', + ], + 'umno': ['united malays', 'umno', 'united malays national organization'], + 'barisan nasional': ['bn', 'barisan nasional'], + 'parti islam semalaysia': [ + 'parti islam', + 'malaysian islamic party', + 'parti islam semalaysia', + 'parti islam malaysia', + ], + 'nurul izzah': ['nurul izzah', 'izzah'], + 'Tunku Ismail Idris': ['tunku ismail', 'tunku ismail idris', 'tmj'], + 'mca': ['malaysian chinese association', 'mca'], + 'democratic action party': ['democratic action party'], + 'parti amanah': [ + 'national trust party', + 'amanah', + 'parti amanah', + 'parti amanah negara', + ], + 'ppbm': [ + 'parti pribumi bersatu malaysia', + 'ppbm', + 'malaysian united', + 'parti pribumi', + 'malaysian united indigenous party', + ], + 'mic': [ + 'malaysian indian', + 'malaysian indian congress', + 'indian congress', + 'mic', + ], + 'Tun Daim Zainuddin': [ + 'daim zainuddin', + 'daim', + 'tun daim', + 'tun daim zainuddin', + ], + 'datuk seri abdul hadi awang': [ + 'hadi', + 'datuk seri abdul hadi awang', + 'hadi awang', + ], + 'majlis pakatan harapan': ['majlis pakatan harapan'], + 'wan azizah': ['kak wan', 'azizah', 'wan azizah'], + 'Parti Pribumi Bersatu Malaysia': [ + 'parti pribumi bersatu malaysia', + 'ppbm', + 'parti bersatu', + 'parti pribumi', + ], + 'Datuk Seri Azmin Ali': ['azmin ali', 'datuk seri azmin ali', 'azmin'], + 'Datuk Johari Abdul': ['johari', 'johari abdul', 'datuk johari abdul'], + 'Tengku Razaleigh Hamzah': ['tengku razaleigh hamzah', 'razaleigh'], + 'Tan Sri Dr Rais Yatim': ['rais yatim', 'tan sri dr rais yatim'], + 'rafizi ramli': ['rafizi', 'rafizi ramli'], + 'bersatu': ['bersatu'], + 'bernama': ['bernama'], + 'donald trump': ['trump', 'donald', 'donald trump'], + 'perkasa': ['pertubuhan pribumi perkasa', 'pertubuhan pribumi', 'perkasa'], + 'Tan Sri Mokhzani Mahathir': [ + 'tan sri mokhzani mahathir', + 'mokhzani', + 'mokhzani mahathir', + ], + 'Rais Yatim': ['rais yatim', 'rais'], + 'Anthony Loke Siew Fook': ['anthony loke siew fook', 'loke siew'], + 'rosmah mansur': ['rosmah', 'rosmah mansur'], + 'arul kanda': ['arul kanda', 'kanda'], + 'manchester united': ['manchester', 'manchester united'], + 'arsenal fc': ['arsenal fc', 'arsenal'], + 'liverpool fc': ['liverpool fc', 'liverpool'], + 'chelsea fc': ['chelsea', 'chelsea fc'], + 'manchester city': ['manchester city'], + 'fc barcelona': ['barcelona', 'fc barcelona'], + 'real madrid cf': ['madrid', 'real madrid', 'real madrid cf'], + 'fc bayern munich': ['bayern munich', 'fc bayern munich'], + 'juventus fc': ['juventus fc', 'juventus'], + 'zeti aziz': ['zeti aziz'], + 'robert kuok': ['robert kuok'], + 'hassan merican': ['hassan merican'], + 'ks jomo': ['ks jomo'], + 'jho low': ['jho low'], + 'kadir jasin': ['kadir jasin'], + 'zakir naik': ['zakir naik'], + 'bung mokhtar': ['bung mokhtar'], + 'shafie apdal': ['shafie apdal'], + 'ariff md yusof': ['ariff yusof', 'datuk ariff md yusof', 'ariff md yusof'], + 'felda': ['felda'], + 'dato vida': ['vida', 'dato vida'], + 'Jabatan Perancangan Bandar dan Desa': [ + 'jabatan perancangan bandar dan desa' + ], +} diff --git a/malaya/topic/location.py b/malaya/topic/location.py new file mode 100644 index 00000000..16e6ae00 --- /dev/null +++ b/malaya/topic/location.py @@ -0,0 +1,1077 @@ +location = { + 0: {'negeri': 'JOHOR', 'parlimen': 'SEGAMAT', 'dun': 'BULOH KASAP'}, + 1: {'negeri': 'JOHOR', 'parlimen': 'SEGAMAT', 'dun': 'JEMENTAH'}, + 2: {'negeri': 'JOHOR', 'parlimen': 'SEKIJANG', 'dun': 'PEMANIS'}, + 3: {'negeri': 'JOHOR', 'parlimen': 'SEKIJANG', 'dun': 'KEMELAH'}, + 4: {'negeri': 'JOHOR', 'parlimen': 'LABIS', 'dun': 'TENANG'}, + 5: {'negeri': 'JOHOR', 'parlimen': 'LABIS', 'dun': 'BEKOK'}, + 6: {'negeri': 'JOHOR', 'parlimen': 'PAGOH', 'dun': 'BUKIT SERAMPANG'}, + 7: {'negeri': 'JOHOR', 'parlimen': 'PAGOH', 'dun': 'JORAK'}, + 8: {'negeri': 'JOHOR', 'parlimen': 'LEDANG', 'dun': 'GAMBIR'}, + 9: {'negeri': 'JOHOR', 'parlimen': 'LEDANG', 'dun': 'TANGKAK'}, + 10: {'negeri': 'JOHOR', 'parlimen': 'LEDANG', 'dun': 'SEROM'}, + 11: {'negeri': 'JOHOR', 'parlimen': 'BAKRI', 'dun': 'BENTAYAN'}, + 12: {'negeri': 'JOHOR', 'parlimen': 'BAKRI', 'dun': 'SUNGAI ABONG'}, + 13: {'negeri': 'JOHOR', 'parlimen': 'BAKRI', 'dun': 'BUKIT NANING'}, + 14: {'negeri': 'JOHOR', 'parlimen': 'MUAR', 'dun': 'MAHARANI'}, + 15: {'negeri': 'JOHOR', 'parlimen': 'MUAR', 'dun': 'SUNGAI BALANG'}, + 16: {'negeri': 'JOHOR', 'parlimen': 'PARIT SULONG', 'dun': 'SEMERAH'}, + 17: {'negeri': 'JOHOR', 'parlimen': 'PARIT SULONG', 'dun': 'SRI MEDAN'}, + 18: {'negeri': 'JOHOR', 'parlimen': 'AYER HITAM', 'dun': 'YONG PENG'}, + 19: {'negeri': 'JOHOR', 'parlimen': 'AYER HITAM', 'dun': 'SEMARANG'}, + 20: {'negeri': 'JOHOR', 'parlimen': 'SRI GADING', 'dun': 'PARIT YAANI'}, + 21: {'negeri': 'JOHOR', 'parlimen': 'SRI GADING', 'dun': 'PARIT RAJA'}, + 22: {'negeri': 'JOHOR', 'parlimen': 'BATU PAHAT', 'dun': 'PENGGARAM'}, + 23: {'negeri': 'JOHOR', 'parlimen': 'BATU PAHAT', 'dun': 'SENGGARANG'}, + 24: {'negeri': 'JOHOR', 'parlimen': 'BATU PAHAT', 'dun': 'RENGIT'}, + 25: {'negeri': 'JOHOR', 'parlimen': 'SIMPANG RENGGAM', 'dun': 'MACHAP'}, + 26: { + 'negeri': 'JOHOR', + 'parlimen': 'SIMPANG RENGGAM', + 'dun': 'LAYANG-LAYANG', + }, + 27: {'negeri': 'JOHOR', 'parlimen': 'KLUANG', 'dun': 'MENGKIBOL'}, + 28: {'negeri': 'JOHOR', 'parlimen': 'KLUANG', 'dun': 'MAHKOTA'}, + 29: {'negeri': 'JOHOR', 'parlimen': 'SEMBRONG', 'dun': 'PALOH'}, + 30: {'negeri': 'JOHOR', 'parlimen': 'SEMBRONG', 'dun': 'KAHANG'}, + 31: {'negeri': 'JOHOR', 'parlimen': 'MERSING', 'dun': 'ENDAU'}, + 32: {'negeri': 'JOHOR', 'parlimen': 'MERSING', 'dun': 'TENGGAROH'}, + 33: {'negeri': 'JOHOR', 'parlimen': 'TENGGARA', 'dun': 'PANTI'}, + 34: {'negeri': 'JOHOR', 'parlimen': 'TENGGARA', 'dun': 'PASIR RAJA'}, + 35: {'negeri': 'JOHOR', 'parlimen': 'KOTA TINGGI', 'dun': 'SEDILI'}, + 36: {'negeri': 'JOHOR', 'parlimen': 'KOTA TINGGI', 'dun': 'JOHOR LAMA'}, + 37: {'negeri': 'JOHOR', 'parlimen': 'PENGERANG', 'dun': 'PENAWAR'}, + 38: {'negeri': 'JOHOR', 'parlimen': 'PENGERANG', 'dun': 'TANJONG SURAT'}, + 39: {'negeri': 'JOHOR', 'parlimen': 'TEBRAU', 'dun': 'TIRAM'}, + 40: {'negeri': 'JOHOR', 'parlimen': 'TEBRAU', 'dun': 'PUTERI WANGSA'}, + 41: {'negeri': 'JOHOR', 'parlimen': 'PASIR GUDANG', 'dun': 'JOHOR JAYA'}, + 42: {'negeri': 'JOHOR', 'parlimen': 'PASIR GUDANG', 'dun': 'PERMAS'}, + 43: {'negeri': 'JOHOR', 'parlimen': 'JOHOR BAHRU', 'dun': 'TANJONG PUTERI'}, + 44: {'negeri': 'JOHOR', 'parlimen': 'JOHOR BAHRU', 'dun': 'STULANG'}, + 45: {'negeri': 'JOHOR', 'parlimen': 'PULAI', 'dun': 'PENGKALAN RINTING'}, + 46: {'negeri': 'JOHOR', 'parlimen': 'PULAI', 'dun': 'KEMPAS'}, + 47: {'negeri': 'JOHOR', 'parlimen': 'GELANG PATAH', 'dun': 'SKUDAI'}, + 48: {'negeri': 'JOHOR', 'parlimen': 'GELANG PATAH', 'dun': 'NUSA JAYA'}, + 49: {'negeri': 'JOHOR', 'parlimen': 'KULAI', 'dun': 'BUKIT PERMAI'}, + 50: {'negeri': 'JOHOR', 'parlimen': 'KULAI', 'dun': 'BUKIT BATU'}, + 51: {'negeri': 'JOHOR', 'parlimen': 'KULAI', 'dun': 'SENAI'}, + 52: {'negeri': 'JOHOR', 'parlimen': 'PONTIAN', 'dun': 'BENUT'}, + 53: {'negeri': 'JOHOR', 'parlimen': 'PONTIAN', 'dun': 'PULAI SEBATANG'}, + 54: {'negeri': 'JOHOR', 'parlimen': 'TANJONG PIAI', 'dun': 'PEKAN NENAS'}, + 55: {'negeri': 'JOHOR', 'parlimen': 'TANJONG PIAI', 'dun': 'KUKUP'}, + 56: {'negeri': 'KEDAH', 'parlimen': 'LANGKAWI', 'dun': 'AYER HANGAT'}, + 57: {'negeri': 'KEDAH', 'parlimen': 'LANGKAWI', 'dun': 'KUAH'}, + 58: {'negeri': 'KEDAH', 'parlimen': 'JERLUN', 'dun': 'KOTA SIPUTEH'}, + 59: {'negeri': 'KEDAH', 'parlimen': 'JERLUN', 'dun': 'AYER HITAM'}, + 60: { + 'negeri': 'KEDAH', + 'parlimen': 'KUBANG PASU', + 'dun': 'BUKIT KAYU HITAM', + }, + 61: {'negeri': 'KEDAH', 'parlimen': 'KUBANG PASU', 'dun': 'JITRA'}, + 62: {'negeri': 'KEDAH', 'parlimen': 'PADANG TERAP', 'dun': 'KUALA NERANG'}, + 63: {'negeri': 'KEDAH', 'parlimen': 'PADANG TERAP', 'dun': 'PEDU'}, + 64: {'negeri': 'KEDAH', 'parlimen': 'POKOK SENA', 'dun': 'BUKIT LADA'}, + 65: {'negeri': 'KEDAH', 'parlimen': 'POKOK SENA', 'dun': 'BUKIT PINANG'}, + 66: {'negeri': 'KEDAH', 'parlimen': 'POKOK SENA', 'dun': 'DERGA'}, + 67: {'negeri': 'KEDAH', 'parlimen': 'ALOR STAR', 'dun': 'BAKAR BATA'}, + 68: {'negeri': 'KEDAH', 'parlimen': 'ALOR STAR', 'dun': 'KOTA DARUL AMAN'}, + 69: {'negeri': 'KEDAH', 'parlimen': 'ALOR STAR', 'dun': 'ALOR MENGKUDU'}, + 70: {'negeri': 'KEDAH', 'parlimen': 'KUALA KEDAH', 'dun': 'ANAK BUKIT'}, + 71: {'negeri': 'KEDAH', 'parlimen': 'KUALA KEDAH', 'dun': 'KUBANG ROTAN'}, + 72: { + 'negeri': 'KEDAH', + 'parlimen': 'KUALA KEDAH', + 'dun': 'PENGKALAN KUNDOR', + }, + 73: {'negeri': 'KEDAH', 'parlimen': 'PENDANG', 'dun': 'TOKAI'}, + 74: {'negeri': 'KEDAH', 'parlimen': 'PENDANG', 'dun': 'SUNGAI TIANG'}, + 75: {'negeri': 'KEDAH', 'parlimen': 'JERAI', 'dun': 'SUNGAI LIMAU'}, + 76: {'negeri': 'KEDAH', 'parlimen': 'JERAI', 'dun': 'GUAR CHEMPEDAK'}, + 77: {'negeri': 'KEDAH', 'parlimen': 'JERAI', 'dun': 'GURUN'}, + 78: {'negeri': 'KEDAH', 'parlimen': 'SIK', 'dun': 'BELANTEK'}, + 79: {'negeri': 'KEDAH', 'parlimen': 'SIK', 'dun': 'JENERI'}, + 80: {'negeri': 'KEDAH', 'parlimen': 'MERBOK', 'dun': 'BUKIT SELAMBAU'}, + 81: {'negeri': 'KEDAH', 'parlimen': 'MERBOK', 'dun': 'TANJONG DAWAI'}, + 82: { + 'negeri': 'KEDAH', + 'parlimen': 'SUNGAI PETANI', + 'dun': 'PANTAI MERDEKA', + }, + 83: {'negeri': 'KEDAH', 'parlimen': 'SUNGAI PETANI', 'dun': 'BAKAR ARANG'}, + 84: {'negeri': 'KEDAH', 'parlimen': 'SUNGAI PETANI', 'dun': 'SIDAM'}, + 85: {'negeri': 'KEDAH', 'parlimen': 'BALING', 'dun': 'BAYU'}, + 86: {'negeri': 'KEDAH', 'parlimen': 'BALING', 'dun': 'KUPANG'}, + 87: {'negeri': 'KEDAH', 'parlimen': 'BALING', 'dun': 'KUALA KETIL'}, + 88: {'negeri': 'KEDAH', 'parlimen': 'PADANG SERAI', 'dun': 'MERBAU PULAS'}, + 89: {'negeri': 'KEDAH', 'parlimen': 'PADANG SERAI', 'dun': 'LUNAS'}, + 90: {'negeri': 'KEDAH', 'parlimen': 'KULIM-BANDAR BAHARU', 'dun': 'KULIM'}, + 91: { + 'negeri': 'KEDAH', + 'parlimen': 'KULIM-BANDAR BAHARU', + 'dun': 'BANDAR BAHARU', + }, + 92: {'negeri': 'KELANTAN', 'parlimen': 'TUMPAT', 'dun': 'PENGKALAN KUBOR'}, + 93: {'negeri': 'KELANTAN', 'parlimen': 'TUMPAT', 'dun': 'KELABORAN'}, + 94: {'negeri': 'KELANTAN', 'parlimen': 'TUMPAT', 'dun': 'PASIR PEKAN'}, + 95: {'negeri': 'KELANTAN', 'parlimen': 'TUMPAT', 'dun': 'WAKAF BHARU'}, + 96: {'negeri': 'KELANTAN', 'parlimen': 'PENGKALAN CHEPA', 'dun': 'KIJANG'}, + 97: { + 'negeri': 'KELANTAN', + 'parlimen': 'PENGKALAN CHEPA', + 'dun': 'CHEMPAKA', + }, + 98: {'negeri': 'KELANTAN', 'parlimen': 'PENGKALAN CHEPA', 'dun': 'PANCHOR'}, + 99: {'negeri': 'KELANTAN', 'parlimen': 'KOTA BHARU', 'dun': 'TANJONG MAS'}, + 100: {'negeri': 'KELANTAN', 'parlimen': 'KOTA BHARU', 'dun': 'KOTA LAMA'}, + 101: { + 'negeri': 'KELANTAN', + 'parlimen': 'KOTA BHARU', + 'dun': 'BUNUT PAYONG', + }, + 102: {'negeri': 'KELANTAN', 'parlimen': 'PASIR MAS', 'dun': 'TENDONG'}, + 103: { + 'negeri': 'KELANTAN', + 'parlimen': 'PASIR MAS', + 'dun': 'PENGKALAN PASIR', + }, + 104: {'negeri': 'KELANTAN', 'parlimen': 'PASIR MAS', 'dun': 'CHETOK'}, + 105: {'negeri': 'KELANTAN', 'parlimen': 'RANTAU PANJANG', 'dun': 'MERANTI'}, + 106: { + 'negeri': 'KELANTAN', + 'parlimen': 'RANTAU PANJANG', + 'dun': 'GUAL PERIOK', + }, + 107: { + 'negeri': 'KELANTAN', + 'parlimen': 'RANTAU PANJANG', + 'dun': 'BUKIT TUKU', + }, + 108: {'negeri': 'KELANTAN', 'parlimen': 'KUBANG KERIAN', 'dun': 'SALOR'}, + 109: { + 'negeri': 'KELANTAN', + 'parlimen': 'KUBANG KERIAN', + 'dun': 'PASIR TUMBOH', + }, + 110: {'negeri': 'KELANTAN', 'parlimen': 'KUBANG KERIAN', 'dun': 'DEMIT'}, + 111: {'negeri': 'KELANTAN', 'parlimen': 'BACHOK', 'dun': 'TAWANG'}, + 112: {'negeri': 'KELANTAN', 'parlimen': 'BACHOK', 'dun': 'PERUPOK'}, + 113: {'negeri': 'KELANTAN', 'parlimen': 'BACHOK', 'dun': 'JELAWAT'}, + 114: {'negeri': 'KELANTAN', 'parlimen': 'KETEREH', 'dun': 'MELOR'}, + 115: {'negeri': 'KELANTAN', 'parlimen': 'KETEREH', 'dun': 'KADOK'}, + 116: {'negeri': 'KELANTAN', 'parlimen': 'KETEREH', 'dun': 'KOK LANAS'}, + 117: { + 'negeri': 'KELANTAN', + 'parlimen': 'TANAH MERAH', + 'dun': 'BUKIT PANAU', + }, + 118: {'negeri': 'KELANTAN', 'parlimen': 'TANAH MERAH', 'dun': 'GUAL IPOH'}, + 119: {'negeri': 'KELANTAN', 'parlimen': 'TANAH MERAH', 'dun': 'KEMAHANG'}, + 120: {'negeri': 'KELANTAN', 'parlimen': 'PASIR PUTEH', 'dun': 'SELISING'}, + 121: {'negeri': 'KELANTAN', 'parlimen': 'PASIR PUTEH', 'dun': 'LIMBONGAN'}, + 122: {'negeri': 'KELANTAN', 'parlimen': 'PASIR PUTEH', 'dun': 'SEMERAK'}, + 123: {'negeri': 'KELANTAN', 'parlimen': 'PASIR PUTEH', 'dun': 'GAAL'}, + 124: {'negeri': 'KELANTAN', 'parlimen': 'MACHANG', 'dun': 'PULAI CHONDONG'}, + 125: {'negeri': 'KELANTAN', 'parlimen': 'MACHANG', 'dun': 'TEMANGAN'}, + 126: {'negeri': 'KELANTAN', 'parlimen': 'MACHANG', 'dun': 'KEMUNING'}, + 127: {'negeri': 'KELANTAN', 'parlimen': 'JELI', 'dun': 'BUKIT BUNGA'}, + 128: {'negeri': 'KELANTAN', 'parlimen': 'JELI', 'dun': 'AIR LANAS'}, + 129: {'negeri': 'KELANTAN', 'parlimen': 'JELI', 'dun': 'KUALA BALAH'}, + 130: {'negeri': 'KELANTAN', 'parlimen': 'KUALA KRAI', 'dun': 'MENGKEBANG'}, + 131: {'negeri': 'KELANTAN', 'parlimen': 'KUALA KRAI', 'dun': 'GUCHIL'}, + 132: {'negeri': 'KELANTAN', 'parlimen': 'KUALA KRAI', 'dun': 'MANEK URAI'}, + 133: {'negeri': 'KELANTAN', 'parlimen': 'KUALA KRAI', 'dun': 'DABONG'}, + 134: {'negeri': 'KELANTAN', 'parlimen': 'GUA MUSANG', 'dun': 'NENGGIRI'}, + 135: {'negeri': 'KELANTAN', 'parlimen': 'GUA MUSANG', 'dun': 'PALOH'}, + 136: {'negeri': 'KELANTAN', 'parlimen': 'GUA MUSANG', 'dun': 'GALAS'}, + 137: { + 'negeri': 'MELAKA', + 'parlimen': 'MASJID TANAH', + 'dun': 'KUALA LINGGI', + }, + 138: { + 'negeri': 'MELAKA', + 'parlimen': 'MASJID TANAH', + 'dun': 'TANJUNG BIDARA', + }, + 139: {'negeri': 'MELAKA', 'parlimen': 'MASJID TANAH', 'dun': 'AYER LIMAU'}, + 140: {'negeri': 'MELAKA', 'parlimen': 'MASJID TANAH', 'dun': 'LENDU'}, + 141: { + 'negeri': 'MELAKA', + 'parlimen': 'MASJID TANAH', + 'dun': 'TABOH NANING', + }, + 142: {'negeri': 'MELAKA', 'parlimen': 'ALOR GAJAH', 'dun': 'REMBIA'}, + 143: {'negeri': 'MELAKA', 'parlimen': 'ALOR GAJAH', 'dun': 'GADEK'}, + 144: {'negeri': 'MELAKA', 'parlimen': 'ALOR GAJAH', 'dun': 'MACHAP'}, + 145: { + 'negeri': 'MELAKA', + 'parlimen': 'ALOR GAJAH', + 'dun': 'DURIAN TUNGGAL', + }, + 146: {'negeri': 'MELAKA', 'parlimen': 'ALOR GAJAH', 'dun': 'ASAHAN'}, + 147: {'negeri': 'MELAKA', 'parlimen': 'TANGGA BATU', 'dun': 'SUNGAI UDANG'}, + 148: { + 'negeri': 'MELAKA', + 'parlimen': 'TANGGA BATU', + 'dun': 'PANTAI KUNDOR', + }, + 149: {'negeri': 'MELAKA', 'parlimen': 'TANGGA BATU', 'dun': 'PAYA RUMPUT'}, + 150: {'negeri': 'MELAKA', 'parlimen': 'TANGGA BATU', 'dun': 'KELEBANG'}, + 151: {'negeri': 'MELAKA', 'parlimen': 'BUKIT KATIL', 'dun': 'BACHANG'}, + 152: {'negeri': 'MELAKA', 'parlimen': 'BUKIT KATIL', 'dun': 'AYER KEROH'}, + 153: {'negeri': 'MELAKA', 'parlimen': 'BUKIT KATIL', 'dun': 'BUKIT BARU'}, + 154: {'negeri': 'MELAKA', 'parlimen': 'BUKIT KATIL', 'dun': 'AYER MOLEK'}, + 155: {'negeri': 'MELAKA', 'parlimen': 'KOTA MELAKA', 'dun': 'KESIDANG'}, + 156: { + 'negeri': 'MELAKA', + 'parlimen': 'KOTA MELAKA', + 'dun': 'KOTA LAKSAMANA', + }, + 157: {'negeri': 'MELAKA', 'parlimen': 'KOTA MELAKA', 'dun': 'DUYONG'}, + 158: {'negeri': 'MELAKA', 'parlimen': 'KOTA MELAKA', 'dun': 'BANDAR HILIR'}, + 159: {'negeri': 'MELAKA', 'parlimen': 'KOTA MELAKA', 'dun': 'TELOK MAS'}, + 160: {'negeri': 'MELAKA', 'parlimen': 'JASIN', 'dun': 'BEMBAN'}, + 161: {'negeri': 'MELAKA', 'parlimen': 'JASIN', 'dun': 'RIM'}, + 162: {'negeri': 'MELAKA', 'parlimen': 'JASIN', 'dun': 'SERKAM'}, + 163: {'negeri': 'MELAKA', 'parlimen': 'JASIN', 'dun': 'MERLIMAU'}, + 164: {'negeri': 'MELAKA', 'parlimen': 'JASIN', 'dun': 'SUNGAI RAMBAI'}, + 165: {'negeri': 'NEGERI SEMBILAN', 'parlimen': 'JELEBU', 'dun': 'CHENNAH'}, + 166: {'negeri': 'NEGERI SEMBILAN', 'parlimen': 'JELEBU', 'dun': 'PERTANG'}, + 167: { + 'negeri': 'NEGERI SEMBILAN', + 'parlimen': 'JELEBU', + 'dun': 'SUNGAI LUI', + }, + 168: {'negeri': 'NEGERI SEMBILAN', 'parlimen': 'JELEBU', 'dun': 'KLAWANG'}, + 169: {'negeri': 'NEGERI SEMBILAN', 'parlimen': 'JEMPOL', 'dun': 'SERTING'}, + 170: {'negeri': 'NEGERI SEMBILAN', 'parlimen': 'JEMPOL', 'dun': 'PALONG'}, + 171: { + 'negeri': 'NEGERI SEMBILAN', + 'parlimen': 'JEMPOL', + 'dun': 'JERAM PADANG', + }, + 172: {'negeri': 'NEGERI SEMBILAN', 'parlimen': 'JEMPOL', 'dun': 'BAHAU'}, + 173: { + 'negeri': 'NEGERI SEMBILAN', + 'parlimen': 'SEREMBAN', + 'dun': 'LENGGENG', + }, + 174: {'negeri': 'NEGERI SEMBILAN', 'parlimen': 'SEREMBAN', 'dun': 'NILAI'}, + 175: {'negeri': 'NEGERI SEMBILAN', 'parlimen': 'SEREMBAN', 'dun': 'LOBAK'}, + 176: { + 'negeri': 'NEGERI SEMBILAN', + 'parlimen': 'SEREMBAN', + 'dun': 'TEMIANG', + }, + 177: { + 'negeri': 'NEGERI SEMBILAN', + 'parlimen': 'SEREMBAN', + 'dun': 'SIKAMAT', + }, + 178: { + 'negeri': 'NEGERI SEMBILAN', + 'parlimen': 'SEREMBAN', + 'dun': 'AMPANGAN', + }, + 179: { + 'negeri': 'NEGERI SEMBILAN', + 'parlimen': 'KUALA PILAH', + 'dun': 'JUASSEH', + }, + 180: { + 'negeri': 'NEGERI SEMBILAN', + 'parlimen': 'KUALA PILAH', + 'dun': 'SERI MENANTI', + }, + 181: { + 'negeri': 'NEGERI SEMBILAN', + 'parlimen': 'KUALA PILAH', + 'dun': 'SENALING', + }, + 182: { + 'negeri': 'NEGERI SEMBILAN', + 'parlimen': 'KUALA PILAH', + 'dun': 'PILAH', + }, + 183: { + 'negeri': 'NEGERI SEMBILAN', + 'parlimen': 'KUALA PILAH', + 'dun': 'JOHOL', + }, + 184: {'negeri': 'NEGERI SEMBILAN', 'parlimen': 'RASAH', 'dun': 'LABU'}, + 185: { + 'negeri': 'NEGERI SEMBILAN', + 'parlimen': 'RASAH', + 'dun': 'BUKIT KEPAYANG', + }, + 186: {'negeri': 'NEGERI SEMBILAN', 'parlimen': 'RASAH', 'dun': 'RAHANG'}, + 187: {'negeri': 'NEGERI SEMBILAN', 'parlimen': 'RASAH', 'dun': 'MAMBAU'}, + 188: {'negeri': 'NEGERI SEMBILAN', 'parlimen': 'RASAH', 'dun': 'SENAWANG'}, + 189: {'negeri': 'NEGERI SEMBILAN', 'parlimen': 'REMBAU', 'dun': 'PAROI'}, + 190: {'negeri': 'NEGERI SEMBILAN', 'parlimen': 'REMBAU', 'dun': 'CHEMBONG'}, + 191: {'negeri': 'NEGERI SEMBILAN', 'parlimen': 'REMBAU', 'dun': 'RANTAU'}, + 192: {'negeri': 'NEGERI SEMBILAN', 'parlimen': 'REMBAU', 'dun': 'KOTA'}, + 193: { + 'negeri': 'NEGERI SEMBILAN', + 'parlimen': 'TELOK KEMANG', + 'dun': 'CHUAH', + }, + 194: { + 'negeri': 'NEGERI SEMBILAN', + 'parlimen': 'TELOK KEMANG', + 'dun': 'LUKUT', + }, + 195: { + 'negeri': 'NEGERI SEMBILAN', + 'parlimen': 'TELOK KEMANG', + 'dun': 'BAGAN PINANG', + }, + 196: { + 'negeri': 'NEGERI SEMBILAN', + 'parlimen': 'TELOK KEMANG', + 'dun': 'LINGGI', + }, + 197: { + 'negeri': 'NEGERI SEMBILAN', + 'parlimen': 'TELOK KEMANG', + 'dun': 'PORT DICKSON', + }, + 198: {'negeri': 'NEGERI SEMBILAN', 'parlimen': 'TAMPIN', 'dun': 'GEMAS'}, + 199: { + 'negeri': 'NEGERI SEMBILAN', + 'parlimen': 'TAMPIN', + 'dun': 'GEMENCHEH', + }, + 200: {'negeri': 'NEGERI SEMBILAN', 'parlimen': 'TAMPIN', 'dun': 'REPAH'}, + 201: { + 'negeri': 'PAHANG', + 'parlimen': 'CAMERON HIGHLANDS', + 'dun': 'TANAH RATA', + }, + 202: {'negeri': 'PAHANG', 'parlimen': 'CAMERON HIGHLANDS', 'dun': 'JELAI'}, + 203: {'negeri': 'PAHANG', 'parlimen': 'LIPIS', 'dun': 'PADANG TENGKU'}, + 204: {'negeri': 'PAHANG', 'parlimen': 'LIPIS', 'dun': 'CHEKA'}, + 205: {'negeri': 'PAHANG', 'parlimen': 'LIPIS', 'dun': 'BENTA'}, + 206: {'negeri': 'PAHANG', 'parlimen': 'RAUB', 'dun': 'BATU TALAM'}, + 207: {'negeri': 'PAHANG', 'parlimen': 'RAUB', 'dun': 'TRAS'}, + 208: {'negeri': 'PAHANG', 'parlimen': 'RAUB', 'dun': 'DONG'}, + 209: {'negeri': 'PAHANG', 'parlimen': 'JERANTUT', 'dun': 'TAHAN'}, + 210: {'negeri': 'PAHANG', 'parlimen': 'JERANTUT', 'dun': 'DAMAK'}, + 211: {'negeri': 'PAHANG', 'parlimen': 'JERANTUT', 'dun': 'PULAU TAWAR'}, + 212: {'negeri': 'PAHANG', 'parlimen': 'INDERA MAHKOTA', 'dun': 'BESERAH'}, + 213: {'negeri': 'PAHANG', 'parlimen': 'INDERA MAHKOTA', 'dun': 'SEMAMBU'}, + 214: {'negeri': 'PAHANG', 'parlimen': 'KUANTAN', 'dun': 'TERUNTUM'}, + 215: {'negeri': 'PAHANG', 'parlimen': 'KUANTAN', 'dun': 'TANJUNG LUMPUR'}, + 216: {'negeri': 'PAHANG', 'parlimen': 'KUANTAN', 'dun': 'INDERAPURA'}, + 217: { + 'negeri': 'PAHANG', + 'parlimen': 'PAYA BESAR', + 'dun': 'SUNGAI LEMBING', + }, + 218: {'negeri': 'PAHANG', 'parlimen': 'PAYA BESAR', 'dun': 'LEPAR'}, + 219: {'negeri': 'PAHANG', 'parlimen': 'PAYA BESAR', 'dun': 'PANCHING'}, + 220: {'negeri': 'PAHANG', 'parlimen': 'PEKAN', 'dun': 'PULAU MANIS'}, + 221: {'negeri': 'PAHANG', 'parlimen': 'PEKAN', 'dun': 'PERAMU JAYA'}, + 222: {'negeri': 'PAHANG', 'parlimen': 'PEKAN', 'dun': 'BEBAR'}, + 223: {'negeri': 'PAHANG', 'parlimen': 'PEKAN', 'dun': 'CHINI'}, + 224: {'negeri': 'PAHANG', 'parlimen': 'MARAN', 'dun': 'LUIT'}, + 225: {'negeri': 'PAHANG', 'parlimen': 'MARAN', 'dun': 'KUALA SENTUL'}, + 226: {'negeri': 'PAHANG', 'parlimen': 'MARAN', 'dun': 'CHENOR'}, + 227: {'negeri': 'PAHANG', 'parlimen': 'KUALA KRAU', 'dun': 'JENDERAK'}, + 228: {'negeri': 'PAHANG', 'parlimen': 'KUALA KRAU', 'dun': 'KERDAU'}, + 229: {'negeri': 'PAHANG', 'parlimen': 'KUALA KRAU', 'dun': 'JENGKA'}, + 230: {'negeri': 'PAHANG', 'parlimen': 'TEMERLOH', 'dun': 'MENTAKAB'}, + 231: {'negeri': 'PAHANG', 'parlimen': 'TEMERLOH', 'dun': 'LANCHANG'}, + 232: {'negeri': 'PAHANG', 'parlimen': 'TEMERLOH', 'dun': 'KUALA SEMANTAN'}, + 233: {'negeri': 'PAHANG', 'parlimen': 'BENTONG', 'dun': 'BILUT'}, + 234: {'negeri': 'PAHANG', 'parlimen': 'BENTONG', 'dun': 'KETARI'}, + 235: {'negeri': 'PAHANG', 'parlimen': 'BENTONG', 'dun': 'SABAI'}, + 236: {'negeri': 'PAHANG', 'parlimen': 'BENTONG', 'dun': 'PELANGAI'}, + 237: {'negeri': 'PAHANG', 'parlimen': 'BERA', 'dun': 'GUAI'}, + 238: {'negeri': 'PAHANG', 'parlimen': 'BERA', 'dun': 'TRIANG'}, + 239: {'negeri': 'PAHANG', 'parlimen': 'BERA', 'dun': 'KEMAYAN'}, + 240: {'negeri': 'PAHANG', 'parlimen': 'ROMPIN', 'dun': 'BUKIT IBAM'}, + 241: {'negeri': 'PAHANG', 'parlimen': 'ROMPIN', 'dun': 'MUADZAM SHAH'}, + 242: {'negeri': 'PAHANG', 'parlimen': 'ROMPIN', 'dun': 'TIOMAN'}, + 243: {'negeri': 'PERAK', 'parlimen': 'GERIK', 'dun': 'PENGKALAN HULU'}, + 244: {'negeri': 'PERAK', 'parlimen': 'GERIK', 'dun': 'TEMENGOR'}, + 245: {'negeri': 'PERAK', 'parlimen': 'LENGGONG', 'dun': 'KENERING'}, + 246: {'negeri': 'PERAK', 'parlimen': 'LENGGONG', 'dun': 'KOTA TAMPAN'}, + 247: {'negeri': 'PERAK', 'parlimen': 'LARUT', 'dun': 'SELAMA'}, + 248: {'negeri': 'PERAK', 'parlimen': 'LARUT', 'dun': 'KUBU GAJAH'}, + 249: {'negeri': 'PERAK', 'parlimen': 'LARUT', 'dun': 'BATU KURAU'}, + 250: {'negeri': 'PERAK', 'parlimen': 'PARIT BUNTAR', 'dun': 'TITI SERONG'}, + 251: {'negeri': 'PERAK', 'parlimen': 'PARIT BUNTAR', 'dun': 'KUALA KURAU'}, + 252: {'negeri': 'PERAK', 'parlimen': 'BAGAN SERAI', 'dun': 'ALOR PONGSU'}, + 253: { + 'negeri': 'PERAK', + 'parlimen': 'BAGAN SERAI', + 'dun': 'GUNONG SEMANGGOL', + }, + 254: {'negeri': 'PERAK', 'parlimen': 'BAGAN SERAI', 'dun': 'SELINSING'}, + 255: { + 'negeri': 'PERAK', + 'parlimen': 'BUKIT GANTANG', + 'dun': 'KUALA SAPETANG', + }, + 256: { + 'negeri': 'PERAK', + 'parlimen': 'BUKIT GANTANG', + 'dun': 'CHANGKAT JERING', + }, + 257: {'negeri': 'PERAK', 'parlimen': 'BUKIT GANTANG', 'dun': 'TRONG'}, + 258: {'negeri': 'PERAK', 'parlimen': 'TAIPING', 'dun': 'KAMUNTING'}, + 259: {'negeri': 'PERAK', 'parlimen': 'TAIPING', 'dun': 'POKOK ASSAM'}, + 260: {'negeri': 'PERAK', 'parlimen': 'TAIPING', 'dun': 'AULONG'}, + 261: {'negeri': 'PERAK', 'parlimen': 'PADANG RENGAS', 'dun': 'CHENDEROH'}, + 262: { + 'negeri': 'PERAK', + 'parlimen': 'PADANG RENGAS', + 'dun': 'LUBOK MERBAU', + }, + 263: {'negeri': 'PERAK', 'parlimen': 'SUNGAI SIPUT', 'dun': 'LINTANG'}, + 264: {'negeri': 'PERAK', 'parlimen': 'SUNGAI SIPUT', 'dun': 'JALONG'}, + 265: {'negeri': 'PERAK', 'parlimen': 'TAMBUN', 'dun': 'MANJOI'}, + 266: {'negeri': 'PERAK', 'parlimen': 'TAMBUN', 'dun': 'HULU KINTA'}, + 267: {'negeri': 'PERAK', 'parlimen': 'IPOH TIMOR', 'dun': 'CANNING'}, + 268: {'negeri': 'PERAK', 'parlimen': 'IPOH TIMOR', 'dun': 'TEBING TINGGI'}, + 269: {'negeri': 'PERAK', 'parlimen': 'IPOH TIMOR', 'dun': 'PASIR PINJI'}, + 270: {'negeri': 'PERAK', 'parlimen': 'IPOH BARAT', 'dun': 'BERCHAM'}, + 271: {'negeri': 'PERAK', 'parlimen': 'IPOH BARAT', 'dun': 'KEPAYANG'}, + 272: {'negeri': 'PERAK', 'parlimen': 'IPOH BARAT', 'dun': 'BUNTONG'}, + 273: {'negeri': 'PERAK', 'parlimen': 'BATU GAJAH', 'dun': 'JELAPANG'}, + 274: {'negeri': 'PERAK', 'parlimen': 'BATU GAJAH', 'dun': 'MENGLEMBU'}, + 275: {'negeri': 'PERAK', 'parlimen': 'BATU GAJAH', 'dun': 'TRONOH'}, + 276: { + 'negeri': 'PERAK', + 'parlimen': 'KUALA KANGSAR', + 'dun': 'BUKIT CHANDAN', + }, + 277: {'negeri': 'PERAK', 'parlimen': 'KUALA KANGSAR', 'dun': 'MANONG'}, + 278: {'negeri': 'PERAK', 'parlimen': 'BERUAS', 'dun': 'PENGKALAN BAHARU'}, + 279: {'negeri': 'PERAK', 'parlimen': 'BERUAS', 'dun': 'PANTAI REMIS'}, + 280: {'negeri': 'PERAK', 'parlimen': 'PARIT', 'dun': 'BELANJA'}, + 281: {'negeri': 'PERAK', 'parlimen': 'PARIT', 'dun': 'BOTA'}, + 282: {'negeri': 'PERAK', 'parlimen': 'KAMPAR', 'dun': 'MALIM NAWAR'}, + 283: {'negeri': 'PERAK', 'parlimen': 'KAMPAR', 'dun': 'KERANJI'}, + 284: {'negeri': 'PERAK', 'parlimen': 'KAMPAR', 'dun': 'TUALANG SEKAH'}, + 285: {'negeri': 'PERAK', 'parlimen': 'GOPENG', 'dun': 'SUNGAI RAPAT'}, + 286: {'negeri': 'PERAK', 'parlimen': 'GOPENG', 'dun': 'SIMPANG PULAI'}, + 287: {'negeri': 'PERAK', 'parlimen': 'GOPENG', 'dun': 'TEJA'}, + 288: {'negeri': 'PERAK', 'parlimen': 'TAPAH', 'dun': 'CHENDERIANG'}, + 289: {'negeri': 'PERAK', 'parlimen': 'TAPAH', 'dun': 'AYER KUNING'}, + 290: {'negeri': 'PERAK', 'parlimen': 'PASIR SALAK', 'dun': 'SUNGAI MANIK'}, + 291: {'negeri': 'PERAK', 'parlimen': 'PASIR SALAK', 'dun': 'KAMPONG GAJAH'}, + 292: {'negeri': 'PERAK', 'parlimen': 'LUMUT', 'dun': 'SITIAWAN'}, + 293: {'negeri': 'PERAK', 'parlimen': 'LUMUT', 'dun': 'PASIR PANJANG'}, + 294: {'negeri': 'PERAK', 'parlimen': 'LUMUT', 'dun': 'PANGKOR'}, + 295: {'negeri': 'PERAK', 'parlimen': 'BAGAN DATOK', 'dun': 'RUNGKUP'}, + 296: { + 'negeri': 'PERAK', + 'parlimen': 'BAGAN DATOK', + 'dun': 'HUTAN MELINTANG', + }, + 297: {'negeri': 'PERAK', 'parlimen': 'TELOK INTAN', 'dun': 'PASIR BEDAMAR'}, + 298: {'negeri': 'PERAK', 'parlimen': 'TELOK INTAN', 'dun': 'CHANGKAT JONG'}, + 299: {'negeri': 'PERAK', 'parlimen': 'TANJONG MALIM', 'dun': 'SUNGKAI'}, + 300: {'negeri': 'PERAK', 'parlimen': 'TANJONG MALIM', 'dun': 'SLIM'}, + 301: {'negeri': 'PERAK', 'parlimen': 'TANJONG MALIM', 'dun': 'BEHRANG'}, + 302: {'negeri': 'PERLIS', 'parlimen': 'PADANG BESAR', 'dun': 'TITI TINGGI'}, + 303: {'negeri': 'PERLIS', 'parlimen': 'PADANG BESAR', 'dun': 'BESERI'}, + 304: {'negeri': 'PERLIS', 'parlimen': 'PADANG BESAR', 'dun': 'CHUPING'}, + 305: {'negeri': 'PERLIS', 'parlimen': 'PADANG BESAR', 'dun': 'MATA AYER'}, + 306: {'negeri': 'PERLIS', 'parlimen': 'PADANG BESAR', 'dun': 'SANTAN'}, + 307: {'negeri': 'PERLIS', 'parlimen': 'KANGAR', 'dun': 'BINTONG'}, + 308: {'negeri': 'PERLIS', 'parlimen': 'KANGAR', 'dun': 'SENA'}, + 309: {'negeri': 'PERLIS', 'parlimen': 'KANGAR', 'dun': 'INDERA KAYANGAN'}, + 310: {'negeri': 'PERLIS', 'parlimen': 'KANGAR', 'dun': 'KUALA PERLIS'}, + 311: {'negeri': 'PERLIS', 'parlimen': 'KANGAR', 'dun': 'KAYANG'}, + 312: {'negeri': 'PERLIS', 'parlimen': 'ARAU', 'dun': 'PAUH'}, + 313: {'negeri': 'PERLIS', 'parlimen': 'ARAU', 'dun': 'TAMBUN TULANG'}, + 314: {'negeri': 'PERLIS', 'parlimen': 'ARAU', 'dun': 'GUAR SANJI'}, + 315: {'negeri': 'PERLIS', 'parlimen': 'ARAU', 'dun': 'SIMPANG EMPAT'}, + 316: {'negeri': 'PERLIS', 'parlimen': 'ARAU', 'dun': 'SANGLANG'}, + 317: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'KEPALA BATAS', + 'dun': 'PENAGA', + }, + 318: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'KEPALA BATAS', + 'dun': 'BERTAM', + }, + 319: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'KEPALA BATAS', + 'dun': 'PINANG TUNGGAL', + }, + 320: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'TASEK GELUGOR', + 'dun': 'PERMATANG BERANGAN', + }, + 321: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'TASEK GELUGOR', + 'dun': 'SUNGAI DUA', + }, + 322: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'TASEK GELUGOR', + 'dun': 'TELOK AYER TAWAR', + }, + 323: {'negeri': 'PULAU PINANG', 'parlimen': 'BAGAN', 'dun': 'SUNGAI PUYU'}, + 324: {'negeri': 'PULAU PINANG', 'parlimen': 'BAGAN', 'dun': 'BAGAN JERMAL'}, + 325: {'negeri': 'PULAU PINANG', 'parlimen': 'BAGAN', 'dun': 'BAGAN DALAM'}, + 326: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'PERMATANG PAUH', + 'dun': 'SEBERANG JAYA', + }, + 327: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'PERMATANG PAUH', + 'dun': 'PERMATANG PASIR', + }, + 328: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'PERMATANG PAUH', + 'dun': 'PENANTI', + }, + 329: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'BUKIT MERTAJAM', + 'dun': 'BERAPIT', + }, + 330: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'BUKIT MERTAJAM', + 'dun': 'MACHANG BUBUK', + }, + 331: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'BUKIT MERTAJAM', + 'dun': 'PADANG LALANG', + }, + 332: {'negeri': 'PULAU PINANG', 'parlimen': 'BATU KAWAN', 'dun': 'PERAI'}, + 333: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'BATU KAWAN', + 'dun': 'BUKIT TENGAH', + }, + 334: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'BATU KAWAN', + 'dun': 'BUKIT TAMBUN', + }, + 335: {'negeri': 'PULAU PINANG', 'parlimen': 'NIBONG TEBAL', 'dun': 'JAWI'}, + 336: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'NIBONG TEBAL', + 'dun': 'SUNGAI BAKAP', + }, + 337: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'NIBONG TEBAL', + 'dun': 'SUNGAI ACHEH', + }, + 338: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'BUKIT BENDERA', + 'dun': 'TANJONG BUNGA', + }, + 339: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'BUKIT BENDERA', + 'dun': 'AIR PUTIH', + }, + 340: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'BUKIT BENDERA', + 'dun': 'KEBUN BUNGA', + }, + 341: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'BUKIT BENDERA', + 'dun': 'PULAU TIKUS', + }, + 342: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'TANJONG', + 'dun': 'PADANG KOTA', + }, + 343: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'TANJONG', + 'dun': 'PENGKALAN KOTA', + }, + 344: {'negeri': 'PULAU PINANG', 'parlimen': 'TANJONG', 'dun': 'KOMTAR'}, + 345: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'JELUTONG', + 'dun': 'DATOK KERAMAT', + }, + 346: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'JELUTONG', + 'dun': 'SUNGAI PINANG', + }, + 347: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'JELUTONG', + 'dun': 'BATU LANCANG', + }, + 348: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'BUKIT GELUGOR', + 'dun': 'SERI DELIMA', + }, + 349: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'BUKIT GELUGOR', + 'dun': 'AIR ITAM', + }, + 350: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'BUKIT GELUGOR', + 'dun': 'PAYA TERUBONG', + }, + 351: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'BAYAN BARU', + 'dun': 'BATU UBAN', + }, + 352: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'BAYAN BARU', + 'dun': 'PANTAI JEREJAK', + }, + 353: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'BAYAN BARU', + 'dun': 'BATU MAUNG', + }, + 354: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'BALIK PULAU', + 'dun': 'BAYAN LEPAS', + }, + 355: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'BALIK PULAU', + 'dun': 'PULAU BETONG', + }, + 356: { + 'negeri': 'PULAU PINANG', + 'parlimen': 'BALIK PULAU', + 'dun': 'TELOK BAHANG', + }, + 357: {'negeri': 'SABAH', 'parlimen': 'KUDAT', 'dun': 'BANGGI'}, + 358: {'negeri': 'SABAH', 'parlimen': 'KUDAT', 'dun': 'TANJONG KAPOR'}, + 359: {'negeri': 'SABAH', 'parlimen': 'KUDAT', 'dun': 'PITAS'}, + 360: {'negeri': 'SABAH', 'parlimen': 'KOTA MARUDU', 'dun': 'MATUNGGONG'}, + 361: {'negeri': 'SABAH', 'parlimen': 'KOTA MARUDU', 'dun': 'TANDEK'}, + 362: {'negeri': 'SABAH', 'parlimen': 'KOTA BELUD', 'dun': 'TEMPASUK'}, + 363: {'negeri': 'SABAH', 'parlimen': 'KOTA BELUD', 'dun': 'KADAMAIAN'}, + 364: {'negeri': 'SABAH', 'parlimen': 'KOTA BELUD', 'dun': 'USUKAN'}, + 365: {'negeri': 'SABAH', 'parlimen': 'TUARAN', 'dun': 'TAMPARULI'}, + 366: {'negeri': 'SABAH', 'parlimen': 'TUARAN', 'dun': 'SULAMAN'}, + 367: {'negeri': 'SABAH', 'parlimen': 'TUARAN', 'dun': 'KIULU'}, + 368: {'negeri': 'SABAH', 'parlimen': 'SEPANGGAR', 'dun': 'KARAMBUNAI'}, + 369: {'negeri': 'SABAH', 'parlimen': 'SEPANGGAR', 'dun': 'INANAM'}, + 370: {'negeri': 'SABAH', 'parlimen': 'KOTA KINABALU', 'dun': 'LIKAS'}, + 371: {'negeri': 'SABAH', 'parlimen': 'KOTA KINABALU', 'dun': 'API-API'}, + 372: {'negeri': 'SABAH', 'parlimen': 'KOTA KINABALU', 'dun': 'LUYANG'}, + 373: {'negeri': 'SABAH', 'parlimen': 'PUTATAN', 'dun': 'TANJONG ARU'}, + 374: {'negeri': 'SABAH', 'parlimen': 'PUTATAN', 'dun': 'PETAGAS'}, + 375: {'negeri': 'SABAH', 'parlimen': 'PENAMPANG', 'dun': 'KAPAYAN'}, + 376: {'negeri': 'SABAH', 'parlimen': 'PENAMPANG', 'dun': 'MOYOG'}, + 377: {'negeri': 'SABAH', 'parlimen': 'PAPAR', 'dun': 'KAWANG'}, + 378: {'negeri': 'SABAH', 'parlimen': 'PAPAR', 'dun': 'PANTAI MANIS'}, + 379: {'negeri': 'SABAH', 'parlimen': 'KIMANIS', 'dun': 'BONGAWAN'}, + 380: {'negeri': 'SABAH', 'parlimen': 'KIMANIS', 'dun': 'MEMBAKUT'}, + 381: {'negeri': 'SABAH', 'parlimen': 'BEAUFORT', 'dun': 'KLIAS'}, + 382: {'negeri': 'SABAH', 'parlimen': 'BEAUFORT', 'dun': 'KUALA PENYU'}, + 383: {'negeri': 'SABAH', 'parlimen': 'SIPITANG', 'dun': 'LUMADAN'}, + 384: {'negeri': 'SABAH', 'parlimen': 'SIPITANG', 'dun': 'SINDUMIN'}, + 385: {'negeri': 'SABAH', 'parlimen': 'RANAU', 'dun': 'KUNDASANG'}, + 386: {'negeri': 'SABAH', 'parlimen': 'RANAU', 'dun': 'KARANAAN'}, + 387: {'negeri': 'SABAH', 'parlimen': 'RANAU', 'dun': 'PAGINATAN'}, + 388: {'negeri': 'SABAH', 'parlimen': 'KENINGAU', 'dun': 'TAMBUNAN'}, + 389: {'negeri': 'SABAH', 'parlimen': 'KENINGAU', 'dun': 'BINGKOR'}, + 390: {'negeri': 'SABAH', 'parlimen': 'KENINGAU', 'dun': 'LIAWAN'}, + 391: {'negeri': 'SABAH', 'parlimen': 'TENOM', 'dun': 'MELALAP'}, + 392: {'negeri': 'SABAH', 'parlimen': 'TENOM', 'dun': 'KEMABONG'}, + 393: {'negeri': 'SABAH', 'parlimen': 'PENSIANGAN', 'dun': 'SOOK'}, + 394: {'negeri': 'SABAH', 'parlimen': 'PENSIANGAN', 'dun': 'NABAWAN'}, + 395: {'negeri': 'SABAH', 'parlimen': 'BELURAN', 'dun': 'SUGUT'}, + 396: {'negeri': 'SABAH', 'parlimen': 'BELURAN', 'dun': 'LABUK'}, + 397: {'negeri': 'SABAH', 'parlimen': 'LIBARAN', 'dun': 'GUM-GUM'}, + 398: {'negeri': 'SABAH', 'parlimen': 'LIBARAN', 'dun': 'SUNGAI SIBUGA'}, + 399: {'negeri': 'SABAH', 'parlimen': 'BATU SAPI', 'dun': 'SEKONG'}, + 400: {'negeri': 'SABAH', 'parlimen': 'BATU SAPI', 'dun': 'KARAMUNTING'}, + 401: {'negeri': 'SABAH', 'parlimen': 'SANDAKAN', 'dun': 'ELOPURA'}, + 402: {'negeri': 'SABAH', 'parlimen': 'SANDAKAN', 'dun': 'TANJONG PAPAT'}, + 403: {'negeri': 'SABAH', 'parlimen': 'KINABATANGAN', 'dun': 'KUAMUT'}, + 404: {'negeri': 'SABAH', 'parlimen': 'KINABATANGAN', 'dun': 'SUKAU'}, + 405: {'negeri': 'SABAH', 'parlimen': 'SILAM', 'dun': 'TUNGKU'}, + 406: {'negeri': 'SABAH', 'parlimen': 'SILAM', 'dun': 'LAHAD DATU'}, + 407: {'negeri': 'SABAH', 'parlimen': 'SILAM', 'dun': 'KUNAK'}, + 408: {'negeri': 'SABAH', 'parlimen': 'SEMPORNA', 'dun': 'SULABAYAN'}, + 409: {'negeri': 'SABAH', 'parlimen': 'SEMPORNA', 'dun': 'SENALLANG'}, + 410: {'negeri': 'SABAH', 'parlimen': 'SEMPORNA', 'dun': 'BUGAYA'}, + 411: {'negeri': 'SABAH', 'parlimen': 'TAWAU', 'dun': 'BALUNG'}, + 412: {'negeri': 'SABAH', 'parlimen': 'TAWAU', 'dun': 'APAS'}, + 413: {'negeri': 'SABAH', 'parlimen': 'TAWAU', 'dun': 'SRI TANJONG'}, + 414: {'negeri': 'SABAH', 'parlimen': 'KALABAKAN', 'dun': 'MEROTAI'}, + 415: {'negeri': 'SABAH', 'parlimen': 'KALABAKAN', 'dun': 'TANJONG BATU'}, + 416: {'negeri': 'SABAH', 'parlimen': 'KALABAKAN', 'dun': 'SEBATIK'}, + 417: {'negeri': 'SARAWAK', 'parlimen': 'MAS GADING', 'dun': 'OPAR'}, + 418: {'negeri': 'SARAWAK', 'parlimen': 'MAS GADING', 'dun': 'TASIK BIRU'}, + 419: {'negeri': 'SARAWAK', 'parlimen': 'SANTUBONG', 'dun': 'TANJONG DATU'}, + 420: {'negeri': 'SARAWAK', 'parlimen': 'SANTUBONG', 'dun': 'PANTAI DAMAI'}, + 421: {'negeri': 'SARAWAK', 'parlimen': 'SANTUBONG', 'dun': 'DEMAK LAUT'}, + 422: {'negeri': 'SARAWAK', 'parlimen': 'PETRA JAYA', 'dun': 'TUPONG'}, + 423: {'negeri': 'SARAWAK', 'parlimen': 'PETRA JAYA', 'dun': 'SAMARIANG'}, + 424: {'negeri': 'SARAWAK', 'parlimen': 'PETRA JAYA', 'dun': 'SATOK'}, + 425: {'negeri': 'SARAWAK', 'parlimen': 'BANDAR KUCHING', 'dun': 'PADUNGAN'}, + 426: {'negeri': 'SARAWAK', 'parlimen': 'BANDAR KUCHING', 'dun': 'PENDING'}, + 427: { + 'negeri': 'SARAWAK', + 'parlimen': 'BANDAR KUCHING', + 'dun': 'BATU LINTANG', + }, + 428: {'negeri': 'SARAWAK', 'parlimen': 'STAMPIN', 'dun': 'KOTA SENTOSA'}, + 429: {'negeri': 'SARAWAK', 'parlimen': 'STAMPIN', 'dun': 'BATU KITANG'}, + 430: {'negeri': 'SARAWAK', 'parlimen': 'STAMPIN', 'dun': 'BATU KAWAH'}, + 431: {'negeri': 'SARAWAK', 'parlimen': 'KOTA SAMARAHAN', 'dun': 'ASAJAYA'}, + 432: { + 'negeri': 'SARAWAK', + 'parlimen': 'KOTA SAMARAHAN', + 'dun': 'MUARA TUANG', + }, + 433: {'negeri': 'SARAWAK', 'parlimen': 'KOTA SAMARAHAN', 'dun': 'STAKAN'}, + 434: {'negeri': 'SARAWAK', 'parlimen': 'MAMBONG', 'dun': 'SEREMBU'}, + 435: {'negeri': 'SARAWAK', 'parlimen': 'MAMBONG', 'dun': 'MAMBONG'}, + 436: {'negeri': 'SARAWAK', 'parlimen': 'MAMBONG', 'dun': 'TARAT'}, + 437: {'negeri': 'SARAWAK', 'parlimen': 'SERIAN', 'dun': 'TEBEDU'}, + 438: {'negeri': 'SARAWAK', 'parlimen': 'SERIAN', 'dun': 'KEDUP'}, + 439: {'negeri': 'SARAWAK', 'parlimen': 'SERIAN', 'dun': 'BUKIT SEMUJA'}, + 440: { + 'negeri': 'SARAWAK', + 'parlimen': 'BATANG SADONG', + 'dun': 'SADONG JAYA', + }, + 441: {'negeri': 'SARAWAK', 'parlimen': 'BATANG SADONG', 'dun': 'SIMUNJAN'}, + 442: {'negeri': 'SARAWAK', 'parlimen': 'BATANG SADONG', 'dun': 'GEDONG'}, + 443: {'negeri': 'SARAWAK', 'parlimen': 'BATANG LUPAR', 'dun': 'SEBUYAU'}, + 444: {'negeri': 'SARAWAK', 'parlimen': 'BATANG LUPAR', 'dun': 'LINGGA'}, + 445: { + 'negeri': 'SARAWAK', + 'parlimen': 'BATANG LUPAR', + 'dun': 'BETING MARO', + }, + 446: {'negeri': 'SARAWAK', 'parlimen': 'SRI AMAN', 'dun': 'BALAI RINGIN'}, + 447: {'negeri': 'SARAWAK', 'parlimen': 'SRI AMAN', 'dun': 'BUKIT BEGUNAN'}, + 448: {'negeri': 'SARAWAK', 'parlimen': 'SRI AMAN', 'dun': 'SIMANGGANG'}, + 449: {'negeri': 'SARAWAK', 'parlimen': 'LUBOK ANTU', 'dun': 'ENGKILILI'}, + 450: {'negeri': 'SARAWAK', 'parlimen': 'LUBOK ANTU', 'dun': 'BATANG AI'}, + 451: {'negeri': 'SARAWAK', 'parlimen': 'BETONG', 'dun': 'SARIBAS'}, + 452: {'negeri': 'SARAWAK', 'parlimen': 'BETONG', 'dun': 'LAYAR'}, + 453: {'negeri': 'SARAWAK', 'parlimen': 'BETONG', 'dun': 'BUKIT SABAN'}, + 454: {'negeri': 'SARAWAK', 'parlimen': 'SARATOK', 'dun': 'KALAKA'}, + 455: {'negeri': 'SARAWAK', 'parlimen': 'SARATOK', 'dun': 'KRIAN'}, + 456: {'negeri': 'SARAWAK', 'parlimen': 'SARATOK', 'dun': 'KABONG'}, + 457: { + 'negeri': 'SARAWAK', + 'parlimen': 'TANJONG MANIS', + 'dun': 'KUALA RAJANG', + }, + 458: {'negeri': 'SARAWAK', 'parlimen': 'TANJONG MANIS', 'dun': 'SEMOP'}, + 459: {'negeri': 'SARAWAK', 'parlimen': 'IGAN', 'dun': 'DARO'}, + 460: {'negeri': 'SARAWAK', 'parlimen': 'IGAN', 'dun': 'JEMORENG'}, + 461: {'negeri': 'SARAWAK', 'parlimen': 'SARIKEI', 'dun': 'REPOK'}, + 462: {'negeri': 'SARAWAK', 'parlimen': 'SARIKEI', 'dun': 'MERADONG'}, + 463: {'negeri': 'SARAWAK', 'parlimen': 'JULAU', 'dun': 'PAKAN'}, + 464: {'negeri': 'SARAWAK', 'parlimen': 'JULAU', 'dun': 'MELUAN'}, + 465: {'negeri': 'SARAWAK', 'parlimen': 'KANOWIT', 'dun': 'NGEMAH'}, + 466: {'negeri': 'SARAWAK', 'parlimen': 'KANOWIT', 'dun': 'MACHAN'}, + 467: {'negeri': 'SARAWAK', 'parlimen': 'LANANG', 'dun': 'BUKIT ASSEK'}, + 468: {'negeri': 'SARAWAK', 'parlimen': 'LANANG', 'dun': 'DUDONG'}, + 469: {'negeri': 'SARAWAK', 'parlimen': 'SIBU', 'dun': 'BAWANG ASSAN'}, + 470: {'negeri': 'SARAWAK', 'parlimen': 'SIBU', 'dun': 'PELAWAN'}, + 471: {'negeri': 'SARAWAK', 'parlimen': 'SIBU', 'dun': 'NANGKA'}, + 472: {'negeri': 'SARAWAK', 'parlimen': 'MUKAH', 'dun': 'DALAT'}, + 473: {'negeri': 'SARAWAK', 'parlimen': 'MUKAH', 'dun': 'TELLIAN'}, + 474: {'negeri': 'SARAWAK', 'parlimen': 'MUKAH', 'dun': 'BALINGIAN'}, + 475: {'negeri': 'SARAWAK', 'parlimen': 'SELANGAU', 'dun': 'TAMIN'}, + 476: {'negeri': 'SARAWAK', 'parlimen': 'SELANGAU', 'dun': 'KAKUS'}, + 477: {'negeri': 'SARAWAK', 'parlimen': 'KAPIT', 'dun': 'PELAGUS'}, + 478: {'negeri': 'SARAWAK', 'parlimen': 'KAPIT', 'dun': 'KATIBAS'}, + 479: {'negeri': 'SARAWAK', 'parlimen': 'KAPIT', 'dun': 'BUKIT GORAM'}, + 480: {'negeri': 'SARAWAK', 'parlimen': 'HULU RAJANG', 'dun': 'BALEH'}, + 481: {'negeri': 'SARAWAK', 'parlimen': 'HULU RAJANG', 'dun': 'BELAGA'}, + 482: {'negeri': 'SARAWAK', 'parlimen': 'HULU RAJANG', 'dun': 'MURUM'}, + 483: {'negeri': 'SARAWAK', 'parlimen': 'BINTULU', 'dun': 'JEPAK'}, + 484: {'negeri': 'SARAWAK', 'parlimen': 'BINTULU', 'dun': 'TANJONG BATU'}, + 485: {'negeri': 'SARAWAK', 'parlimen': 'BINTULU', 'dun': 'KEMENA'}, + 486: {'negeri': 'SARAWAK', 'parlimen': 'BINTULU', 'dun': 'SAMALAJU'}, + 487: {'negeri': 'SARAWAK', 'parlimen': 'SIBUTI', 'dun': 'BEKENU'}, + 488: {'negeri': 'SARAWAK', 'parlimen': 'SIBUTI', 'dun': 'LAMBIR'}, + 489: {'negeri': 'SARAWAK', 'parlimen': 'MIRI', 'dun': 'PIASAU'}, + 490: {'negeri': 'SARAWAK', 'parlimen': 'MIRI', 'dun': 'PUJUT'}, + 491: {'negeri': 'SARAWAK', 'parlimen': 'MIRI', 'dun': 'SENADIN'}, + 492: {'negeri': 'SARAWAK', 'parlimen': 'BARAM', 'dun': 'MARUDI'}, + 493: {'negeri': 'SARAWAK', 'parlimen': 'BARAM', 'dun': 'TELANG USAN'}, + 494: {'negeri': 'SARAWAK', 'parlimen': 'BARAM', 'dun': 'MULU'}, + 495: {'negeri': 'SARAWAK', 'parlimen': 'LIMBANG', 'dun': 'BUKIT KOTA'}, + 496: {'negeri': 'SARAWAK', 'parlimen': 'LIMBANG', 'dun': 'BATU DANAU'}, + 497: {'negeri': 'SARAWAK', 'parlimen': 'LAWAS', 'dun': 'BA`KELALAN'}, + 498: {'negeri': 'SARAWAK', 'parlimen': 'LAWAS', 'dun': 'BUKIT SARI'}, + 499: { + 'negeri': 'SELANGOR', + 'parlimen': 'SABAK BERNAM', + 'dun': 'SUNGAI AIR TAWAR', + }, + 500: {'negeri': 'SELANGOR', 'parlimen': 'SABAK BERNAM', 'dun': 'SABAK'}, + 501: { + 'negeri': 'SELANGOR', + 'parlimen': 'SUNGAI BESAR', + 'dun': 'SUNGAI PANJANG', + }, + 502: {'negeri': 'SELANGOR', 'parlimen': 'SUNGAI BESAR', 'dun': 'SEKINCHAN'}, + 503: { + 'negeri': 'SELANGOR', + 'parlimen': 'HULU SELANGOR', + 'dun': 'HULU BERNAM', + }, + 504: { + 'negeri': 'SELANGOR', + 'parlimen': 'HULU SELANGOR', + 'dun': 'KUALA KUBU BAHARU', + }, + 505: { + 'negeri': 'SELANGOR', + 'parlimen': 'HULU SELANGOR', + 'dun': 'BATANG KALI', + }, + 506: { + 'negeri': 'SELANGOR', + 'parlimen': 'TANJONG KARANG', + 'dun': 'SUNGAI BURONG', + }, + 507: { + 'negeri': 'SELANGOR', + 'parlimen': 'TANJONG KARANG', + 'dun': 'PERMATANG', + }, + 508: { + 'negeri': 'SELANGOR', + 'parlimen': 'KUALA SELANGOR', + 'dun': 'BUKIT MELAWATI', + }, + 509: {'negeri': 'SELANGOR', 'parlimen': 'KUALA SELANGOR', 'dun': 'IJOK'}, + 510: {'negeri': 'SELANGOR', 'parlimen': 'KUALA SELANGOR', 'dun': 'JERAM'}, + 511: {'negeri': 'SELANGOR', 'parlimen': 'SELAYANG', 'dun': 'KUANG'}, + 512: {'negeri': 'SELANGOR', 'parlimen': 'SELAYANG', 'dun': 'RAWANG'}, + 513: {'negeri': 'SELANGOR', 'parlimen': 'SELAYANG', 'dun': 'TAMAN TEMPLER'}, + 514: {'negeri': 'SELANGOR', 'parlimen': 'GOMBAK', 'dun': 'BATU CAVES'}, + 515: {'negeri': 'SELANGOR', 'parlimen': 'GOMBAK', 'dun': 'GOMBAK SETIA'}, + 516: {'negeri': 'SELANGOR', 'parlimen': 'GOMBAK', 'dun': 'HULU KELANG'}, + 517: { + 'negeri': 'SELANGOR', + 'parlimen': 'AMPANG', + 'dun': 'BUKIT ANTARABANGSA', + }, + 518: {'negeri': 'SELANGOR', 'parlimen': 'AMPANG', 'dun': 'LEMBAH JAYA'}, + 519: {'negeri': 'SELANGOR', 'parlimen': 'PANDAN', 'dun': 'CHEMPAKA'}, + 520: {'negeri': 'SELANGOR', 'parlimen': 'PANDAN', 'dun': 'TERATAI'}, + 521: {'negeri': 'SELANGOR', 'parlimen': 'HULU LANGAT', 'dun': 'DUSUN TUA'}, + 522: {'negeri': 'SELANGOR', 'parlimen': 'HULU LANGAT', 'dun': 'SEMENYIH'}, + 523: {'negeri': 'SELANGOR', 'parlimen': 'HULU LANGAT', 'dun': 'KAJANG'}, + 524: {'negeri': 'SELANGOR', 'parlimen': 'SERDANG', 'dun': 'BANGI'}, + 525: {'negeri': 'SELANGOR', 'parlimen': 'SERDANG', 'dun': 'BALAKONG'}, + 526: {'negeri': 'SELANGOR', 'parlimen': 'SERDANG', 'dun': 'SERI KEMBANGAN'}, + 527: {'negeri': 'SELANGOR', 'parlimen': 'PUCHONG', 'dun': 'SERI SERDANG'}, + 528: {'negeri': 'SELANGOR', 'parlimen': 'PUCHONG', 'dun': 'KINRARA'}, + 529: { + 'negeri': 'SELANGOR', + 'parlimen': 'KELANA JAYA', + 'dun': 'SUBANG JAYA', + }, + 530: {'negeri': 'SELANGOR', 'parlimen': 'KELANA JAYA', 'dun': 'SERI SETIA'}, + 531: { + 'negeri': 'SELANGOR', + 'parlimen': 'PETALING JAYA SELATAN', + 'dun': 'TAMAN MEDAN', + }, + 532: { + 'negeri': 'SELANGOR', + 'parlimen': 'PETALING JAYA SELATAN', + 'dun': 'BUKIT GASING', + }, + 533: { + 'negeri': 'SELANGOR', + 'parlimen': 'PETALING JAYA UTARA', + 'dun': 'KAMPUNG TUNKU', + }, + 534: { + 'negeri': 'SELANGOR', + 'parlimen': 'PETALING JAYA UTARA', + 'dun': 'DAMANSARA UTAMA', + }, + 535: {'negeri': 'SELANGOR', 'parlimen': 'SUBANG', 'dun': 'BUKIT LANJAN'}, + 536: {'negeri': 'SELANGOR', 'parlimen': 'SUBANG', 'dun': 'PAYA JARAS'}, + 537: {'negeri': 'SELANGOR', 'parlimen': 'SUBANG', 'dun': 'KOTA DAMANSARA'}, + 538: { + 'negeri': 'SELANGOR', + 'parlimen': 'SHAH ALAM', + 'dun': 'KOTA ANGGERIK', + }, + 539: {'negeri': 'SELANGOR', 'parlimen': 'SHAH ALAM', 'dun': 'BATU TIGA'}, + 540: {'negeri': 'SELANGOR', 'parlimen': 'KAPAR', 'dun': 'MERU'}, + 541: {'negeri': 'SELANGOR', 'parlimen': 'KAPAR', 'dun': 'SEMENTA'}, + 542: {'negeri': 'SELANGOR', 'parlimen': 'KAPAR', 'dun': 'SUNGAI PINANG'}, + 543: {'negeri': 'SELANGOR', 'parlimen': 'KAPAR', 'dun': 'SELAT KLANG'}, + 544: {'negeri': 'SELANGOR', 'parlimen': 'KLANG', 'dun': 'PELABUHAN KLANG'}, + 545: {'negeri': 'SELANGOR', 'parlimen': 'KLANG', 'dun': 'PANDAMARAN'}, + 546: {'negeri': 'SELANGOR', 'parlimen': 'KLANG', 'dun': 'KOTA ALAM SHAH'}, + 547: {'negeri': 'SELANGOR', 'parlimen': 'KOTA RAJA', 'dun': 'SERI ANDALAS'}, + 548: {'negeri': 'SELANGOR', 'parlimen': 'KOTA RAJA', 'dun': 'SRI MUDA'}, + 549: { + 'negeri': 'SELANGOR', + 'parlimen': 'KUALA LANGAT', + 'dun': 'SIJANGKANG', + }, + 550: { + 'negeri': 'SELANGOR', + 'parlimen': 'KUALA LANGAT', + 'dun': 'TELUK DATUK', + }, + 551: {'negeri': 'SELANGOR', 'parlimen': 'KUALA LANGAT', 'dun': 'MORIB'}, + 552: {'negeri': 'SELANGOR', 'parlimen': 'SEPANG', 'dun': 'TANJONG SEPAT'}, + 553: {'negeri': 'SELANGOR', 'parlimen': 'SEPANG', 'dun': 'DENGKIL'}, + 554: {'negeri': 'SELANGOR', 'parlimen': 'SEPANG', 'dun': 'SUNGAI PELEK'}, + 555: {'negeri': 'TERENGGANU', 'parlimen': 'BESUT', 'dun': 'KUALA BESUT'}, + 556: {'negeri': 'TERENGGANU', 'parlimen': 'BESUT', 'dun': 'KOTA PUTERA'}, + 557: {'negeri': 'TERENGGANU', 'parlimen': 'BESUT', 'dun': 'JERTIH'}, + 558: {'negeri': 'TERENGGANU', 'parlimen': 'BESUT', 'dun': 'HULU BESUT'}, + 559: {'negeri': 'TERENGGANU', 'parlimen': 'SETIU', 'dun': 'JABI'}, + 560: {'negeri': 'TERENGGANU', 'parlimen': 'SETIU', 'dun': 'PERMAISURI'}, + 561: {'negeri': 'TERENGGANU', 'parlimen': 'SETIU', 'dun': 'LANGKAP'}, + 562: {'negeri': 'TERENGGANU', 'parlimen': 'SETIU', 'dun': 'BATU RAKIT'}, + 563: {'negeri': 'TERENGGANU', 'parlimen': 'KUALA NERUS', 'dun': 'TEPUH'}, + 564: { + 'negeri': 'TERENGGANU', + 'parlimen': 'KUALA NERUS', + 'dun': 'TELUK PASU', + }, + 565: { + 'negeri': 'TERENGGANU', + 'parlimen': 'KUALA NERUS', + 'dun': 'SEBERANG TAKIR', + }, + 566: { + 'negeri': 'TERENGGANU', + 'parlimen': 'KUALA NERUS', + 'dun': 'BUKIT TUNGGAL', + }, + 567: { + 'negeri': 'TERENGGANU', + 'parlimen': 'KUALA TERENGGANU', + 'dun': 'WAKAF MEMPELAM', + }, + 568: { + 'negeri': 'TERENGGANU', + 'parlimen': 'KUALA TERENGGANU', + 'dun': 'BANDAR', + }, + 569: { + 'negeri': 'TERENGGANU', + 'parlimen': 'KUALA TERENGGANU', + 'dun': 'LADANG', + }, + 570: { + 'negeri': 'TERENGGANU', + 'parlimen': 'KUALA TERENGGANU', + 'dun': 'BATU BURUK', + }, + 571: {'negeri': 'TERENGGANU', 'parlimen': 'MARANG', 'dun': 'ALUR LIMBAT'}, + 572: {'negeri': 'TERENGGANU', 'parlimen': 'MARANG', 'dun': 'BUKIT PAYUNG'}, + 573: {'negeri': 'TERENGGANU', 'parlimen': 'MARANG', 'dun': 'RU RENDANG'}, + 574: { + 'negeri': 'TERENGGANU', + 'parlimen': 'MARANG', + 'dun': 'PENGKALAN BERANGAN', + }, + 575: { + 'negeri': 'TERENGGANU', + 'parlimen': 'HULU TERENGGANU', + 'dun': 'TELEMUNG', + }, + 576: { + 'negeri': 'TERENGGANU', + 'parlimen': 'HULU TERENGGANU', + 'dun': 'MANIR', + }, + 577: { + 'negeri': 'TERENGGANU', + 'parlimen': 'HULU TERENGGANU', + 'dun': 'KUALA BERANG', + }, + 578: {'negeri': 'TERENGGANU', 'parlimen': 'HULU TERENGGANU', 'dun': 'AJIL'}, + 579: {'negeri': 'TERENGGANU', 'parlimen': 'DUNGUN', 'dun': 'BUKIT BESI'}, + 580: {'negeri': 'TERENGGANU', 'parlimen': 'DUNGUN', 'dun': 'RANTAU ABANG'}, + 581: {'negeri': 'TERENGGANU', 'parlimen': 'DUNGUN', 'dun': 'SURA'}, + 582: {'negeri': 'TERENGGANU', 'parlimen': 'DUNGUN', 'dun': 'PAKA'}, + 583: {'negeri': 'TERENGGANU', 'parlimen': 'KEMAMAN', 'dun': 'KEMASIK'}, + 584: {'negeri': 'TERENGGANU', 'parlimen': 'KEMAMAN', 'dun': 'KIJAL'}, + 585: {'negeri': 'TERENGGANU', 'parlimen': 'KEMAMAN', 'dun': 'CUKAI'}, + 586: {'negeri': 'TERENGGANU', 'parlimen': 'KEMAMAN', 'dun': 'AIR PUTIH'}, + 587: {'negeri': 'WILAYAH PERSEKUTUAN', 'parlimen': 'KEPONG', 'dun': 'NAN'}, + 588: { + 'negeri': 'WILAYAH PERSEKUTUAN', + 'parlimen': 'WANGSA MAJU', + 'dun': 'NAN', + }, + 589: { + 'negeri': 'WILAYAH PERSEKUTUAN', + 'parlimen': 'SEGAMBUT', + 'dun': 'NAN', + }, + 590: { + 'negeri': 'WILAYAH PERSEKUTUAN', + 'parlimen': 'SETIAWANGSA', + 'dun': 'NAN', + }, + 591: { + 'negeri': 'WILAYAH PERSEKUTUAN', + 'parlimen': 'TITIWANGSA', + 'dun': 'NAN', + }, + 592: { + 'negeri': 'WILAYAH PERSEKUTUAN', + 'parlimen': 'BUKIT BINTANG', + 'dun': 'NAN', + }, + 593: { + 'negeri': 'WILAYAH PERSEKUTUAN', + 'parlimen': 'LEMBAH PANTAI', + 'dun': 'NAN', + }, + 594: {'negeri': 'WILAYAH PERSEKUTUAN', 'parlimen': 'SEPUTEH', 'dun': 'NAN'}, + 595: {'negeri': 'WILAYAH PERSEKUTUAN', 'parlimen': 'CHERAS', 'dun': 'NAN'}, + 596: { + 'negeri': 'WILAYAH PERSEKUTUAN', + 'parlimen': 'BANDAR TUN RAZAK', + 'dun': 'NAN', + }, + 597: { + 'negeri': 'WILAYAH PERSEKUTUAN', + 'parlimen': 'PUTRAJAYA', + 'dun': 'NAN', + }, + 598: {'negeri': 'WILAYAH PERSEKUTUAN', 'parlimen': 'LABUAN', 'dun': 'NAN'}, +} diff --git a/malaya/topic/shortform.py b/malaya/topic/shortform.py new file mode 100644 index 00000000..b30c0060 --- /dev/null +++ b/malaya/topic/shortform.py @@ -0,0 +1,17 @@ +shortform = { + 'parti islam semalaysia': ['parti islam semalaysia', 'pas'], + 'parti keadilan rakyat': ['parti keadilan rakyat', 'pkr'], + 'parti amanah': ['parti amanah', 'pan'], + 'democratic action party': ['dap', 'democratic action party'], + 'Pilihan Raya Umum Ke-14': ['ge', 'pru', 'pilihan raya umum ke-14'], + 'malaysian chinese association': ['malaysian chinese association', 'mca'], + 'pakatan harapan': ['ph', 'pakatan harapan'], + 'barisan nasional': ['bn', 'barisan nasional'], + 'universiti malaya': ['universiti malaya', 'um'], + 'universiti islam antarabangsa': [ + 'universiti islam antarabangsa', + 'uia', + 'iium', + ], + 'maktab rendah sains mara': ['mjsc', 'mrsm', 'maktab rendah sains mara'], +} diff --git a/malaya/topic/topic.py b/malaya/topic/topic.py new file mode 100644 index 00000000..d614bf39 --- /dev/null +++ b/malaya/topic/topic.py @@ -0,0 +1,718 @@ +topic = { + 'mahathir': [ + 'tun mahathir', + 'madey', + 'dr mahathir', + 'tun m', + 'mahathir', + 'madir', + 'dr m', + 'mahathir muhamad', + ], + 'anwar ibrahim': ['anwar ibrahim', 'anwar'], + 'najib razak': [ + 'najib razak', + 'ajib', + 'pakjib', + 'pok jib', + 'pak jib', + 'najib', + 'tan sri najib', + ], + 'pakatan harapan': ['pakatan harapan'], + 'syed saddiq': ['syed saddiq', 'syedsaddiq', 'saddiq'], + 'parti keadilan rakyat': ['parti keadilan rakyat', 'people justice party'], + 'umno': ['united malays', 'umno', 'united malays national organization'], + 'barisan nasional': ['barisan nasional'], + 'parti islam semalaysia': [ + 'parti islam', + 'malaysian islamic party', + 'parti islam semalaysia', + 'parti islam malaysia', + ], + 'nurul izzah': ['nurul izzah', 'izzah'], + 'Tunku Ismail Idris': ['tunku ismail', 'tunku ismail idris', 'tmj'], + 'pdrm': [ + 'royal police malaysia', + 'polis diraja malaysia', + 'pdrm', + 'polis', + 'polis diraja', + ], + '1mdb': [ + '1mdb', + '1malaysia development berhad', + '1malaysia development', + '1malaysia development bhd', + 'mdb', + ], + 'makanan': [ + 'kfc', + 'murtabak', + 'sate', + 'nasi', + 'nandos', + 'mcdonald', + 'mcd', + 'makanan', + 'martabak', + 'roti', + 'canai', + 'sushi king', + ], + 'ganja': ['cannabis', 'heroin', 'weed', 'ganja'], + 'gst': ['gst', 'good service tax'], + 'malaysian chinese association': ['malaysian chinese association'], + 'democratic action party': ['democratic action party'], + 'amanah': ['national trust party', 'amanah', 'parti amanah negara'], + 'ppbm': [ + 'parti pribumi bersatu malaysia', + 'ppbm', + 'malaysian united', + 'parti pribumi', + 'malaysian united indigenous party', + ], + 'mic': [ + 'malaysian indian', + 'malaysian indian congress', + 'indian congress', + 'mic', + ], + 'kerajaan': ['gemen', 'kerajaan', 'kemen', 'gomen', 'government'], + 'pembangkang': ['opposition', 'pembangkang'], + 'tiga penjuru': ['tiga penjuru'], + 'Pilihan Raya Umum Ke-14': [ + 'election', + 'ge14', + 'pilihan raya', + 'pilihan raya umum ke-14', + 'pru14', + ], + 'Pusat Daerah Mangundi': ['pdm', 'pusat daerah mangundi', 'pusat mengundi'], + 'Tun Daim Zainuddin': [ + 'daim zainuddin', + 'daim', + 'tun daim', + 'tun daim zainuddin', + ], + 'Datuk Seri Abdul Hadi Awang': [ + 'hadi', + 'datuk seri abdul hadi awang', + 'hadi awang', + ], + 'Majlis Pakatan Harapan': ['majlis pakatan harapan'], + 'Wan Azizah': ['kak wan', 'azizah', 'wan azizah'], + 'Parti Pribumi Bersatu Malaysia': [ + 'parti pribumi bersatu malaysia', + 'ppbm', + 'parti bersatu', + 'parti pribumi', + ], + 'Datuk Seri Azmin Ali': ['azmin ali', 'datuk seri azmin ali', 'azmin'], + 'masalah air': ['air', 'masalah air', 'isu air'], + 'orang asli': [ + 'perkampungan asli', + 'perkampungan orang asli', + 'orang asli', + 'tenau', + ], + 'Datuk Johari Abdul': ['johari', 'johari abdul', 'datuk johari abdul'], + 'Tengku Razaleigh Hamzah': ['tengku razaleigh hamzah', 'razaleigh'], + 'Tan Sri Dr Rais Yatim': ['rais yatim', 'tan sri dr rais yatim'], + 'kaum cina': ['cina', 'chinese', 'kaum cina'], + 'k-pop': ['korea', 'k-pop'], + 'kaum india': ['kaum india', 'india', 'indian'], + 'rafidah aziz': ['rafidah', 'rafidah aziz'], + 'rumah mampu milik': ['rmm', 'mampu milik', 'rmmj', 'rumah mampu milik'], + 'universiti teknologi mara': [ + 'universiti teknologi mara', + 'teknologi mara', + 'uitm', + ], + 'universiti teknologi malaysia': ['utm', 'universiti teknologi malaysia'], + 'universiti malaya': ['universiti malaya'], + 'pendidikan': [ + 'peruntukan', + 'pendidikan', + 'sekolah', + 'tvet', + 'untuk semua', + 'universiti', + 'asean', + 'prasekolah', + 'vokasional', + 'ilmu', + ], + 'sekolah': ['sekolah'], + 'universiti': ['universiti'], + 'maktab rendah sains mara': ['maktab rendah sains mara'], + 'pos laju': ['pos laju', 'poslaju'], + 'hari raya': ['aidiladha', 'aidilfitri', 'hari raya'], + 'kesihatan': [ + 'denggi', + 'klinik', + 'fiber', + 'kencing manis', + 'diet', + 'kanser', + 'vitamin', + 'pusat jantung', + 'kesihatan', + 'hospital', + ], + 'kewangan': ['hutang negara', 'kewangan', 'ekonomi negara', 'bank'], + 'hutang negara': [ + 'national debt', + 'malaysian debt', + 'hutang negara', + 'malaysia debt', + ], + 'ekonomi': [ + 'asia tenggara', + 'dftz', + 'pelabur', + 'ekonomi', + 'dagang', + 'modal teroka', + 'swasta', + 'magic', + 'cradle', + 'stvp', + 'map', + 'keusahawan', + 'bebas digital', + 'global', + 'ekonomi digital', + 'mycreative', + ], + 'sosial': [ + 'sosial', + 'kehidupan', + 'taraf hidup', + 'sosiologi', + 'keusahawan', + 'masyarakat', + ], + 'politik': [ + 'pru', + 'transformasi', + 'exco', + 'menteri besar', + 'kabinet', + 'jawatan', + 'debat', + 'menteri', + 'politik', + 'senator', + 'parti', + 'pemimpin', + 'undi luar', + 'calon speaker', + ], + 'startup companies': [ + 'pelabur', + 'cradle', + 'magic', + 'startup companies', + 'keusahawan sosial', + 'startup', + 'ekonomi digital', + 'mycreative', + ], + 'felda': [ + 'lembaga kemajuan tanah persekutuan', + 'federal land development authority', + 'felda global ventures', + 'felda', + ], + 'kwsp': ['epf', 'employees provident fund', 'kwsp', 'kumpulan wang'], + 'bank malaysia': [ + 'ocbc', + 'cimb', + 'citibank', + 'hsbc', + 'affin bank', + 'alliance bank', + 'bangkok bank', + 'hong leong bank', + 'ambank', + 'bank malaysia', + 'rhb', + ], + 'bank negara': ['bank negara'], + 'perdana menteri': ['perdana menteri', 'prime minister'], + 'timbalan perdana menteri': [ + 'deputy prime minister', + 'timbalan perdana menteri', + ], + 'menteri dalam negeri': [ + 'ministry of home affairs', + 'menteri dalam negeri', + ], + 'menteri kewangan': ['menteri kewangan', 'ministry of finance', 'mof'], + 'menteri pertahanan': ['menteri pertahanan', 'minister of defence'], + 'majlis penasihat': [ + 'tun daim', + 'zeti aziz', + 'council of elders', + 'ks jomo', + 'robert kuok', + 'majlis penasihat', + 'hassan merican', + ], + 'skim peduli sihat': ['skim peduli sihat'], + 'ptptn': [ + 'ptptn', + 'perbadanan tabung pendidikan tinggi nasional', + 'tabung pendidikan', + ], + 'projek mega': ['projek mega'], + 'gaji minimum': ['gaji minimum'], + 'menyiasat skandal': [ + 'korupsi kerajaan', + 'skandal bn', + 'skandal kerajaan', + 'government scandal', + 'menyiasat skandal', + ], + 'highway tol': [ + 'highway tol', + 'tol', + 'hapuskan tol', + 'harga tol', + 'kutipan tol', + ], + 'tabung haji': ['tabung haji'], + 'tentera malaysia': [ + 'tentera', + 'malaysian armed forces', + 'tentera udara', + 'tentera malaysia', + 'tentera darat', + 'tentera laut', + ], + 'infrastruktur': [ + 'luar bandar', + 'pan borneo', + 'infrastruktur', + 'lebuhraya pan borneo', + 'transformasi luar bandar', + 'belb', + 'bekalan elektrik', + 'bekalan air', + ], + 'kos sara hidup': [ + 'bantuan rakyat', + 'k1m', + 'brim', + 'kos sara hidup', + 'br1m', + 'bantuan pelajar', + ], + 'pengangkutan awam': ['lrt', 'terminal', 'pengangkutan awam', 'bas', 'mrt'], + 'perkhidmatan awam': [ + 'dasar pengambilan', + 'perkhidmatan awam', + 'oku', + 'peluang pekerjaan', + 'utc', + 'rtc', + ], + 'wanita': ['wanita', 'talentcorp', 'dewi', 'kembali bekerja'], + 'rafizi ramli': ['rafizi', 'rafizi ramli'], + 'bersatu': ['bersatu'], + 'bernama': ['bernama'], + 'rela': ['rela', 'anggota jabatan sukarelawan malaysia'], + 'kementerian dalam negeri': ['kementerian dalam negeri', 'kdn'], + 'donald trump': ['trump', 'donald', 'donald trump'], + 'kaum melayu': ['malay', 'melayu', 'kaum melayu'], + 'Survei Institut Darul Ehsan': [ + 'survei institut', + 'survei institut darul ehsan', + ], + 'Inisiatif Peduli Rakyat': [ + 'peduli rakyat', + 'ipr', + 'inisiatif peduli rakyat', + ], + 'astro awani': ['astro', 'astro awani', 'awani'], + 'Datuk Seri Ti Lian Ker': ['ti lian', 'datuk seri ti lian ker', 'lian ker'], + 'Nga Kor Ming': ['kor ming', 'nga kor ming'], + 'Lee Kuan Yew': ['kuan yew', 'lee kuan yew'], + 'rosmah mansur': ['rosmah', 'rosmah mansur'], + 'facebook': ['fb', 'facebook'], + '1malaysia': ['1malaysia'], + 'petronas': ['petronas'], + 'keluar parti': [ + 'pemecatan ahli', + 'khianati parti', + 'khianat parti', + 'keluar parti', + ], + 'sabotaj parti': ['sabotaj calon', 'sabotaj parti'], + 'kotak undi': ['spr', 'kotak undi', 'salah kotak'], + 'perkasa': ['pertubuhan pribumi perkasa', 'pertubuhan pribumi', 'perkasa'], + 'Tan Sri Mokhzani Mahathir': [ + 'tan sri mokhzani mahathir', + 'mokhzani', + 'mokhzani mahathir', + ], + 'teknologi': [ + 'smartphone', + 'machine learning', + 'fiber optic', + 'telefon pintar', + 'big data', + 'kecerdasan buatan', + 'teknologi', + 'internet', + 'artificial intelligence', + 'iot', + 'drone', + ], + 'internet': ['broadband', 'fiber optic', '4g', '3g', 'internet'], + 'artificial intelligence': [ + 'artificial intelligence', + 'bayes', + 'machine learning', + ], + 'humanoid': ['humanoid', 'robot', 'sofia humanoid'], + 'Rais Yatim': ['rais yatim', 'rais'], + 'Anthony Loke Siew Fook': ['anthony loke siew fook', 'loke siew'], + 'Ahli Dewan Undangan Negeri': [ + 'ahli dewan undangan negeri', + 'ahli dewan undangan', + 'adun', + ], + '#fakenews': ['#fakenews', 'fake news', 'berita palsu'], + 'suruhanjaya pilihan raya malaysia': [ + 'suruhanjaya pilihan raya', + 'spr', + 'suruhanjaya pilihan raya malaysia', + 'sprm', + ], + 'kertas undi': ['kertas undi'], + 'KKMM': [ + 'kementerian komunikasi multimedia', + 'kkmm', + 'kementerian komunikasi', + 'kementerian komunikasi dan multimedia', + ], + 'akta pilihan raya': ['akta pilihan raya'], + 'undi pos': ['undian pos', 'pengundi pos', 'undi pos'], + 'undi rosak': ['undi rosak', '#undirosak'], + 'harga minyak': [ + 'ron95', + 'harga minyak', + 'oil', + 'petrol', + 'diesel', + 'minyak', + 'ron97', + ], + 'petrol': ['ron95', 'ron', 'petrol', 'ron97'], + 'government subsidies': ['government subsidies', 'subsidies'], + 'akademik': [ + 'akademik', + 'phd', + 'ijazah', + 'sarjana', + 'degree', + 'diploma', + 'master', + ], + 'mh370': ['mh370'], + 'kemelangan penumpang cedera': [ + 'penumpang cedera', + 'kemelangan penumpang cedera', + ], + 'kemelangan maut': ['kemelangan maut', 'maut'], + 'Recep Tayyip Erdogan': ['recep tayyip', 'recep tayyip erdogan', 'erdogan'], + 'individu penjara': ['penjara', 'individu penjara'], + 'kes rogol': ['kes rogol', 'rogol'], + 'isytihar darurat': ['isytihar darurat', 'darurat'], + 'cambridge analytica': [ + 'analytica', + 'strategic communication laboratories', + 'cambridge analytica', + ], + 'kokain': ['kokain', 'cocaine'], + 'bebas tahanan': ['tahanan', 'tahanan bebas', 'bebas tahanan'], + 'sosial media': ['fb', 'instragram', 'twitter', 'sosial media', 'facebook'], + 'twitter': ['twitter'], + 'instagram': ['instagram'], + 'mati dipukul': ['mati dipukul'], + 'pengedar dadah': ['dadah', 'pengedar dadah', 'pengedar'], + 'kematian wabak': ['ebola', 'penyakit', 'wabak', 'h1n1', 'kematian wabak'], + 'letupan bom': ['letupan bom', 'pengebom', 'bom'], + 'isu dadah': ['dadah', 'isu dadah'], + 'diesel': ['diesel'], + 'china': ['china'], + 'saudi arabia': ['arab', 'saudi arabia', 'saudi'], + 'gaji menteri': ['gaji menteri'], + 'jabatan bubar': ['jabatan bubar', 'dibubarkan', 'bubar'], + 'harakah': ['harakah'], + 'apple product': [ + 'apple product', + 'macintosh', + 'airpod', + 'iphone', + 'ipad', + 'imac', + 'macbook', + 'apple', + ], + 'iphone': ['iphone'], + 'samsung smartphone': [ + 'samsung smartphone', + 'samsung galaxy', + 'samsung note', + ], + 'huawei smartphone': [ + 'huawei mate', + 'huawei nova', + 'huawei smartphone', + 'huawei honor', + 'huawei p', + ], + 'xiaomi smartphone': ['xiaomi mi', 'xiaomi redmi', 'xiaomi smartphone'], + 'asus smartphone': ['asus smartphone', 'zenfone'], + 'oppo smartphone': ['oppo smartphone', 'oppo r', 'oppo f', 'oppo a'], + 'lenovo smartphone': [ + 'lenovo phab', + 'lenovo smartphone', + 'lenovo vibe', + 'lenovo a', + ], + 'vivo smartphone': ['vivo y', 'vivo smartphone', 'vivo v'], + 'telekom malaysia': [ + 'telekom malaysia', + 'unifi', + 'streamyx', + 'telekom', + 'tm net', + 'axiata', + ], + 'unifi': ['unifi'], + 'robert kuok': ['robert kuok', 'kuok'], + 'macc': ['macc'], + 'piala thomas': ['piala thomas'], + 'fifa': ['world cup', 'piala dunia', 'fifa'], + 'programming language': [ + 'ruby', + 'programming language', + 'c++', + 'java', + 'python', + ], + 'agama': [ + 'lesbian', + 'muslim', + 'lgbt', + 'free thinker', + 'kafir', + 'agama', + 'kristian', + 'islam', + 'gay', + 'buddha', + ], + 'lgbt': [ + 'lesbian', + 'asexual', + 'lgbt', + 'gay', + 'transgender', + 'bisexual', + 'biseksual', + ], + 'islam': ['muslim', 'kafir', 'hadis', 'syiah', 'islam', 'wahabi'], + 'masyarakat': [ + 'free thinker', + 'konservatif', + 'komunis', + 'liberalisme', + 'sosialis', + 'masyarakat', + ], + 'idealogi': [ + 'idealogi', + 'konservatif', + 'liberal', + 'komunis', + 'kapitalis', + 'sosialis', + ], + 'parlimen': ['parlimen'], + 'Pusat Transformasi Bandar': [ + 'pusat transformasi bandar', + 'utc', + 'pusat transformasi', + ], + 'gerakan': ['gerakan', 'gerakan rakyat malaysia', 'parti gerakan'], + 'institut diraja': [ + 'sultan', + 'institut diraja', + 'diraja', + 'institusi diraja', + 'kerabat', + ], + 'tsunami fitnah': [ + 'bohong', + 'tsunami politik', + 'janji palsu', + 'tiada modal', + 'tsunami', + 'tsunami fitnah', + 'fitnah', + 'jual cerita', + ], + 'makro-ekonomi': [ + 'macroeconomies', + 'makroekonomi', + 'macroeconomy', + 'makro-ekonomi', + ], + 'mikro-ekonomi': [ + 'microeconomy', + 'mikroekonomi', + 'mikro-ekonomi', + 'microeconomies', + ], + 'stock market malaysia': [ + 'macroeconomic impact', + 'usdmyr', + 'stock market malaysia', + 'economic policies', + 'stock votality', + 'subsidiaries', + 'national stock', + 'bloomberg', + 'foreign investor', + 'malaysia stock market', + 'malaysia revenue', + ], + 'government revenue': [ + 'stock market', + 'government revenue', + 'credit negative', + 'subsidies', + 'fuel subsidies', + 'foreign investor', + 'tax', + 'fiscal position', + 'moody', + ], + 'ringgit fall': [ + 'power transition', + 'ringgit', + 'ekonomi', + 'malaysian economy', + 'oil related', + 'subsidies', + 'ringgit fall', + 'foreign investor', + 'shock vote', + 'tax', + 'revenue', + 'moody', + ], + 'bloomberg': ['bloomberg'], + 'new straits times': [ + 'pro-government', + 'new straits times', + 'english newspaper', + 'straits times', + 'right wing', + 'media prima', + ], + 'the star': ['the star'], + 'malay mail': ['malay mail'], + 'median salary': [ + 'monthly salary', + 'median salary', + 'department of statistics', + 'per anum', + 'overtime', + 'employee', + 'wage', + 'allowance', + ], + 'bursa malaysia': ['bursa malaysia', 'bursa'], + 'bumiputra': ['bumi putra', 'bumiputra', 'melayu'], + 'universiti islam antarabangsa': ['universiti islam antarabangsa'], + 'baling botol': ['baling botol'], + 'child marriage': ['child marriage', 'kahwin bawah umur', 'kahwin budak'], + 'bridge city park': ['bridge city park', 'citi park'], + 'malaysia baru': ['malaysia baharu', 'malaysia baru'], + 'produk berbahaya': ['produk berbahaya'], + 'keluar parlimen': ['keluar parlimen'], + 'musim durian': ['durian', 'musim durian'], + 'world cup': ['world cup', 'fifa'], + 'rtm': ['radio televisyen malaysia', 'rtm'], + 'motogp': ['motogp'], + 'euro 2020': ['euro 2020'], + 'ask me a question': ['ask me a question'], + 'thai cave': ['thai cave'], + 'dewan rakyat': ['dewan rakyat', 'dato ariff', 'parliament house'], + 'tabung harapan': ['tabung harapan'], + 'racist': ['racist', 'perkauman'], + 'singapura': ['singapura', 'singapore'], + 'sst': ['sales and service tax', 'sales service tax', 'sst'], + 'malaysia-indonesia': ['malaysia-indonesia'], + 'gaza': ['gaza'], + 'bola sepak': ['bola sepak'], + 'sepak takraw': ['sepak takraw'], + 'isu sosma': ['isu sosma', 'sosma'], + 'isu ecrl': ['isu ecrl', 'ecrl'], + 'royalti minyak': ['royalti minyak'], + 'Jabatan Agama Islam Wilayah Persekutuan': [ + 'jawi', + 'jabatan agama islam wilayah persekutuan', + ], + 'sinar harian': ['sinar harian'], + 'reformasi': ['reformasi'], + 'kes rasuah': ['kes rasuah', 'rasuah'], + 'kewangan dan perniagaan': [ + 'kewangan', + 'niaga', + 'perniagaan', + 'duit', + 'kewangan dan perniagaan', + 'wang', + ], + 'saham dan komoditi': ['wang', 'saham', 'saham dan komoditi', 'komoditi'], + 'isu kerugian': [ + 'mata wang jatuh', + 'isu kerugian', + 'saham jatuh', + 'kerugian', + ], + 'isu bumiputera': [ + 'melayu', + 'isu bumiputera', + 'bumiputera', + 'cina', + 'india', + ], + 'alam sekitar': ['alam sekitar', 'hidupan liar', 'biodiversiti', 'hutan'], + 'isu kemiskinan': [ + 'duit takde', + 'kemiskinan', + 'takda duit', + 'takde duit', + 'isu kemiskinan', + 'miskin', + 'duit takda', + ], + 'sumber asli': [ + 'emas', + 'sumber asli', + 'getah', + 'sawit', + 'timah', + 'perak', + 'besi', + 'kuprum', + ], +} diff --git a/malaya/topic_influencer.py b/malaya/topic_influencer.py deleted file mode 100644 index c957d221..00000000 --- a/malaya/topic_influencer.py +++ /dev/null @@ -1,807 +0,0 @@ -import sys -import warnings - -if not sys.warnoptions: - warnings.simplefilter('ignore') - -import re -import os -import random -import numpy as np -from fuzzywuzzy import fuzz -from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer -from sklearn.metrics.pairwise import cosine_similarity -from sklearn.utils import shuffle -from .texts._text_functions import ( - STOPWORDS, - STOPWORD_CALON, - simple_textcleaning, - str_idx, -) -from .cluster import sentence_ngram -from . import home, _delete_macos -from ._utils._utils import download_file -from ._models._skip_thought import train_model as skip_train, batch_sequence -from ._models._siamese_lstm import train_model as siamese_train - -_zip_location = home + '/rules-based.zip' -_namacalon = None -_parlimen = None -_dun = None -_negeri = None -_location = None -_person_dict = None -_topic_dict = None -_short_dict = None - - -def _apply_stopwords_calon(string): - string = re.sub('[^A-Za-z ]+', ' ', string) - string = re.sub(r'[ ]+', ' ', string.lower()).strip() - return ' '.join( - [i for i in string.split() if i not in STOPWORD_CALON and len(i) > 1] - ) - - -class _DEEP_SIAMESE_SIMILARITY: - def __init__( - self, sess, model, keys, dictionary, maxlen, is_influencers = False - ): - self._sess = sess - self._model = model - self.keys = keys - self.dictionary = dictionary - self.maxlen = maxlen - self._is_influencers = is_influencers - - def get_similarity(self, string, anchor = 0.5): - """ - Return similar topics / influencers. - - Parameters - ---------- - string: str - anchor: float, (default=0.5) - baseline similarity. - - Returns - ------- - results: list of strings - """ - assert isinstance(string, str), 'input must be a string' - assert isinstance(anchor, float), 'anchor must be a float' - assert ( - anchor > 0 and anchor < 1 - ), 'anchor must be bigger than 0, less than 1' - original_string = simple_textcleaning(string) - strings = [original_string] * len(self.keys) - left = str_idx(strings, self.dictionary, self.maxlen, UNK = 3) - right = str_idx(self.keys, self.dictionary, self.maxlen, UNK = 3) - distances = self._sess.run( - 1 - self._model.distance, - feed_dict = {self._model.X_left: left, self._model.X_right: right}, - ) - where = np.where(distances > anchor)[0] - results = [self.keys[i].lower() for i in where] - for key, vals in _short_dict.items(): - for v in vals: - if v in original_string.split(): - results.append(key.lower()) - break - if self._is_influencers: - for index in np.where( - np.array( - [ - fuzz.token_set_ratio(i, original_string) - for i in _namacalon - ] - ) - >= 80 - )[0]: - results.append(_namacalon[index].lower()) - return list(set(results)) - - -class _DEEP_SIMILARITY: - def __init__( - self, - sess, - model, - vectorized, - keys, - dictionary, - maxlen, - is_influencers = False, - ): - self._sess = sess - self._model = model - self.vectorized = vectorized - self.keys = keys - self.dictionary = dictionary - self.maxlen = maxlen - self._is_influencers = is_influencers - - def get_similarity(self, string, anchor = 0.5): - """ - Return similar topics / influencers. - - Parameters - ---------- - string: str - anchor: float, (default=0.5) - baseline similarity. - - Returns - ------- - results: list of strings - """ - assert isinstance(string, str), 'input must be a string' - assert isinstance(anchor, float), 'anchor must be a float' - assert ( - anchor > 0 and anchor < 1 - ), 'anchor must be bigger than 0, less than 1' - original_string = simple_textcleaning(string) - string = ' '.join(set(original_string.split())) - encoded = self._sess.run( - self._model.get_thought, - feed_dict = { - self._model.INPUT: batch_sequence( - [string], self.dictionary, maxlen = self.maxlen - ) - }, - ) - where = np.where( - cosine_similarity(self.vectorized, encoded)[:, 0] > anchor - )[0] - results = [self.keys[i].lower() for i in where] - for key, vals in _short_dict.items(): - for v in vals: - if v in original_string.split(): - results.append(key.lower()) - break - if self._is_influencers: - for index in np.where( - np.array( - [ - fuzz.token_set_ratio(i, original_string) - for i in _namacalon - ] - ) - >= 80 - )[0]: - results.append(_namacalon[index].lower()) - return list(set(results)) - - -class _FAST_SIMILARITY: - def __init__(self, vectorizer, vectorized, keys, is_influencers = False): - self.vectorizer = vectorizer - self.vectorized = vectorized - self.keys = keys - self._is_influencers = is_influencers - - def get_similarity(self, string, anchor = 0.1): - """ - Return similar topics / influencers. - - Parameters - ---------- - string: str - anchor: float, (default=0.5) - baseline similarity. - - Returns - ------- - results: list of strings - """ - assert isinstance(string, str), 'input must be a string' - assert isinstance(anchor, float), 'anchor must be a float' - assert ( - anchor > 0 and anchor < 1 - ), 'anchor must be bigger than 0, less than 1' - original_string = simple_textcleaning(string) - string = ' '.join(set(original_string.split())) - where = np.where( - cosine_similarity( - self.vectorized, self.vectorizer.transform([string]) - )[:, 0] - > anchor - )[0] - results = [self.keys[i].lower() for i in where] - for key, vals in _short_dict.items(): - for v in vals: - if v in original_string.split(): - results.append(key.lower()) - break - if self._is_influencers: - for index in np.where( - np.array( - [ - fuzz.token_set_ratio(i, original_string) - for i in _namacalon - ] - ) - >= 80 - )[0]: - results.append(_namacalon[index].lower()) - return list(set(results)) - - -def _load_internal_data(): - import pandas as pd - import zipfile - - global _namacalon, _parlimen, _dun, _negeri, _location, _person_dict, _topic_dict, _short_dict - if not os.path.isfile(_zip_location): - print('downloading Topics, Influencers, location data') - download_file('rules-based.zip', _zip_location) - - if not os.path.exists(home + '/rules-based/calon.csv'): - with zipfile.ZipFile(_zip_location, 'r') as zip_ref: - zip_ref.extractall(home) - - _delete_macos() - df = pd.read_csv(home + '/rules-based/calon.csv') - _namacalon = df.NamaCalon.str.lower().unique().tolist() - for i in range(len(_namacalon)): - _namacalon[i] = _apply_stopwords_calon(_namacalon[i]) - _namacalon = list(set(_namacalon)) - - df = pd.read_csv(home + '/rules-based/negeri.csv') - _negeri = df.negeri.str.lower().unique().tolist() - _parlimen = df.parlimen.str.lower().unique().tolist() - _dun = df.dun.str.lower().unique().tolist()[:-1] - - _location = _negeri + _parlimen + _dun - - with open(home + '/rules-based/person-normalized', 'r') as fopen: - person = list(filter(None, fopen.read().split('\n'))) - - _person_dict = {} - for i in range(len(person)): - splitted = person[i].split(':') - uniques = list( - filter( - None, - ( - set( - [k.strip().lower() for k in splitted[1].split(', ')] - + [splitted[0].lower()] - ) - ), - ) - ) - _person_dict[splitted[0]] = uniques - - with open(home + '/rules-based/topic-normalized', 'r') as fopen: - topic = list(filter(None, fopen.read().split('\n'))) - - _topic_dict = {} - for i in range(len(topic)): - splitted = topic[i].split(':') - uniques = list( - filter( - None, - ( - set( - [k.strip().lower() for k in splitted[1].split(', ')] - + [splitted[0].lower()] - ) - ), - ) - ) - _topic_dict[splitted[0]] = uniques - - with open(home + '/rules-based/short-normalized', 'r') as fopen: - short = list(filter(None, fopen.read().split('\n'))) - - _short_dict = {} - for i in range(len(short)): - splitted = short[i].split(':') - uniques = list( - filter( - None, - ( - set( - [k.strip().lower() for k in splitted[1].split(', ')] - + [splitted[0].lower()] - ) - ), - ) - ) - _short_dict[splitted[0]] = uniques - - -def fuzzy_influencer(string): - """ - Return similar influencers. - - Parameters - ---------- - string: str - - Returns - ------- - results: list of strings - """ - if not _person_dict: - _load_internal_data() - assert isinstance(string, str), 'input must be a string' - string = string.lower() - influencers = [] - for key, vals in _person_dict.items(): - for v in vals: - if fuzz.token_set_ratio(v, string) >= 80: - influencers.append(key.lower()) - break - for key, vals in _short_dict.items(): - for v in vals: - if v in string.split(): - influencers.append(key.lower()) - break - - for index in np.where( - np.array([fuzz.token_set_ratio(i, string) for i in _namacalon]) >= 80 - )[0]: - influencers.append(_namacalon[index].lower()) - return list(set(influencers)) - - -def fuzzy_topic(string): - """ - Return similar topics. - - Parameters - ---------- - string: str - - Returns - ------- - results: list of strings - """ - if not _person_dict: - _load_internal_data() - assert isinstance(string, str), 'input must be a string' - string = string.lower() - topics = [] - for key, vals in _topic_dict.items(): - for v in vals: - if fuzz.token_set_ratio(v, string) >= 80: - topics.append(key.lower()) - break - for key, vals in _person_dict.items(): - for v in vals: - if fuzz.token_set_ratio(v, string) >= 80: - topics.append(key.lower()) - break - for key, vals in _short_dict.items(): - for v in vals: - if v in string.split(): - topics.append(key.lower()) - break - - return list(set(topics)) - - -def is_location(string): - """ - check whether a string is a malaysia location. - - Parameters - ---------- - string: str - - Returns - ------- - boolean: bool - """ - if not _person_dict: - _load_internal_data() - for loc in _location: - if fuzz.token_set_ratio(loc.lower(), string) >= 90: - return True - return False - - -def fuzzy_location(string): - """ - Return similar _location. - - Parameters - ---------- - string: str - - Returns - ------- - results: list of strings - """ - if not _person_dict: - _load_internal_data() - assert isinstance(string, str), 'input must be a string' - negeri_list = list( - set([i for i in _negeri if fuzz.token_set_ratio(i, string) >= 80]) - ) - parlimen_list = list( - set([i for i in _parlimen if fuzz.token_set_ratio(i, string) >= 80]) - ) - dun_list = list( - set([i for i in _dun if fuzz.token_set_ratio(i, string) >= 80]) - ) - return {'negeri': negeri_list, 'parlimen': parlimen_list, 'dun': dun_list} - - -def _generate_topics(): - if not _person_dict: - _load_internal_data() - texts = [' '.join(words) for _, words in _topic_dict.items()] - keys = [key for key, _ in _topic_dict.items()] - texts += [' '.join(words) for _, words in _person_dict.items()] - keys += [key for key, _ in _person_dict.items()] - texts = [' '.join(list(set(text.split()))) for text in texts] - output = [] - for text in texts: - output.append( - ' '.join([word for word in text.split() if word not in STOPWORDS]) - ) - return output, keys - - -def _generate_influencers(): - if not _person_dict: - _load_internal_data() - texts = [' '.join(words) for _, words in _person_dict.items()] - keys = [key for key, _ in _person_dict.items()] - texts = [' '.join(list(set(text.split()))) for text in texts] - output = [] - for text in texts: - output.append( - ' '.join([word for word in text.split() if word not in STOPWORDS]) - ) - return output, keys - - -def siamese_topic( - epoch = 5, - batch_size = 32, - embedding_size = 256, - output_size = 100, - maxlen = 100, - ngram = (1, 4), -): - """ - Train a deep siamese network for topics similarity - - Parameters - ---------- - epoch: int, (default=5) - iteration numbers - batch_size: int, (default=32) - batch size for every feed, batch size must <= size of corpus - embedding_size: int, (default=256) - vector size representation for a word - output_size: int, (default=100) - encoder output size, bigger means more vector definition - maxlen: int, (default=100) - max length of a string to be train - ngram: tuple, (default=(1,4)) - n-grams size to train a corpus - - Returns - ------- - _DEEP_SIAMESE_SIMILARITY: malaya.topics_influencers._DEEP_SIAMESE_SIMILARITY class - """ - if not _person_dict: - _load_internal_data() - assert isinstance(epoch, int), 'epoch must be an integer' - assert isinstance(batch_size, int), 'batch_size must be an integer' - assert isinstance(embedding_size, int), 'embedding_size must be an integer' - assert isinstance(output_size, int), 'output_size must be an integer' - assert isinstance(maxlen, int), 'maxlen must be an integer' - assert isinstance(ngram, tuple), 'ngram must be a tuple' - assert len(ngram) == 2, 'ngram size must equal to 2' - output, keys = _generate_topics() - batch_x_left, batch_x_right, batch_y = [], [], [] - for i in range(len(output)): - augmentation = sentence_ngram(output[i]) - batch_x_right.extend([keys[i]] * len(augmentation)) - batch_x_left.extend(augmentation) - batch_y.extend([1] * len(augmentation)) - neg_batch_x_left, neg_batch_x_right = [], [] - for i in range(len(batch_x_left)): - random_num = random.randint(0, len(batch_x_left) - 1) - while random_num == i: - random_num = random.randint(0, len(batch_x_left) - 1) - neg_batch_x_right.append(batch_x_right[random_num]) - neg_batch_x_left.append(batch_x_left[i]) - batch_y.append(0) - batch_x_left.extend(neg_batch_x_left) - batch_x_right.extend(neg_batch_x_right) - batch_x_left, batch_x_right, batch_y = shuffle( - batch_x_left, batch_x_right, batch_y - ) - sess, model, dictionary = siamese_train( - batch_x_left, - batch_x_right, - batch_y, - epoch = epoch, - batch_size = batch_size, - embedding_size = embedding_size, - output_size = output_size, - maxlen = maxlen, - ) - return _DEEP_SIAMESE_SIMILARITY(sess, model, keys, dictionary, maxlen) - - -def siamese_influencer( - epoch = 5, - batch_size = 32, - embedding_size = 256, - output_size = 100, - maxlen = 100, - ngram = (1, 4), -): - """ - Train a deep siamese network for influencers similarity - - Parameters - ---------- - epoch: int, (default=5) - iteration numbers - batch_size: int, (default=32) - batch size for every feed, batch size must <= size of corpus - embedding_size: int, (default=256) - vector size representation for a word - output_size: int, (default=100) - encoder output size, bigger means more vector definition - maxlen: int, (default=100) - max length of a string to be train - ngram: tuple, (default=(1,4)) - n-grams size to train a corpus - - Returns - ------- - _DEEP_SIAMESE_SIMILARITY: malaya.topic_influencers._DEEP_SIAMESE_SIMILARITY class - """ - if not _person_dict: - _load_internal_data() - assert isinstance(epoch, int), 'epoch must be an integer' - assert isinstance(batch_size, int), 'batch_size must be an integer' - assert isinstance(embedding_size, int), 'embedding_size must be an integer' - assert isinstance(output_size, int), 'output_size must be an integer' - assert isinstance(maxlen, int), 'maxlen must be an integer' - assert isinstance(ngram, tuple), 'ngram must be a tuple' - assert len(ngram) == 2, 'ngram size must equal to 2' - output, keys = _generate_influencers() - batch_x_left, batch_x_right, batch_y = [], [], [] - for i in range(len(output)): - augmentation = sentence_ngram(output[i]) - batch_x_right.extend([keys[i]] * len(augmentation)) - batch_x_left.extend(augmentation) - batch_y.extend([1] * len(augmentation)) - neg_batch_x_left, neg_batch_x_right = [], [] - for i in range(len(batch_x_left)): - random_num = random.randint(0, len(batch_x_left) - 1) - while random_num == i: - random_num = random.randint(0, len(batch_x_left) - 1) - neg_batch_x_right.append(batch_x_right[random_num]) - neg_batch_x_left.append(batch_x_left[i]) - batch_y.append(0) - batch_x_left.extend(neg_batch_x_left) - batch_x_right.extend(neg_batch_x_right) - batch_x_left, batch_x_right, batch_y = shuffle( - batch_x_left, batch_x_right, batch_y - ) - sess, model, dictionary = siamese_train( - batch_x_left, - batch_x_right, - batch_y, - epoch = epoch, - batch_size = batch_size, - embedding_size = embedding_size, - output_size = output_size, - maxlen = maxlen, - ) - return _DEEP_SIAMESE_SIMILARITY( - sess, model, keys, dictionary, maxlen, is_influencers = True - ) - - -def skipthought_topic( - epoch = 5, - batch_size = 16, - embedding_size = 256, - maxlen = 100, - ngram = (1, 4), -): - """ - Train a deep skip-thought network for topics similarity - - Parameters - ---------- - epoch: int, (default=5) - iteration numbers - batch_size: int, (default=32) - batch size for every feed, batch size must <= size of corpus - embedding_size: int, (default=256) - vector size representation for a word - maxlen: int, (default=100) - max length of a string to be train - ngram: tuple, (default=(1,4)) - n-grams size to train a corpus - - Returns - ------- - _DEEP_SIMILARITY: malaya.topic_influencers._DEEP_SIMILARITY class - """ - if not _person_dict: - _load_internal_data() - assert isinstance(epoch, int), 'epoch must be an integer' - assert isinstance(batch_size, int), 'batch_size must be an integer' - assert isinstance(embedding_size, int), 'embedding_size must be an integer' - assert isinstance(maxlen, int), 'maxlen must be an integer' - assert isinstance(ngram, tuple), 'ngram must be a tuple' - assert len(ngram) == 2, 'ngram size must equal to 2' - output, keys = _generate_topics() - batch_x, batch_y = [], [] - for i in range(len(output)): - augmentation = sentence_ngram(output[i]) - batch_y.extend([keys[i]] * len(augmentation)) - batch_x.extend(augmentation) - batch_x, batch_y = shuffle(batch_x, batch_y) - sess, model, dictionary = skip_train( - batch_x, - batch_y, - batch_y, - epoch = epoch, - batch_size = batch_size, - embedding_size = embedding_size, - maxlen = maxlen, - ) - encoded = sess.run( - model.get_thought, - feed_dict = { - model.INPUT: batch_sequence(output, dictionary, maxlen = maxlen) - }, - ) - return _DEEP_SIMILARITY(sess, model, encoded, keys, dictionary, maxlen) - - -def skipthought_influencer( - epoch = 10, - batch_size = 16, - embedding_size = 256, - maxlen = 100, - ngram = (1, 4), -): - """ - Train a deep skip-thought network for influencers similarity - - Parameters - ---------- - epoch: int, (default=5) - iteration numbers - batch_size: int, (default=32) - batch size for every feed, batch size must <= size of corpus - embedding_size: int, (default=256) - vector size representation for a word - maxlen: int, (default=100) - max length of a string to be train - ngram: tuple, (default=(1,4)) - n-grams size to train a corpus - - Returns - ------- - _DEEP_SIMILARITY: malaya.topics_influencers._DEEP_SIMILARITY class - """ - if not _person_dict: - _load_internal_data() - assert isinstance(epoch, int), 'epoch must be an integer' - assert isinstance(batch_size, int), 'batch_size must be an integer' - assert isinstance(embedding_size, int), 'embedding_size must be an integer' - assert isinstance(maxlen, int), 'maxlen must be an integer' - assert isinstance(ngram, tuple), 'ngram must be a tuple' - assert len(ngram) == 2, 'ngram size must equal to 2' - output, keys = _generate_influencers() - batch_x, batch_y = [], [] - for i in range(len(output)): - augmentation = sentence_ngram(output[i]) - batch_y.extend([keys[i]] * len(augmentation)) - batch_x.extend(augmentation) - assert batch_size < len(batch_x), 'batch size must smaller with corpus size' - batch_x, batch_y = shuffle(batch_x, batch_y) - sess, model, dictionary = skip_train( - batch_x, - batch_y, - batch_y, - epoch = epoch, - batch_size = batch_size, - embedding_size = embedding_size, - maxlen = maxlen, - ) - encoded = sess.run( - model.get_thought, - feed_dict = { - model.INPUT: batch_sequence(output, dictionary, maxlen = maxlen) - }, - ) - return _DEEP_SIMILARITY( - sess, model, encoded, keys, dictionary, maxlen, is_influencers = True - ) - - -def fast_topic(vectorizer = 'tfidf', ngram = (3, 10)): - """ - Train a deep siamese network for topics similarity - - Parameters - ---------- - vectorizer: str, (default='tfidf') - vectorization technique for a corpus - ngram: tuple, (default=(1,4)) - n-grams size to train a corpus - - Returns - ------- - _FAST_SIMILARITY: malaya.siamese_lstm._FAST_SIMILARITY class - """ - if not _person_dict: - _load_internal_data() - assert isinstance(vectorizer, str), 'vectorizer must be a string' - assert isinstance(ngram, tuple), 'ngram must be a tuple' - assert len(ngram) == 2, 'ngram size must equal to 2' - if 'tfidf' in vectorizer.lower(): - char_vectorizer = TfidfVectorizer( - sublinear_tf = True, - strip_accents = 'unicode', - analyzer = 'char', - ngram_range = ngram, - ) - elif 'count' in vectorizer.lower(): - char_vectorizer = CountVectorizer( - strip_accents = 'unicode', analyzer = 'char', ngram_range = ngram - ) - else: - raise Exception('model not supported') - output, keys = _generate_topics() - vectorizer = char_vectorizer.fit(output) - vectorized = vectorizer.transform(output) - return _FAST_SIMILARITY(vectorizer, vectorized, keys) - - -def fast_influencer(vectorizer = 'tfidf', ngram = (3, 10)): - """ - Train a deep siamese network for influencers similarity - - Parameters - ---------- - vectorizer: str, (default='tfidf') - vectorization technique for a corpus - ngram: tuple, (default=(1,4)) - n-grams size to train a corpus - - Returns - ------- - _FAST_SIMILARITY: malaya.siamese_lstm._FAST_SIMILARITY class - """ - if not _person_dict: - _load_internal_data() - assert isinstance(vectorizer, str), 'vectorizer must be a string' - assert isinstance(ngram, tuple), 'ngram must be a tuple' - assert len(ngram) == 2, 'ngram size must equal to 2' - if 'tfidf' in vectorizer.lower(): - char_vectorizer = TfidfVectorizer( - sublinear_tf = True, - strip_accents = 'unicode', - analyzer = 'char', - ngram_range = ngram, - ) - elif 'count' in vectorizer.lower(): - char_vectorizer = CountVectorizer( - strip_accents = 'unicode', analyzer = 'char', ngram_range = ngram - ) - else: - raise Exception('model not supported') - output, keys = _generate_influencers() - vectorizer = char_vectorizer.fit(output) - vectorized = vectorizer.transform(output) - return _FAST_SIMILARITY(vectorizer, vectorized, keys, is_influencers = True) diff --git a/malaya/toxic.py b/malaya/toxic.py index c417cb54..5552d8d6 100644 --- a/malaya/toxic.py +++ b/malaya/toxic.py @@ -120,8 +120,6 @@ def deep_model(model = 'luong', validate = True): try: with open(PATH_TOXIC['fast-text']['setting'], 'r') as fopen: dictionary = json.load(fopen)['dictionary'] - with open(PATH_TOXIC['fast-text']['pickle'], 'rb') as fopen: - ngram = pickle.load(fopen) g = load_graph(PATH_TOXIC['fast-text']['model']) except: raise Exception( @@ -133,35 +131,8 @@ def deep_model(model = 'luong', validate = True): tf.InteractiveSession(graph = g), model, dictionary, - ngram = ngram, ) - elif model == 'hierarchical': - if validate: - check_file( - PATH_TOXIC['hierarchical'], S3_PATH_TOXIC['hierarchical'] - ) - else: - if not check_available(PATH_TOXIC['logistic']): - raise Exception( - 'toxic/hierarchical is not available, please `validate = True`' - ) - try: - with open(PATH_TOXIC['hierarchical']['setting'], 'r') as fopen: - dictionary = json.load(fopen)['dictionary'] - g = load_graph(PATH_TOXIC['hierarchical']['model']) - except: - raise Exception( - "model corrupted due to some reasons, please run malaya.clear_cache('toxic/hierarchical') and try again" - ) - return SIGMOID( - g.get_tensor_by_name('import/Placeholder:0'), - g.get_tensor_by_name('import/logits:0'), - tf.InteractiveSession(graph = g), - model, - dictionary, - alphas = g.get_tensor_by_name('import/alphas:0'), - ) - elif model in ['bahdanau', 'luong']: + elif model in ['bahdanau', 'luong', 'hierarchical']: if validate: check_file(PATH_TOXIC[model], S3_PATH_TOXIC[model]) else: diff --git a/malaya/word_mover.py b/malaya/word_mover.py index ab4491bf..41b6b6bc 100644 --- a/malaya/word_mover.py +++ b/malaya/word_mover.py @@ -5,10 +5,24 @@ warnings.simplefilter('ignore') from itertools import product -from collections import defaultdict +from collections import defaultdict, Counter +from fuzzywuzzy import fuzz import numpy as np -from scipy.spatial.distance import euclidean import pulp +from scipy.spatial.distance import euclidean +from .texts._text_functions import normalizer_textcleaning +from .texts._tatabahasa import ( + rules_normalizer, + consonants, + vowels, + sounds, + GO, + PAD, + EOS, + UNK, +) +from .spell import _return_possible, _edit_normalizer, _return_known +from .similarity import is_location def _tokens_to_fracdict(tokens): @@ -75,3 +89,110 @@ def distance(left_token, right_token, vectorizer): ), 'vectorizer must has `get_vector_by_name` method' prob = _word_mover(left_token, right_token, vectorizer) return pulp.value(prob.objective) + + +class _DEEP_CONTRACTION: + def __init__(self, corpus, vectorizer): + self.corpus = Counter(corpus) + self.vectorizer = vectorizer + + def _suggest(self, string): + """ + Normalize a string + + Parameters + ---------- + string : str + + debug : bool, optional (default=True) + If true, it will print character similarity distances. + + Returns + ------- + string: normalized string + """ + assert isinstance(string, str), 'input must be a string' + result, outer_candidates = [], [] + for word in normalizer_textcleaning(string).split(): + if word.istitle(): + result.append(word) + continue + if len(string) > 2: + if string[-2] in consonants and string[-1] == 'e': + string[-1] = 'a' + if word[0] == 'x' and len(word) > 1: + result_string = 'tak ' + word = word[1:] + else: + result_string = '' + if word[-2:] == 'la': + end_result_string = ' lah' + word = word[:-2] + elif word[-3:] == 'lah': + end_result_string = ' lah' + word = word[:-3] + else: + end_result_string = '' + if word in sounds: + result.append(result_string + sounds[word] + end_result_string) + continue + if word in rules_normalizer: + result.append( + result_string + rules_normalizer[word] + end_result_string + ) + continue + if word in self.corpus: + result.append(result_string + word + end_result_string) + continue + candidates = ( + _return_known([word], self.corpus) + or _return_known(_edit_normalizer(word), self.corpus) + or _return_possible(word, self.corpus, _edit_normalizer) + or [word] + ) + candidates = list(candidates) + candidates = [ + (candidate, is_location(candidate)) + for candidate in list(candidates) + ] + strings = [fuzz.ratio(string, k[0]) for k in candidates] + descending_sort = np.argsort(strings)[::-1] + selected = None + for index in descending_sort: + if not candidates[index][1]: + selected = candidates[index][0] + break + selected = ( + candidates[descending_sort[0]][0] if not selected else selected + ) + result.append(result_string + word + end_result_string) + outer_candidates.append([(word, k[0]) for k in candidates]) + return ' '.join(result), outer_candidates + + def expand(self, string): + result, candidates = self._suggest(string) + intermediates = [] + for candidate in candidates: + inner = [] + for c in candidate: + text = [c[1] if w in c[0] else w for w in result.split()] + inner.append( + ( + c[0], + ' '.join(text), + distance(text, result.split(), self.vectorizer), + ) + ) + inner.sort(key = lambda x: x[2]) + intermediates.append(inner) + return intermediates + + +def expander(corpus, vectorizer): + assert isinstance(corpus, list) and isinstance( + corpus[0], str + ), 'input must be list of strings' + assert hasattr( + vectorizer, 'get_vector_by_name' + ), 'vectorizer must has `get_vector_by_name` method' + return _DEEP_CONTRACTION(corpus, vectorizer) diff --git a/session/emotion/fast-text-char.ipynb b/session/emotion/fast-text-char.ipynb index 2f542a78..3290e9dd 100644 --- a/session/emotion/fast-text-char.ipynb +++ b/session/emotion/fast-text-char.ipynb @@ -9,7 +9,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/usr/local/lib/python3.5/dist-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n", + "/usr/local/lib/python3.6/dist-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n", " \"This module will be removed in 0.20.\", DeprecationWarning)\n" ] } @@ -57,14 +57,17 @@ "\n", "def naive_stemmer(word):\n", " assert isinstance(word, str), 'input must be a string'\n", - " hujung_result = re.findall(r'^(.*?)(%s)$' % ('|'.join(hujung)), word)\n", - " word = hujung_result[0][0] if len(hujung_result) else word\n", - " permulaan_result = re.findall(r'^(.*?)(%s)' % ('|'.join(permulaan[::-1])), word)\n", - " permulaan_result.extend(re.findall(r'^(.*?)(%s)' % ('|'.join(permulaan)), word))\n", - " mula = permulaan_result if len(permulaan_result) else ''\n", - " if len(mula):\n", - " mula = mula[1][1] if len(mula[1][1]) > len(mula[0][1]) else mula[0][1]\n", - " return word.replace(mula, '')" + " hujung_result = [e for e in hujung if word.endswith(e)]\n", + " if len(hujung_result):\n", + " hujung_result = max(hujung_result, key = len)\n", + " if len(hujung_result):\n", + " word = word[: -len(hujung_result)]\n", + " permulaan_result = [e for e in permulaan if word.startswith(e)]\n", + " if len(permulaan_result):\n", + " permulaan_result = max(permulaan_result, key = len)\n", + " if len(permulaan_result):\n", + " word = word[len(permulaan_result) :]\n", + " return word" ] }, { @@ -88,16 +91,12 @@ " [i for i in re.findall('[\\\\w\\']+|[;:\\-\\(\\)&.,!?\"]', string) if len(i)]\n", " )\n", " string = string.lower().split()\n", - " string = [(naive_stemmer(word), word) for word in string]\n", - " return (\n", - " ' '.join([word[0] for word in string if len(word[0]) > 1]),\n", - " ' '.join([word[1] for word in string if len(word[0]) > 1]),\n", - " )\n", + " string = [naive_stemmer(word) for word in string]\n", + " return ' '.join([word for word in string if len(word) > 1])\n", "\n", - "def convert_sparse_matrix_to_sparse_tensor(X, limit = 5):\n", + "def convert_sparse_matrix_to_sparse_tensor(X):\n", " coo = X.tocoo()\n", " indices = np.mat([coo.row, coo.col]).transpose()\n", - " coo.data[coo.data > limit] = limit\n", " return tf.SparseTensorValue(indices, coo.col, coo.shape), tf.SparseTensorValue(indices, coo.data, coo.shape)" ] }, @@ -146,16 +145,6 @@ "cell_type": "code", "execution_count": 6, "metadata": {}, - "outputs": [], - "source": [ - "for i in range(len(texts)):\n", - " texts[i] = classification_textcleaning(texts[i])[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, "outputs": [ { "data": { @@ -163,7 +152,7 @@ "['anger', 'fear', 'joy', 'love', 'sadness', 'surprise']" ] }, - "execution_count": 7, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -176,17 +165,21 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ + "x, y = [], []\n", "for i in range(len(texts)):\n", - " texts[i] = classification_textcleaning(texts[i])[0]" + " s = classification_textcleaning(texts[i])\n", + " if len(s) > 5:\n", + " x.append(s)\n", + " y.append(labels[i])" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -196,16 +189,16 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "67557" + "86078" ] }, - "execution_count": 10, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -217,7 +210,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -226,7 +219,7 @@ " self.X = tf.sparse_placeholder(tf.int32)\n", " self.W = tf.sparse_placeholder(tf.int32)\n", " self.Y = tf.placeholder(tf.int32, [None])\n", - " embeddings = tf.Variable(tf.truncated_normal([vocab_size,64]))\n", + " embeddings = tf.Variable(tf.truncated_normal([vocab_size,128]))\n", " embed = tf.nn.embedding_lookup_sparse(embeddings, self.X, self.W, combiner='mean')\n", " self.logits = tf.layers.dense(embed, output_size)\n", " self.cost = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(\n", @@ -238,14 +231,14 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/gradients_impl.py:112: UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.\n", + "/usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/gradients_impl.py:112: UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.\n", " \"Converting sparse IndexedSlices to a dense Tensor of unknown shape. \"\n" ] } @@ -258,7 +251,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -267,7 +260,7 @@ "'fast-text-char/model.ckpt'" ] }, - "execution_count": 13, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -279,7 +272,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -291,25 +284,25 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 94.81it/s, accuracy=0.5, cost=1.64] \n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 219.05it/s, accuracy=0.261, cost=1.71]\n", - "train minibatch loop: 0%| | 10/2463 [00:00<00:26, 93.47it/s, accuracy=0.281, cost=1.71]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 70.78it/s, accuracy=0.357, cost=1.7] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 380.79it/s, accuracy=0.435, cost=1.58]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 70.91it/s, accuracy=0.406, cost=1.63]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 0, pass acc: 0.000000, current acc: 0.367424\n", - "time taken: 28.793192148208618\n", - "epoch: 0, training loss: 1.737624, training acc: 0.286365, valid loss: 1.683998, valid acc: 0.367424\n", + "epoch: 0, pass acc: 0.000000, current acc: 0.435818\n", + "time taken: 36.526482820510864\n", + "epoch: 0, training loss: 1.719506, training acc: 0.311557, valid loss: 1.642083, valid acc: 0.435818\n", "\n" ] }, @@ -317,18 +310,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 95.42it/s, accuracy=0.5, cost=1.47] \n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 217.81it/s, accuracy=0.522, cost=1.58]\n", - "train minibatch loop: 0%| | 10/2463 [00:00<00:27, 90.54it/s, accuracy=0.344, cost=1.59]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 70.89it/s, accuracy=0.429, cost=1.55]\n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 387.49it/s, accuracy=0.696, cost=1.39]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 71.40it/s, accuracy=0.406, cost=1.46]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 1, pass acc: 0.367424, current acc: 0.477628\n", - "time taken: 28.64283514022827\n", - "epoch: 1, training loss: 1.616371, training acc: 0.432574, valid loss: 1.552411, valid acc: 0.477628\n", + "epoch: 1, pass acc: 0.435818, current acc: 0.559877\n", + "time taken: 36.337278842926025\n", + "epoch: 1, training loss: 1.541226, training acc: 0.506874, valid loss: 1.439651, valid acc: 0.559877\n", "\n" ] }, @@ -336,18 +329,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 94.91it/s, accuracy=0.643, cost=1.27] \n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 218.93it/s, accuracy=0.652, cost=1.42]\n", - "train minibatch loop: 0%| | 10/2463 [00:00<00:26, 93.13it/s, accuracy=0.531, cost=1.41]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 70.93it/s, accuracy=0.536, cost=1.39]\n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 381.69it/s, accuracy=0.652, cost=1.2] \n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 71.39it/s, accuracy=0.438, cost=1.3] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 2, pass acc: 0.477628, current acc: 0.551381\n", - "time taken: 28.76784896850586\n", - "epoch: 2, training loss: 1.464915, training acc: 0.528620, valid loss: 1.396159, valid acc: 0.551381\n", + "epoch: 2, pass acc: 0.559877, current acc: 0.626852\n", + "time taken: 36.342402935028076\n", + "epoch: 2, training loss: 1.323602, training acc: 0.601750, valid loss: 1.231924, valid acc: 0.626852\n", "\n" ] }, @@ -355,18 +348,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 95.33it/s, accuracy=0.714, cost=1.1] \n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 214.44it/s, accuracy=0.609, cost=1.27] \n", - "train minibatch loop: 0%| | 10/2463 [00:00<00:26, 91.84it/s, accuracy=0.625, cost=1.25]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 70.88it/s, accuracy=0.571, cost=1.27] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 387.22it/s, accuracy=0.696, cost=1.07] \n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 71.34it/s, accuracy=0.469, cost=1.17] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 3, pass acc: 0.551381, current acc: 0.598512\n", - "time taken: 28.711954355239868\n", - "epoch: 3, training loss: 1.307954, training acc: 0.589959, valid loss: 1.253290, valid acc: 0.598512\n", + "epoch: 3, pass acc: 0.626852, current acc: 0.669962\n", + "time taken: 36.342238664627075\n", + "epoch: 3, training loss: 1.134289, training acc: 0.655741, valid loss: 1.075691, valid acc: 0.669962\n", "\n" ] }, @@ -374,18 +367,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 95.20it/s, accuracy=0.786, cost=0.973]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 213.55it/s, accuracy=0.609, cost=1.16] \n", - "train minibatch loop: 0%| | 10/2463 [00:00<00:26, 93.12it/s, accuracy=0.562, cost=1.22]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 70.57it/s, accuracy=0.643, cost=1.19] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 388.18it/s, accuracy=0.652, cost=0.989]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 71.03it/s, accuracy=0.531, cost=1.06] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 4, pass acc: 0.598512, current acc: 0.637288\n", - "time taken: 28.757939338684082\n", - "epoch: 4, training loss: 1.174731, training acc: 0.633383, valid loss: 1.140401, valid acc: 0.637288\n", + "epoch: 4, pass acc: 0.669962, current acc: 0.698719\n", + "time taken: 36.333343744277954\n", + "epoch: 4, training loss: 0.998491, training acc: 0.694736, valid loss: 0.969251, valid acc: 0.698719\n", "\n" ] }, @@ -393,18 +386,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 95.30it/s, accuracy=0.75, cost=0.877] \n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 218.63it/s, accuracy=0.565, cost=1.07] \n", - "train minibatch loop: 0%| | 10/2463 [00:00<00:25, 95.99it/s, accuracy=0.594, cost=1.15] " + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 70.90it/s, accuracy=0.679, cost=1.15] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 386.50it/s, accuracy=0.609, cost=0.931]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 71.71it/s, accuracy=0.531, cost=0.984]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 5, pass acc: 0.637288, current acc: 0.661630\n", - "time taken: 28.666513681411743\n", - "epoch: 5, training loss: 1.072006, training acc: 0.662767, valid loss: 1.056140, valid acc: 0.661630\n", + "epoch: 5, pass acc: 0.698719, current acc: 0.717174\n", + "time taken: 36.339839696884155\n", + "epoch: 5, training loss: 0.905001, training acc: 0.720179, valid loss: 0.897002, valid acc: 0.717174\n", "\n" ] }, @@ -412,18 +405,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 95.55it/s, accuracy=0.786, cost=0.805]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 217.30it/s, accuracy=0.609, cost=1] \n", - "train minibatch loop: 0%| | 10/2463 [00:00<00:27, 90.84it/s, accuracy=0.594, cost=1.09] " + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 71.06it/s, accuracy=0.679, cost=1.12] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 386.56it/s, accuracy=0.609, cost=0.889]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 70.95it/s, accuracy=0.531, cost=0.924]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 6, pass acc: 0.661630, current acc: 0.680987\n", - "time taken: 28.615931510925293\n", - "epoch: 6, training loss: 0.995213, training acc: 0.683210, valid loss: 0.994008, valid acc: 0.680987\n", + "epoch: 6, pass acc: 0.717174, current acc: 0.729609\n", + "time taken: 36.34914755821228\n", + "epoch: 6, training loss: 0.839532, training acc: 0.738272, valid loss: 0.846647, valid acc: 0.729609\n", "\n" ] }, @@ -431,18 +424,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:26<00:00, 95.48it/s, accuracy=0.786, cost=0.75] \n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 216.61it/s, accuracy=0.652, cost=0.945]\n", - "train minibatch loop: 0%| | 9/2463 [00:00<00:27, 89.52it/s, accuracy=0.594, cost=1.05] " + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 70.81it/s, accuracy=0.714, cost=1.09] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 387.07it/s, accuracy=0.609, cost=0.857]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 70.70it/s, accuracy=0.625, cost=0.878]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 7, pass acc: 0.680987, current acc: 0.693441\n", - "time taken: 28.90414547920227\n", - "epoch: 7, training loss: 0.937690, training acc: 0.698893, valid loss: 0.947770, valid acc: 0.693441\n", + "epoch: 7, pass acc: 0.729609, current acc: 0.737577\n", + "time taken: 36.355093002319336\n", + "epoch: 7, training loss: 0.792104, training acc: 0.749782, valid loss: 0.810350, valid acc: 0.737577\n", "\n" ] }, @@ -450,18 +443,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 95.71it/s, accuracy=0.786, cost=0.707] \n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 211.98it/s, accuracy=0.652, cost=0.901]\n", - "train minibatch loop: 0%| | 10/2463 [00:00<00:26, 93.23it/s, accuracy=0.719, cost=0.828]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 70.80it/s, accuracy=0.714, cost=1.07] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 387.46it/s, accuracy=0.652, cost=0.831]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 71.31it/s, accuracy=0.656, cost=0.843]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 8, pass acc: 0.693441, current acc: 0.702374\n", - "time taken: 28.642375230789185\n", - "epoch: 8, training loss: 0.893843, training acc: 0.710655, valid loss: 0.912714, valid acc: 0.702374\n", + "epoch: 8, pass acc: 0.737577, current acc: 0.743738\n", + "time taken: 36.382598638534546\n", + "epoch: 8, training loss: 0.756453, training acc: 0.758982, valid loss: 0.783319, valid acc: 0.743738\n", "\n" ] }, @@ -469,18 +462,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:26<00:00, 94.62it/s, accuracy=0.786, cost=0.673]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 216.21it/s, accuracy=0.696, cost=0.866]\n", - "train minibatch loop: 0%| | 9/2463 [00:00<00:27, 88.15it/s, accuracy=0.656, cost=0.979]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 70.96it/s, accuracy=0.714, cost=1.05] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 388.64it/s, accuracy=0.652, cost=0.81] \n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 70.95it/s, accuracy=0.688, cost=0.814]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 9, pass acc: 0.702374, current acc: 0.710565\n", - "time taken: 28.882978916168213\n", - "epoch: 9, training loss: 0.859628, training acc: 0.720387, valid loss: 0.885560, valid acc: 0.710565\n", + "epoch: 9, pass acc: 0.743738, current acc: 0.747748\n", + "time taken: 36.29483675956726\n", + "epoch: 9, training loss: 0.728712, training acc: 0.765998, valid loss: 0.762610, valid acc: 0.747748\n", "\n" ] }, @@ -488,18 +481,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 95.47it/s, accuracy=0.786, cost=0.646]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 217.88it/s, accuracy=0.739, cost=0.836]\n", - "train minibatch loop: 0%| | 11/2463 [00:00<00:24, 100.15it/s, accuracy=0.656, cost=0.954]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 70.91it/s, accuracy=0.714, cost=1.03] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 389.73it/s, accuracy=0.652, cost=0.793]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 70.73it/s, accuracy=0.688, cost=0.792]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 10, pass acc: 0.710565, current acc: 0.715406\n", - "time taken: 28.62755060195923\n", - "epoch: 10, training loss: 0.832274, training acc: 0.727937, valid loss: 0.864087, valid acc: 0.715406\n", + "epoch: 10, pass acc: 0.747748, current acc: 0.752315\n", + "time taken: 36.31716275215149\n", + "epoch: 10, training loss: 0.706465, training acc: 0.771442, valid loss: 0.746365, valid acc: 0.752315\n", "\n" ] }, @@ -507,18 +500,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 94.80it/s, accuracy=0.786, cost=0.624]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 218.43it/s, accuracy=0.739, cost=0.81] \n", - "train minibatch loop: 0%| | 10/2463 [00:00<00:26, 92.49it/s, accuracy=0.656, cost=0.932]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 70.87it/s, accuracy=0.714, cost=1.02] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 374.06it/s, accuracy=0.696, cost=0.778]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:35, 70.09it/s, accuracy=0.688, cost=0.773]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 11, pass acc: 0.715406, current acc: 0.719619\n", - "time taken: 28.80274724960327\n", - "epoch: 11, training loss: 0.809904, training acc: 0.734103, valid loss: 0.846787, valid acc: 0.719619\n", + "epoch: 11, pass acc: 0.752315, current acc: 0.756446\n", + "time taken: 36.397101402282715\n", + "epoch: 11, training loss: 0.688158, training acc: 0.776771, valid loss: 0.733372, valid acc: 0.756446\n", "\n" ] }, @@ -526,18 +519,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:24<00:00, 101.79it/s, accuracy=0.786, cost=0.606]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 234.45it/s, accuracy=0.739, cost=0.788]\n", - "train minibatch loop: 0%| | 10/2463 [00:00<00:24, 98.90it/s, accuracy=0.719, cost=0.778]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 70.60it/s, accuracy=0.714, cost=1] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 383.09it/s, accuracy=0.696, cost=0.765]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 70.79it/s, accuracy=0.688, cost=0.757]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 12, pass acc: 0.719619, current acc: 0.724288\n", - "time taken: 26.893165588378906\n", - "epoch: 12, training loss: 0.791237, training acc: 0.739750, valid loss: 0.832623, valid acc: 0.724288\n", + "epoch: 12, pass acc: 0.756446, current acc: 0.759898\n", + "time taken: 36.49841284751892\n", + "epoch: 12, training loss: 0.672764, training acc: 0.780780, valid loss: 0.722814, valid acc: 0.759898\n", "\n" ] }, @@ -545,18 +538,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:23<00:00, 105.10it/s, accuracy=0.821, cost=0.591]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 232.67it/s, accuracy=0.739, cost=0.769]\n", - "train minibatch loop: 0%| | 11/2463 [00:00<00:23, 105.56it/s, accuracy=0.719, cost=0.768]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 70.98it/s, accuracy=0.75, cost=0.99] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 382.64it/s, accuracy=0.696, cost=0.753]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 71.26it/s, accuracy=0.688, cost=0.743]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 13, pass acc: 0.724288, current acc: 0.726826\n", - "time taken: 26.086301565170288\n", - "epoch: 13, training loss: 0.775384, training acc: 0.744370, valid loss: 0.820864, valid acc: 0.726826\n", + "epoch: 13, pass acc: 0.759898, current acc: 0.761623\n", + "time taken: 36.41802668571472\n", + "epoch: 13, training loss: 0.659580, training acc: 0.784284, valid loss: 0.714125, valid acc: 0.761623\n", "\n" ] }, @@ -564,18 +557,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:23<00:00, 105.78it/s, accuracy=0.821, cost=0.578]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 229.20it/s, accuracy=0.696, cost=0.752]\n", - "train minibatch loop: 0%| | 10/2463 [00:00<00:24, 98.49it/s, accuracy=0.781, cost=0.687]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 70.92it/s, accuracy=0.75, cost=0.977] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 387.85it/s, accuracy=0.696, cost=0.743]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 71.36it/s, accuracy=0.719, cost=0.732]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 14, pass acc: 0.726826, current acc: 0.728532\n", - "time taken: 25.974788427352905\n", - "epoch: 14, training loss: 0.761716, training acc: 0.748430, valid loss: 0.810987, valid acc: 0.728532\n", + "epoch: 14, pass acc: 0.761623, current acc: 0.762689\n", + "time taken: 36.31924271583557\n", + "epoch: 14, training loss: 0.648110, training acc: 0.787101, valid loss: 0.706897, valid acc: 0.762689\n", "\n" ] }, @@ -583,18 +576,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:23<00:00, 104.50it/s, accuracy=0.821, cost=0.567]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 217.30it/s, accuracy=0.696, cost=0.736]\n", - "train minibatch loop: 0%| | 10/2463 [00:00<00:27, 90.61it/s, accuracy=0.719, cost=0.868]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 70.86it/s, accuracy=0.75, cost=0.964] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 390.25it/s, accuracy=0.696, cost=0.734]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 70.38it/s, accuracy=0.719, cost=0.721]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 15, pass acc: 0.728532, current acc: 0.731678\n", - "time taken: 26.40718150138855\n", - "epoch: 15, training loss: 0.749777, training acc: 0.752008, valid loss: 0.802608, valid acc: 0.731678\n", + "epoch: 15, pass acc: 0.762689, current acc: 0.764973\n", + "time taken: 36.338618755340576\n", + "epoch: 15, training loss: 0.638001, training acc: 0.790336, valid loss: 0.700835, valid acc: 0.764973\n", "\n" ] }, @@ -602,18 +595,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 94.84it/s, accuracy=0.821, cost=0.558]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 218.78it/s, accuracy=0.696, cost=0.722]\n", - "train minibatch loop: 0%| | 11/2463 [00:00<00:24, 100.87it/s, accuracy=0.719, cost=0.856]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 70.95it/s, accuracy=0.75, cost=0.952] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 388.74it/s, accuracy=0.696, cost=0.725]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 71.17it/s, accuracy=0.719, cost=0.712]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 16, pass acc: 0.731678, current acc: 0.734521\n", - "time taken: 28.788124084472656\n", - "epoch: 16, training loss: 0.739230, training acc: 0.754571, valid loss: 0.795440, valid acc: 0.734521\n", + "epoch: 16, pass acc: 0.764973, current acc: 0.765125\n", + "time taken: 36.30199193954468\n", + "epoch: 16, training loss: 0.628989, training acc: 0.792976, valid loss: 0.695717, valid acc: 0.765125\n", "\n" ] }, @@ -621,18 +614,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 95.32it/s, accuracy=0.821, cost=0.55] \n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 212.67it/s, accuracy=0.696, cost=0.709]\n", - "train minibatch loop: 0%| | 9/2463 [00:00<00:28, 86.72it/s, accuracy=0.781, cost=0.786]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 71.06it/s, accuracy=0.75, cost=0.941] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 387.32it/s, accuracy=0.739, cost=0.718]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 71.01it/s, accuracy=0.75, cost=0.704] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 17, pass acc: 0.734521, current acc: 0.735688\n", - "time taken: 28.74174976348877\n", - "epoch: 17, training loss: 0.729820, training acc: 0.757147, valid loss: 0.789265, valid acc: 0.735688\n", + "epoch: 17, pass acc: 0.765125, current acc: 0.766718\n", + "time taken: 36.254037380218506\n", + "epoch: 17, training loss: 0.620877, training acc: 0.795336, valid loss: 0.691374, valid acc: 0.766718\n", "\n" ] }, @@ -640,18 +633,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 95.41it/s, accuracy=0.821, cost=0.543]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 217.65it/s, accuracy=0.696, cost=0.697]\n", - "train minibatch loop: 0%| | 10/2463 [00:00<00:26, 94.22it/s, accuracy=0.781, cost=0.644]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 70.98it/s, accuracy=0.75, cost=0.93] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 389.20it/s, accuracy=0.739, cost=0.711]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 70.85it/s, accuracy=0.75, cost=0.697] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 18, pass acc: 0.735688, current acc: 0.736906\n", - "time taken: 28.64875364303589\n", - "epoch: 18, training loss: 0.721354, training acc: 0.759698, valid loss: 0.783914, valid acc: 0.736906\n", + "epoch: 18, pass acc: 0.766718, current acc: 0.768038\n", + "time taken: 36.285399198532104\n", + "epoch: 18, training loss: 0.613515, training acc: 0.797455, valid loss: 0.687674, valid acc: 0.768038\n", "\n" ] }, @@ -659,18 +652,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 94.92it/s, accuracy=0.857, cost=0.536]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 218.38it/s, accuracy=0.696, cost=0.687]\n", - "train minibatch loop: 0%| | 10/2463 [00:00<00:25, 96.02it/s, accuracy=0.719, cost=0.827]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 70.93it/s, accuracy=0.75, cost=0.92] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 389.41it/s, accuracy=0.739, cost=0.704]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 70.80it/s, accuracy=0.75, cost=0.69] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 19, pass acc: 0.736906, current acc: 0.737718\n", - "time taken: 28.772202253341675\n", - "epoch: 19, training loss: 0.713681, training acc: 0.762326, valid loss: 0.779254, valid acc: 0.737718\n", + "epoch: 19, pass acc: 0.768038, current acc: 0.768749\n", + "time taken: 36.307868242263794\n", + "epoch: 19, training loss: 0.606783, training acc: 0.799028, valid loss: 0.684515, valid acc: 0.768749\n", "\n" ] }, @@ -678,18 +671,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 95.52it/s, accuracy=0.857, cost=0.531] \n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 216.14it/s, accuracy=0.696, cost=0.676]\n", - "train minibatch loop: 0%| | 10/2463 [00:00<00:26, 91.18it/s, accuracy=0.719, cost=0.819]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 70.91it/s, accuracy=0.75, cost=0.91] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 390.15it/s, accuracy=0.739, cost=0.698]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 71.83it/s, accuracy=0.75, cost=0.684] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 20, pass acc: 0.737718, current acc: 0.739342\n", - "time taken: 28.638182640075684\n", - "epoch: 20, training loss: 0.706681, training acc: 0.763887, valid loss: 0.775181, valid acc: 0.739342\n", + "epoch: 20, pass acc: 0.768749, current acc: 0.769307\n", + "time taken: 36.31364560127258\n", + "epoch: 20, training loss: 0.600590, training acc: 0.800957, valid loss: 0.681815, valid acc: 0.769307\n", "\n" ] }, @@ -697,18 +690,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 95.13it/s, accuracy=0.857, cost=0.526]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 217.17it/s, accuracy=0.739, cost=0.667]\n", - "train minibatch loop: 0%| | 9/2463 [00:00<00:27, 88.63it/s, accuracy=0.719, cost=0.811]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 71.23it/s, accuracy=0.75, cost=0.901] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 391.62it/s, accuracy=0.739, cost=0.693]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 71.49it/s, accuracy=0.75, cost=0.678] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 21, pass acc: 0.739342, current acc: 0.741189\n", - "time taken: 28.732747316360474\n", - "epoch: 21, training loss: 0.700259, training acc: 0.765790, valid loss: 0.771611, valid acc: 0.741189\n", + "epoch: 21, pass acc: 0.769307, current acc: 0.769611\n", + "time taken: 36.282639265060425\n", + "epoch: 21, training loss: 0.594859, training acc: 0.802632, valid loss: 0.679508, valid acc: 0.769611\n", "\n" ] }, @@ -716,18 +709,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 96.55it/s, accuracy=0.857, cost=0.522] \n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 214.11it/s, accuracy=0.783, cost=0.658]\n", - "train minibatch loop: 0%| | 10/2463 [00:00<00:26, 93.60it/s, accuracy=0.812, cost=0.617]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 71.02it/s, accuracy=0.75, cost=0.892] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 385.48it/s, accuracy=0.696, cost=0.688]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 70.45it/s, accuracy=0.75, cost=0.673] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 22, pass acc: 0.741189, current acc: 0.742021\n", - "time taken: 28.73519778251648\n", - "epoch: 22, training loss: 0.694336, training acc: 0.767490, valid loss: 0.768473, valid acc: 0.742021\n", + "epoch: 22, pass acc: 0.769611, current acc: 0.769744\n", + "time taken: 36.27955889701843\n", + "epoch: 22, training loss: 0.589530, training acc: 0.804091, valid loss: 0.677539, valid acc: 0.769744\n", "\n" ] }, @@ -735,17 +728,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 95.43it/s, accuracy=0.857, cost=0.518]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 216.38it/s, accuracy=0.783, cost=0.65] \n", - "train minibatch loop: 0%| | 9/2463 [00:00<00:27, 89.91it/s, accuracy=0.719, cost=0.798]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 70.99it/s, accuracy=0.75, cost=0.883] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 389.81it/s, accuracy=0.696, cost=0.684]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 71.44it/s, accuracy=0.75, cost=0.669] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 28.658127546310425\n", - "epoch: 23, training loss: 0.688850, training acc: 0.769089, valid loss: 0.765713, valid acc: 0.741970\n", + "epoch: 23, pass acc: 0.769744, current acc: 0.770759\n", + "time taken: 36.27450656890869\n", + "epoch: 23, training loss: 0.584552, training acc: 0.805537, valid loss: 0.675864, valid acc: 0.770759\n", "\n" ] }, @@ -753,18 +747,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 95.30it/s, accuracy=0.857, cost=0.515]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 219.95it/s, accuracy=0.783, cost=0.643]\n", - "train minibatch loop: 0%| | 10/2463 [00:00<00:26, 92.47it/s, accuracy=0.719, cost=0.792]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 71.02it/s, accuracy=0.75, cost=0.875] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 384.88it/s, accuracy=0.739, cost=0.68] \n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 71.30it/s, accuracy=0.75, cost=0.664] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 24, pass acc: 0.742021, current acc: 0.742681\n", - "time taken: 28.648456811904907\n", - "epoch: 24, training loss: 0.683748, training acc: 0.770751, valid loss: 0.763283, valid acc: 0.742681\n", + "epoch: 24, pass acc: 0.770759, current acc: 0.771286\n", + "time taken: 36.28367853164673\n", + "epoch: 24, training loss: 0.579884, training acc: 0.807111, valid loss: 0.674445, valid acc: 0.771286\n", "\n" ] }, @@ -772,17 +766,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 95.32it/s, accuracy=0.857, cost=0.512] \n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 217.69it/s, accuracy=0.783, cost=0.635]\n", - "train minibatch loop: 0%| | 11/2463 [00:00<00:24, 100.85it/s, accuracy=0.75, cost=0.716] " + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 71.01it/s, accuracy=0.75, cost=0.868] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 391.23it/s, accuracy=0.739, cost=0.676]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 71.26it/s, accuracy=0.75, cost=0.66] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 28.670026540756226\n", - "epoch: 25, training loss: 0.678984, training acc: 0.772210, valid loss: 0.761142, valid acc: 0.742630\n", + "epoch: 25, pass acc: 0.771286, current acc: 0.771540\n", + "time taken: 36.26240372657776\n", + "epoch: 25, training loss: 0.575489, training acc: 0.808709, valid loss: 0.673251, valid acc: 0.771540\n", "\n" ] }, @@ -790,18 +785,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 95.12it/s, accuracy=0.857, cost=0.509]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 217.15it/s, accuracy=0.783, cost=0.629]\n", - "train minibatch loop: 0%| | 10/2463 [00:00<00:25, 95.63it/s, accuracy=0.75, cost=0.714] " + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 71.02it/s, accuracy=0.75, cost=0.861] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 388.60it/s, accuracy=0.739, cost=0.673]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 70.21it/s, accuracy=0.75, cost=0.657] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 26, pass acc: 0.742681, current acc: 0.743544\n", - "time taken: 28.733546257019043\n", - "epoch: 26, training loss: 0.674522, training acc: 0.773581, valid loss: 0.759257, valid acc: 0.743544\n", + "epoch: 26, pass acc: 0.771540, current acc: 0.771844\n", + "time taken: 36.26729607582092\n", + "epoch: 26, training loss: 0.571340, training acc: 0.810156, valid loss: 0.672255, valid acc: 0.771844\n", "\n" ] }, @@ -809,18 +804,17 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 95.22it/s, accuracy=0.857, cost=0.507]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 217.35it/s, accuracy=0.783, cost=0.622]\n", - "train minibatch loop: 0%| | 10/2463 [00:00<00:24, 98.61it/s, accuracy=0.812, cost=0.595]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 71.04it/s, accuracy=0.75, cost=0.854] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 388.18it/s, accuracy=0.739, cost=0.67] \n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 70.72it/s, accuracy=0.75, cost=0.653] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 27, pass acc: 0.743544, current acc: 0.743950\n", - "time taken: 28.70233988761902\n", - "epoch: 27, training loss: 0.670330, training acc: 0.774989, valid loss: 0.757598, valid acc: 0.743950\n", + "time taken: 36.260812520980835\n", + "epoch: 27, training loss: 0.567410, training acc: 0.811412, valid loss: 0.671436, valid acc: 0.771540\n", "\n" ] }, @@ -828,17 +822,17 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 95.47it/s, accuracy=0.857, cost=0.504]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 214.83it/s, accuracy=0.783, cost=0.617]\n", - "train minibatch loop: 0%| | 9/2463 [00:00<00:28, 87.45it/s, accuracy=0.719, cost=0.773]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 71.20it/s, accuracy=0.75, cost=0.847] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 389.44it/s, accuracy=0.739, cost=0.668]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 70.53it/s, accuracy=0.75, cost=0.65] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 28.67311692237854\n", - "epoch: 28, training loss: 0.666380, training acc: 0.776372, valid loss: 0.756140, valid acc: 0.743798\n", + "time taken: 36.282947301864624\n", + "epoch: 28, training loss: 0.563677, training acc: 0.812757, valid loss: 0.670772, valid acc: 0.771844\n", "\n" ] }, @@ -846,18 +840,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 95.22it/s, accuracy=0.857, cost=0.502]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 215.74it/s, accuracy=0.783, cost=0.611]\n", - "train minibatch loop: 0%| | 9/2463 [00:00<00:27, 88.99it/s, accuracy=0.719, cost=0.768]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 71.00it/s, accuracy=0.75, cost=0.841] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 382.91it/s, accuracy=0.739, cost=0.665]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 71.19it/s, accuracy=0.75, cost=0.647] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 29, pass acc: 0.743950, current acc: 0.744153\n", - "time taken: 28.724653244018555\n", - "epoch: 29, training loss: 0.662648, training acc: 0.777514, valid loss: 0.754863, valid acc: 0.744153\n", + "epoch: 29, pass acc: 0.771844, current acc: 0.772149\n", + "time taken: 36.29914617538452\n", + "epoch: 29, training loss: 0.560123, training acc: 0.813747, valid loss: 0.670249, valid acc: 0.772149\n", "\n" ] }, @@ -865,18 +859,17 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 95.14it/s, accuracy=0.857, cost=0.5] \n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 213.82it/s, accuracy=0.783, cost=0.606]\n", - "train minibatch loop: 0%| | 10/2463 [00:00<00:26, 94.11it/s, accuracy=0.812, cost=0.585]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 71.03it/s, accuracy=0.786, cost=0.835]\n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 389.13it/s, accuracy=0.739, cost=0.663]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 70.54it/s, accuracy=0.75, cost=0.644] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 30, pass acc: 0.744153, current acc: 0.744457\n", - "time taken: 28.77310824394226\n", - "epoch: 30, training loss: 0.659113, training acc: 0.778504, valid loss: 0.753746, valid acc: 0.744457\n", + "time taken: 36.25847387313843\n", + "epoch: 30, training loss: 0.556732, training acc: 0.814865, valid loss: 0.669850, valid acc: 0.771997\n", "\n" ] }, @@ -884,18 +877,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 95.35it/s, accuracy=0.857, cost=0.498]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 215.26it/s, accuracy=0.783, cost=0.601]\n", - "train minibatch loop: 0%| | 10/2463 [00:00<00:25, 96.22it/s, accuracy=0.719, cost=0.761]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 70.98it/s, accuracy=0.786, cost=0.83] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 388.67it/s, accuracy=0.739, cost=0.661]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 71.39it/s, accuracy=0.75, cost=0.641] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 31, pass acc: 0.744457, current acc: 0.744762\n", - "time taken: 28.694873571395874\n", - "epoch: 31, training loss: 0.655758, training acc: 0.779557, valid loss: 0.752773, valid acc: 0.744762\n", + "epoch: 31, pass acc: 0.772149, current acc: 0.772504\n", + "time taken: 36.28441309928894\n", + "epoch: 31, training loss: 0.553490, training acc: 0.815652, valid loss: 0.669565, valid acc: 0.772504\n", "\n" ] }, @@ -903,18 +896,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 95.08it/s, accuracy=0.857, cost=0.497]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 215.59it/s, accuracy=0.783, cost=0.596]\n", - "train minibatch loop: 0%| | 9/2463 [00:00<00:28, 86.68it/s, accuracy=0.812, cost=0.661]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 70.85it/s, accuracy=0.786, cost=0.825]\n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 388.94it/s, accuracy=0.739, cost=0.659]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 71.56it/s, accuracy=0.75, cost=0.638] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 32, pass acc: 0.744762, current acc: 0.745016\n", - "time taken: 28.76305365562439\n", - "epoch: 32, training loss: 0.652567, training acc: 0.780508, valid loss: 0.751931, valid acc: 0.745016\n", + "epoch: 32, pass acc: 0.772504, current acc: 0.772860\n", + "time taken: 36.26200866699219\n", + "epoch: 32, training loss: 0.550383, training acc: 0.816794, valid loss: 0.669381, valid acc: 0.772860\n", "\n" ] }, @@ -922,18 +915,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 95.54it/s, accuracy=0.857, cost=0.495]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 213.01it/s, accuracy=0.783, cost=0.592]\n", - "train minibatch loop: 0%| | 10/2463 [00:00<00:24, 98.70it/s, accuracy=0.812, cost=0.577]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 70.99it/s, accuracy=0.786, cost=0.82] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 389.30it/s, accuracy=0.739, cost=0.658]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 70.23it/s, accuracy=0.75, cost=0.636] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 33, pass acc: 0.745016, current acc: 0.745219\n", - "time taken: 28.673179626464844\n", - "epoch: 33, training loss: 0.649525, training acc: 0.781460, valid loss: 0.751206, valid acc: 0.745219\n", + "epoch: 33, pass acc: 0.772860, current acc: 0.772910\n", + "time taken: 36.27719235420227\n", + "epoch: 33, training loss: 0.547402, training acc: 0.817809, valid loss: 0.669289, valid acc: 0.772910\n", "\n" ] }, @@ -941,18 +934,17 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 95.28it/s, accuracy=0.857, cost=0.494]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 217.01it/s, accuracy=0.783, cost=0.588]\n", - "train minibatch loop: 0%| | 10/2463 [00:00<00:26, 92.33it/s, accuracy=0.719, cost=0.751]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 70.96it/s, accuracy=0.786, cost=0.815]\n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 384.71it/s, accuracy=0.739, cost=0.657]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 71.33it/s, accuracy=0.75, cost=0.633] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 34, pass acc: 0.745219, current acc: 0.745472\n", - "time taken: 28.691425800323486\n", - "epoch: 34, training loss: 0.646621, training acc: 0.782729, valid loss: 0.750589, valid acc: 0.745472\n", + "time taken: 36.311283111572266\n", + "epoch: 34, training loss: 0.544536, training acc: 0.818837, valid loss: 0.669282, valid acc: 0.772301\n", "\n" ] }, @@ -960,18 +952,17 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 95.21it/s, accuracy=0.857, cost=0.492]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 219.42it/s, accuracy=0.783, cost=0.584]\n", - "train minibatch loop: 0%| | 9/2463 [00:00<00:28, 86.17it/s, accuracy=0.812, cost=0.652]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 71.12it/s, accuracy=0.786, cost=0.811]\n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 385.35it/s, accuracy=0.739, cost=0.655]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 70.68it/s, accuracy=0.75, cost=0.631] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 35, pass acc: 0.745472, current acc: 0.745777\n", - "time taken: 28.678489685058594\n", - "epoch: 35, training loss: 0.643844, training acc: 0.783516, valid loss: 0.750068, valid acc: 0.745777\n", + "time taken: 36.267308950424194\n", + "epoch: 35, training loss: 0.541777, training acc: 0.819725, valid loss: 0.669350, valid acc: 0.772301\n", "\n" ] }, @@ -979,54 +970,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 95.54it/s, accuracy=0.857, cost=0.491]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 214.17it/s, accuracy=0.783, cost=0.581]\n", - "train minibatch loop: 0%| | 10/2463 [00:00<00:25, 94.90it/s, accuracy=0.719, cost=0.746]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:34<00:00, 70.97it/s, accuracy=0.786, cost=0.806]\n", + "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 389.88it/s, accuracy=0.739, cost=0.654]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 28.657948970794678\n", - "epoch: 36, training loss: 0.641184, training acc: 0.784607, valid loss: 0.749637, valid acc: 0.745574\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 95.24it/s, accuracy=0.857, cost=0.489] \n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 215.19it/s, accuracy=0.783, cost=0.578]\n", - "train minibatch loop: 0%| | 10/2463 [00:00<00:24, 98.59it/s, accuracy=0.719, cost=0.743]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "time taken: 28.724912405014038\n", - "epoch: 37, training loss: 0.638633, training acc: 0.785609, valid loss: 0.749287, valid acc: 0.745574\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [00:25<00:00, 94.77it/s, accuracy=0.857, cost=0.488]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 217.93it/s, accuracy=0.783, cost=0.575]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "time taken: 28.819119691848755\n", - "epoch: 38, training loss: 0.636182, training acc: 0.786624, valid loss: 0.749011, valid acc: 0.745269\n", + "time taken: 36.284964084625244\n", + "epoch: 36, training loss: 0.539117, training acc: 0.820575, valid loss: 0.669489, valid acc: 0.772251\n", "\n", - "break epoch:39\n", + "break epoch:37\n", "\n" ] }, @@ -1114,14 +1069,14 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "validation minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 420.11it/s]\n" + "validation minibatch loop: 100%|██████████| 616/616 [00:00<00:00, 721.06it/s]\n" ] } ], @@ -1145,7 +1100,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -1154,14 +1109,14 @@ "text": [ " precision recall f1-score support\n", "\n", - " anger 0.79 0.75 0.77 3803\n", - " fear 0.73 0.73 0.73 3784\n", - " joy 0.71 0.77 0.74 3872\n", - " love 0.81 0.80 0.80 3052\n", - " sadness 0.72 0.70 0.71 3205\n", - " surprise 0.73 0.70 0.72 1987\n", + " anger 0.79 0.79 0.79 3698\n", + " fear 0.75 0.75 0.75 3808\n", + " joy 0.76 0.77 0.77 3945\n", + " love 0.84 0.83 0.84 3049\n", + " sadness 0.75 0.72 0.74 3251\n", + " surprise 0.74 0.76 0.75 1952\n", "\n", - "avg / total 0.75 0.74 0.75 19703\n", + "avg / total 0.77 0.77 0.77 19703\n", "\n" ] } @@ -1176,17 +1131,17 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([[4.2693354e-03, 3.0179410e-03, 5.0122179e-03, 9.8567480e-01,\n", - " 1.7875731e-03, 2.3805207e-04]], dtype=float32)" + "array([[1.1725525e-07, 2.0598983e-07, 2.3001657e-04, 9.8360693e-01,\n", + " 3.8486030e-14, 1.6162727e-02]], dtype=float32)" ] }, - "execution_count": 18, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -1200,7 +1155,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -1209,7 +1164,7 @@ "'fast-text-char/model.ckpt'" ] }, - "execution_count": 19, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -1220,7 +1175,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -1253,7 +1208,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.2" + "version": "3.6.8" } }, "nbformat": 4, diff --git a/session/emotion/fast-text.ipynb b/session/emotion/fast-text.ipynb index 2616d51e..dc482129 100644 --- a/session/emotion/fast-text.ipynb +++ b/session/emotion/fast-text.ipynb @@ -9,7 +9,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/usr/local/lib/python3.5/dist-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n", + "/usr/local/lib/python3.6/dist-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n", " \"This module will be removed in 0.20.\", DeprecationWarning)\n" ] } @@ -31,7 +31,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 26, "metadata": {}, "outputs": [], "source": [ @@ -56,19 +56,22 @@ "\n", "def naive_stemmer(word):\n", " assert isinstance(word, str), 'input must be a string'\n", - " hujung_result = re.findall(r'^(.*?)(%s)$' % ('|'.join(hujung)), word)\n", - " word = hujung_result[0][0] if len(hujung_result) else word\n", - " permulaan_result = re.findall(r'^(.*?)(%s)' % ('|'.join(permulaan[::-1])), word)\n", - " permulaan_result.extend(re.findall(r'^(.*?)(%s)' % ('|'.join(permulaan)), word))\n", - " mula = permulaan_result if len(permulaan_result) else ''\n", - " if len(mula):\n", - " mula = mula[1][1] if len(mula[1][1]) > len(mula[0][1]) else mula[0][1]\n", - " return word.replace(mula, '')" + " hujung_result = [e for e in hujung if word.endswith(e)]\n", + " if len(hujung_result):\n", + " hujung_result = max(hujung_result, key = len)\n", + " if len(hujung_result):\n", + " word = word[: -len(hujung_result)]\n", + " permulaan_result = [e for e in permulaan if word.startswith(e)]\n", + " if len(permulaan_result):\n", + " permulaan_result = max(permulaan_result, key = len)\n", + " if len(permulaan_result):\n", + " word = word[len(permulaan_result) :]\n", + " return word" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 33, "metadata": {}, "outputs": [], "source": [ @@ -110,53 +113,37 @@ " return ' '.join([word for word in string if len(word) > 1])\n", "\n", "\n", - "def str_idx(corpus, dic, UNK = 3):\n", - " X = []\n", - " for sentence in corpus:\n", - " X.append([dic[w] if w in dic else UNK for w in sentence.split()[:maxlen]])\n", + "def str_idx(corpus, dic, maxlen, UNK = 3):\n", + " X = np.zeros((len(corpus), maxlen))\n", + " for i in range(len(corpus)):\n", + " for no, k in enumerate(corpus[i].split()[:maxlen][::-1]):\n", + " X[i, -1 - no] = dic.get(k, UNK)\n", " return X" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 34, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'raja benar sangat benci rakyat minyak naik gala'" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "def create_ngram_set(input_list, ngram_value):\n", - " return set(zip(*[input_list[i:] for i in range(ngram_value)]))\n", - "\n", - "\n", - "def build_ngram(x_train, limit = 100000):\n", - " global max_features\n", - " ngram_set = set()\n", - " for input_list in tqdm(x_train, total = len(x_train), ncols = 70):\n", - " for i in range(2, 3):\n", - " set_of_ngram = create_ngram_set(input_list, ngram_value = i)\n", - " ngram_set.update(set_of_ngram)\n", - " start_index = max_features + 1\n", - " token_indice = {v: k + start_index for k, v in enumerate(ngram_set) if k + max_features < limit}\n", - " indice_token = {token_indice[k]: k for k in token_indice}\n", - " max_features = np.max(list(indice_token.keys())) + 1\n", - " return token_indice\n", - "\n", - "\n", - "def add_ngram(sequences, token_indice):\n", - " new_sequences = []\n", - " for input_list in sequences:\n", - " new_list = input_list[:]\n", - " for ngram_value in range(2, ngram_range + 1):\n", - " for i in range(len(new_list) - ngram_value + 1):\n", - " ngram = tuple(new_list[i : i + ngram_value])\n", - " if ngram in token_indice:\n", - " new_list.append(token_indice[ngram])\n", - " new_sequences.append(new_list)\n", - " return new_sequences" + "classification_textcleaning('kerajaan sebenarnya sangat bencikan rakyatnya, minyak naik dan segalanya')" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -170,7 +157,7 @@ " 'translated-anger']" ] }, - "execution_count": 5, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -183,7 +170,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -197,7 +184,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -206,7 +193,7 @@ "['anger', 'fear', 'joy', 'love', 'sadness', 'surprise']" ] }, - "execution_count": 7, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -219,7 +206,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -236,9 +223,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "vocab from size: 14652\n", + "vocab from size: 14728\n", "Most common words [('saya', 165182), ('asa', 50903), ('rasa', 50028), ('tidak', 33044), ('yang', 31373), ('untuk', 15327)]\n", - "Sample data [521, 1144, 8, 4, 103, 723, 8, 94, 114, 8] ['buah', 'parti', 'yang', 'saya', 'gi', 'natal', 'yang', 'akhir', 'malam', 'yang']\n" + "Sample data [516, 1128, 8, 4, 103, 722, 8, 93, 115, 8] ['buah', 'parti', 'yang', 'saya', 'gi', 'natal', 'yang', 'akhir', 'malam', 'yang']\n" ] } ], @@ -257,9 +244,8 @@ "metadata": {}, "outputs": [], "source": [ - "ngram_range = 2\n", "max_features = len(dictionary)\n", - "maxlen = 80\n", + "maxlen = 100\n", "batch_size = 32\n", "embedded_size = 256" ] @@ -268,46 +254,15 @@ "cell_type": "code", "execution_count": 11, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "14656" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "max_features" + "X = str_idx(texts, dictionary, maxlen)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|███████████████████████| 98515/98515 [00:00<00:00, 226699.54it/s]\n" - ] - } - ], - "source": [ - "idx_trainset = str_idx(texts, dictionary, maxlen)\n", - "token_indice = build_ngram(idx_trainset)\n", - "X = add_ngram(idx_trainset, token_indice)\n", - "X = tf.keras.preprocessing.sequence.pad_sequences(X, maxlen)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, "outputs": [], "source": [ "train_X, test_X, train_Y, test_Y = train_test_split(X, \n", @@ -317,7 +272,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -354,7 +309,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -363,7 +318,7 @@ "'fast-text/model.ckpt'" ] }, - "execution_count": 15, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -379,7 +334,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -398,7 +353,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -412,7 +367,7 @@ " 'logits']" ] }, - "execution_count": 17, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -423,18 +378,18 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[,\n", + "[,\n", " ,\n", " ]" ] }, - "execution_count": 18, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -445,25 +400,63 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [01:32<00:00, 26.68it/s, accuracy=0.393, cost=1.54] \n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 250.83it/s, accuracy=0.522, cost=1.45]\n", - "train minibatch loop: 0%| | 3/2463 [00:00<01:27, 28.02it/s, accuracy=0.438, cost=1.55]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:29<00:00, 82.29it/s, accuracy=0.321, cost=1.72] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 225.72it/s, accuracy=0.609, cost=1.58]\n", + "train minibatch loop: 0%| | 10/2463 [00:00<00:26, 91.85it/s, accuracy=0.469, cost=1.61]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 0, pass acc: 0.000000, current acc: 0.383418\n", + "time taken: 32.66115999221802\n", + "epoch: 0, training loss: 1.725041, training acc: 0.286889, valid loss: 1.654089, valid acc: 0.383418\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 2463/2463 [00:29<00:00, 82.71it/s, accuracy=0.5, cost=1.44] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 221.76it/s, accuracy=0.696, cost=1.33]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:32, 76.10it/s, accuracy=0.594, cost=1.33]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 1, pass acc: 0.383418, current acc: 0.544854\n", + "time taken: 32.557716846466064\n", + "epoch: 1, training loss: 1.523483, training acc: 0.504238, valid loss: 1.394425, valid acc: 0.544854\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 2463/2463 [00:29<00:00, 82.75it/s, accuracy=0.571, cost=1.2] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 226.10it/s, accuracy=0.826, cost=1.09] \n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:33, 72.50it/s, accuracy=0.531, cost=1.32] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 0, pass acc: 0.000000, current acc: 0.459305\n", - "time taken: 94.68354630470276\n", - "epoch: 0, training loss: 1.677034, training acc: 0.352060, valid loss: 1.541595, valid acc: 0.459305\n", + "epoch: 2, pass acc: 0.544854, current acc: 0.664743\n", + "time taken: 32.49084973335266\n", + "epoch: 2, training loss: 1.241095, training acc: 0.648192, valid loss: 1.130963, valid acc: 0.664743\n", "\n" ] }, @@ -471,18 +464,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [01:32<00:00, 26.73it/s, accuracy=0.571, cost=1.13] \n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 266.92it/s, accuracy=0.565, cost=1.12] \n", - "train minibatch loop: 0%| | 3/2463 [00:00<01:49, 22.40it/s, accuracy=0.75, cost=1.15] " + "train minibatch loop: 100%|██████████| 2463/2463 [00:29<00:00, 80.18it/s, accuracy=0.643, cost=1.06] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 223.45it/s, accuracy=0.826, cost=0.949]\n", + "train minibatch loop: 0%| | 10/2463 [00:00<00:28, 86.76it/s, accuracy=0.719, cost=0.912]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 1, pass acc: 0.459305, current acc: 0.674673\n", - "time taken: 94.46491956710815\n", - "epoch: 1, training loss: 1.325451, training acc: 0.623462, valid loss: 1.148992, valid acc: 0.674673\n", + "epoch: 3, pass acc: 0.664743, current acc: 0.710726\n", + "time taken: 32.686481952667236\n", + "epoch: 3, training loss: 1.009701, training acc: 0.715228, valid loss: 0.950811, valid acc: 0.710726\n", "\n" ] }, @@ -490,18 +483,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [01:32<00:00, 26.76it/s, accuracy=0.643, cost=0.924]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 270.85it/s, accuracy=0.696, cost=0.869]\n", - "train minibatch loop: 0%| | 3/2463 [00:00<01:47, 22.78it/s, accuracy=0.781, cost=0.842]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:29<00:00, 82.81it/s, accuracy=0.714, cost=0.995]\n", + "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 218.47it/s, accuracy=0.826, cost=0.866]\n", + "train minibatch loop: 0%| | 9/2463 [00:00<00:27, 89.57it/s, accuracy=0.75, cost=0.827] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 2, pass acc: 0.674673, current acc: 0.736500\n", - "time taken: 94.32717251777649\n", - "epoch: 2, training loss: 0.962563, training acc: 0.735669, valid loss: 0.892813, valid acc: 0.736500\n", + "epoch: 4, pass acc: 0.710726, current acc: 0.735139\n", + "time taken: 32.563164472579956\n", + "epoch: 4, training loss: 0.860664, training acc: 0.746255, valid loss: 0.842707, valid acc: 0.735139\n", "\n" ] }, @@ -509,18 +502,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [01:32<00:00, 26.74it/s, accuracy=0.643, cost=0.846]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 263.92it/s, accuracy=0.739, cost=0.733]\n", - "train minibatch loop: 0%| | 3/2463 [00:00<01:27, 28.22it/s, accuracy=0.812, cost=0.677]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:29<00:00, 82.99it/s, accuracy=0.643, cost=0.966]\n", + "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 223.71it/s, accuracy=0.826, cost=0.815]\n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:35, 68.79it/s, accuracy=0.844, cost=0.542]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 3, pass acc: 0.736500, current acc: 0.758852\n", - "time taken: 94.42890787124634\n", - "epoch: 3, training loss: 0.749180, training acc: 0.781741, valid loss: 0.766707, valid acc: 0.758852\n", + "epoch: 5, pass acc: 0.735139, current acc: 0.746660\n", + "time taken: 32.43339252471924\n", + "epoch: 5, training loss: 0.770188, training acc: 0.762074, valid loss: 0.778998, valid acc: 0.746660\n", "\n" ] }, @@ -528,18 +521,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [01:32<00:00, 26.77it/s, accuracy=0.679, cost=0.811]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 269.56it/s, accuracy=0.739, cost=0.659]\n", - "train minibatch loop: 0%| | 3/2463 [00:00<01:46, 22.99it/s, accuracy=0.906, cost=0.55] " + "train minibatch loop: 100%|██████████| 2463/2463 [00:29<00:00, 76.69it/s, accuracy=0.643, cost=0.953]\n", + "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 226.17it/s, accuracy=0.826, cost=0.78] \n", + "train minibatch loop: 0%| | 11/2463 [00:00<00:23, 104.60it/s, accuracy=0.781, cost=0.708]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 4, pass acc: 0.758852, current acc: 0.769002\n", - "time taken: 94.28968334197998\n", - "epoch: 4, training loss: 0.632378, training acc: 0.805013, valid loss: 0.704613, valid acc: 0.769002\n", + "epoch: 6, pass acc: 0.746660, current acc: 0.753004\n", + "time taken: 32.654788970947266\n", + "epoch: 6, training loss: 0.714006, training acc: 0.771933, valid loss: 0.740220, valid acc: 0.753004\n", "\n" ] }, @@ -547,18 +540,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [01:32<00:00, 26.18it/s, accuracy=0.679, cost=0.788]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 270.62it/s, accuracy=0.739, cost=0.616]\n", - "train minibatch loop: 0%| | 3/2463 [00:00<01:38, 24.95it/s, accuracy=0.812, cost=0.533]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:29<00:00, 78.53it/s, accuracy=0.643, cost=0.946]\n", + "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 225.32it/s, accuracy=0.783, cost=0.756]\n", + "train minibatch loop: 0%| | 9/2463 [00:00<00:29, 82.34it/s, accuracy=0.625, cost=0.854]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 5, pass acc: 0.769002, current acc: 0.773316\n", - "time taken: 94.3593077659607\n", - "epoch: 5, training loss: 0.561727, training acc: 0.820722, valid loss: 0.671915, valid acc: 0.773316\n", + "epoch: 7, pass acc: 0.753004, current acc: 0.756689\n", + "time taken: 32.62237882614136\n", + "epoch: 7, training loss: 0.677090, training acc: 0.778861, valid loss: 0.715527, valid acc: 0.756689\n", "\n" ] }, @@ -566,18 +559,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [01:32<00:00, 26.52it/s, accuracy=0.714, cost=0.765]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 265.73it/s, accuracy=0.739, cost=0.588]\n", - "train minibatch loop: 0%| | 3/2463 [00:00<01:22, 29.99it/s, accuracy=0.812, cost=0.492]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:29<00:00, 78.99it/s, accuracy=0.643, cost=0.941]\n", + "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 225.55it/s, accuracy=0.783, cost=0.737]\n", + "train minibatch loop: 0%| | 10/2463 [00:00<00:24, 98.82it/s, accuracy=0.688, cost=0.815]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 6, pass acc: 0.773316, current acc: 0.776057\n", - "time taken: 94.39602041244507\n", - "epoch: 6, training loss: 0.513376, training acc: 0.831255, valid loss: 0.653939, valid acc: 0.776057\n", + "epoch: 8, pass acc: 0.756689, current acc: 0.759582\n", + "time taken: 32.511637449264526\n", + "epoch: 8, training loss: 0.651305, training acc: 0.783416, valid loss: 0.699181, valid acc: 0.759582\n", "\n" ] }, @@ -585,18 +578,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [01:32<00:00, 26.75it/s, accuracy=0.714, cost=0.742]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 267.82it/s, accuracy=0.783, cost=0.568]\n", - "train minibatch loop: 0%| | 3/2463 [00:00<01:22, 29.86it/s, accuracy=0.812, cost=0.461]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:29<00:00, 82.81it/s, accuracy=0.643, cost=0.938]\n", + "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 227.18it/s, accuracy=0.783, cost=0.724]\n", + "train minibatch loop: 0%| | 9/2463 [00:00<00:31, 78.47it/s, accuracy=0.781, cost=0.747]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 7, pass acc: 0.776057, current acc: 0.777193\n", - "time taken: 94.37455296516418\n", - "epoch: 7, training loss: 0.476937, training acc: 0.840682, valid loss: 0.644282, valid acc: 0.777193\n", + "epoch: 9, pass acc: 0.759582, current acc: 0.761561\n", + "time taken: 32.457406520843506\n", + "epoch: 9, training loss: 0.632305, training acc: 0.787666, valid loss: 0.688064, valid acc: 0.761561\n", "\n" ] }, @@ -604,18 +597,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [01:26<00:00, 29.86it/s, accuracy=0.714, cost=0.718]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 358.16it/s, accuracy=0.783, cost=0.554]\n", - "train minibatch loop: 0%| | 3/2463 [00:00<01:22, 29.98it/s, accuracy=0.812, cost=0.435]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:29<00:00, 82.98it/s, accuracy=0.643, cost=0.934]\n", + "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 226.95it/s, accuracy=0.826, cost=0.714]\n", + "train minibatch loop: 0%| | 10/2463 [00:00<00:25, 96.00it/s, accuracy=0.75, cost=0.627] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 8, pass acc: 0.777193, current acc: 0.777244\n", - "time taken: 88.02731561660767\n", - "epoch: 8, training loss: 0.447597, training acc: 0.848549, valid loss: 0.639808, valid acc: 0.777244\n", + "epoch: 10, pass acc: 0.761561, current acc: 0.762292\n", + "time taken: 32.39967155456543\n", + "epoch: 10, training loss: 0.617675, training acc: 0.790889, valid loss: 0.680386, valid acc: 0.762292\n", "\n" ] }, @@ -623,17 +616,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [01:22<00:00, 30.32it/s, accuracy=0.714, cost=0.693]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 355.50it/s, accuracy=0.783, cost=0.544]\n", - "train minibatch loop: 0%| | 4/2463 [00:00<01:21, 30.12it/s, accuracy=0.844, cost=0.464]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:29<00:00, 82.81it/s, accuracy=0.643, cost=0.931]\n", + "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 226.59it/s, accuracy=0.87, cost=0.706] \n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:35, 69.43it/s, accuracy=0.938, cost=0.305]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 84.06424927711487\n", - "epoch: 9, training loss: 0.422890, training acc: 0.855287, valid loss: 0.638810, valid acc: 0.776889\n", + "epoch: 11, pass acc: 0.762292, current acc: 0.763987\n", + "time taken: 32.4664580821991\n", + "epoch: 11, training loss: 0.605989, training acc: 0.793414, valid loss: 0.675059, valid acc: 0.763987\n", "\n" ] }, @@ -641,17 +635,17 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [01:28<00:00, 27.78it/s, accuracy=0.75, cost=0.668] \n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 267.66it/s, accuracy=0.783, cost=0.539]\n", - "train minibatch loop: 0%| | 3/2463 [00:00<01:26, 28.41it/s, accuracy=0.844, cost=0.398]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:29<00:00, 82.60it/s, accuracy=0.643, cost=0.927]\n", + "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 226.83it/s, accuracy=0.87, cost=0.701] \n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:32, 76.19it/s, accuracy=0.688, cost=0.754]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 90.96887183189392\n", - "epoch: 10, training loss: 0.401439, training acc: 0.861036, valid loss: 0.640286, valid acc: 0.775975\n", + "time taken: 32.53728008270264\n", + "epoch: 12, training loss: 0.596366, training acc: 0.796193, valid loss: 0.671394, valid acc: 0.763834\n", "\n" ] }, @@ -659,17 +653,17 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [01:32<00:00, 26.77it/s, accuracy=0.786, cost=0.642]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 271.32it/s, accuracy=0.783, cost=0.536]\n", - "train minibatch loop: 0%| | 3/2463 [00:00<01:26, 28.53it/s, accuracy=0.844, cost=0.383]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:29<00:00, 83.28it/s, accuracy=0.643, cost=0.923]\n", + "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 221.53it/s, accuracy=0.87, cost=0.698] \n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:31, 78.06it/s, accuracy=0.75, cost=0.733] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 94.28606629371643\n", - "epoch: 11, training loss: 0.382415, training acc: 0.866888, valid loss: 0.643615, valid acc: 0.774960\n", + "time taken: 32.35716152191162\n", + "epoch: 13, training loss: 0.588233, training acc: 0.798312, valid loss: 0.668933, valid acc: 0.763022\n", "\n" ] }, @@ -677,17 +671,17 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [01:32<00:00, 26.51it/s, accuracy=0.786, cost=0.617]\n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 275.06it/s, accuracy=0.783, cost=0.537]\n", - "train minibatch loop: 0%| | 3/2463 [00:00<01:49, 22.49it/s, accuracy=0.844, cost=0.326]" + "train minibatch loop: 100%|██████████| 2463/2463 [00:29<00:00, 82.84it/s, accuracy=0.643, cost=0.919]\n", + "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 224.24it/s, accuracy=0.87, cost=0.696] \n", + "train minibatch loop: 0%| | 9/2463 [00:00<00:32, 76.31it/s, accuracy=0.688, cost=0.735]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 94.27572536468506\n", - "epoch: 12, training loss: 0.365290, training acc: 0.872255, valid loss: 0.648401, valid acc: 0.773742\n", + "time taken: 32.47988224029541\n", + "epoch: 14, training loss: 0.581209, training acc: 0.800418, valid loss: 0.667365, valid acc: 0.763225\n", "\n" ] }, @@ -695,18 +689,36 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 2463/2463 [01:31<00:00, 26.78it/s, accuracy=0.821, cost=0.593] \n", - "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 269.65it/s, accuracy=0.783, cost=0.54] \n" + "train minibatch loop: 100%|██████████| 2463/2463 [00:29<00:00, 83.29it/s, accuracy=0.643, cost=0.914]\n", + "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 222.51it/s, accuracy=0.87, cost=0.695] \n", + "train minibatch loop: 0%| | 8/2463 [00:00<00:34, 72.19it/s, accuracy=0.688, cost=0.8] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 94.26148343086243\n", - "epoch: 13, training loss: 0.349714, training acc: 0.877522, valid loss: 0.654378, valid acc: 0.772372\n", + "time taken: 32.3430609703064\n", + "epoch: 15, training loss: 0.575031, training acc: 0.801954, valid loss: 0.666473, valid acc: 0.763022\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 2463/2463 [00:29<00:00, 83.00it/s, accuracy=0.643, cost=0.91] \n", + "test minibatch loop: 100%|██████████| 616/616 [00:02<00:00, 227.55it/s, accuracy=0.87, cost=0.696] \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "time taken: 32.38255524635315\n", + "epoch: 16, training loss: 0.569515, training acc: 0.803844, valid loss: 0.666104, valid acc: 0.762870\n", "\n", - "break epoch:14\n", + "break epoch:17\n", "\n" ] }, @@ -716,7 +728,7 @@ "'fast-text/model.ckpt'" ] }, - "execution_count": 19, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -792,14 +804,14 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "validation minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 612.23it/s]\n" + "validation minibatch loop: 100%|██████████| 616/616 [00:01<00:00, 532.99it/s]\n" ] } ], @@ -823,7 +835,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -832,14 +844,14 @@ "text": [ " precision recall f1-score support\n", "\n", - " anger 0.82 0.75 0.78 3754\n", - " fear 0.71 0.81 0.75 3837\n", - " joy 0.76 0.79 0.78 3844\n", - " love 0.83 0.83 0.83 3065\n", - " sadness 0.75 0.75 0.75 3241\n", - " surprise 0.79 0.64 0.71 1962\n", + " anger 0.74 0.81 0.77 3686\n", + " fear 0.75 0.75 0.75 3830\n", + " joy 0.73 0.78 0.75 3896\n", + " love 0.83 0.81 0.82 3041\n", + " sadness 0.77 0.67 0.72 3259\n", + " surprise 0.78 0.74 0.76 1991\n", "\n", - "avg / total 0.77 0.77 0.77 19703\n", + "avg / total 0.76 0.76 0.76 19703\n", "\n" ] } @@ -851,30 +863,82 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "with open('fast-text-emotion.json') as fopen:\n", + " p = json.load(fopen)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([[1.6177664e-08, 5.0652740e-18, 7.5105124e-23, 1.0000000e+00,\n", - " 1.7726123e-19, 4.0211566e-18]], dtype=float32)" + "array([[ 984., 20., 12., 173., 1613., 17., 20., 96.]])" ] }, - "execution_count": 22, + "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], + "source": [ + "str_idx([classification_textcleaning(text)],p['dictionary'], len(text.split()))" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "must be str, not int", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mtext\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'kerajaan sebenarnya sangat sayangkan rakyatnya, tetapi sebenarnya benci'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mnew_vector\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mstr_idx\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mclassification_textcleaning\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'dictionary'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtext\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msplit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;31m#sess.run(tf.nn.softmax(model.logits), feed_dict={model.X:new_vector})\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/array_ops.py\u001b[0m in \u001b[0;36m_slice_helper\u001b[0;34m(tensor, slice_spec, var)\u001b[0m\n\u001b[1;32m 489\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 490\u001b[0m \u001b[0mbegin\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 491\u001b[0;31m \u001b[0mend\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 492\u001b[0m \u001b[0mstrides\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 493\u001b[0m \u001b[0mshrink_axis_mask\u001b[0m \u001b[0;34m|=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m \u001b[0;34m<<\u001b[0m \u001b[0mindex\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: must be str, not int" + ] + } + ], "source": [ "text = 'kerajaan sebenarnya sangat sayangkan rakyatnya, tetapi sebenarnya benci'\n", - "new_vector = add_ngram(str_idx([classification_textcleaning(text)],dictionary), token_indice)\n", - "sess.run(tf.nn.softmax(model.logits), feed_dict={model.X:new_vector})" + "new_vector = str_idx([classification_textcleaning(text)],x['dictionary'], len(text.split()))\n", + "#sess.run(tf.nn.softmax(model.logits), feed_dict={model.X:new_vector})" ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 984., 20., 12., 173., 1613., 17., 20., 96.]])" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "new_vector" + ] + }, + { + "cell_type": "code", + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ @@ -885,7 +949,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -920,7 +984,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -940,7 +1004,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -955,25 +1019,25 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py:1702: UserWarning: An interactive session is already active. This can cause out-of-memory errors in some cases. You must explicitly call `InteractiveSession.close()` to release resources held by the other session(s).\n", + "/usr/local/lib/python3.6/dist-packages/tensorflow/python/client/session.py:1702: UserWarning: An interactive session is already active. This can cause out-of-memory errors in some cases. You must explicitly call `InteractiveSession.close()` to release resources held by the other session(s).\n", " warnings.warn('An interactive session is already active. This can '\n" ] }, { "data": { "text/plain": [ - "array([[1.6177664e-08, 5.0652740e-18, 7.5105124e-23, 1.0000000e+00,\n", - " 1.7726123e-19, 4.0211566e-18]], dtype=float32)" + "array([[4.1450025e-05, 3.9089160e-20, 2.2515555e-26, 9.9995852e-01,\n", + " 2.5486487e-21, 4.6214880e-22]], dtype=float32)" ] }, - "execution_count": 27, + "execution_count": 41, "metadata": {}, "output_type": "execute_result" } @@ -988,13 +1052,125 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 19, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "array([2, 2, 2, ..., 0, 0, 0])" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "labels" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'sebuah parti yang saya pergi ke natal yang terakhir'" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "texts[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[2.285901e-28, 0.000000e+00, 0.000000e+00, 0.000000e+00,\n", + " 1.000000e+00, 0.000000e+00]], dtype=float32)" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "text = 'bodoh sial'\n", + "new_vector = str_idx([classification_textcleaning(text)],p['dictionary'], len(text.split()))\n", + "test_sess.run(tf.nn.softmax(logits), feed_dict = {x: new_vector})" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[178., 874.]])" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "new_vector" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "9" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(text.split())" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'bodoh sial'" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "import pickle\n", - "with open('token-indice.pkl','wb') as fopen:\n", - " pickle.dump(token_indice, fopen)" + "classification_textcleaning(text)" ] }, { @@ -1021,7 +1197,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.2" + "version": "3.6.8" } }, "nbformat": 4, diff --git a/session/language-detection/language-detection-vectorizer.ipynb b/session/language-detection/language-detection-vectorizer.ipynb index 4d280e5e..308e1f67 100644 --- a/session/language-detection/language-detection-vectorizer.ipynb +++ b/session/language-detection/language-detection-vectorizer.ipynb @@ -52,6 +52,22 @@ "execution_count": 4, "metadata": {}, "outputs": [], + "source": [ + "special_langs = ['tur', 'rus', 'ita', 'epo', 'deu', 'fra', 'por', 'spa', 'hun',\n", + " 'heb', 'jpn', 'ukr', 'ber', 'pol', 'fin', 'mkd', 'nld', 'cmn', 'mar',\n", + " 'dan', 'swe', 'srp', 'lat', 'ara', 'ell', 'ces', 'bul', 'lit', 'toki','kor','fil']\n", + "\n", + "multi = []\n", + "for lang in special_langs:\n", + " indices = [i for i in range(len(langs)) if langs[i] == lang]\n", + " multi.append([[sentences[i] for i in indices],lang])" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], "source": [ "with open('malay-text.txt') as fopen:\n", " malays = filter(None, fopen.read().split('\\n'))\n", @@ -73,7 +89,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -91,7 +107,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -101,17 +117,87 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tur 10000\n", + "rus 10000\n", + "ita 10000\n", + "epo 10000\n", + "deu 10000\n", + "fra 10000\n", + "por 10000\n", + "spa 10000\n", + "hun 10000\n", + "heb 10000\n", + "jpn 10000\n", + "ukr 10000\n", + "ber 10000\n", + "pol 10000\n", + "fin 10000\n", + "mkd 10000\n", + "nld 10000\n", + "cmn 10000\n", + "mar 10000\n", + "dan 10000\n", + "swe 10000\n", + "srp 10000\n", + "lat 10000\n", + "ara 10000\n", + "ell 10000\n", + "ces 10000\n", + "bul 10000\n", + "lit 10000\n", + "toki 10000\n", + "kor 3687\n", + "fil 0\n" + ] + } + ], "source": [ "sentences = other_sentences + eng_sentences\n", - "langs = (['OTHER'] * len(other_sentences)) + (['eng'] * len(eng_sentences))" + "langs = (['OTHER'] * len(other_sentences)) + (['eng'] * len(eng_sentences))\n", + "for m in multi:\n", + " print(m[1],len(m[0]))\n", + " sentences += m[0]\n", + " langs += [m[1]] * len(m[0])" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(array(['OTHER', 'ara', 'ber', 'bul', 'ces', 'cmn', 'dan', 'deu', 'ell',\n", + " 'eng', 'epo', 'fin', 'fra', 'heb', 'hun', 'ita', 'jpn', 'kor',\n", + " 'lat', 'lit', 'mar', 'mkd', 'nld', 'pol', 'por', 'rus', 'spa',\n", + " 'srp', 'swe', 'toki', 'tur', 'ukr'], dtype='\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
textlang
0Klement Gottwaldi surnukeha palsameeriti ning ...est
1Sebes, Joseph; Pereira Thomas (1961) (på eng)....swe
2भारतीय स्वातन्त्र्य आन्दोलन राष्ट्रीय एवम क्षे...mai
3Après lo cort periòde d'establiment a Basilèa,...oci
4ถนนเจริญกรุง (อักษรโรมัน: Thanon Charoen Krung...tha
\n", + "" + ], + "text/plain": [ + " text lang\n", + "0 Klement Gottwaldi surnukeha palsameeriti ning ... est\n", + "1 Sebes, Joseph; Pereira Thomas (1961) (på eng).... swe\n", + "2 भारतीय स्वातन्त्र्य आन्दोलन राष्ट्रीय एवम क्षे... mai\n", + "3 Après lo cort periòde d'establiment a Basilèa,... oci\n", + "4 ถนนเจริญกรุง (อักษรโรมัน: Thanon Charoen Krung... tha" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "df = pd.DataFrame({'text':x,'lang':y})\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "selected = df.loc[df.lang.isin(['msa','ind'])]" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "import re\n", + "\n", + "def augmenter(text,label):\n", + " label = 'zlm' if label == 'msa' else label\n", + " text = text.split()\n", + " half = len(text) // 2\n", + " t = []\n", + " for i in range(len(text) - (half //2)):\n", + " t.append(' '.join(text[i:i + half]))\n", + " return t, [label] * len(t)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "X, Y = [], []\n", + "for i in range(selected.shape[0]):\n", + " x, y = augmenter(selected.iloc[i,0],selected.iloc[i,1])\n", + " X.extend(x)\n", + " Y.extend(y)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
1cmn我們試試看!
02cmn我该去睡觉了。
13cmn你在干什麼啊?
24cmn這是什麼啊?
35cmn今天是6月18号,也是Muiriel的生日!
46cmn生日快乐,Muiriel!
\n", + "
" + ], + "text/plain": [ + " 1 cmn 我們試試看!\n", + "0 2 cmn 我该去睡觉了。\n", + "1 3 cmn 你在干什麼啊?\n", + "2 4 cmn 這是什麼啊?\n", + "3 5 cmn 今天是6月18号,也是Muiriel的生日!\n", + "4 6 cmn 生日快乐,Muiriel!" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lang = pd.read_csv('sentences.csv',sep='\\t')\n", + "lang = lang.dropna()\n", + "lang.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['eng', 'tur', 'rus', 'ita', 'epo', 'deu', 'fra', 'por', 'spa', 'hun',\n", + " 'heb', 'jpn', 'ukr', 'ber', 'pol', 'fin', 'mkd', 'nld', 'cmn', 'mar',\n", + " 'dan', 'swe', 'srp', 'lat', 'ara', 'ell', 'ces', 'bul', 'lit', 'toki'],\n", + " dtype='object')" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lang.cmn.value_counts().index[:30]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "selected_langs = ['zlm','eng','ind']\n", + "special_langs = ['tur', 'rus', 'ita', 'epo', 'deu', 'fra', 'por', 'spa', 'hun',\n", + " 'heb', 'jpn', 'ukr', 'ber', 'pol', 'fin', 'mkd', 'nld', 'cmn', 'mar',\n", + " 'dan', 'swe', 'srp', 'lat', 'ara', 'ell', 'ces', 'bul', 'lit', 'toki','kor','fil']" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "vie\n", + "arz\n", + "yue\n", + "bel\n", + "que\n", + "swh\n", + "nno\n", + "wuu\n", + "nob\n", + "zsm\n", + "est\n", + "kat\n", + "urd\n", + "sqi\n", + "isl\n", + "fry\n", + "afr\n", + "ron\n", + "fao\n", + "san\n", + "bre\n", + "tat\n", + "yid\n", + "uig\n", + "uzb\n", + "qya\n", + "pes\n", + "slk\n", + "eus\n", + "cycl\n", + "acm\n", + "tgl\n", + "lvs\n", + "kaz\n", + "hye\n", + "hin\n", + "ben\n", + "cat\n", + "bos\n", + "hrv\n", + "tha\n", + "orv\n", + "cha\n", + "mon\n", + "lzh\n", + "scn\n", + "gle\n", + "slv\n", + "frm\n", + "glg\n", + "vol\n", + "ain\n", + "jbo\n", + "ina\n", + "nds\n", + "mal\n", + "tlh\n", + "roh\n", + "ltz\n", + "oss\n", + "ido\n", + "gla\n", + "mlt\n", + "sco\n", + "ast\n", + "jav\n", + "oci\n", + "ile\n", + "xal\n", + "tel\n", + "sjn\n", + "nov\n", + "khm\n", + "tpi\n", + "ang\n", + "aze\n", + "tgk\n", + "tuk\n", + "chv\n", + "hsb\n", + "dsb\n", + "bod\n", + "sme\n", + "cym\n", + "mri\n", + "ksh\n", + "kur\n", + "ewe\n", + "kab\n", + "tpw\n", + "udm\n", + "lld\n", + "pms\n", + "lad\n", + "grn\n", + "mlg\n", + "xho\n", + "pnb\n", + "grc\n", + "hat\n", + "lao\n", + "npi\n", + "cor\n", + "nah\n", + "avk\n", + "guj\n", + "pan\n", + "kir\n", + "myv\n", + "prg\n", + "sux\n", + "crs\n", + "ckt\n", + "bak\n", + "hil\n", + "cbk\n", + "chr\n", + "nav\n", + "lkt\n", + "enm\n", + "arq\n", + "lin\n", + "abk\n", + "pcd\n", + "rom\n", + "gsw\n", + "tam\n", + "zul\n", + "awa\n", + "wln\n", + "amh\n", + "bar\n", + "ota\n", + "mhr\n", + "bho\n", + "mrj\n", + "osx\n", + "pfl\n", + "mgm\n", + "sna\n", + "mah\n", + "hau\n", + "kan\n", + "nog\n", + "sin\n", + "glv\n", + "dng\n", + "kal\n", + "liv\n", + "vro\n", + "apc\n", + "jdt\n", + "fur\n", + "che\n", + "haw\n", + "yor\n", + "crh\n", + "pdc\n", + "ppl\n", + "kin\n", + "shs\n", + "mnw\n", + "tet\n", + "sah\n", + "kum\n", + "ngt\n", + "nya\n", + "pus\n", + "hif\n", + "mya\n", + "moh\n", + "wol\n", + "tir\n", + "lzz\n", + "oar\n", + "lug\n", + "brx\n", + "non\n", + "mww\n", + "hak\n", + "nlv\n", + "ngu\n", + "bua\n", + "aym\n", + "vec\n", + "ibo\n", + "tkl\n", + "ton\n", + "bam\n", + "kha\n", + "ceb\n", + "lou\n", + "fuc\n", + "smo\n", + "gag\n", + "lfn\n", + "arg\n", + "umb\n", + "tyv\n", + "kjh\n", + "oji\n", + "cyo\n", + "urh\n", + "kzj\n", + "pam\n", + "srd\n", + "lmo\n", + "swg\n", + "mdf\n", + "gil\n", + "snd\n", + "tso\n", + "sot\n", + "zza\n", + "tsn\n", + "pau\n", + "som\n", + "egl\n", + "ady\n", + "asm\n", + "ori\n", + "dtp\n", + "cho\n", + "max\n", + "kam\n", + "niu\n", + "sag\n", + "ilo\n", + "kaa\n", + "fuv\n", + "nch\n", + "hoc\n", + "iba\n", + "gbm\n", + "sun\n", + "war\n", + "mvv\n", + "pap\n", + "ary\n", + "kxi\n", + "csb\n", + "pag\n", + "cos\n", + "rif\n", + "kek\n", + "krc\n", + "aii\n", + "ban\n", + "ssw\n", + "tvl\n", + "mfe\n", + "tah\n", + "bvy\n", + "bcl\n", + "hnj\n", + "nau\n", + "nst\n", + "afb\n", + "quc\n", + "min\n", + "tmw\n", + "mad\n", + "bjn\n", + "mai\n", + "cjy\n", + "got\n", + "hsn\n", + "gan\n", + "tzl\n", + "dws\n", + "ldn\n", + "afh\n", + "sgs\n", + "krl\n", + "vep\n", + "rue\n", + "tly\n", + "mic\n", + "ext\n", + "izh\n", + "sma\n", + "jam\n", + "cmo\n", + "mwl\n", + "kpv\n", + "koi\n", + "ike\n", + "\\N\n", + "mnc\n", + "aoz\n", + "otk\n", + "kas\n", + "aln\n", + "akl\n", + "run\n" + ] + } + ], + "source": [ + "negative_sentences = []\n", + "for ln in lang.cmn.unique():\n", + " if ln in selected_langs:\n", + " langs = lang.loc[lang.cmn == ln].iloc[:50000,-1].tolist()\n", + " X.extend(langs)\n", + " Y.extend([ln] * len(langs))\n", + " elif ln in special_langs:\n", + " langs = lang.loc[lang.cmn == ln].iloc[:10000,-1].tolist()\n", + " X.extend(langs)\n", + " Y.extend([ln] * len(langs))\n", + " else:\n", + " print(ln)\n", + " negative_sentences.extend(lang.loc[lang.cmn == ln].iloc[-300:,-1].tolist())" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "X.extend(negative_sentences)\n", + "Y.extend(['OTHER'] * len(negative_sentences))" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['ind', 'ind', 'ind', 'ind', 'ind', 'ind', 'ind', 'ind', 'ind', 'ind']" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Y[:10]" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import json\n", + "import re\n", + "from unidecode import unidecode\n", + "\n", + "def simple_textcleaning_language_detection(string):\n", + " string = re.sub('[^A-Za-z ]+', ' ', unidecode(string))\n", + " string = filter(None, string.split())\n", + " string = [y.strip() for y in string if len(y) > 1]\n", + " return ' '.join(string).lower()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "bm = ''\n", + "for i in [i for i in os.listdir('crawler') if i.find('isu')>=0]:\n", + " with open('crawler/' + i,'r') as fopen:\n", + " isu = json.load(fopen)\n", + " bm += ' '.join([simple_textcleaning_language_detection(i['summary']) for i in isu if i['language']=='id'])\n", + "bm = bm.split()\n", + "new_langs = [' '.join(bm[i:i+4]) for i in range(0, len(bm), 4)] " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "X.extend(new_langs)\n", + "Y.extend(['zlm'] * len(new_langs))" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(array(['OTHER', 'ara', 'ber', 'bul', 'ces', 'cmn', 'dan', 'deu', 'ell',\n", + " 'eng', 'epo', 'fin', 'fra', 'heb', 'hun', 'ind', 'ita', 'jpn',\n", + " 'kor', 'lat', 'lit', 'mar', 'mkd', 'nld', 'pol', 'por', 'rus',\n", + " 'spa', 'srp', 'swe', 'toki', 'tur', 'ukr', 'zlm'], dtype=' len(mula[0][1]) else mula[0][1]\n", - " return word.replace(mula, '')" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ + " hujung_result = [e for e in hujung if word.endswith(e)]\n", + " if len(hujung_result):\n", + " hujung_result = max(hujung_result, key = len)\n", + " if len(hujung_result):\n", + " word = word[: -len(hujung_result)]\n", + " permulaan_result = [e for e in permulaan if word.startswith(e)]\n", + " if len(permulaan_result):\n", + " permulaan_result = max(permulaan_result, key = len)\n", + " if len(permulaan_result):\n", + " word = word[len(permulaan_result) :]\n", + " return word\n", + "\n", "def build_dataset(words, n_words):\n", " count = [['GO', 0], ['PAD', 1], ['EOS', 2], ['UNK', 3]]\n", " counter = collections.Counter(words).most_common(n_words)\n", @@ -101,118 +655,53 @@ " )\n", " string = unidecode(string).replace('.', ' . ').replace(',', ' , ')\n", " string = re.sub('[^A-Za-z ]+', ' ', string)\n", - " string = re.sub(r'[ ]+', ' ', string).strip()\n", - " string = ' '.join(\n", - " [i for i in re.findall('[\\\\w\\']+|[;:\\-\\(\\)&.,!?\"]', string) if len(i)]\n", - " )\n", - " string = string.lower().split()\n", - " string = [(naive_stemmer(word), word) for word in string]\n", - " return (\n", - " ' '.join([word[0] for word in string if len(word[0]) > 1]),\n", - " ' '.join([word[1] for word in string if len(word[0]) > 1]),\n", - " )\n", + " string = re.sub(r'[ ]+', ' ', string.lower()).strip()\n", + " string = [rules_normalizer.get(w, w) for w in string.split()]\n", + " string = [naive_stemmer(word) for word in string]\n", + " return ' '.join([word for word in string if len(word) > 1])\n", "\n", "\n", "def str_idx(corpus, dic, maxlen, UNK = 3):\n", " X = np.zeros((len(corpus), maxlen))\n", " for i in range(len(corpus)):\n", " for no, k in enumerate(corpus[i].split()[:maxlen][::-1]):\n", - " val = dic[k] if k in dic else UNK\n", - " X[i, -1 - no] = val\n", + " X[i, -1 - no] = dic.get(k, UNK)\n", " return X" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
labeltext
0NegativeLebih-lebih lagi dengan  kemudahan internet da...
1Positiveboleh memberi teguran kepada parti tetapi perl...
2NegativeAdalah membingungkan mengapa masyarakat Cina b...
3PositiveKami menurunkan defisit daripada 6.7 peratus p...
4NegativeIni masalahnya. Bukan rakyat, tetapi sistem
\n", - "
" - ], "text/plain": [ - " label text\n", - "0 Negative Lebih-lebih lagi dengan  kemudahan internet da...\n", - "1 Positive boleh memberi teguran kepada parti tetapi perl...\n", - "2 Negative Adalah membingungkan mengapa masyarakat Cina b...\n", - "3 Positive Kami menurunkan defisit daripada 6.7 peratus p...\n", - "4 Negative Ini masalahnya. Bukan rakyat, tetapi sistem" + "'raja benar sangat benci rakyat minyak naik gala'" ] }, - "execution_count": 5, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df = pd.read_csv('dataset/sentiment-data-v2.csv')\n", - "Y = LabelEncoder().fit_transform(df.label)\n", - "df.head()" + "classification_textcleaning('kerajaan sebenarnya sangat bencikan rakyatnya, minyak naik dan segalanya')" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ - "with open('dataset/polarity-negative-translated.txt','r') as fopen:\n", + "df = pd.read_csv('sentiment-data-v2.csv')\n", + "Y = LabelEncoder().fit_transform(df.label)\n", + "with open('polarity-negative-translated.txt','r') as fopen:\n", " texts = fopen.read().split('\\n')\n", "labels = [0] * len(texts)\n", "\n", - "with open('dataset/polarity-positive-translated.txt','r') as fopen:\n", + "with open('polarity-positive-translated.txt','r') as fopen:\n", " positive_texts = fopen.read().split('\\n')\n", "labels += [1] * len(positive_texts)\n", "texts += positive_texts\n", @@ -222,28 +711,157 @@ "assert len(labels) == len(texts)" ] }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "with open('bm-amazon.json') as fopen:\n", + " amazon = json.load(fopen)\n", + " \n", + "with open('bm-imdb.json') as fopen:\n", + " imdb = json.load(fopen)\n", + " \n", + "with open('bm-yelp.json') as fopen:\n", + " yelp = json.load(fopen)\n", + " \n", + "texts += amazon['negative']\n", + "labels += [0] * len(amazon['negative'])\n", + "texts += amazon['positive']\n", + "labels += [1] * len(amazon['positive'])\n", + "\n", + "texts += imdb['negative']\n", + "labels += [0] * len(imdb['negative'])\n", + "texts += imdb['positive']\n", + "labels += [1] * len(imdb['positive'])\n", + "\n", + "texts += yelp['negative']\n", + "labels += [0] * len(yelp['negative'])\n", + "texts += yelp['positive']\n", + "labels += [1] * len(yelp['positive'])" + ] + }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ - "for i in range(len(texts)):\n", - " texts[i] = classification_textcleaning(texts[i])[0]" + "import os\n", + "for i in [i for i in os.listdir('negative') if 'Store' not in i]:\n", + " with open('negative/'+i) as fopen:\n", + " a = json.load(fopen)\n", + " texts += a\n", + " labels += [0] * len(a)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "for i in [i for i in os.listdir('positive') if 'Store' not in i]:\n", + " with open('positive/'+i) as fopen:\n", + " a = json.load(fopen)\n", + " texts += a\n", + " labels += [1] * len(a)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(675023, 675023)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(texts),len(labels)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "for i in range(len(texts)):\n", + " texts[i] = classification_textcleaning(texts[i])" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['ada anda yiar tentang gatur tidur yang baru tidak lama lagi yusun mula ada yang baik ntiasa asa begitu jaya lepas itu',\n", + " 'lamat pagi dunia',\n", + " 'sini rumah pupu saya',\n", + " 'mungkin ini lebih anda',\n", + " 'ima kasih saya erlukan',\n", + " 'neraka windows luar dari julat harga saya cuali jika tidak',\n", + " 'neah saya harap ha enang mbali catat dalam tweet akhir saya',\n", + " 'aww saya benar benar minta maaf tentang itu tidak ada apa apa yang sa deng jadi asi tidak anda lihat quot quot malam kido',\n", + " 'saya tidak sabar untuk lihat apa kara yang akjub yang anda datang tidak nah lupa anda luar biasa',\n", + " 'deng cara saya embali dewi matahari malam tadi anda sasha sangat agum saya boleh onton filem itu ulang kali']" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "texts[-10:]" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "labels[-10:]" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "vocab from size: 13325\n", - "Most common words [('yang', 14899), ('tidak', 4588), ('untuk', 4038), ('filem', 3698), ('deng', 3350), ('ada', 3190)]\n", - "Sample data [1316, 196, 178, 98, 98, 126, 353, 4, 90, 210] ['ringkas', 'bodoh', 'bosan', 'kanak', 'kanak', 'lelaki', 'remaja', 'yang', 'begitu', 'muda']\n" + "vocab from size: 120097\n", + "Most common words [('saya', 533028), ('yang', 204446), ('tidak', 164296), ('untuk', 129707), ('anda', 126091), ('hari', 88975)]\n", + "Sample data [2667, 229, 363, 235, 235, 94, 1357, 5, 78, 678] ['ringkas', 'bodoh', 'bosan', 'kanak', 'kanak', 'lelaki', 'remaja', 'yang', 'begitu', 'muda']\n" ] } ], @@ -258,10 +876,11 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ + "\n", "class Model:\n", " def __init__(\n", " self,\n", @@ -331,12 +950,12 @@ " self.accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))\n", " self.attention = tf.nn.softmax(\n", " tf.reduce_sum(self.alignments[0], 1), name = 'alphas'\n", - " )\n" + " )" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -345,7 +964,7 @@ "'bahdanau/model.ckpt'" ] }, - "execution_count": 11, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -357,7 +976,7 @@ "learning_rate = 1e-4\n", "batch_size = 32\n", "dropout = 0.8\n", - "maxlen = 80\n", + "maxlen = 100\n", "\n", "tf.reset_default_graph()\n", "sess = tf.InteractiveSession()\n", @@ -376,7 +995,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -396,7 +1015,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -429,7 +1048,7 @@ " 'alphas']" ] }, - "execution_count": 13, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -440,13 +1059,13 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[,\n", + "[,\n", " ,\n", " ,\n", " ,\n", @@ -459,7 +1078,7 @@ " ]" ] }, - "execution_count": 14, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -470,37 +1089,36 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ - "vectors = str_idx(texts, dictionary, maxlen)\n", "train_X, test_X, train_Y, test_Y = train_test_split(\n", - " vectors, labels, test_size = 0.2\n", + " texts, labels, test_size = 0.2\n", ")" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [02:07<00:00, 2.73it/s, accuracy=0.613, cost=0.602]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:11<00:00, 7.53it/s, accuracy=0.625, cost=0.588]\n", - "train minibatch loop: 0%| | 0/357 [00:00" + "
" ] }, "metadata": { @@ -1013,7 +1568,7 @@ ], "source": [ "plt.figure(figsize = (15, 7))\n", - "labels = [word for word in text[1].split()]\n", + "labels = [word for word in text.split()]\n", "val = [val for val in result[1]]\n", "plt.bar(np.arange(len(labels)), val)\n", "plt.xticks(np.arange(len(labels)), labels, rotation = 'vertical')\n", @@ -1045,7 +1600,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.2" + "version": "3.6.8" } }, "nbformat": 4, diff --git a/session/sentiment/bidirectional.ipynb b/session/sentiment/bidirectional.ipynb index 281993ca..96ce3052 100644 --- a/session/sentiment/bidirectional.ipynb +++ b/session/sentiment/bidirectional.ipynb @@ -9,7 +9,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/usr/local/lib/python3.5/dist-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n", + "/usr/local/lib/python3.6/dist-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n", " \"This module will be removed in 0.20.\", DeprecationWarning)\n" ] } @@ -17,14 +17,13 @@ "source": [ "import re\n", "import numpy as np\n", - "import pandas as pd\n", "import collections\n", "from sklearn import metrics\n", - "from sklearn.preprocessing import LabelEncoder\n", - "import tensorflow as tf\n", "from sklearn.cross_validation import train_test_split\n", + "import tensorflow as tf\n", + "import pandas as pd\n", "from unidecode import unidecode\n", - "from nltk.util import ngrams\n", + "from sklearn.preprocessing import LabelEncoder\n", "from tqdm import tqdm\n", "import time" ] @@ -34,6 +33,565 @@ "execution_count": 2, "metadata": {}, "outputs": [], + "source": [ + "rules_normalizer = {\n", + " 'experience': 'pengalaman',\n", + " 'bagasi': 'bagasi',\n", + " 'kg': 'kampung',\n", + " 'kilo': 'kilogram',\n", + " 'g': 'gram',\n", + " 'grm': 'gram',\n", + " 'k': 'okay',\n", + " 'abgkat': 'abang dekat',\n", + " 'abis': 'habis',\n", + " 'ade': 'ada',\n", + " 'adoi': 'aduh',\n", + " 'adoii': 'aduhh',\n", + " 'aerodarat': 'kapal darat',\n", + " 'agkt': 'angkat',\n", + " 'ahh': 'ah',\n", + " 'ailior': 'air liur',\n", + " 'airasia': 'air asia x',\n", + " 'airasiax': 'penerbangan',\n", + " 'airline': 'penerbangan',\n", + " 'airlines': 'penerbangan',\n", + " 'airport': 'lapangan terbang',\n", + " 'airpot': 'lapangan terbang',\n", + " 'aje': 'sahaja',\n", + " 'ajelah': 'sahajalah',\n", + " 'ajer': 'sahaja',\n", + " 'ak': 'aku',\n", + " 'aq': 'aku',\n", + " 'all': 'semua',\n", + " 'ambik': 'ambil',\n", + " 'amek': 'ambil',\n", + " 'amer': 'amir',\n", + " 'amik': 'ambil',\n", + " 'ana': 'saya',\n", + " 'angkt': 'angkat',\n", + " 'anual': 'tahunan',\n", + " 'apapun': 'apa pun',\n", + " 'ape': 'apa',\n", + " 'arab': 'arab',\n", + " 'area': 'kawasan',\n", + " 'aritu': 'hari itu',\n", + " 'ask': 'tanya',\n", + " 'astro': 'astro',\n", + " 'at': 'pada',\n", + " 'attitude': 'sikap',\n", + " 'babi': 'khinzir',\n", + " 'back': 'belakang',\n", + " 'bag': 'beg',\n", + " 'bang': 'abang',\n", + " 'bangla': 'bangladesh',\n", + " 'banyk': 'banyak',\n", + " 'bard': 'pujangga',\n", + " 'bargasi': 'bagasi',\n", + " 'bawak': 'bawa',\n", + " 'bawanges': 'bawang',\n", + " 'be': 'jadi',\n", + " 'behave': 'berkelakuan baik',\n", + " 'belagak': 'berlagak',\n", + " 'berdisiplin': 'berdisplin',\n", + " 'berenti': 'berhenti',\n", + " 'beskal': 'basikal',\n", + " 'bff': 'rakan karib',\n", + " 'bg': 'bagi',\n", + " 'bgi': 'bagi',\n", + " 'biase': 'biasa',\n", + " 'big': 'besar',\n", + " 'bike': 'basikal',\n", + " 'bile': 'bila',\n", + " 'binawe': 'binatang',\n", + " 'bini': 'isteri',\n", + " 'bkn': 'bukan',\n", + " 'bla': 'bila',\n", + " 'blom': 'belum',\n", + " 'bnyak': 'banyak',\n", + " 'body': 'tubuh',\n", + " 'bole': 'boleh',\n", + " 'boss': 'bos',\n", + " 'bowling': 'boling',\n", + " 'bpe': 'berapa',\n", + " 'brand': 'jenama',\n", + " 'brg': 'barang',\n", + " 'briefing': 'taklimat',\n", + " 'brng': 'barang',\n", + " 'bro': 'abang',\n", + " 'bru': 'baru',\n", + " 'bruntung': 'beruntung',\n", + " 'bsikal': 'basikal',\n", + " 'btnggjwb': 'bertanggungjawab',\n", + " 'btul': 'betul',\n", + " 'buatlh': 'buatlah',\n", + " 'buh': 'letak',\n", + " 'buka': 'buka',\n", + " 'but': 'tetapi',\n", + " 'bwk': 'bawa',\n", + " 'by': 'dengan',\n", + " 'byr': 'bayar',\n", + " 'bz': 'sibuk',\n", + " 'camera': 'kamera',\n", + " 'camni': 'macam ini',\n", + " 'cane': 'macam mana',\n", + " 'cant': 'tak boleh',\n", + " 'carakerja': 'cara kerja',\n", + " 'care': 'jaga',\n", + " 'cargo': 'kargo',\n", + " 'cctv': 'kamera litar tertutup',\n", + " 'celako': 'celaka',\n", + " 'cer': 'cerita',\n", + " 'cheap': 'murah',\n", + " 'check': 'semak',\n", + " 'ciput': 'sedikit',\n", + " 'cite': 'cerita',\n", + " 'citer': 'cerita',\n", + " 'ckit': 'sikit',\n", + " 'ckp': 'cakap',\n", + " 'class': 'kelas',\n", + " 'cm': 'macam',\n", + " 'cmni': 'macam ini',\n", + " 'cmpak': 'campak',\n", + " 'committed': 'komited',\n", + " 'company': 'syarikat',\n", + " 'complain': 'aduan',\n", + " 'corn': 'jagung',\n", + " 'couldnt': 'tak boleh',\n", + " 'cr': 'cari',\n", + " 'crew': 'krew',\n", + " 'cube': 'cuba',\n", + " 'cuma': 'cuma',\n", + " 'curinyaa': 'curinya',\n", + " 'cust': 'pelanggan',\n", + " 'customer': 'pelanggan',\n", + " 'd': 'di',\n", + " 'da': 'dah',\n", + " 'dn': 'dan',\n", + " 'dahh': 'dah',\n", + " 'damaged': 'rosak',\n", + " 'dapek': 'dapat',\n", + " 'day': 'hari',\n", + " 'dazrin': 'dazrin',\n", + " 'dbalingnya': 'dibalingnya',\n", + " 'de': 'ada',\n", + " 'deep': 'dalam',\n", + " 'deliberately': 'sengaja',\n", + " 'depa': 'mereka',\n", + " 'dessa': 'desa',\n", + " 'dgn': 'dengan',\n", + " 'dh': 'dah',\n", + " 'didunia': 'di dunia',\n", + " 'diorang': 'mereka',\n", + " 'diorng': 'mereka',\n", + " 'direct': 'secara terus',\n", + " 'diving': 'junam',\n", + " 'dkt': 'dekat',\n", + " 'dlempar': 'dilempar',\n", + " 'dlm': 'dalam',\n", + " 'dlt': 'padam',\n", + " 'dlu': 'dulu',\n", + " 'done': 'siap',\n", + " 'dont': 'jangan',\n", + " 'dorg': 'mereka',\n", + " 'dpermudhkn': 'dipermudahkan',\n", + " 'dpt': 'dapat',\n", + " 'dr': 'dari',\n", + " 'dri': 'dari',\n", + " 'dsb': 'dan sebagainya',\n", + " 'dy': 'dia',\n", + " 'educate': 'mendidik',\n", + " 'ensure': 'memastikan',\n", + " 'everything': 'semua',\n", + " 'ewahh': 'wah',\n", + " 'expect': 'sangka',\n", + " 'fb': 'facebook',\n", + " 'fired': 'pecat',\n", + " 'first': 'pertama',\n", + " 'fkr': 'fikir',\n", + " 'flight': 'kapal terbang',\n", + " 'for': 'untuk',\n", + " 'free': 'percuma',\n", + " 'friend': 'kawan',\n", + " 'fyi': 'untuk pengetahuan anda',\n", + " 'gantila': 'gantilah',\n", + " 'gantirugi': 'ganti rugi',\n", + " 'gentlemen': 'lelaki budiman',\n", + " 'gerenti': 'jaminan',\n", + " 'gile': 'gila',\n", + " 'gk': 'juga',\n", + " 'gnti': 'ganti',\n", + " 'go': 'pergi',\n", + " 'gomen': 'kerajaan',\n", + " 'goment': 'kerajaan',\n", + " 'good': 'baik',\n", + " 'ground': 'tanah',\n", + " 'guarno': 'macam mana',\n", + " 'hampa': 'mereka',\n", + " 'hampeh': 'teruk',\n", + " 'hanat': 'jahanam',\n", + " 'handle': 'kawal',\n", + " 'handling': 'kawalan',\n", + " 'hanta': 'hantar',\n", + " 'haritu': 'hari itu',\n", + " 'hate': 'benci',\n", + " 'have': 'ada',\n", + " 'hawau': 'celaka',\n", + " 'henpon': 'telefon',\n", + " 'heran': 'hairan',\n", + " 'him': 'dia',\n", + " 'his': 'dia',\n", + " 'hmpa': 'mereka',\n", + " 'hntr': 'hantar',\n", + " 'hotak': 'otak',\n", + " 'hr': 'hari',\n", + " 'i': 'saya',\n", + " 'hrga': 'harga',\n", + " 'hrp': 'harap',\n", + " 'hu': 'sedih',\n", + " 'humble': 'merendah diri',\n", + " 'ibon': 'ikon',\n", + " 'ichi': 'inci',\n", + " 'idung': 'hidung',\n", + " 'if': 'jika',\n", + " 'ig': 'instagram',\n", + " 'iklas': 'ikhlas',\n", + " 'improve': 'menambah baik',\n", + " 'in': 'masuk',\n", + " 'isn t': 'tidak',\n", + " 'isyaallah': 'insyallah',\n", + " 'ja': 'sahaja',\n", + " 'japan': 'jepun',\n", + " 'jd': 'jadi',\n", + " 'je': 'saja',\n", + " 'jee': 'saja',\n", + " 'jek': 'saja',\n", + " 'jepun': 'jepun',\n", + " 'jer': 'saja',\n", + " 'jerr': 'saja',\n", + " 'jez': 'saja',\n", + " 'jg': 'juga',\n", + " 'jgk': 'juga',\n", + " 'jgn': 'jangan',\n", + " 'jgnla': 'janganlah',\n", + " 'jibake': 'celaka',\n", + " 'jjur': 'jujur',\n", + " 'job': 'kerja',\n", + " 'jobscope': 'skop kerja',\n", + " 'jogja': 'jogjakarta',\n", + " 'jpam': 'jpam',\n", + " 'jth': 'jatuh',\n", + " 'jugak': 'juga',\n", + " 'ka': 'ke',\n", + " 'kalo': 'kalau',\n", + " 'kalu': 'kalau',\n", + " 'kang': 'nanti',\n", + " 'kantoi': 'temberang',\n", + " 'kasi': 'beri',\n", + " 'kat': 'dekat',\n", + " 'kbye': 'ok bye',\n", + " 'kearah': 'ke arah',\n", + " 'kecik': 'kecil',\n", + " 'keja': 'kerja',\n", + " 'keje': 'kerja',\n", + " 'kejo': 'kerja',\n", + " 'keksongan': 'kekosongan',\n", + " 'kemana': 'ke mana',\n", + " 'kene': 'kena',\n", + " 'kenekan': 'kenakan',\n", + " 'kesah': 'kisah',\n", + " 'ketempat': 'ke tempat',\n", + " 'kije': 'kerja',\n", + " 'kijo': 'kerja',\n", + " 'kiss': 'cium',\n", + " 'kite': 'kita',\n", + " 'kito': 'kita',\n", + " 'kje': 'kerja',\n", + " 'kjr': 'kerja',\n", + " 'kk': 'okay',\n", + " 'kmi': 'kami',\n", + " 'kt': 'kat',\n", + " 'tlg': 'tolong',\n", + " 'kl': 'kuala lumpur',\n", + " 'klai': 'kalau',\n", + " 'klau': 'kalau',\n", + " 'klia': 'klia',\n", + " 'klo': 'kalau',\n", + " 'klu': 'kalau',\n", + " 'kn': 'kan',\n", + " 'knapa': 'kenapa',\n", + " 'kne': 'kena',\n", + " 'ko': 'kau',\n", + " 'kompom': 'sah',\n", + " 'korang': 'kamu semua',\n", + " 'korea': 'korea',\n", + " 'korg': 'kamu semua',\n", + " 'kot': 'mungkin',\n", + " 'krja': 'kerja',\n", + " 'ksalahan': 'kesalahan',\n", + " 'kta': 'kita',\n", + " 'kuar': 'keluar',\n", + " 'kut': 'mungkin',\n", + " 'la': 'lah',\n", + " 'laa': 'lah',\n", + " 'lahabau': 'celaka',\n", + " 'lahanat': 'celaka',\n", + " 'lainda': 'lain dah',\n", + " 'lak': 'pula',\n", + " 'last': 'akhir',\n", + " 'le': 'lah',\n", + " 'leader': 'ketua',\n", + " 'leave': 'pergi',\n", + " 'ler': 'lah',\n", + " 'less': 'kurang',\n", + " 'letter': 'surat',\n", + " 'lg': 'lagi',\n", + " 'lgi': 'lagi',\n", + " 'lngsong': 'langsung',\n", + " 'lol': 'hehe',\n", + " 'lorr': 'lah',\n", + " 'low': 'rendah',\n", + " 'lps': 'lepas',\n", + " 'luggage': 'bagasi',\n", + " 'lumbe': 'lumba',\n", + " 'lyak': 'layak',\n", + " 'maap': 'maaf',\n", + " 'maapkan': 'maafkan',\n", + " 'mahai': 'mahal',\n", + " 'mampos': 'mampus',\n", + " 'mart': 'kedai',\n", + " 'mau': 'mahu',\n", + " 'mcm': 'macam',\n", + " 'mcmtu': 'macam itu',\n", + " 'memerlukn': 'memerlukan',\n", + " 'mengembirakan': 'menggembirakan',\n", + " 'mengmbilnyer': 'mengambilnya',\n", + " 'mengtasi': 'mengatasi',\n", + " 'mg': 'memang',\n", + " 'mihak': 'memihak',\n", + " 'min': 'admin',\n", + " 'mingu': 'minggu',\n", + " 'mintak': 'minta',\n", + " 'mjtuhkn': 'menjatuhkan',\n", + " 'mkyong': 'mak yong',\n", + " 'mlibatkn': 'melibatkan',\n", + " 'mmg': 'memang',\n", + " 'mmnjang': 'memanjang',\n", + " 'mmpos': 'mampus',\n", + " 'mn': 'mana',\n", + " 'mna': 'mana',\n", + " 'mntak': 'minta',\n", + " 'mntk': 'minta',\n", + " 'mnyusun': 'menyusun',\n", + " 'mood': 'suasana',\n", + " 'most': 'paling',\n", + " 'mr': 'tuan',\n", + " 'msa': 'masa',\n", + " 'msia': 'malaysia',\n", + " 'mst': 'mesti',\n", + " 'mu': 'awak',\n", + " 'much': 'banyak',\n", + " 'muko': 'muka',\n", + " 'mum': 'emak',\n", + " 'n': 'dan',\n", + " 'nah': 'nah',\n", + " 'nanny': 'nenek',\n", + " 'napo': 'kenapa',\n", + " 'nati': 'nanti',\n", + " 'ngan': 'dengan',\n", + " 'ngn': 'dengan',\n", + " 'ni': 'ini',\n", + " 'nie': 'ini',\n", + " 'nii': 'ini',\n", + " 'nk': 'nak',\n", + " 'nmpk': 'nampak',\n", + " 'nye': 'nya',\n", + " 'ofis': 'pejabat',\n", + " 'ohh': 'oh',\n", + " 'oii': 'hoi',\n", + " 'one': 'satu',\n", + " 'online': 'dalam talian',\n", + " 'or': 'atau',\n", + " 'org': 'orang',\n", + " 'orng': 'orang',\n", + " 'otek': 'otak',\n", + " 'p': 'pergi',\n", + " 'paid': 'dah bayar',\n", + " 'palabana': 'kepala otak',\n", + " 'pasni': 'lepas ini',\n", + " 'passengers': 'penumpang',\n", + " 'passengger': 'penumpang',\n", + " 'pastu': 'lepas itu',\n", + " 'pd': 'pada',\n", + " 'pegi': 'pergi',\n", + " 'pekerje': 'pekerja',\n", + " 'pekrja': 'pekerja',\n", + " 'perabih': 'perabis',\n", + " 'perkerja': 'pekerja',\n", + " 'pg': 'pergi',\n", + " 'phuii': 'puih',\n", + " 'pikir': 'fikir',\n", + " 'pilot': 'juruterbang',\n", + " 'pk': 'fikir',\n", + " 'pkerja': 'pekerja',\n", + " 'pkerjaan': 'pekerjaan',\n", + " 'pki': 'pakai',\n", + " 'please': 'tolong',\n", + " 'pls': 'tolong',\n", + " 'pn': 'pun',\n", + " 'pnh': 'pernah',\n", + " 'pnt': 'penat',\n", + " 'pnya': 'punya',\n", + " 'pon': 'pun',\n", + " 'priority': 'keutamaan',\n", + " 'properties': 'harta benda',\n", + " 'ptugas': 'petugas',\n", + " 'pub': 'kelab malam',\n", + " 'pulak': 'pula',\n", + " 'puye': 'punya',\n", + " 'pwrcuma': 'percuma',\n", + " 'pyahnya': 'payahnya',\n", + " 'quality': 'kualiti',\n", + " 'quit': 'keluar',\n", + " 'ramly': 'ramly',\n", + " 'rege': 'harga',\n", + " 'reger': 'harga',\n", + " 'report': 'laporan',\n", + " 'resigned': 'meletakkan jawatan',\n", + " 'respect': 'hormat',\n", + " 'rizal': 'rizal',\n", + " 'rosak': 'rosak',\n", + " 'rosok': 'rosak',\n", + " 'rse': 'rasa',\n", + " 'sacked': 'buang',\n", + " 'sado': 'tegap',\n", + " 'salute': 'sanjung',\n", + " 'sam': 'sama',\n", + " 'same': 'sama',\n", + " 'samp': 'sampah',\n", + " 'sbb': 'sebab',\n", + " 'sbgai': 'sebagai',\n", + " 'sblm': 'sebelum',\n", + " 'sblum': 'sebelum',\n", + " 'sbnarnya': 'sebenarnya',\n", + " 'sbum': 'sebelum',\n", + " 'sdg': 'sedang',\n", + " 'sebb': 'sebab',\n", + " 'sebijik': 'sebiji',\n", + " 'see': 'lihat',\n", + " 'seen': 'dilihat',\n", + " 'selangor': 'selangor',\n", + " 'selfie': 'swafoto',\n", + " 'sempoi': 'cantik',\n", + " 'senaraihitam': 'senarai hitam',\n", + " 'seorg': 'seorang',\n", + " 'service': 'perkhidmatan',\n", + " 'sgt': 'sangat',\n", + " 'shared': 'kongsi',\n", + " 'shirt': 'kemeja',\n", + " 'shut': 'tutup',\n", + " 'sib': 'nasib',\n", + " 'skali': 'sekali',\n", + " 'sket': 'sikit',\n", + " 'sma': 'sama',\n", + " 'smoga': 'semoga',\n", + " 'smpoi': 'cantik',\n", + " 'sndiri': 'sendiri',\n", + " 'sndr': 'sendiri',\n", + " 'sndri': 'sendiri',\n", + " 'sne': 'sana',\n", + " 'so': 'jadi',\n", + " 'sop': 'tatacara pengendalian piawai',\n", + " 'sorang': 'seorang',\n", + " 'spoting': 'pembintikan',\n", + " 'sronok': 'seronok',\n", + " 'ssh': 'susah',\n", + " 'staff': 'staf',\n", + " 'standing': 'berdiri',\n", + " 'start': 'mula',\n", + " 'steady': 'mantap',\n", + " 'stiap': 'setiap',\n", + " 'stress': 'stres',\n", + " 'student': 'pelajar',\n", + " 'study': 'belajar',\n", + " 'studycase': 'kajian kes',\n", + " 'sure': 'pasti',\n", + " 'sykt': 'syarikat',\n", + " 'tah': 'entah',\n", + " 'taik': 'tahi',\n", + " 'takan': 'tak akan',\n", + " 'takat': 'setakat',\n", + " 'takde': 'tak ada',\n", + " 'takkan': 'tak akan',\n", + " 'taknak': 'tak nak',\n", + " 'tang': 'tentang',\n", + " 'tanggungjawab': 'bertanggungjawab',\n", + " 'taraa': 'sementara',\n", + " 'tau': 'tahu',\n", + " 'tbabit': 'terbabit',\n", + " 'team': 'pasukan',\n", + " 'terbaekk': 'terbaik',\n", + " 'teruknye': 'teruknya',\n", + " 'tgk': 'tengok',\n", + " 'that': 'itu',\n", + " 'thinking': 'fikir',\n", + " 'those': 'itu',\n", + " 'time': 'masa',\n", + " 'tk': 'tak',\n", + " 'tnggongjwb': 'tanggungjawab',\n", + " 'tngok': 'tengok',\n", + " 'tngu': 'tunggu',\n", + " 'to': 'kepada',\n", + " 'tosak': 'rosak',\n", + " 'tp': 'tapi',\n", + " 'tpi': 'tapi',\n", + " 'tpon': 'telefon',\n", + " 'transfer': 'pindah',\n", + " 'trgelak': 'tergelak',\n", + " 'ts': 'tan sri',\n", + " 'tstony': 'tan sri tony',\n", + " 'tu': 'itu',\n", + " 'tuh': 'itu',\n", + " 'tula': 'itulah',\n", + " 'umeno': 'umno',\n", + " 'unfortunately': 'malangnya',\n", + " 'unhappy': 'tidak gembira',\n", + " 'up': 'naik',\n", + " 'upkan': 'naikkan',\n", + " 'ur': 'awak',\n", + " 'utk': 'untuk',\n", + " 'very': 'sangat',\n", + " 'viral': 'tular',\n", + " 'vote': 'undi',\n", + " 'warning': 'amaran',\n", + " 'warranty': 'waranti',\n", + " 'wassap': 'whatsapp',\n", + " 'wat': 'apa',\n", + " 'weii': 'wei',\n", + " 'well': 'maklumlah',\n", + " 'win': 'menang',\n", + " 'with': 'dengan',\n", + " 'wt': 'buat',\n", + " 'x': 'tak',\n", + " 'tw': 'tahu',\n", + " 'ye': 'ya',\n", + " 'yee': 'ya',\n", + " 'yg': 'yang',\n", + " 'yng': 'yang',\n", + " 'you': 'awak',\n", + " 'your': 'awak',\n", + " 'sakai': 'selekeh',\n", + " 'rmb': 'billion ringgit',\n", + " 'rmj': 'juta ringgit',\n", + " 'rmk': 'ribu ringgit',\n", + " 'rm': 'ringgit',\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], "source": [ "permulaan = [\n", " 'bel',\n", @@ -56,22 +614,18 @@ "\n", "def naive_stemmer(word):\n", " assert isinstance(word, str), 'input must be a string'\n", - " hujung_result = re.findall(r'^(.*?)(%s)$' % ('|'.join(hujung)), word)\n", - " word = hujung_result[0][0] if len(hujung_result) else word\n", - " permulaan_result = re.findall(r'^(.*?)(%s)' % ('|'.join(permulaan[::-1])), word)\n", - " permulaan_result.extend(re.findall(r'^(.*?)(%s)' % ('|'.join(permulaan)), word))\n", - " mula = permulaan_result if len(permulaan_result) else ''\n", - " if len(mula):\n", - " mula = mula[1][1] if len(mula[1][1]) > len(mula[0][1]) else mula[0][1]\n", - " return word.replace(mula, '')" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ + " hujung_result = [e for e in hujung if word.endswith(e)]\n", + " if len(hujung_result):\n", + " hujung_result = max(hujung_result, key = len)\n", + " if len(hujung_result):\n", + " word = word[: -len(hujung_result)]\n", + " permulaan_result = [e for e in permulaan if word.startswith(e)]\n", + " if len(permulaan_result):\n", + " permulaan_result = max(permulaan_result, key = len)\n", + " if len(permulaan_result):\n", + " word = word[len(permulaan_result) :]\n", + " return word\n", + "\n", "def build_dataset(words, n_words):\n", " count = [['GO', 0], ['PAD', 1], ['EOS', 2], ['UNK', 3]]\n", " counter = collections.Counter(words).most_common(n_words)\n", @@ -101,23 +655,17 @@ " )\n", " string = unidecode(string).replace('.', ' . ').replace(',', ' , ')\n", " string = re.sub('[^A-Za-z ]+', ' ', string)\n", - " string = re.sub(r'[ ]+', ' ', string).strip()\n", - " string = ' '.join(\n", - " [i for i in re.findall('[\\\\w\\']+|[;:\\-\\(\\)&.,!?\"]', string) if len(i)]\n", - " )\n", - " string = string.lower().split()\n", - " string = [(naive_stemmer(word), word) for word in string]\n", - " return (\n", - " ' '.join([word[0] for word in string if len(word[0]) > 1]),\n", - " ' '.join([word[1] for word in string if len(word[0]) > 1]),\n", - " )\n", + " string = re.sub(r'[ ]+', ' ', string.lower()).strip()\n", + " string = [rules_normalizer.get(w, w) for w in string.split()]\n", + " string = [naive_stemmer(word) for word in string]\n", + " return ' '.join([word for word in string if len(word) > 1])\n", + "\n", "\n", "def str_idx(corpus, dic, maxlen, UNK = 3):\n", " X = np.zeros((len(corpus), maxlen))\n", " for i in range(len(corpus)):\n", " for no, k in enumerate(corpus[i].split()[:maxlen][::-1]):\n", - " val = dic[k] if k in dic else UNK\n", - " X[i, -1 - no] = val\n", + " X[i, -1 - no] = dic.get(k, UNK)\n", " return X" ] }, @@ -128,66 +676,8 @@ "outputs": [ { "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
labeltext
0NegativeLebih-lebih lagi dengan  kemudahan internet da...
1Positiveboleh memberi teguran kepada parti tetapi perl...
2NegativeAdalah membingungkan mengapa masyarakat Cina b...
3PositiveKami menurunkan defisit daripada 6.7 peratus p...
4NegativeIni masalahnya. Bukan rakyat, tetapi sistem
\n", - "
" - ], "text/plain": [ - " label text\n", - "0 Negative Lebih-lebih lagi dengan  kemudahan internet da...\n", - "1 Positive boleh memberi teguran kepada parti tetapi perl...\n", - "2 Negative Adalah membingungkan mengapa masyarakat Cina b...\n", - "3 Positive Kami menurunkan defisit daripada 6.7 peratus p...\n", - "4 Negative Ini masalahnya. Bukan rakyat, tetapi sistem" + "'raja benar sangat benci rakyat minyak naik gala'" ] }, "execution_count": 4, @@ -196,9 +686,7 @@ } ], "source": [ - "df = pd.read_csv('dataset/sentiment-data-v2.csv')\n", - "Y = LabelEncoder().fit_transform(df.label)\n", - "df.head()" + "classification_textcleaning('kerajaan sebenarnya sangat bencikan rakyatnya, minyak naik dan segalanya')" ] }, { @@ -207,11 +695,13 @@ "metadata": {}, "outputs": [], "source": [ - "with open('dataset/polarity-negative-translated.txt','r') as fopen:\n", + "df = pd.read_csv('sentiment-data-v2.csv')\n", + "Y = LabelEncoder().fit_transform(df.label)\n", + "with open('polarity-negative-translated.txt','r') as fopen:\n", " texts = fopen.read().split('\\n')\n", "labels = [0] * len(texts)\n", "\n", - "with open('dataset/polarity-positive-translated.txt','r') as fopen:\n", + "with open('polarity-positive-translated.txt','r') as fopen:\n", " positive_texts = fopen.read().split('\\n')\n", "labels += [1] * len(positive_texts)\n", "texts += positive_texts\n", @@ -227,22 +717,151 @@ "metadata": {}, "outputs": [], "source": [ - "for i in range(len(texts)):\n", - " texts[i] = classification_textcleaning(texts[i])[0]" + "import json\n", + "with open('bm-amazon.json') as fopen:\n", + " amazon = json.load(fopen)\n", + " \n", + "with open('bm-imdb.json') as fopen:\n", + " imdb = json.load(fopen)\n", + " \n", + "with open('bm-yelp.json') as fopen:\n", + " yelp = json.load(fopen)\n", + " \n", + "texts += amazon['negative']\n", + "labels += [0] * len(amazon['negative'])\n", + "texts += amazon['positive']\n", + "labels += [1] * len(amazon['positive'])\n", + "\n", + "texts += imdb['negative']\n", + "labels += [0] * len(imdb['negative'])\n", + "texts += imdb['positive']\n", + "labels += [1] * len(imdb['positive'])\n", + "\n", + "texts += yelp['negative']\n", + "labels += [0] * len(yelp['negative'])\n", + "texts += yelp['positive']\n", + "labels += [1] * len(yelp['positive'])" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "for i in [i for i in os.listdir('negative') if 'Store' not in i]:\n", + " with open('negative/'+i) as fopen:\n", + " a = json.load(fopen)\n", + " texts += a\n", + " labels += [0] * len(a)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "for i in [i for i in os.listdir('positive') if 'Store' not in i]:\n", + " with open('positive/'+i) as fopen:\n", + " a = json.load(fopen)\n", + " texts += a\n", + " labels += [1] * len(a)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(675023, 675023)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(texts),len(labels)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "for i in range(len(texts)):\n", + " texts[i] = classification_textcleaning(texts[i])" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['ada anda yiar tentang gatur tidur yang baru tidak lama lagi yusun mula ada yang baik ntiasa asa begitu jaya lepas itu',\n", + " 'lamat pagi dunia',\n", + " 'sini rumah pupu saya',\n", + " 'mungkin ini lebih anda',\n", + " 'ima kasih saya erlukan',\n", + " 'neraka windows luar dari julat harga saya cuali jika tidak',\n", + " 'neah saya harap ha enang mbali catat dalam tweet akhir saya',\n", + " 'aww saya benar benar minta maaf tentang itu tidak ada apa apa yang sa deng jadi asi tidak anda lihat quot quot malam kido',\n", + " 'saya tidak sabar untuk lihat apa kara yang akjub yang anda datang tidak nah lupa anda luar biasa',\n", + " 'deng cara saya embali dewi matahari malam tadi anda sasha sangat agum saya boleh onton filem itu ulang kali']" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "texts[-10:]" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "labels[-10:]" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "vocab from size: 13325\n", - "Most common words [('yang', 14899), ('tidak', 4588), ('untuk', 4038), ('filem', 3698), ('deng', 3350), ('ada', 3190)]\n", - "Sample data [1327, 197, 178, 98, 98, 126, 355, 4, 90, 210] ['ringkas', 'bodoh', 'bosan', 'kanak', 'kanak', 'lelaki', 'remaja', 'yang', 'begitu', 'muda']\n" + "vocab from size: 120097\n", + "Most common words [('saya', 533028), ('yang', 204446), ('tidak', 164296), ('untuk', 129707), ('anda', 126091), ('hari', 88975)]\n", + "Sample data [2667, 229, 363, 235, 235, 94, 1357, 5, 78, 678] ['ringkas', 'bodoh', 'bosan', 'kanak', 'kanak', 'lelaki', 'remaja', 'yang', 'begitu', 'muda']\n" ] } ], @@ -257,7 +876,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -330,7 +949,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -339,7 +958,7 @@ "'bidirectional/model.ckpt'" ] }, - "execution_count": 9, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -351,7 +970,7 @@ "learning_rate = 1e-4\n", "batch_size = 32\n", "dropout = 0.8\n", - "maxlen = 80\n", + "maxlen = 100\n", "\n", "tf.reset_default_graph()\n", "sess = tf.InteractiveSession()\n", @@ -370,7 +989,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -390,7 +1009,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -422,7 +1041,7 @@ " 'gradients/logits_grad/tuple/control_dependency_1']" ] }, - "execution_count": 11, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -433,13 +1052,13 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[,\n", + "[,\n", " ,\n", " ,\n", " ,\n", @@ -452,7 +1071,7 @@ " ]" ] }, - "execution_count": 12, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -463,132 +1082,36 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ - "vectors = str_idx(texts, dictionary, maxlen)\n", "train_X, test_X, train_Y, test_Y = train_test_split(\n", - " vectors, labels, test_size = 0.2\n", + " texts, labels, test_size = 0.2\n", ")" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [01:12<00:00, 4.93it/s, accuracy=0.452, cost=0.692]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:06<00:00, 13.55it/s, accuracy=0.625, cost=0.679]\n", - "train minibatch loop: 0%| | 0/357 [00:00 len(mula[0][1]) else mula[0][1]\n", - " return word.replace(mula, '')" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ + " hujung_result = [e for e in hujung if word.endswith(e)]\n", + " if len(hujung_result):\n", + " hujung_result = max(hujung_result, key = len)\n", + " if len(hujung_result):\n", + " word = word[: -len(hujung_result)]\n", + " permulaan_result = [e for e in permulaan if word.startswith(e)]\n", + " if len(permulaan_result):\n", + " permulaan_result = max(permulaan_result, key = len)\n", + " if len(permulaan_result):\n", + " word = word[len(permulaan_result) :]\n", + " return word\n", + "\n", + "def build_dataset(words, n_words):\n", + " count = [['GO', 0], ['PAD', 1], ['EOS', 2], ['UNK', 3]]\n", + " counter = collections.Counter(words).most_common(n_words)\n", + " count.extend(counter)\n", + " dictionary = dict()\n", + " for word, _ in count:\n", + " dictionary[word] = len(dictionary)\n", + " data = list()\n", + " unk_count = 0\n", + " for word in words:\n", + " index = dictionary.get(word, 3)\n", + " if index == 0:\n", + " unk_count += 1\n", + " data.append(index)\n", + " count[0][1] = unk_count\n", + " reversed_dictionary = dict(zip(dictionary.values(), dictionary.keys()))\n", + " return data, count, dictionary, reversed_dictionary\n", + "\n", + "\n", "def classification_textcleaning(string):\n", " string = re.sub(\n", " 'http\\S+|www.\\S+',\n", @@ -82,22 +655,18 @@ " )\n", " string = unidecode(string).replace('.', ' . ').replace(',', ' , ')\n", " string = re.sub('[^A-Za-z ]+', ' ', string)\n", - " string = re.sub(r'[ ]+', ' ', string).strip()\n", - " string = ' '.join(\n", - " [i for i in re.findall('[\\\\w\\']+|[;:\\-\\(\\)&.,!?\"]', string) if len(i)]\n", - " )\n", - " string = string.lower().split()\n", - " string = [(naive_stemmer(word), word) for word in string]\n", - " return (\n", - " ' '.join([word[0] for word in string if len(word[0]) > 1]),\n", - " ' '.join([word[1] for word in string if len(word[0]) > 1]),\n", - " )\n", + " string = re.sub(r'[ ]+', ' ', string.lower()).strip()\n", + " string = [rules_normalizer.get(w, w) for w in string.split()]\n", + " string = [naive_stemmer(word) for word in string]\n", + " return ' '.join([word for word in string if len(word) > 1])\n", "\n", - "def convert_sparse_matrix_to_sparse_tensor(X, limit = 5):\n", - " coo = X.tocoo()\n", - " indices = np.mat([coo.row, coo.col]).transpose()\n", - " coo.data[coo.data > limit] = limit\n", - " return tf.SparseTensorValue(indices, coo.col, coo.shape), tf.SparseTensorValue(indices, coo.data, coo.shape)" + "\n", + "def str_idx(corpus, dic, maxlen, UNK = 3):\n", + " X = np.zeros((len(corpus), maxlen))\n", + " for i in range(len(corpus)):\n", + " for no, k in enumerate(corpus[i].split()[:maxlen][::-1]):\n", + " X[i, -1 - no] = dic.get(k, UNK)\n", + " return X" ] }, { @@ -107,66 +676,8 @@ "outputs": [ { "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
labeltext
0NegativeLebih-lebih lagi dengan  kemudahan internet da...
1Positiveboleh memberi teguran kepada parti tetapi perl...
2NegativeAdalah membingungkan mengapa masyarakat Cina b...
3PositiveKami menurunkan defisit daripada 6.7 peratus p...
4NegativeIni masalahnya. Bukan rakyat, tetapi sistem
\n", - "
" - ], "text/plain": [ - " label text\n", - "0 Negative Lebih-lebih lagi dengan  kemudahan internet da...\n", - "1 Positive boleh memberi teguran kepada parti tetapi perl...\n", - "2 Negative Adalah membingungkan mengapa masyarakat Cina b...\n", - "3 Positive Kami menurunkan defisit daripada 6.7 peratus p...\n", - "4 Negative Ini masalahnya. Bukan rakyat, tetapi sistem" + "'raja benar sangat benci rakyat minyak naik gala'" ] }, "execution_count": 4, @@ -175,9 +686,7 @@ } ], "source": [ - "df = pd.read_csv('dataset/sentiment-data-v2.csv')\n", - "Y = LabelEncoder().fit_transform(df.label)\n", - "df.head()" + "classification_textcleaning('kerajaan sebenarnya sangat bencikan rakyatnya, minyak naik dan segalanya')" ] }, { @@ -186,11 +695,13 @@ "metadata": {}, "outputs": [], "source": [ - "with open('dataset/polarity-negative-translated.txt','r') as fopen:\n", + "df = pd.read_csv('sentiment-data-v2.csv')\n", + "Y = LabelEncoder().fit_transform(df.label)\n", + "with open('polarity-negative-translated.txt','r') as fopen:\n", " texts = fopen.read().split('\\n')\n", "labels = [0] * len(texts)\n", "\n", - "with open('dataset/polarity-positive-translated.txt','r') as fopen:\n", + "with open('polarity-positive-translated.txt','r') as fopen:\n", " positive_texts = fopen.read().split('\\n')\n", "labels += [1] * len(positive_texts)\n", "texts += positive_texts\n", @@ -206,8 +717,30 @@ "metadata": {}, "outputs": [], "source": [ - "for i in range(len(texts)):\n", - " texts[i] = classification_textcleaning(texts[i])[0]" + "import json\n", + "with open('bm-amazon.json') as fopen:\n", + " amazon = json.load(fopen)\n", + " \n", + "with open('bm-imdb.json') as fopen:\n", + " imdb = json.load(fopen)\n", + " \n", + "with open('bm-yelp.json') as fopen:\n", + " yelp = json.load(fopen)\n", + " \n", + "texts += amazon['negative']\n", + "labels += [0] * len(amazon['negative'])\n", + "texts += amazon['positive']\n", + "labels += [1] * len(amazon['positive'])\n", + "\n", + "texts += imdb['negative']\n", + "labels += [0] * len(imdb['negative'])\n", + "texts += imdb['positive']\n", + "labels += [1] * len(imdb['positive'])\n", + "\n", + "texts += yelp['negative']\n", + "labels += [0] * len(yelp['negative'])\n", + "texts += yelp['positive']\n", + "labels += [1] * len(yelp['positive'])" ] }, { @@ -216,8 +749,19 @@ "metadata": {}, "outputs": [], "source": [ - "bow_chars = CountVectorizer(ngram_range=(3, 5), analyzer='char_wb', max_features=300000).fit(texts)\n", - "delattr(bow_chars, 'stop_words_')" + "import os\n", + "for i in [i for i in os.listdir('negative') if 'Store' not in i]:\n", + " with open('negative/'+i) as fopen:\n", + " a = json.load(fopen)\n", + " texts += a\n", + " labels += [0] * len(a)\n", + " \n", + "import os\n", + "for i in [i for i in os.listdir('positive') if 'Store' not in i]:\n", + " with open('positive/'+i) as fopen:\n", + " a = json.load(fopen)\n", + " texts += a\n", + " labels += [1] * len(a)" ] }, { @@ -226,7 +770,12 @@ "metadata": {}, "outputs": [], "source": [ - "feature_shape = bow_chars.transform(texts[:1]).shape[1]" + "x, y = [], []\n", + "for i in range(len(texts)):\n", + " s = classification_textcleaning(texts[i])\n", + " if len(s) > 5:\n", + " x.append(s)\n", + " y.append(labels[i])" ] }, { @@ -234,45 +783,99 @@ "execution_count": 9, "metadata": {}, "outputs": [], + "source": [ + "def convert_sparse_matrix_to_sparse_tensor(X, limit = 5):\n", + " coo = X.tocoo()\n", + " indices = np.mat([coo.row, coo.col]).transpose()\n", + " #coo.data[coo.data > limit] = limit\n", + " return tf.SparseTensorValue(indices, coo.col, coo.shape), tf.SparseTensorValue(indices, coo.data, coo.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.feature_extraction.text import CountVectorizer" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "bow_chars = CountVectorizer(ngram_range=(3, 5), analyzer='char_wb').fit(x)\n", + "delattr(bow_chars, 'stop_words_')" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "331938" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "feature_shape = bow_chars.transform(texts[:1]).shape[1]\n", + "feature_shape" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], "source": [ "class Model:\n", " def __init__(self, vocab_size, learning_rate):\n", " self.X = tf.sparse_placeholder(tf.int32)\n", " self.W = tf.sparse_placeholder(tf.int32)\n", " self.Y = tf.placeholder(tf.int32, [None])\n", - " embeddings = tf.Variable(tf.truncated_normal([vocab_size,64]))\n", - " embed = tf.nn.embedding_lookup_sparse(embeddings, self.X, self.W, combiner='mean')\n", + " self.embeddings = tf.Variable(tf.truncated_normal([vocab_size,128]))\n", + " embed = tf.nn.embedding_lookup_sparse(self.embeddings, self.X, self.W, combiner='mean')\n", " self.logits = tf.layers.dense(embed, 2)\n", " self.cost = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(\n", " logits = self.logits, labels = self.Y))\n", - " self.optimizer = tf.train.AdamOptimizer(learning_rate = learning_rate).minimize(self.cost)\n", - " correct_pred = tf.equal(tf.argmax(self.logits, 1,output_type=tf.int32), self.Y)\n", + " self.optimizer = tf.train.GradientDescentOptimizer(learning_rate = learning_rate).minimize(self.cost)\n", + " correct_pred = tf.equal(tf.argmax(self.logits, 1, output_type=tf.int32), self.Y)\n", " self.accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/gradients_impl.py:112: UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.\n", + "/usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/gradients_impl.py:112: UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.\n", " \"Converting sparse IndexedSlices to a dense Tensor of unknown shape. \"\n" ] } ], "source": [ + "tf.reset_default_graph()\n", "sess = tf.InteractiveSession()\n", - "model = Model(feature_shape, 1e-4)\n", + "model = Model(feature_shape, 1e-3)\n", "sess.run(tf.global_variables_initializer())" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -281,7 +884,7 @@ "'fast-text-char/model.ckpt'" ] }, - "execution_count": 11, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -293,37 +896,36 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ - "vectors = bow_chars.transform(texts)\n", "train_X, test_X, train_Y, test_Y = train_test_split(\n", - " vectors, labels, test_size = 0.2\n", + " x, y, test_size = 0.2\n", ")" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 135.13it/s, accuracy=0.548, cost=0.694]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 377.78it/s, accuracy=0.75, cost=0.675] \n", - "train minibatch loop: 4%|▍ | 14/357 [00:00<00:02, 139.94it/s, accuracy=0.344, cost=0.73] " + "train minibatch loop: 100%|██████████| 16751/16751 [01:29<00:00, 187.21it/s, accuracy=0.667, cost=0.632]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:20<00:00, 207.88it/s, accuracy=0.588, cost=0.716]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:29, 186.78it/s, accuracy=0.75, cost=0.653] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 0, pass acc: 0.000000, current acc: 0.557073\n", - "time taken: 2.8827085494995117\n", - "epoch: 0, training loss: 0.692972, training acc: 0.524341, valid loss: 0.691601, valid acc: 0.557073\n", + "epoch: 0, pass acc: 0.000000, current acc: 0.605330\n", + "time taken: 109.6246485710144\n", + "epoch: 0, training loss: 0.675434, training acc: 0.580658, valid loss: 0.665955, valid acc: 0.605330\n", "\n" ] }, @@ -331,18 +933,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 138.14it/s, accuracy=0.516, cost=0.691]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 378.54it/s, accuracy=0.75, cost=0.669] \n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 142.93it/s, accuracy=0.406, cost=0.725]" + "train minibatch loop: 100%|██████████| 16751/16751 [01:29<00:00, 186.76it/s, accuracy=0.667, cost=0.618]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:20<00:00, 207.90it/s, accuracy=0.588, cost=0.713]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:28, 189.25it/s, accuracy=0.594, cost=0.623]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 1, pass acc: 0.557073, current acc: 0.582283\n", - "time taken: 2.82466197013855\n", - "epoch: 1, training loss: 0.683992, training acc: 0.560493, valid loss: 0.684942, valid acc: 0.582283\n", + "epoch: 1, pass acc: 0.605330, current acc: 0.624076\n", + "time taken: 109.83600759506226\n", + "epoch: 1, training loss: 0.659840, training acc: 0.614980, valid loss: 0.654714, valid acc: 0.624076\n", "\n" ] }, @@ -350,18 +952,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 138.60it/s, accuracy=0.516, cost=0.688]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 390.31it/s, accuracy=0.75, cost=0.665] \n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 141.31it/s, accuracy=0.406, cost=0.717]" + "train minibatch loop: 100%|██████████| 16751/16751 [01:29<00:00, 186.61it/s, accuracy=0.667, cost=0.61] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:20<00:00, 207.64it/s, accuracy=0.647, cost=0.712]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:28, 189.51it/s, accuracy=0.594, cost=0.61] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 2, pass acc: 0.582283, current acc: 0.601891\n", - "time taken: 2.80815052986145\n", - "epoch: 2, training loss: 0.676320, training acc: 0.583955, valid loss: 0.679109, valid acc: 0.601891\n", + "epoch: 2, pass acc: 0.624076, current acc: 0.632978\n", + "time taken: 109.93450498580933\n", + "epoch: 2, training loss: 0.650890, training acc: 0.627057, valid loss: 0.647528, valid acc: 0.632978\n", "\n" ] }, @@ -369,18 +971,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.37it/s, accuracy=0.548, cost=0.683]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 387.60it/s, accuracy=0.75, cost=0.663] \n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 140.39it/s, accuracy=0.438, cost=0.709]" + "train minibatch loop: 100%|██████████| 16751/16751 [01:29<00:00, 186.59it/s, accuracy=0.667, cost=0.605]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:20<00:00, 208.66it/s, accuracy=0.647, cost=0.713]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:28, 188.63it/s, accuracy=0.625, cost=0.601]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 3, pass acc: 0.601891, current acc: 0.611695\n", - "time taken: 2.759413242340088\n", - "epoch: 3, training loss: 0.668874, training acc: 0.599715, valid loss: 0.673454, valid acc: 0.611695\n", + "epoch: 3, pass acc: 0.632978, current acc: 0.638202\n", + "time taken: 109.84741282463074\n", + "epoch: 3, training loss: 0.644791, training acc: 0.634047, valid loss: 0.642354, valid acc: 0.638202\n", "\n" ] }, @@ -388,18 +990,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.49it/s, accuracy=0.548, cost=0.677]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 385.68it/s, accuracy=0.625, cost=0.66] \n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 141.40it/s, accuracy=0.438, cost=0.7] " + "train minibatch loop: 100%|██████████| 16751/16751 [01:29<00:00, 187.92it/s, accuracy=0.667, cost=0.603]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:20<00:00, 208.36it/s, accuracy=0.647, cost=0.715]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:28, 189.00it/s, accuracy=0.625, cost=0.593]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 4, pass acc: 0.611695, current acc: 0.619748\n", - "time taken: 2.7584547996520996\n", - "epoch: 4, training loss: 0.661259, training acc: 0.616086, valid loss: 0.667748, valid acc: 0.619748\n", + "epoch: 4, pass acc: 0.638202, current acc: 0.642015\n", + "time taken: 109.24157357215881\n", + "epoch: 4, training loss: 0.640234, training acc: 0.638803, valid loss: 0.638368, valid acc: 0.642015\n", "\n" ] }, @@ -407,18 +1009,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.79it/s, accuracy=0.548, cost=0.67] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 389.77it/s, accuracy=0.625, cost=0.658]\n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 142.68it/s, accuracy=0.5, cost=0.69] " + "train minibatch loop: 100%|██████████| 16751/16751 [01:29<00:00, 187.83it/s, accuracy=0.667, cost=0.602]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:20<00:00, 208.23it/s, accuracy=0.647, cost=0.716]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:28, 190.04it/s, accuracy=0.625, cost=0.587]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 5, pass acc: 0.619748, current acc: 0.628501\n", - "time taken: 2.750880002975464\n", - "epoch: 5, training loss: 0.653339, training acc: 0.629655, valid loss: 0.661933, valid acc: 0.628501\n", + "epoch: 5, pass acc: 0.642015, current acc: 0.645000\n", + "time taken: 109.2938768863678\n", + "epoch: 5, training loss: 0.636639, training acc: 0.642463, valid loss: 0.635162, valid acc: 0.645000\n", "\n" ] }, @@ -426,18 +1028,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.63it/s, accuracy=0.548, cost=0.662]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 392.35it/s, accuracy=0.625, cost=0.656]\n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 142.49it/s, accuracy=0.5, cost=0.68] " + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 188.34it/s, accuracy=0.333, cost=0.601]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:20<00:00, 208.57it/s, accuracy=0.588, cost=0.718]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:28, 189.67it/s, accuracy=0.594, cost=0.582]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 6, pass acc: 0.628501, current acc: 0.632703\n", - "time taken: 2.7522051334381104\n", - "epoch: 6, training loss: 0.645093, training acc: 0.645850, valid loss: 0.656033, valid acc: 0.632703\n", + "epoch: 6, pass acc: 0.645000, current acc: 0.647427\n", + "time taken: 109.02886891365051\n", + "epoch: 6, training loss: 0.633693, training acc: 0.645279, valid loss: 0.632499, valid acc: 0.647427\n", "\n" ] }, @@ -445,18 +1047,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.72it/s, accuracy=0.548, cost=0.654]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 389.13it/s, accuracy=0.625, cost=0.653]\n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 140.33it/s, accuracy=0.531, cost=0.67] " + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 188.64it/s, accuracy=0.333, cost=0.601]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 209.84it/s, accuracy=0.588, cost=0.719]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.98it/s, accuracy=0.625, cost=0.579]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 7, pass acc: 0.632703, current acc: 0.642507\n", - "time taken: 2.7521347999572754\n", - "epoch: 7, training loss: 0.636568, training acc: 0.657231, valid loss: 0.650113, valid acc: 0.642507\n", + "epoch: 7, pass acc: 0.647427, current acc: 0.649994\n", + "time taken: 108.7573893070221\n", + "epoch: 7, training loss: 0.631212, training acc: 0.647731, valid loss: 0.630230, valid acc: 0.649994\n", "\n" ] }, @@ -464,18 +1066,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.12it/s, accuracy=0.613, cost=0.645]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 387.28it/s, accuracy=0.75, cost=0.65] \n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 142.51it/s, accuracy=0.562, cost=0.659]" + "train minibatch loop: 100%|██████████| 16751/16751 [01:29<00:00, 186.92it/s, accuracy=0.333, cost=0.601]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 209.91it/s, accuracy=0.588, cost=0.721]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.55it/s, accuracy=0.625, cost=0.576]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 8, pass acc: 0.642507, current acc: 0.653011\n", - "time taken: 2.7645280361175537\n", - "epoch: 8, training loss: 0.627843, training acc: 0.670543, valid loss: 0.644252, valid acc: 0.653011\n", + "epoch: 8, pass acc: 0.649994, current acc: 0.651800\n", + "time taken: 109.57051610946655\n", + "epoch: 8, training loss: 0.629072, training acc: 0.649753, valid loss: 0.628256, valid acc: 0.651800\n", "\n" ] }, @@ -483,18 +1085,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.51it/s, accuracy=0.613, cost=0.636]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 390.22it/s, accuracy=0.75, cost=0.647] \n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 139.74it/s, accuracy=0.562, cost=0.649]" + "train minibatch loop: 100%|██████████| 16751/16751 [01:31<00:00, 183.61it/s, accuracy=0.333, cost=0.6] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:20<00:00, 203.15it/s, accuracy=0.588, cost=0.722]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:30, 184.92it/s, accuracy=0.625, cost=0.586]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 9, pass acc: 0.653011, current acc: 0.660014\n", - "time taken: 2.7556698322296143\n", - "epoch: 9, training loss: 0.619011, training acc: 0.680173, valid loss: 0.638526, valid acc: 0.660014\n", + "epoch: 9, pass acc: 0.651800, current acc: 0.653576\n", + "time taken: 111.84981298446655\n", + "epoch: 9, training loss: 0.627191, training acc: 0.651582, valid loss: 0.626508, valid acc: 0.653576\n", "\n" ] }, @@ -502,18 +1104,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.83it/s, accuracy=0.645, cost=0.627]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 388.00it/s, accuracy=0.75, cost=0.644] \n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 142.79it/s, accuracy=0.594, cost=0.639]" + "train minibatch loop: 100%|██████████| 16751/16751 [01:29<00:00, 187.91it/s, accuracy=0.333, cost=0.6] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.46it/s, accuracy=0.588, cost=0.724]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.21it/s, accuracy=0.625, cost=0.571]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 10, pass acc: 0.660014, current acc: 0.662115\n", - "time taken: 2.7511253356933594\n", - "epoch: 10, training loss: 0.610162, training acc: 0.691556, valid loss: 0.633000, valid acc: 0.662115\n", + "epoch: 10, pass acc: 0.653576, current acc: 0.654688\n", + "time taken: 109.04651880264282\n", + "epoch: 10, training loss: 0.625513, training acc: 0.653031, valid loss: 0.624939, valid acc: 0.654688\n", "\n" ] }, @@ -521,18 +1123,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.08it/s, accuracy=0.677, cost=0.617]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 390.23it/s, accuracy=0.75, cost=0.641] \n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 140.96it/s, accuracy=0.594, cost=0.629]" + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 189.52it/s, accuracy=0.667, cost=0.6] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.62it/s, accuracy=0.588, cost=0.725]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.90it/s, accuracy=0.656, cost=0.569]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 11, pass acc: 0.662115, current acc: 0.669118\n", - "time taken: 2.762988328933716\n", - "epoch: 11, training loss: 0.601373, training acc: 0.701014, valid loss: 0.627722, valid acc: 0.669118\n", + "epoch: 11, pass acc: 0.654688, current acc: 0.655859\n", + "time taken: 108.27160167694092\n", + "epoch: 11, training loss: 0.623995, training acc: 0.654217, valid loss: 0.623512, valid acc: 0.655859\n", "\n" ] }, @@ -540,18 +1142,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.05it/s, accuracy=0.645, cost=0.608]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 388.39it/s, accuracy=0.75, cost=0.638] \n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 141.13it/s, accuracy=0.625, cost=0.619]" + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 189.91it/s, accuracy=0.667, cost=0.6] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.56it/s, accuracy=0.588, cost=0.726]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.06it/s, accuracy=0.656, cost=0.568]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 12, pass acc: 0.669118, current acc: 0.673669\n", - "time taken: 2.7647182941436768\n", - "epoch: 12, training loss: 0.592705, training acc: 0.708890, valid loss: 0.622722, valid acc: 0.673669\n", + "epoch: 12, pass acc: 0.655859, current acc: 0.657106\n", + "time taken: 108.09513711929321\n", + "epoch: 12, training loss: 0.622607, training acc: 0.655510, valid loss: 0.622201, valid acc: 0.657106\n", "\n" ] }, @@ -559,18 +1161,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.68it/s, accuracy=0.71, cost=0.598] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 389.31it/s, accuracy=0.75, cost=0.634] \n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 142.10it/s, accuracy=0.625, cost=0.61] " + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 189.57it/s, accuracy=0.667, cost=0.6] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:20<00:00, 201.98it/s, accuracy=0.588, cost=0.727]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.01it/s, accuracy=0.656, cost=0.567]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 13, pass acc: 0.673669, current acc: 0.677521\n", - "time taken: 2.752776622772217\n", - "epoch: 13, training loss: 0.584202, training acc: 0.717912, valid loss: 0.618016, valid acc: 0.677521\n", + "epoch: 13, pass acc: 0.657106, current acc: 0.658203\n", + "time taken: 109.09941792488098\n", + "epoch: 13, training loss: 0.621324, training acc: 0.656857, valid loss: 0.620985, valid acc: 0.658203\n", "\n" ] }, @@ -578,18 +1180,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.40it/s, accuracy=0.71, cost=0.589] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 388.58it/s, accuracy=0.75, cost=0.631] \n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 142.73it/s, accuracy=0.625, cost=0.601]" + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 189.19it/s, accuracy=0.667, cost=0.599]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:20<00:00, 203.10it/s, accuracy=0.588, cost=0.729]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:31, 182.73it/s, accuracy=0.656, cost=0.578]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 14, pass acc: 0.677521, current acc: 0.683824\n", - "time taken: 2.758405923843384\n", - "epoch: 14, training loss: 0.575892, training acc: 0.726229, valid loss: 0.613612, valid acc: 0.683824\n", + "epoch: 14, pass acc: 0.658203, current acc: 0.659889\n", + "time taken: 109.16181421279907\n", + "epoch: 14, training loss: 0.620130, training acc: 0.658370, valid loss: 0.619849, valid acc: 0.659889\n", "\n" ] }, @@ -597,18 +1199,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.67it/s, accuracy=0.71, cost=0.579] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 390.11it/s, accuracy=0.75, cost=0.628] \n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 141.13it/s, accuracy=0.625, cost=0.592]" + "train minibatch loop: 100%|██████████| 16751/16751 [01:31<00:00, 182.71it/s, accuracy=0.667, cost=0.599]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.03it/s, accuracy=0.588, cost=0.729]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:32, 181.53it/s, accuracy=0.594, cost=0.645]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 15, pass acc: 0.683824, current acc: 0.686625\n", - "time taken: 2.7528414726257324\n", - "epoch: 15, training loss: 0.567794, training acc: 0.729730, valid loss: 0.609508, valid acc: 0.686625\n", + "epoch: 15, pass acc: 0.659889, current acc: 0.660904\n", + "time taken: 111.62359046936035\n", + "epoch: 15, training loss: 0.619010, training acc: 0.659698, valid loss: 0.618780, valid acc: 0.660904\n", "\n" ] }, @@ -616,18 +1218,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.28it/s, accuracy=0.71, cost=0.57] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 392.20it/s, accuracy=0.75, cost=0.624] \n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 140.84it/s, accuracy=0.625, cost=0.584]" + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.00it/s, accuracy=0.667, cost=0.599]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 209.84it/s, accuracy=0.588, cost=0.73] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.10it/s, accuracy=0.688, cost=0.565]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 16, pass acc: 0.686625, current acc: 0.688025\n", - "time taken: 2.7586071491241455\n", - "epoch: 16, training loss: 0.559920, training acc: 0.736033, valid loss: 0.605698, valid acc: 0.688025\n", + "epoch: 16, pass acc: 0.660904, current acc: 0.661971\n", + "time taken: 108.1222014427185\n", + "epoch: 16, training loss: 0.617953, training acc: 0.660767, valid loss: 0.617769, valid acc: 0.661971\n", "\n" ] }, @@ -635,18 +1237,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.84it/s, accuracy=0.71, cost=0.561] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 387.14it/s, accuracy=0.75, cost=0.621] \n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 141.56it/s, accuracy=0.625, cost=0.575]" + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 189.87it/s, accuracy=0.667, cost=0.598]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.49it/s, accuracy=0.588, cost=0.731]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.10it/s, accuracy=0.719, cost=0.564]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 17, pass acc: 0.688025, current acc: 0.690476\n", - "time taken: 2.7624003887176514\n", - "epoch: 17, training loss: 0.552275, training acc: 0.740936, valid loss: 0.602174, valid acc: 0.690476\n", + "epoch: 17, pass acc: 0.661971, current acc: 0.662859\n", + "time taken: 108.12147760391235\n", + "epoch: 17, training loss: 0.616951, training acc: 0.661807, valid loss: 0.616808, valid acc: 0.662859\n", "\n" ] }, @@ -654,18 +1256,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.35it/s, accuracy=0.71, cost=0.552] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 388.68it/s, accuracy=0.75, cost=0.618] \n", - "train minibatch loop: 4%|▍ | 14/357 [00:00<00:02, 139.90it/s, accuracy=0.719, cost=0.567]" + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 189.86it/s, accuracy=0.667, cost=0.598]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.53it/s, accuracy=0.588, cost=0.732]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:29, 186.62it/s, accuracy=0.719, cost=0.564]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 18, pass acc: 0.690476, current acc: 0.694328\n", - "time taken: 2.759275197982788\n", - "epoch: 18, training loss: 0.544860, training acc: 0.745838, valid loss: 0.598926, valid acc: 0.694328\n", + "epoch: 18, pass acc: 0.662859, current acc: 0.663807\n", + "time taken: 108.12456226348877\n", + "epoch: 18, training loss: 0.615995, training acc: 0.662706, valid loss: 0.615890, valid acc: 0.663807\n", "\n" ] }, @@ -673,18 +1275,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.15it/s, accuracy=0.71, cost=0.543] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 390.34it/s, accuracy=0.75, cost=0.615] \n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 142.45it/s, accuracy=0.688, cost=0.56] " + "train minibatch loop: 100%|██████████| 16751/16751 [01:30<00:00, 186.11it/s, accuracy=0.667, cost=0.597]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:20<00:00, 202.90it/s, accuracy=0.588, cost=0.732]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:29, 186.44it/s, accuracy=0.656, cost=0.574]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 19, pass acc: 0.694328, current acc: 0.696078\n", - "time taken: 2.7616238594055176\n", - "epoch: 19, training loss: 0.537674, training acc: 0.751091, valid loss: 0.595943, valid acc: 0.696078\n", + "epoch: 19, pass acc: 0.663807, current acc: 0.664755\n", + "time taken: 110.64721846580505\n", + "epoch: 19, training loss: 0.615081, training acc: 0.663570, valid loss: 0.615010, valid acc: 0.664755\n", "\n" ] }, @@ -692,18 +1294,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.05it/s, accuracy=0.71, cost=0.535] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 389.80it/s, accuracy=0.875, cost=0.612]\n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 141.62it/s, accuracy=0.688, cost=0.552]" + "train minibatch loop: 100%|██████████| 16751/16751 [01:31<00:00, 183.10it/s, accuracy=0.667, cost=0.596]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:20<00:00, 208.36it/s, accuracy=0.588, cost=0.733]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.02it/s, accuracy=0.719, cost=0.563]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 20, pass acc: 0.696078, current acc: 0.699230\n", - "time taken: 2.7638111114501953\n", - "epoch: 20, training loss: 0.530713, training acc: 0.756168, valid loss: 0.593213, valid acc: 0.699230\n", + "epoch: 20, pass acc: 0.664755, current acc: 0.665553\n", + "time taken: 111.58767294883728\n", + "epoch: 20, training loss: 0.614204, training acc: 0.664389, valid loss: 0.614164, valid acc: 0.665553\n", "\n" ] }, @@ -711,18 +1313,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.55it/s, accuracy=0.71, cost=0.527] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 387.96it/s, accuracy=0.875, cost=0.609]\n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 141.29it/s, accuracy=0.688, cost=0.545]" + "train minibatch loop: 100%|██████████| 16751/16751 [01:30<00:00, 184.77it/s, accuracy=0.667, cost=0.596]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.04it/s, accuracy=0.588, cost=0.733]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.23it/s, accuracy=0.719, cost=0.563]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 21, pass acc: 0.699230, current acc: 0.705882\n", - "time taken: 2.7564079761505127\n", - "epoch: 21, training loss: 0.523973, training acc: 0.760283, valid loss: 0.590724, valid acc: 0.705882\n", + "epoch: 21, pass acc: 0.665553, current acc: 0.666225\n", + "time taken: 110.51120924949646\n", + "epoch: 21, training loss: 0.613358, training acc: 0.665197, valid loss: 0.613348, valid acc: 0.666225\n", "\n" ] }, @@ -730,18 +1332,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.72it/s, accuracy=0.71, cost=0.519] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 390.19it/s, accuracy=0.75, cost=0.607] \n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 140.85it/s, accuracy=0.688, cost=0.539]" + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.65it/s, accuracy=0.667, cost=0.595]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.66it/s, accuracy=0.588, cost=0.734]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.44it/s, accuracy=0.719, cost=0.563]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 22, pass acc: 0.705882, current acc: 0.709034\n", - "time taken: 2.7519538402557373\n", - "epoch: 22, training loss: 0.517449, training acc: 0.764135, valid loss: 0.588464, valid acc: 0.709034\n", + "epoch: 22, pass acc: 0.666225, current acc: 0.666650\n", + "time taken: 107.7443745136261\n", + "epoch: 22, training loss: 0.612542, training acc: 0.665963, valid loss: 0.612559, valid acc: 0.666650\n", "\n" ] }, @@ -749,18 +1351,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 139.98it/s, accuracy=0.742, cost=0.511]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 386.37it/s, accuracy=0.75, cost=0.604] \n", - "train minibatch loop: 4%|▍ | 14/357 [00:00<00:02, 139.76it/s, accuracy=0.75, cost=0.546] " + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.38it/s, accuracy=0.667, cost=0.594]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.39it/s, accuracy=0.588, cost=0.734]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.53it/s, accuracy=0.719, cost=0.563]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 23, pass acc: 0.709034, current acc: 0.711134\n", - "time taken: 2.7852275371551514\n", - "epoch: 23, training loss: 0.511133, training acc: 0.766939, valid loss: 0.586422, valid acc: 0.711134\n", + "epoch: 23, pass acc: 0.666650, current acc: 0.667128\n", + "time taken: 107.79966044425964\n", + "epoch: 23, training loss: 0.611752, training acc: 0.666627, valid loss: 0.611794, valid acc: 0.667128\n", "\n" ] }, @@ -768,18 +1370,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 140.79it/s, accuracy=0.742, cost=0.503]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 388.31it/s, accuracy=0.75, cost=0.602] \n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 141.68it/s, accuracy=0.688, cost=0.526]" + "train minibatch loop: 100%|██████████| 16751/16751 [01:30<00:00, 184.68it/s, accuracy=0.667, cost=0.594]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.25it/s, accuracy=0.588, cost=0.735]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.76it/s, accuracy=0.719, cost=0.563]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 24, pass acc: 0.711134, current acc: 0.714286\n", - "time taken: 2.769306182861328\n", - "epoch: 24, training loss: 0.505019, training acc: 0.771053, valid loss: 0.584587, valid acc: 0.714286\n", + "epoch: 24, pass acc: 0.667128, current acc: 0.667897\n", + "time taken: 110.52696061134338\n", + "epoch: 24, training loss: 0.610985, training acc: 0.667355, valid loss: 0.611051, valid acc: 0.667897\n", "\n" ] }, @@ -787,17 +1389,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.56it/s, accuracy=0.774, cost=0.496]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 383.06it/s, accuracy=0.75, cost=0.6] \n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 141.37it/s, accuracy=0.688, cost=0.52] " + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 189.63it/s, accuracy=0.667, cost=0.593]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.28it/s, accuracy=0.588, cost=0.735]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:28, 188.99it/s, accuracy=0.719, cost=0.562]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 2.759004592895508\n", - "epoch: 25, training loss: 0.499100, training acc: 0.775433, valid loss: 0.582946, valid acc: 0.712885\n", + "epoch: 25, pass acc: 0.667897, current acc: 0.668546\n", + "time taken: 108.1580023765564\n", + "epoch: 25, training loss: 0.610240, training acc: 0.668152, valid loss: 0.610328, valid acc: 0.668546\n", "\n" ] }, @@ -805,17 +1408,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.49it/s, accuracy=0.774, cost=0.489]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 391.37it/s, accuracy=0.75, cost=0.598] \n", - "train minibatch loop: 4%|▍ | 14/357 [00:00<00:02, 139.37it/s, accuracy=0.688, cost=0.514]" + "train minibatch loop: 100%|██████████| 16751/16751 [01:33<00:00, 179.84it/s, accuracy=0.667, cost=0.592]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:20<00:00, 200.10it/s, accuracy=0.588, cost=0.735]\n", + "train minibatch loop: 0%| | 18/16751 [00:00<01:34, 177.85it/s, accuracy=0.594, cost=0.638]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 2.7552366256713867\n", - "epoch: 26, training loss: 0.493368, training acc: 0.779635, valid loss: 0.581490, valid acc: 0.713936\n", + "epoch: 26, pass acc: 0.668546, current acc: 0.669180\n", + "time taken: 114.07756853103638\n", + "epoch: 26, training loss: 0.609514, training acc: 0.668844, valid loss: 0.609624, valid acc: 0.669180\n", "\n" ] }, @@ -823,18 +1427,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.22it/s, accuracy=0.774, cost=0.482]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 389.51it/s, accuracy=0.75, cost=0.596] \n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 140.76it/s, accuracy=0.688, cost=0.509]" + "train minibatch loop: 100%|██████████| 16751/16751 [01:34<00:00, 177.46it/s, accuracy=0.667, cost=0.591]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:21<00:00, 192.69it/s, accuracy=0.588, cost=0.736]\n", + "train minibatch loop: 0%| | 17/16751 [00:00<01:39, 167.97it/s, accuracy=0.812, cost=0.508]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 27, pass acc: 0.714286, current acc: 0.715686\n", - "time taken: 2.7610113620758057\n", - "epoch: 27, training loss: 0.487816, training acc: 0.782962, valid loss: 0.580207, valid acc: 0.715686\n", + "epoch: 27, pass acc: 0.669180, current acc: 0.669732\n", + "time taken: 116.12809944152832\n", + "epoch: 27, training loss: 0.608807, training acc: 0.669648, valid loss: 0.608936, valid acc: 0.669732\n", "\n" ] }, @@ -842,17 +1446,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.44it/s, accuracy=0.806, cost=0.475]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 387.98it/s, accuracy=0.75, cost=0.595] \n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 142.14it/s, accuracy=0.688, cost=0.503]" + "train minibatch loop: 100%|██████████| 16751/16751 [01:34<00:00, 177.82it/s, accuracy=0.667, cost=0.59] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:21<00:00, 192.91it/s, accuracy=0.588, cost=0.736]\n", + "train minibatch loop: 0%| | 18/16751 [00:00<01:35, 175.13it/s, accuracy=0.594, cost=0.637]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 2.7584028244018555\n", - "epoch: 28, training loss: 0.482437, training acc: 0.785591, valid loss: 0.579088, valid acc: 0.715686\n", + "epoch: 28, pass acc: 0.669732, current acc: 0.670441\n", + "time taken: 115.91281247138977\n", + "epoch: 28, training loss: 0.608116, training acc: 0.670277, valid loss: 0.608265, valid acc: 0.670441\n", "\n" ] }, @@ -860,18 +1465,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.29it/s, accuracy=0.806, cost=0.469]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 389.15it/s, accuracy=0.75, cost=0.594] \n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 142.98it/s, accuracy=0.688, cost=0.498]" + "train minibatch loop: 100%|██████████| 16751/16751 [01:30<00:00, 184.84it/s, accuracy=0.667, cost=0.589]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.26it/s, accuracy=0.588, cost=0.736]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.37it/s, accuracy=0.719, cost=0.563]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 29, pass acc: 0.715686, current acc: 0.717787\n", - "time taken: 2.75982666015625\n", - "epoch: 29, training loss: 0.477222, training acc: 0.789618, valid loss: 0.578122, valid acc: 0.717787\n", + "epoch: 29, pass acc: 0.670441, current acc: 0.670919\n", + "time taken: 110.54308009147644\n", + "epoch: 29, training loss: 0.607441, training acc: 0.670885, valid loss: 0.607608, valid acc: 0.670919\n", "\n" ] }, @@ -879,18 +1484,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.47it/s, accuracy=0.806, cost=0.463]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 389.13it/s, accuracy=0.75, cost=0.593] \n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 140.98it/s, accuracy=0.688, cost=0.493]" + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.19it/s, accuracy=0.667, cost=0.588]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.34it/s, accuracy=0.588, cost=0.736]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.19it/s, accuracy=0.719, cost=0.563]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 30, pass acc: 0.717787, current acc: 0.719188\n", - "time taken: 2.756946563720703\n", - "epoch: 30, training loss: 0.472165, training acc: 0.793207, valid loss: 0.577300, valid acc: 0.719188\n", + "epoch: 30, pass acc: 0.670919, current acc: 0.671419\n", + "time taken: 107.98747634887695\n", + "epoch: 30, training loss: 0.606781, training acc: 0.671702, valid loss: 0.606965, valid acc: 0.671419\n", "\n" ] }, @@ -898,18 +1503,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.24it/s, accuracy=0.806, cost=0.457]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 387.14it/s, accuracy=0.75, cost=0.592] \n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 141.82it/s, accuracy=0.688, cost=0.489]" + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.22it/s, accuracy=0.667, cost=0.587]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.96it/s, accuracy=0.588, cost=0.736]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.55it/s, accuracy=0.594, cost=0.634]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 31, pass acc: 0.719188, current acc: 0.720588\n", - "time taken: 2.7619266510009766\n", - "epoch: 31, training loss: 0.467257, training acc: 0.795221, valid loss: 0.576612, valid acc: 0.720588\n", + "epoch: 31, pass acc: 0.671419, current acc: 0.672024\n", + "time taken: 107.91307282447815\n", + "epoch: 31, training loss: 0.606134, training acc: 0.672445, valid loss: 0.606335, valid acc: 0.672024\n", "\n" ] }, @@ -917,18 +1522,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.26it/s, accuracy=0.806, cost=0.451]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 389.60it/s, accuracy=0.75, cost=0.591] \n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 142.78it/s, accuracy=0.688, cost=0.484]" + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.22it/s, accuracy=0.667, cost=0.586]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.79it/s, accuracy=0.647, cost=0.736]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.90it/s, accuracy=0.719, cost=0.563]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 32, pass acc: 0.720588, current acc: 0.721289\n", - "time taken: 2.765531301498413\n", - "epoch: 32, training loss: 0.462491, training acc: 0.798110, valid loss: 0.576051, valid acc: 0.721289\n", + "epoch: 32, pass acc: 0.672024, current acc: 0.672552\n", + "time taken: 107.92883849143982\n", + "epoch: 32, training loss: 0.605499, training acc: 0.673267, valid loss: 0.605717, valid acc: 0.672552\n", "\n" ] }, @@ -936,18 +1541,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.88it/s, accuracy=0.806, cost=0.445]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 387.49it/s, accuracy=0.75, cost=0.59] \n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 141.26it/s, accuracy=0.719, cost=0.48] " + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.29it/s, accuracy=0.667, cost=0.585]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.76it/s, accuracy=0.647, cost=0.736]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.68it/s, accuracy=0.719, cost=0.563]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 33, pass acc: 0.721289, current acc: 0.722339\n", - "time taken: 2.7505366802215576\n", - "epoch: 33, training loss: 0.457860, training acc: 0.800386, valid loss: 0.575607, valid acc: 0.722339\n", + "epoch: 33, pass acc: 0.672552, current acc: 0.672985\n", + "time taken: 107.90358185768127\n", + "epoch: 33, training loss: 0.604877, training acc: 0.673913, valid loss: 0.605110, valid acc: 0.672985\n", "\n" ] }, @@ -955,18 +1560,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.02it/s, accuracy=0.806, cost=0.44] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 385.89it/s, accuracy=0.75, cost=0.59] \n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 141.45it/s, accuracy=0.719, cost=0.476]" + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.19it/s, accuracy=0.667, cost=0.584]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.05it/s, accuracy=0.647, cost=0.737]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.10it/s, accuracy=0.594, cost=0.631]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 34, pass acc: 0.722339, current acc: 0.722689\n", - "time taken: 2.766610622406006\n", - "epoch: 34, training loss: 0.453357, training acc: 0.801962, valid loss: 0.575274, valid acc: 0.722689\n", + "epoch: 34, pass acc: 0.672985, current acc: 0.673523\n", + "time taken: 108.01332092285156\n", + "epoch: 34, training loss: 0.604266, training acc: 0.674558, valid loss: 0.604514, valid acc: 0.673523\n", "\n" ] }, @@ -974,17 +1579,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.22it/s, accuracy=0.806, cost=0.434]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 386.44it/s, accuracy=0.75, cost=0.59] \n", - "train minibatch loop: 4%|▍ | 14/357 [00:00<00:02, 139.49it/s, accuracy=0.75, cost=0.472] " + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.29it/s, accuracy=0.667, cost=0.583]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.74it/s, accuracy=0.647, cost=0.737]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.74it/s, accuracy=0.688, cost=0.563]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 2.762693166732788\n", - "epoch: 35, training loss: 0.448976, training acc: 0.804675, valid loss: 0.575043, valid acc: 0.722689\n", + "epoch: 35, pass acc: 0.673523, current acc: 0.674142\n", + "time taken: 107.90229320526123\n", + "epoch: 35, training loss: 0.603666, training acc: 0.675161, valid loss: 0.603929, valid acc: 0.674142\n", "\n" ] }, @@ -992,17 +1598,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.57it/s, accuracy=0.806, cost=0.429]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 389.69it/s, accuracy=0.75, cost=0.589] \n", - "train minibatch loop: 4%|▍ | 15/357 [00:00<00:02, 142.45it/s, accuracy=0.781, cost=0.468]" + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.50it/s, accuracy=0.667, cost=0.582]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.96it/s, accuracy=0.647, cost=0.737]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.50it/s, accuracy=0.688, cost=0.563]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 2.7545599937438965\n", - "epoch: 36, training loss: 0.444709, training acc: 0.807127, valid loss: 0.574909, valid acc: 0.721639\n", + "epoch: 36, pass acc: 0.674142, current acc: 0.674500\n", + "time taken: 107.78788876533508\n", + "epoch: 36, training loss: 0.603076, training acc: 0.675812, valid loss: 0.603353, valid acc: 0.674500\n", "\n" ] }, @@ -1010,18 +1617,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:02<00:00, 141.58it/s, accuracy=0.806, cost=0.424]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 386.84it/s, accuracy=0.75, cost=0.589] " + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.59it/s, accuracy=0.667, cost=0.581]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.28it/s, accuracy=0.647, cost=0.737]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.86it/s, accuracy=0.688, cost=0.563]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 2.7560172080993652\n", - "epoch: 37, training loss: 0.440552, training acc: 0.809665, valid loss: 0.574864, valid acc: 0.720238\n", - "\n", - "break epoch:38\n", + "epoch: 37, pass acc: 0.674500, current acc: 0.675232\n", + "time taken: 107.71517157554626\n", + "epoch: 37, training loss: 0.602496, training acc: 0.676409, valid loss: 0.602786, valid acc: 0.675232\n", "\n" ] }, @@ -1029,188 +1636,8818 @@ "name": "stderr", "output_type": "stream", "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.54it/s, accuracy=0.667, cost=0.58] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.62it/s, accuracy=0.647, cost=0.737]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.39it/s, accuracy=0.688, cost=0.564]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 38, pass acc: 0.675232, current acc: 0.675799\n", + "time taken: 107.79743504524231\n", + "epoch: 38, training loss: 0.601925, training acc: 0.677019, valid loss: 0.602229, valid acc: 0.675799\n", "\n" ] - } - ], - "source": [ - "from tqdm import tqdm\n", - "import time\n", - "\n", - "batch_size = 32\n", - "EARLY_STOPPING, CURRENT_CHECKPOINT, CURRENT_ACC, EPOCH = 3, 0, 0, 0\n", - "\n", - "while True:\n", - " lasttime = time.time()\n", - " if CURRENT_CHECKPOINT == EARLY_STOPPING:\n", - " print('break epoch:%d\\n' % (EPOCH))\n", - " break\n", - "\n", - " train_acc, train_loss, test_acc, test_loss = 0, 0, 0, 0\n", - " pbar = tqdm(\n", - " range(0, train_X.shape[0], batch_size), desc = 'train minibatch loop'\n", - " )\n", - " for i in pbar:\n", - " batch_x = convert_sparse_matrix_to_sparse_tensor(train_X[i : min(i + batch_size, train_X.shape[0])])\n", - " batch_y = train_Y[i : min(i + batch_size, train_X.shape[0])]\n", - " batch_x_expand = np.expand_dims(batch_x,axis = 1)\n", - " acc, cost, _ = sess.run(\n", - " [model.accuracy, model.cost, model.optimizer],\n", - " feed_dict = {\n", - " model.Y: batch_y,\n", - " model.X: batch_x[0],\n", - " model.W: batch_x[1],\n", - " },\n", - " )\n", - " assert not np.isnan(cost)\n", - " train_loss += cost\n", - " train_acc += acc\n", - " pbar.set_postfix(cost = cost, accuracy = acc)\n", - "\n", - " pbar = tqdm(range(0, test_X.shape[0], batch_size), desc = 'test minibatch loop')\n", - " for i in pbar:\n", - " batch_x = convert_sparse_matrix_to_sparse_tensor(test_X[i : min(i + batch_size, test_X.shape[0])])\n", - " batch_y = test_Y[i : min(i + batch_size, test_X.shape[0])]\n", - " batch_x_expand = np.expand_dims(batch_x,axis = 1)\n", - " acc, cost = sess.run(\n", - " [model.accuracy, model.cost],\n", - " feed_dict = {\n", - " model.Y: batch_y,\n", - " model.X: batch_x[0],\n", - " model.W: batch_x[1],\n", - " },\n", - " )\n", - " test_loss += cost\n", - " test_acc += acc\n", - " pbar.set_postfix(cost = cost, accuracy = acc)\n", - "\n", - " train_loss /= train_X.shape[0] / batch_size\n", - " train_acc /= train_X.shape[0] / batch_size\n", - " test_loss /= test_X.shape[0] / batch_size\n", - " test_acc /= test_X.shape[0] / batch_size\n", - "\n", - " if test_acc > CURRENT_ACC:\n", - " print(\n", - " 'epoch: %d, pass acc: %f, current acc: %f'\n", - " % (EPOCH, CURRENT_ACC, test_acc)\n", - " )\n", - " CURRENT_ACC = test_acc\n", - " CURRENT_CHECKPOINT = 0\n", - " else:\n", - " CURRENT_CHECKPOINT += 1\n", - "\n", - " print('time taken:', time.time() - lasttime)\n", - " print(\n", - " 'epoch: %d, training loss: %f, training acc: %f, valid loss: %f, valid acc: %f\\n'\n", - " % (EPOCH, train_loss, train_acc, test_loss, test_acc)\n", - " )\n", - " EPOCH += 1" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ + }, { "name": "stderr", "output_type": "stream", "text": [ - "validation minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 655.27it/s]\n" + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.60it/s, accuracy=0.667, cost=0.579]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 209.85it/s, accuracy=0.647, cost=0.737]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.90it/s, accuracy=0.688, cost=0.564]" ] - } - ], - "source": [ - "real_Y, predict_Y = [], []\n", - "\n", - "pbar = tqdm(\n", - " range(0, test_X.shape[0], batch_size), desc = 'validation minibatch loop'\n", - ")\n", - "for i in pbar:\n", - " batch_x = convert_sparse_matrix_to_sparse_tensor(test_X[i : min(i + batch_size, test_X.shape[0])])\n", - " batch_y = test_Y[i : min(i + batch_size, test_X.shape[0])]\n", - " predict_Y += np.argmax(\n", - " sess.run(\n", - " model.logits, feed_dict = {model.X: batch_x[0], model.W: batch_x[1], model.Y: batch_y}\n", - " ),\n", - " 1,\n", - " ).tolist()\n", - " real_Y += batch_y" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ + }, { "name": "stdout", "output_type": "stream", "text": [ - " precision recall f1-score support\n", - "\n", - " negative 0.71 0.64 0.67 1303\n", - " positive 0.72 0.78 0.75 1553\n", - "\n", - "avg / total 0.71 0.71 0.71 2856\n", + "epoch: 39, pass acc: 0.675799, current acc: 0.676351\n", + "time taken: 107.76272058486938\n", + "epoch: 39, training loss: 0.601363, training acc: 0.677542, valid loss: 0.601680, valid acc: 0.676351\n", "\n" ] - } - ], - "source": [ - "print(\n", - " metrics.classification_report(\n", - " real_Y, predict_Y, target_names = ['negative','positive']\n", - " )\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "array([[-0.8593565, 0.9225268]], dtype=float32)" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "text = classification_textcleaning('kerajaan sebenarnya sangat sayangkan rakyatnya')\n", - "transformed = bow_chars.transform([text[0]])\n", - "batch_x = convert_sparse_matrix_to_sparse_tensor(transformed)\n", - "sess.run(model.logits, feed_dict = {model.X: batch_x[0], model.W: batch_x[1]})" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.63it/s, accuracy=0.667, cost=0.578]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.90it/s, accuracy=0.647, cost=0.737]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.01it/s, accuracy=0.688, cost=0.564]" + ] + }, { - "data": { - "text/plain": [ - "'fast-text-char/model.ckpt'" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "saver.save(sess, 'fast-text-char/model.ckpt')" - ] - }, - { - "cell_type": "code", - "execution_count": 18, + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 40, pass acc: 0.676351, current acc: 0.676836\n", + "time taken: 107.73185563087463\n", + "epoch: 40, training loss: 0.600809, training acc: 0.678105, valid loss: 0.601139, valid acc: 0.676836\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.58it/s, accuracy=0.667, cost=0.577]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.07it/s, accuracy=0.647, cost=0.736]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.04it/s, accuracy=0.688, cost=0.564]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 41, pass acc: 0.676836, current acc: 0.677299\n", + "time taken: 107.736398935318\n", + "epoch: 41, training loss: 0.600264, training acc: 0.678751, valid loss: 0.600606, valid acc: 0.677299\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 192.76it/s, accuracy=0.667, cost=0.576]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.22it/s, accuracy=0.647, cost=0.736]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.09it/s, accuracy=0.688, cost=0.564]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 42, pass acc: 0.677299, current acc: 0.677761\n", + "time taken: 107.79096746444702\n", + "epoch: 42, training loss: 0.599726, training acc: 0.679275, valid loss: 0.600080, valid acc: 0.677761\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.57it/s, accuracy=0.667, cost=0.575]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.17it/s, accuracy=0.647, cost=0.736]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.89it/s, accuracy=0.656, cost=0.564]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 43, pass acc: 0.677761, current acc: 0.678224\n", + "time taken: 107.73334813117981\n", + "epoch: 43, training loss: 0.599196, training acc: 0.679779, valid loss: 0.599562, valid acc: 0.678224\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.64it/s, accuracy=0.667, cost=0.574]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.82it/s, accuracy=0.647, cost=0.736]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.89it/s, accuracy=0.594, cost=0.623]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 44, pass acc: 0.678224, current acc: 0.678851\n", + "time taken: 107.73616361618042\n", + "epoch: 44, training loss: 0.598674, training acc: 0.680265, valid loss: 0.599051, valid acc: 0.678851\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.55it/s, accuracy=0.667, cost=0.573]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.55it/s, accuracy=0.647, cost=0.736]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.59it/s, accuracy=0.656, cost=0.565]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 45, pass acc: 0.678851, current acc: 0.679403\n", + "time taken: 107.70548701286316\n", + "epoch: 45, training loss: 0.598158, training acc: 0.680715, valid loss: 0.598546, valid acc: 0.679403\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.48it/s, accuracy=0.667, cost=0.572]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.80it/s, accuracy=0.647, cost=0.736]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:25, 195.81it/s, accuracy=0.594, cost=0.621]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 46, pass acc: 0.679403, current acc: 0.679799\n", + "time taken: 107.72872591018677\n", + "epoch: 46, training loss: 0.597649, training acc: 0.681176, valid loss: 0.598048, valid acc: 0.679799\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.89it/s, accuracy=0.667, cost=0.571]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.65it/s, accuracy=0.647, cost=0.736]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:28, 189.10it/s, accuracy=0.625, cost=0.565]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 47, pass acc: 0.679799, current acc: 0.680239\n", + "time taken: 107.54082584381104\n", + "epoch: 47, training loss: 0.597147, training acc: 0.681612, valid loss: 0.597557, valid acc: 0.680239\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 192.87it/s, accuracy=0.667, cost=0.57] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.53it/s, accuracy=0.647, cost=0.736]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.13it/s, accuracy=0.594, cost=0.62] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 48, pass acc: 0.680239, current acc: 0.680702\n", + "time taken: 107.63859462738037\n", + "epoch: 48, training loss: 0.596651, training acc: 0.682103, valid loss: 0.597072, valid acc: 0.680702\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.84it/s, accuracy=0.667, cost=0.569]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.82it/s, accuracy=0.647, cost=0.736]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.21it/s, accuracy=0.656, cost=0.566]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 49, pass acc: 0.680702, current acc: 0.681000\n", + "time taken: 107.54812026023865\n", + "epoch: 49, training loss: 0.596162, training acc: 0.682536, valid loss: 0.596593, valid acc: 0.681000\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.90it/s, accuracy=0.667, cost=0.568]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 212.09it/s, accuracy=0.647, cost=0.736]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:25, 194.92it/s, accuracy=0.594, cost=0.618]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 50, pass acc: 0.681000, current acc: 0.681433\n", + "time taken: 107.49469375610352\n", + "epoch: 50, training loss: 0.595678, training acc: 0.682984, valid loss: 0.596119, valid acc: 0.681433\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.68it/s, accuracy=0.667, cost=0.567]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.42it/s, accuracy=0.647, cost=0.736]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.50it/s, accuracy=0.594, cost=0.618]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 51, pass acc: 0.681433, current acc: 0.681933\n", + "time taken: 107.6572117805481\n", + "epoch: 51, training loss: 0.595201, training acc: 0.683506, valid loss: 0.595651, valid acc: 0.681933\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.70it/s, accuracy=0.667, cost=0.566]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.44it/s, accuracy=0.647, cost=0.735]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.23it/s, accuracy=0.688, cost=0.566]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 52, pass acc: 0.681933, current acc: 0.682373\n", + "time taken: 107.64822173118591\n", + "epoch: 52, training loss: 0.594729, training acc: 0.684109, valid loss: 0.595189, valid acc: 0.682373\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.76it/s, accuracy=0.667, cost=0.565]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.11it/s, accuracy=0.647, cost=0.735]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.36it/s, accuracy=0.688, cost=0.566]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 53, pass acc: 0.682373, current acc: 0.682993\n", + "time taken: 107.649418592453\n", + "epoch: 53, training loss: 0.594263, training acc: 0.684635, valid loss: 0.594733, valid acc: 0.682993\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.92it/s, accuracy=0.667, cost=0.564]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.60it/s, accuracy=0.647, cost=0.735]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.63it/s, accuracy=0.688, cost=0.567]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 54, pass acc: 0.682993, current acc: 0.683470\n", + "time taken: 107.52933931350708\n", + "epoch: 54, training loss: 0.593802, training acc: 0.685157, valid loss: 0.594281, valid acc: 0.683470\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.33it/s, accuracy=0.667, cost=0.563]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.54it/s, accuracy=0.647, cost=0.735]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:28, 189.69it/s, accuracy=0.688, cost=0.567]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 55, pass acc: 0.683470, current acc: 0.683970\n", + "time taken: 107.80942726135254\n", + "epoch: 55, training loss: 0.593346, training acc: 0.685611, valid loss: 0.593835, valid acc: 0.683970\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.64it/s, accuracy=0.667, cost=0.562]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.26it/s, accuracy=0.647, cost=0.735]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.28it/s, accuracy=0.688, cost=0.567]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 56, pass acc: 0.683970, current acc: 0.684306\n", + "time taken: 107.68839287757874\n", + "epoch: 56, training loss: 0.592896, training acc: 0.686042, valid loss: 0.593393, valid acc: 0.684306\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.41it/s, accuracy=0.667, cost=0.561]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.26it/s, accuracy=0.647, cost=0.735]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.37it/s, accuracy=0.594, cost=0.614]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 57, pass acc: 0.684306, current acc: 0.684746\n", + "time taken: 107.79683804512024\n", + "epoch: 57, training loss: 0.592450, training acc: 0.686463, valid loss: 0.592957, valid acc: 0.684746\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.30it/s, accuracy=0.667, cost=0.56] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.83it/s, accuracy=0.647, cost=0.735]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.12it/s, accuracy=0.594, cost=0.613]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 58, pass acc: 0.684746, current acc: 0.685254\n", + "time taken: 107.88986110687256\n", + "epoch: 58, training loss: 0.592010, training acc: 0.686862, valid loss: 0.592525, valid acc: 0.685254\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.48it/s, accuracy=0.667, cost=0.558]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.57it/s, accuracy=0.647, cost=0.735]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.14it/s, accuracy=0.688, cost=0.568]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 59, pass acc: 0.685254, current acc: 0.685731\n", + "time taken: 107.73933482170105\n", + "epoch: 59, training loss: 0.591574, training acc: 0.687278, valid loss: 0.592098, valid acc: 0.685731\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.50it/s, accuracy=0.667, cost=0.557]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.43it/s, accuracy=0.647, cost=0.734]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.57it/s, accuracy=0.688, cost=0.568]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 60, pass acc: 0.685731, current acc: 0.686261\n", + "time taken: 107.74195742607117\n", + "epoch: 60, training loss: 0.591144, training acc: 0.687644, valid loss: 0.591676, valid acc: 0.686261\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.51it/s, accuracy=0.667, cost=0.556]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.39it/s, accuracy=0.647, cost=0.734]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.77it/s, accuracy=0.594, cost=0.611]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 61, pass acc: 0.686261, current acc: 0.686672\n", + "time taken: 107.74094200134277\n", + "epoch: 61, training loss: 0.590717, training acc: 0.688081, valid loss: 0.591258, valid acc: 0.686672\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.61it/s, accuracy=0.667, cost=0.555]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.45it/s, accuracy=0.588, cost=0.734]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.69it/s, accuracy=0.688, cost=0.568]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 62, pass acc: 0.686672, current acc: 0.686986\n", + "time taken: 107.68662810325623\n", + "epoch: 62, training loss: 0.590296, training acc: 0.688458, valid loss: 0.590844, valid acc: 0.686986\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.67it/s, accuracy=0.667, cost=0.554]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.13it/s, accuracy=0.588, cost=0.734]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:28, 189.07it/s, accuracy=0.688, cost=0.569]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 63, pass acc: 0.686986, current acc: 0.687404\n", + "time taken: 107.69173169136047\n", + "epoch: 63, training loss: 0.589878, training acc: 0.688889, valid loss: 0.590435, valid acc: 0.687404\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.74it/s, accuracy=0.667, cost=0.553]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.67it/s, accuracy=0.588, cost=0.734]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.70it/s, accuracy=0.688, cost=0.569]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 64, pass acc: 0.687404, current acc: 0.687494\n", + "time taken: 107.60827088356018\n", + "epoch: 64, training loss: 0.589465, training acc: 0.689213, valid loss: 0.590030, valid acc: 0.687494\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.69it/s, accuracy=0.667, cost=0.552]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.60it/s, accuracy=0.588, cost=0.734]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.17it/s, accuracy=0.688, cost=0.569]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 65, pass acc: 0.687494, current acc: 0.687792\n", + "time taken: 107.63724684715271\n", + "epoch: 65, training loss: 0.589057, training acc: 0.689573, valid loss: 0.589629, valid acc: 0.687792\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.76it/s, accuracy=0.667, cost=0.551]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.55it/s, accuracy=0.529, cost=0.734]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.38it/s, accuracy=0.688, cost=0.569]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 66, pass acc: 0.687792, current acc: 0.688159\n", + "time taken: 107.60908007621765\n", + "epoch: 66, training loss: 0.588652, training acc: 0.689907, valid loss: 0.589232, valid acc: 0.688159\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.65it/s, accuracy=0.667, cost=0.55] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.94it/s, accuracy=0.529, cost=0.733]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.52it/s, accuracy=0.656, cost=0.607]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 67, pass acc: 0.688159, current acc: 0.688696\n", + "time taken: 107.71687912940979\n", + "epoch: 67, training loss: 0.588252, training acc: 0.690275, valid loss: 0.588839, valid acc: 0.688696\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.71it/s, accuracy=0.667, cost=0.549]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.83it/s, accuracy=0.529, cost=0.733]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:25, 194.84it/s, accuracy=0.656, cost=0.606]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 68, pass acc: 0.688696, current acc: 0.689032\n", + "time taken: 107.70263361930847\n", + "epoch: 68, training loss: 0.587855, training acc: 0.690584, valid loss: 0.588450, valid acc: 0.689032\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.59it/s, accuracy=0.667, cost=0.548]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.80it/s, accuracy=0.529, cost=0.733]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.75it/s, accuracy=0.688, cost=0.57] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 69, pass acc: 0.689032, current acc: 0.689360\n", + "time taken: 107.66497302055359\n", + "epoch: 69, training loss: 0.587463, training acc: 0.690973, valid loss: 0.588065, valid acc: 0.689360\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.53it/s, accuracy=0.667, cost=0.547]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.17it/s, accuracy=0.529, cost=0.733]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.90it/s, accuracy=0.688, cost=0.57] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 70, pass acc: 0.689360, current acc: 0.689912\n", + "time taken: 107.75315642356873\n", + "epoch: 70, training loss: 0.587074, training acc: 0.691411, valid loss: 0.587684, valid acc: 0.689912\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.69it/s, accuracy=0.667, cost=0.546]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.53it/s, accuracy=0.529, cost=0.733]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.89it/s, accuracy=0.688, cost=0.57] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 71, pass acc: 0.689912, current acc: 0.690390\n", + "time taken: 107.64590835571289\n", + "epoch: 71, training loss: 0.586689, training acc: 0.691812, valid loss: 0.587306, valid acc: 0.690390\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 189.84it/s, accuracy=0.667, cost=0.545]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.12it/s, accuracy=0.529, cost=0.733]\n", + "train minibatch loop: 0%| | 17/16751 [00:00<01:38, 169.62it/s, accuracy=0.625, cost=0.636]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 72, pass acc: 0.690390, current acc: 0.690778\n", + "time taken: 108.07043957710266\n", + "epoch: 72, training loss: 0.586308, training acc: 0.692221, valid loss: 0.586932, valid acc: 0.690778\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.56it/s, accuracy=0.667, cost=0.544]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 209.74it/s, accuracy=0.529, cost=0.732]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.92it/s, accuracy=0.688, cost=0.571]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 73, pass acc: 0.690778, current acc: 0.691285\n", + "time taken: 107.873779296875\n", + "epoch: 73, training loss: 0.585931, training acc: 0.692564, valid loss: 0.586561, valid acc: 0.691285\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.56it/s, accuracy=0.667, cost=0.543]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.40it/s, accuracy=0.529, cost=0.732]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:30, 184.93it/s, accuracy=0.688, cost=0.571]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 74, pass acc: 0.691285, current acc: 0.691576\n", + "time taken: 107.71588206291199\n", + "epoch: 74, training loss: 0.585557, training acc: 0.692887, valid loss: 0.586194, valid acc: 0.691576\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.50it/s, accuracy=0.667, cost=0.542]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.22it/s, accuracy=0.529, cost=0.732]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.17it/s, accuracy=0.656, cost=0.602]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 75, pass acc: 0.691576, current acc: 0.691860\n", + "time taken: 107.76205706596375\n", + "epoch: 75, training loss: 0.585186, training acc: 0.693155, valid loss: 0.585831, valid acc: 0.691860\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.61it/s, accuracy=0.667, cost=0.542]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.10it/s, accuracy=0.529, cost=0.732]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:29, 187.79it/s, accuracy=0.688, cost=0.571]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 76, pass acc: 0.691860, current acc: 0.692159\n", + "time taken: 107.72117686271667\n", + "epoch: 76, training loss: 0.584819, training acc: 0.693433, valid loss: 0.585470, valid acc: 0.692159\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.34it/s, accuracy=0.667, cost=0.541]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.54it/s, accuracy=0.529, cost=0.732]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.39it/s, accuracy=0.688, cost=0.571]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 77, pass acc: 0.692159, current acc: 0.692465\n", + "time taken: 107.89808201789856\n", + "epoch: 77, training loss: 0.584456, training acc: 0.693805, valid loss: 0.585113, valid acc: 0.692465\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.57it/s, accuracy=0.667, cost=0.54] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.76it/s, accuracy=0.529, cost=0.732]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.18it/s, accuracy=0.688, cost=0.572]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 78, pass acc: 0.692465, current acc: 0.692733\n", + "time taken: 107.77280068397522\n", + "epoch: 78, training loss: 0.584096, training acc: 0.694148, valid loss: 0.584760, valid acc: 0.692733\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.52it/s, accuracy=0.667, cost=0.539]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.32it/s, accuracy=0.529, cost=0.732]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:28, 189.33it/s, accuracy=0.625, cost=0.56] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 79, pass acc: 0.692733, current acc: 0.693084\n", + "time taken: 107.74084138870239\n", + "epoch: 79, training loss: 0.583739, training acc: 0.694461, valid loss: 0.584409, valid acc: 0.693084\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.72it/s, accuracy=0.667, cost=0.538]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.42it/s, accuracy=0.529, cost=0.731]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.55it/s, accuracy=0.688, cost=0.599]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 80, pass acc: 0.693084, current acc: 0.693278\n", + "time taken: 107.6422860622406\n", + "epoch: 80, training loss: 0.583385, training acc: 0.694719, valid loss: 0.584062, valid acc: 0.693278\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.57it/s, accuracy=0.667, cost=0.537]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.58it/s, accuracy=0.529, cost=0.731]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.73it/s, accuracy=0.688, cost=0.572]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 81, pass acc: 0.693278, current acc: 0.693487\n", + "time taken: 107.69443416595459\n", + "epoch: 81, training loss: 0.583034, training acc: 0.695090, valid loss: 0.583717, valid acc: 0.693487\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.52it/s, accuracy=0.667, cost=0.536]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.85it/s, accuracy=0.529, cost=0.731]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:28, 188.59it/s, accuracy=0.688, cost=0.572]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 82, pass acc: 0.693487, current acc: 0.693830\n", + "time taken: 107.78699922561646\n", + "epoch: 82, training loss: 0.582687, training acc: 0.695396, valid loss: 0.583376, valid acc: 0.693830\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.52it/s, accuracy=0.667, cost=0.535]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.59it/s, accuracy=0.529, cost=0.731]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:28, 190.06it/s, accuracy=0.688, cost=0.573]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 83, pass acc: 0.693830, current acc: 0.694166\n", + "time taken: 107.76189470291138\n", + "epoch: 83, training loss: 0.582343, training acc: 0.695594, valid loss: 0.583038, valid acc: 0.694166\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.74it/s, accuracy=0.667, cost=0.534]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.57it/s, accuracy=0.529, cost=0.731]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.59it/s, accuracy=0.688, cost=0.573]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 84, pass acc: 0.694166, current acc: 0.694375\n", + "time taken: 107.6187915802002\n", + "epoch: 84, training loss: 0.582001, training acc: 0.695877, valid loss: 0.582703, valid acc: 0.694375\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.68it/s, accuracy=0.667, cost=0.533]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.40it/s, accuracy=0.529, cost=0.731]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:31, 182.19it/s, accuracy=0.625, cost=0.559]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 85, pass acc: 0.694375, current acc: 0.694629\n", + "time taken: 107.66129851341248\n", + "epoch: 85, training loss: 0.581663, training acc: 0.696209, valid loss: 0.582370, valid acc: 0.694629\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.61it/s, accuracy=0.667, cost=0.532]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.35it/s, accuracy=0.529, cost=0.73] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.14it/s, accuracy=0.688, cost=0.573]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 86, pass acc: 0.694629, current acc: 0.694979\n", + "time taken: 107.69972586631775\n", + "epoch: 86, training loss: 0.581328, training acc: 0.696512, valid loss: 0.582041, valid acc: 0.694979\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.53it/s, accuracy=0.667, cost=0.531]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.07it/s, accuracy=0.529, cost=0.73] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.33it/s, accuracy=0.688, cost=0.573]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 87, pass acc: 0.694979, current acc: 0.695293\n", + "time taken: 107.76305556297302\n", + "epoch: 87, training loss: 0.580995, training acc: 0.696760, valid loss: 0.581714, valid acc: 0.695293\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 191.46it/s, accuracy=0.667, cost=0.53] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.29it/s, accuracy=0.529, cost=0.73] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.62it/s, accuracy=0.656, cost=0.595]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 88, pass acc: 0.695293, current acc: 0.695606\n", + "time taken: 107.31195759773254\n", + "epoch: 88, training loss: 0.580665, training acc: 0.697030, valid loss: 0.581390, valid acc: 0.695606\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.90it/s, accuracy=0.667, cost=0.529]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.60it/s, accuracy=0.529, cost=0.73] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.80it/s, accuracy=0.656, cost=0.595]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 89, pass acc: 0.695606, current acc: 0.695942\n", + "time taken: 107.54351162910461\n", + "epoch: 89, training loss: 0.580339, training acc: 0.697372, valid loss: 0.581069, valid acc: 0.695942\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.74it/s, accuracy=0.667, cost=0.528]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.55it/s, accuracy=0.529, cost=0.73] \n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:32, 180.68it/s, accuracy=0.625, cost=0.559]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 90, pass acc: 0.695942, current acc: 0.696338\n", + "time taken: 107.6191999912262\n", + "epoch: 90, training loss: 0.580014, training acc: 0.697612, valid loss: 0.580750, valid acc: 0.696338\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.52it/s, accuracy=0.667, cost=0.527]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.67it/s, accuracy=0.529, cost=0.73] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.96it/s, accuracy=0.688, cost=0.574]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 91, pass acc: 0.696338, current acc: 0.696629\n", + "time taken: 107.70880508422852\n", + "epoch: 91, training loss: 0.579693, training acc: 0.697872, valid loss: 0.580434, valid acc: 0.696629\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 191.46it/s, accuracy=0.667, cost=0.526]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.10it/s, accuracy=0.529, cost=0.73] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.19it/s, accuracy=0.688, cost=0.574]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 92, pass acc: 0.696629, current acc: 0.696897\n", + "time taken: 107.64151811599731\n", + "epoch: 92, training loss: 0.579374, training acc: 0.698107, valid loss: 0.580121, valid acc: 0.696897\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.94it/s, accuracy=0.667, cost=0.526]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.45it/s, accuracy=0.529, cost=0.729]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.63it/s, accuracy=0.688, cost=0.575]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 93, pass acc: 0.696897, current acc: 0.697256\n", + "time taken: 107.53481197357178\n", + "epoch: 93, training loss: 0.579058, training acc: 0.698372, valid loss: 0.579810, valid acc: 0.697256\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.66it/s, accuracy=0.667, cost=0.525]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.56it/s, accuracy=0.529, cost=0.729]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.28it/s, accuracy=0.688, cost=0.575]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 94, pass acc: 0.697256, current acc: 0.697509\n", + "time taken: 107.65583086013794\n", + "epoch: 94, training loss: 0.578745, training acc: 0.698607, valid loss: 0.579502, valid acc: 0.697509\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.51it/s, accuracy=0.667, cost=0.524]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.48it/s, accuracy=0.529, cost=0.729]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.63it/s, accuracy=0.656, cost=0.592]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 95, pass acc: 0.697509, current acc: 0.697808\n", + "time taken: 107.73135256767273\n", + "epoch: 95, training loss: 0.578434, training acc: 0.698920, valid loss: 0.579196, valid acc: 0.697808\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.61it/s, accuracy=0.667, cost=0.523]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.32it/s, accuracy=0.529, cost=0.729]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.29it/s, accuracy=0.719, cost=0.575]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 96, pass acc: 0.697808, current acc: 0.698144\n", + "time taken: 107.70218014717102\n", + "epoch: 96, training loss: 0.578125, training acc: 0.699129, valid loss: 0.578893, valid acc: 0.698144\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.78it/s, accuracy=0.667, cost=0.522]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.93it/s, accuracy=0.529, cost=0.729]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.41it/s, accuracy=0.719, cost=0.575]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 97, pass acc: 0.698144, current acc: 0.698330\n", + "time taken: 107.65740418434143\n", + "epoch: 97, training loss: 0.577819, training acc: 0.699392, valid loss: 0.578592, valid acc: 0.698330\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.71it/s, accuracy=0.667, cost=0.521]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.49it/s, accuracy=0.529, cost=0.729]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.27it/s, accuracy=0.719, cost=0.576]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 98, pass acc: 0.698330, current acc: 0.698793\n", + "time taken: 107.64051365852356\n", + "epoch: 98, training loss: 0.577516, training acc: 0.699698, valid loss: 0.578294, valid acc: 0.698793\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.80it/s, accuracy=0.667, cost=0.52] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.39it/s, accuracy=0.529, cost=0.728]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.69it/s, accuracy=0.719, cost=0.576]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 99, pass acc: 0.698793, current acc: 0.699047\n", + "time taken: 107.6045892238617\n", + "epoch: 99, training loss: 0.577215, training acc: 0.699879, valid loss: 0.577998, valid acc: 0.699047\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.64it/s, accuracy=0.667, cost=0.519]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.40it/s, accuracy=0.529, cost=0.728]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.22it/s, accuracy=0.719, cost=0.576]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 100, pass acc: 0.699047, current acc: 0.699323\n", + "time taken: 107.67813611030579\n", + "epoch: 100, training loss: 0.576916, training acc: 0.700140, valid loss: 0.577704, valid acc: 0.699323\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.83it/s, accuracy=0.667, cost=0.518]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.42it/s, accuracy=0.529, cost=0.728]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.27it/s, accuracy=0.719, cost=0.576]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 101, pass acc: 0.699323, current acc: 0.699539\n", + "time taken: 107.5903115272522\n", + "epoch: 101, training loss: 0.576620, training acc: 0.700428, valid loss: 0.577413, valid acc: 0.699539\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.69it/s, accuracy=0.667, cost=0.517]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.90it/s, accuracy=0.529, cost=0.728]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.16it/s, accuracy=0.625, cost=0.588]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 102, pass acc: 0.699539, current acc: 0.699897\n", + "time taken: 107.70278024673462\n", + "epoch: 102, training loss: 0.576326, training acc: 0.700663, valid loss: 0.577124, valid acc: 0.699897\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.92it/s, accuracy=0.667, cost=0.517]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.23it/s, accuracy=0.529, cost=0.728]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.21it/s, accuracy=0.625, cost=0.588]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 103, pass acc: 0.699897, current acc: 0.700308\n", + "time taken: 107.56525588035583\n", + "epoch: 103, training loss: 0.576034, training acc: 0.700887, valid loss: 0.576837, valid acc: 0.700308\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.57it/s, accuracy=0.667, cost=0.516]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.18it/s, accuracy=0.529, cost=0.728]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.37it/s, accuracy=0.719, cost=0.577]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 104, pass acc: 0.700308, current acc: 0.700509\n", + "time taken: 107.73149943351746\n", + "epoch: 104, training loss: 0.575745, training acc: 0.701127, valid loss: 0.576552, valid acc: 0.700509\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.60it/s, accuracy=0.667, cost=0.515]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.01it/s, accuracy=0.529, cost=0.728]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.14it/s, accuracy=0.656, cost=0.557]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 105, pass acc: 0.700509, current acc: 0.700800\n", + "time taken: 107.73290181159973\n", + "epoch: 105, training loss: 0.575458, training acc: 0.701381, valid loss: 0.576270, valid acc: 0.700800\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.74it/s, accuracy=0.667, cost=0.514]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.79it/s, accuracy=0.529, cost=0.727]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.19it/s, accuracy=0.719, cost=0.577]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 106, pass acc: 0.700800, current acc: 0.700905\n", + "time taken: 107.6894805431366\n", + "epoch: 106, training loss: 0.575173, training acc: 0.701618, valid loss: 0.575989, valid acc: 0.700905\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.71it/s, accuracy=0.667, cost=0.513]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.72it/s, accuracy=0.529, cost=0.727]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.19it/s, accuracy=0.719, cost=0.577]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 107, pass acc: 0.700905, current acc: 0.701181\n", + "time taken: 107.713871717453\n", + "epoch: 107, training loss: 0.574890, training acc: 0.701836, valid loss: 0.575711, valid acc: 0.701181\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.78it/s, accuracy=0.667, cost=0.512]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.85it/s, accuracy=0.529, cost=0.727]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.61it/s, accuracy=0.719, cost=0.577]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 108, pass acc: 0.701181, current acc: 0.701532\n", + "time taken: 107.62563991546631\n", + "epoch: 108, training loss: 0.574609, training acc: 0.702099, valid loss: 0.575435, valid acc: 0.701532\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.53it/s, accuracy=0.667, cost=0.511]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.44it/s, accuracy=0.529, cost=0.727]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.11it/s, accuracy=0.625, cost=0.585]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 109, pass acc: 0.701532, current acc: 0.701591\n", + "time taken: 107.72871589660645\n", + "epoch: 109, training loss: 0.574331, training acc: 0.702271, valid loss: 0.575161, valid acc: 0.701591\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.69it/s, accuracy=0.667, cost=0.511]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.20it/s, accuracy=0.529, cost=0.727]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.46it/s, accuracy=0.625, cost=0.585]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 110, pass acc: 0.701591, current acc: 0.701867\n", + "time taken: 107.6742775440216\n", + "epoch: 110, training loss: 0.574054, training acc: 0.702478, valid loss: 0.574889, valid acc: 0.701867\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.62it/s, accuracy=0.667, cost=0.51] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.20it/s, accuracy=0.529, cost=0.727]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.41it/s, accuracy=0.719, cost=0.578]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 111, pass acc: 0.701867, current acc: 0.702114\n", + "time taken: 107.70853090286255\n", + "epoch: 111, training loss: 0.573780, training acc: 0.702726, valid loss: 0.574619, valid acc: 0.702114\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.67it/s, accuracy=0.667, cost=0.509]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.18it/s, accuracy=0.529, cost=0.727]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.30it/s, accuracy=0.625, cost=0.584]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 112, pass acc: 0.702114, current acc: 0.702233\n", + "time taken: 107.68769526481628\n", + "epoch: 112, training loss: 0.573507, training acc: 0.702972, valid loss: 0.574351, valid acc: 0.702233\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.76it/s, accuracy=0.667, cost=0.508]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.33it/s, accuracy=0.529, cost=0.726]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.85it/s, accuracy=0.719, cost=0.578]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 113, pass acc: 0.702233, current acc: 0.702524\n", + "time taken: 107.6330292224884\n", + "epoch: 113, training loss: 0.573237, training acc: 0.703183, valid loss: 0.574085, valid acc: 0.702524\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.78it/s, accuracy=0.667, cost=0.507]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.61it/s, accuracy=0.529, cost=0.726]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.27it/s, accuracy=0.719, cost=0.579]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 114, pass acc: 0.702524, current acc: 0.702800\n", + "time taken: 107.59576678276062\n", + "epoch: 114, training loss: 0.572968, training acc: 0.703426, valid loss: 0.573821, valid acc: 0.702800\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.69it/s, accuracy=0.667, cost=0.506]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.63it/s, accuracy=0.529, cost=0.726]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.14it/s, accuracy=0.719, cost=0.579]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 115, pass acc: 0.702800, current acc: 0.703091\n", + "time taken: 107.63443422317505\n", + "epoch: 115, training loss: 0.572702, training acc: 0.703624, valid loss: 0.573559, valid acc: 0.703091\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.75it/s, accuracy=0.667, cost=0.505]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.98it/s, accuracy=0.529, cost=0.726]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.62it/s, accuracy=0.719, cost=0.579]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 116, pass acc: 0.703091, current acc: 0.703226\n", + "time taken: 107.66951394081116\n", + "epoch: 116, training loss: 0.572438, training acc: 0.703887, valid loss: 0.573299, valid acc: 0.703226\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.83it/s, accuracy=0.667, cost=0.505]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.22it/s, accuracy=0.529, cost=0.726]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.96it/s, accuracy=0.719, cost=0.579]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 117, pass acc: 0.703226, current acc: 0.703539\n", + "time taken: 107.6104109287262\n", + "epoch: 117, training loss: 0.572175, training acc: 0.704077, valid loss: 0.573040, valid acc: 0.703539\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.77it/s, accuracy=0.667, cost=0.504]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.37it/s, accuracy=0.529, cost=0.726]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.40it/s, accuracy=0.719, cost=0.579]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 118, pass acc: 0.703539, current acc: 0.703718\n", + "time taken: 107.62096405029297\n", + "epoch: 118, training loss: 0.571914, training acc: 0.704271, valid loss: 0.572784, valid acc: 0.703718\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.65it/s, accuracy=0.667, cost=0.503]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.36it/s, accuracy=0.529, cost=0.726]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.44it/s, accuracy=0.719, cost=0.579]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 119, pass acc: 0.703718, current acc: 0.703942\n", + "time taken: 107.67861604690552\n", + "epoch: 119, training loss: 0.571656, training acc: 0.704485, valid loss: 0.572529, valid acc: 0.703942\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.41it/s, accuracy=0.667, cost=0.502]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.37it/s, accuracy=0.529, cost=0.725]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.93it/s, accuracy=0.719, cost=0.58] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 120, pass acc: 0.703942, current acc: 0.704241\n", + "time taken: 107.78900837898254\n", + "epoch: 120, training loss: 0.571399, training acc: 0.704657, valid loss: 0.572276, valid acc: 0.704241\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.72it/s, accuracy=0.667, cost=0.501]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.38it/s, accuracy=0.529, cost=0.725]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.43it/s, accuracy=0.625, cost=0.58] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 121, pass acc: 0.704241, current acc: 0.704509\n", + "time taken: 107.64572811126709\n", + "epoch: 121, training loss: 0.571143, training acc: 0.704803, valid loss: 0.572025, valid acc: 0.704509\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.78it/s, accuracy=0.667, cost=0.5] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.17it/s, accuracy=0.529, cost=0.725]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.37it/s, accuracy=0.625, cost=0.58] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 122, pass acc: 0.704509, current acc: 0.704666\n", + "time taken: 107.63543581962585\n", + "epoch: 122, training loss: 0.570890, training acc: 0.705023, valid loss: 0.571776, valid acc: 0.704666\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.83it/s, accuracy=0.667, cost=0.5] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.67it/s, accuracy=0.529, cost=0.725]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.89it/s, accuracy=0.719, cost=0.58] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 123, pass acc: 0.704666, current acc: 0.704830\n", + "time taken: 107.56488394737244\n", + "epoch: 123, training loss: 0.570639, training acc: 0.705234, valid loss: 0.571528, valid acc: 0.704830\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.74it/s, accuracy=0.667, cost=0.499]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.79it/s, accuracy=0.529, cost=0.725]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.63it/s, accuracy=0.719, cost=0.58] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 124, pass acc: 0.704830, current acc: 0.705039\n", + "time taken: 107.59502387046814\n", + "epoch: 124, training loss: 0.570389, training acc: 0.705444, valid loss: 0.571283, valid acc: 0.705039\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.69it/s, accuracy=0.667, cost=0.498]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.54it/s, accuracy=0.529, cost=0.725]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:28, 189.59it/s, accuracy=0.719, cost=0.58] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 125, pass acc: 0.705039, current acc: 0.705181\n", + "time taken: 107.6409637928009\n", + "epoch: 125, training loss: 0.570141, training acc: 0.705693, valid loss: 0.571038, valid acc: 0.705181\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.85it/s, accuracy=0.667, cost=0.497]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.18it/s, accuracy=0.529, cost=0.725]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.64it/s, accuracy=0.719, cost=0.581]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 126, pass acc: 0.705181, current acc: 0.705338\n", + "time taken: 107.60178756713867\n", + "epoch: 126, training loss: 0.569894, training acc: 0.705939, valid loss: 0.570796, valid acc: 0.705338\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.81it/s, accuracy=0.667, cost=0.496]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.44it/s, accuracy=0.529, cost=0.725]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.59it/s, accuracy=0.719, cost=0.581]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 127, pass acc: 0.705338, current acc: 0.705606\n", + "time taken: 107.59727454185486\n", + "epoch: 127, training loss: 0.569650, training acc: 0.706152, valid loss: 0.570555, valid acc: 0.705606\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.74it/s, accuracy=0.667, cost=0.496]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.33it/s, accuracy=0.529, cost=0.724]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.65it/s, accuracy=0.719, cost=0.581]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 128, pass acc: 0.705606, current acc: 0.705897\n", + "time taken: 107.63994479179382\n", + "epoch: 128, training loss: 0.569407, training acc: 0.706357, valid loss: 0.570316, valid acc: 0.705897\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.88it/s, accuracy=0.667, cost=0.495]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.31it/s, accuracy=0.529, cost=0.724]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.66it/s, accuracy=0.719, cost=0.581]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 129, pass acc: 0.705897, current acc: 0.706173\n", + "time taken: 107.5792670249939\n", + "epoch: 129, training loss: 0.569165, training acc: 0.706569, valid loss: 0.570079, valid acc: 0.706173\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.73it/s, accuracy=0.667, cost=0.494]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.61it/s, accuracy=0.529, cost=0.724]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:29, 187.03it/s, accuracy=0.719, cost=0.581]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 130, pass acc: 0.706173, current acc: 0.706464\n", + "time taken: 107.61936593055725\n", + "epoch: 130, training loss: 0.568926, training acc: 0.706827, valid loss: 0.569843, valid acc: 0.706464\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.59it/s, accuracy=0.667, cost=0.493]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.02it/s, accuracy=0.529, cost=0.724]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.19it/s, accuracy=0.719, cost=0.581]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 131, pass acc: 0.706464, current acc: 0.706636\n", + "time taken: 107.73847842216492\n", + "epoch: 131, training loss: 0.568688, training acc: 0.707081, valid loss: 0.569609, valid acc: 0.706636\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.79it/s, accuracy=0.667, cost=0.492]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.57it/s, accuracy=0.529, cost=0.724]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.08it/s, accuracy=0.719, cost=0.582]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 132, pass acc: 0.706636, current acc: 0.706830\n", + "time taken: 107.59507822990417\n", + "epoch: 132, training loss: 0.568451, training acc: 0.707332, valid loss: 0.569376, valid acc: 0.706830\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.73it/s, accuracy=0.667, cost=0.492]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.78it/s, accuracy=0.529, cost=0.724]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:29, 187.12it/s, accuracy=0.719, cost=0.582]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 133, pass acc: 0.706830, current acc: 0.707047\n", + "time taken: 107.60304522514343\n", + "epoch: 133, training loss: 0.568217, training acc: 0.707532, valid loss: 0.569145, valid acc: 0.707047\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.78it/s, accuracy=0.667, cost=0.491]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.47it/s, accuracy=0.529, cost=0.724]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.40it/s, accuracy=0.719, cost=0.582]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 134, pass acc: 0.707047, current acc: 0.707144\n", + "time taken: 107.60745000839233\n", + "epoch: 134, training loss: 0.567983, training acc: 0.707760, valid loss: 0.568915, valid acc: 0.707144\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.73it/s, accuracy=0.667, cost=0.49] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.38it/s, accuracy=0.529, cost=0.723]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.34it/s, accuracy=0.625, cost=0.575]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 135, pass acc: 0.707144, current acc: 0.707218\n", + "time taken: 107.63808560371399\n", + "epoch: 135, training loss: 0.567752, training acc: 0.707987, valid loss: 0.568687, valid acc: 0.707218\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.94it/s, accuracy=0.667, cost=0.489]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.05it/s, accuracy=0.529, cost=0.723]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.04it/s, accuracy=0.625, cost=0.575]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 136, pass acc: 0.707218, current acc: 0.707352\n", + "time taken: 107.57535552978516\n", + "epoch: 136, training loss: 0.567522, training acc: 0.708196, valid loss: 0.568461, valid acc: 0.707352\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.70it/s, accuracy=0.667, cost=0.489]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.65it/s, accuracy=0.529, cost=0.723]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.59it/s, accuracy=0.625, cost=0.575]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 137, pass acc: 0.707352, current acc: 0.707472\n", + "time taken: 107.62800931930542\n", + "epoch: 137, training loss: 0.567293, training acc: 0.708402, valid loss: 0.568235, valid acc: 0.707472\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.52it/s, accuracy=0.667, cost=0.488]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.15it/s, accuracy=0.529, cost=0.723]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.27it/s, accuracy=0.719, cost=0.583]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 138, pass acc: 0.707472, current acc: 0.707629\n", + "time taken: 107.76011204719543\n", + "epoch: 138, training loss: 0.567066, training acc: 0.708596, valid loss: 0.568012, valid acc: 0.707629\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.49it/s, accuracy=0.667, cost=0.487]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.41it/s, accuracy=0.529, cost=0.723]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.32it/s, accuracy=0.719, cost=0.583]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 139, pass acc: 0.707629, current acc: 0.707763\n", + "time taken: 107.74739146232605\n", + "epoch: 139, training loss: 0.566840, training acc: 0.708706, valid loss: 0.567790, valid acc: 0.707763\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.70it/s, accuracy=0.667, cost=0.486]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.77it/s, accuracy=0.529, cost=0.723]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.48it/s, accuracy=0.719, cost=0.583]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 140, pass acc: 0.707763, current acc: 0.708054\n", + "time taken: 107.7103979587555\n", + "epoch: 140, training loss: 0.566616, training acc: 0.708868, valid loss: 0.567569, valid acc: 0.708054\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.73it/s, accuracy=0.667, cost=0.486]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.06it/s, accuracy=0.529, cost=0.723]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.87it/s, accuracy=0.719, cost=0.583]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 141, pass acc: 0.708054, current acc: 0.708121\n", + "time taken: 107.66880583763123\n", + "epoch: 141, training loss: 0.566393, training acc: 0.708980, valid loss: 0.567350, valid acc: 0.708121\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.79it/s, accuracy=0.667, cost=0.485]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.39it/s, accuracy=0.529, cost=0.722]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.22it/s, accuracy=0.719, cost=0.583]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 142, pass acc: 0.708121, current acc: 0.708390\n", + "time taken: 107.61167550086975\n", + "epoch: 142, training loss: 0.566172, training acc: 0.709131, valid loss: 0.567132, valid acc: 0.708390\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.58it/s, accuracy=0.667, cost=0.484]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.27it/s, accuracy=0.529, cost=0.722]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.81it/s, accuracy=0.625, cost=0.573]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 143, pass acc: 0.708390, current acc: 0.708547\n", + "time taken: 107.71838474273682\n", + "epoch: 143, training loss: 0.565952, training acc: 0.709332, valid loss: 0.566916, valid acc: 0.708547\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.53it/s, accuracy=0.667, cost=0.483]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.62it/s, accuracy=0.529, cost=0.722]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.77it/s, accuracy=0.625, cost=0.572]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 144, pass acc: 0.708547, current acc: 0.708770\n", + "time taken: 107.71091437339783\n", + "epoch: 144, training loss: 0.565734, training acc: 0.709521, valid loss: 0.566701, valid acc: 0.708770\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.56it/s, accuracy=0.667, cost=0.483]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.61it/s, accuracy=0.529, cost=0.722]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.96it/s, accuracy=0.719, cost=0.584]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 145, pass acc: 0.708770, current acc: 0.708778\n", + "time taken: 107.78882765769958\n", + "epoch: 145, training loss: 0.565517, training acc: 0.709743, valid loss: 0.566487, valid acc: 0.708778\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.56it/s, accuracy=0.667, cost=0.482]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.04it/s, accuracy=0.529, cost=0.722]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.73it/s, accuracy=0.719, cost=0.584]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 146, pass acc: 0.708778, current acc: 0.708875\n", + "time taken: 107.75465488433838\n", + "epoch: 146, training loss: 0.565301, training acc: 0.709971, valid loss: 0.566275, valid acc: 0.708875\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.67it/s, accuracy=0.667, cost=0.481]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.54it/s, accuracy=0.529, cost=0.722]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.68it/s, accuracy=0.625, cost=0.571]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 147, pass acc: 0.708875, current acc: 0.709076\n", + "time taken: 107.66541886329651\n", + "epoch: 147, training loss: 0.565087, training acc: 0.710183, valid loss: 0.566064, valid acc: 0.709076\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.60it/s, accuracy=0.667, cost=0.48] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.38it/s, accuracy=0.529, cost=0.722]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.49it/s, accuracy=0.719, cost=0.584]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 148, pass acc: 0.709076, current acc: 0.709233\n", + "time taken: 107.70178771018982\n", + "epoch: 148, training loss: 0.564874, training acc: 0.710372, valid loss: 0.565854, valid acc: 0.709233\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.69it/s, accuracy=0.667, cost=0.48] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.16it/s, accuracy=0.529, cost=0.721]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:28, 189.57it/s, accuracy=0.719, cost=0.584]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 149, pass acc: 0.709233, current acc: 0.709345\n", + "time taken: 107.68047165870667\n", + "epoch: 149, training loss: 0.564662, training acc: 0.710558, valid loss: 0.565646, valid acc: 0.709345\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.75it/s, accuracy=0.667, cost=0.479]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.74it/s, accuracy=0.529, cost=0.721]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.53it/s, accuracy=0.625, cost=0.571]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 150, pass acc: 0.709345, current acc: 0.709509\n", + "time taken: 107.68914008140564\n", + "epoch: 150, training loss: 0.564452, training acc: 0.710676, valid loss: 0.565439, valid acc: 0.709509\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.71it/s, accuracy=0.667, cost=0.478]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.73it/s, accuracy=0.529, cost=0.721]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.05it/s, accuracy=0.719, cost=0.585]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 151, pass acc: 0.709509, current acc: 0.709696\n", + "time taken: 107.70815706253052\n", + "epoch: 151, training loss: 0.564243, training acc: 0.710814, valid loss: 0.565233, valid acc: 0.709696\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.70it/s, accuracy=0.667, cost=0.477]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.46it/s, accuracy=0.529, cost=0.721]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:31, 183.65it/s, accuracy=0.719, cost=0.585]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 152, pass acc: 0.709696, current acc: 0.709838\n", + "time taken: 107.6477632522583\n", + "epoch: 152, training loss: 0.564035, training acc: 0.711049, valid loss: 0.565029, valid acc: 0.709838\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.51it/s, accuracy=0.667, cost=0.477]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.55it/s, accuracy=0.529, cost=0.721]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.54it/s, accuracy=0.625, cost=0.57] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 153, pass acc: 0.709838, current acc: 0.709979\n", + "time taken: 107.72495102882385\n", + "epoch: 153, training loss: 0.563829, training acc: 0.711230, valid loss: 0.564825, valid acc: 0.709979\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.57it/s, accuracy=0.667, cost=0.476]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.22it/s, accuracy=0.529, cost=0.721]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.86it/s, accuracy=0.719, cost=0.585]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 154, pass acc: 0.709979, current acc: 0.710263\n", + "time taken: 107.72863411903381\n", + "epoch: 154, training loss: 0.563624, training acc: 0.711407, valid loss: 0.564624, valid acc: 0.710263\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.62it/s, accuracy=0.667, cost=0.475]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.02it/s, accuracy=0.529, cost=0.721]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.13it/s, accuracy=0.625, cost=0.569]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 155, pass acc: 0.710263, current acc: 0.710427\n", + "time taken: 107.72437310218811\n", + "epoch: 155, training loss: 0.563420, training acc: 0.711562, valid loss: 0.564423, valid acc: 0.710427\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.74it/s, accuracy=0.667, cost=0.474]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.13it/s, accuracy=0.529, cost=0.72] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.18it/s, accuracy=0.719, cost=0.585]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 156, pass acc: 0.710427, current acc: 0.710711\n", + "time taken: 107.6583023071289\n", + "epoch: 156, training loss: 0.563217, training acc: 0.711722, valid loss: 0.564223, valid acc: 0.710711\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.65it/s, accuracy=0.667, cost=0.474]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.24it/s, accuracy=0.529, cost=0.72] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.39it/s, accuracy=0.719, cost=0.585]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 157, pass acc: 0.710711, current acc: 0.710994\n", + "time taken: 107.69064044952393\n", + "epoch: 157, training loss: 0.563016, training acc: 0.711875, valid loss: 0.564025, valid acc: 0.710994\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 193.18it/s, accuracy=0.667, cost=0.473]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.41it/s, accuracy=0.529, cost=0.72] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.55it/s, accuracy=0.719, cost=0.586]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 158, pass acc: 0.710994, current acc: 0.711106\n", + "time taken: 107.6977527141571\n", + "epoch: 158, training loss: 0.562816, training acc: 0.711944, valid loss: 0.563828, valid acc: 0.711106\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.56it/s, accuracy=0.667, cost=0.472]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.63it/s, accuracy=0.529, cost=0.72] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.00it/s, accuracy=0.719, cost=0.586]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 159, pass acc: 0.711106, current acc: 0.711300\n", + "time taken: 107.69594931602478\n", + "epoch: 159, training loss: 0.562617, training acc: 0.712081, valid loss: 0.563632, valid acc: 0.711300\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.72it/s, accuracy=0.667, cost=0.472]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.20it/s, accuracy=0.529, cost=0.72] \n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:28, 189.70it/s, accuracy=0.719, cost=0.586]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 160, pass acc: 0.711300, current acc: 0.711449\n", + "time taken: 107.6613199710846\n", + "epoch: 160, training loss: 0.562419, training acc: 0.712267, valid loss: 0.563438, valid acc: 0.711449\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.73it/s, accuracy=0.667, cost=0.471]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.90it/s, accuracy=0.529, cost=0.72] \n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:30, 185.88it/s, accuracy=0.719, cost=0.586]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 161, pass acc: 0.711449, current acc: 0.711539\n", + "time taken: 107.68718075752258\n", + "epoch: 161, training loss: 0.562223, training acc: 0.712433, valid loss: 0.563244, valid acc: 0.711539\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 193.19it/s, accuracy=0.667, cost=0.47] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.48it/s, accuracy=0.529, cost=0.72] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.76it/s, accuracy=0.719, cost=0.586]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 162, pass acc: 0.711539, current acc: 0.711681\n", + "time taken: 107.67088198661804\n", + "epoch: 162, training loss: 0.562027, training acc: 0.712592, valid loss: 0.563052, valid acc: 0.711681\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.65it/s, accuracy=0.667, cost=0.47] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.52it/s, accuracy=0.529, cost=0.719]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.09it/s, accuracy=0.719, cost=0.586]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 163, pass acc: 0.711681, current acc: 0.711763\n", + "time taken: 107.66264700889587\n", + "epoch: 163, training loss: 0.561833, training acc: 0.712724, valid loss: 0.562861, valid acc: 0.711763\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.38it/s, accuracy=0.667, cost=0.469]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.18it/s, accuracy=0.529, cost=0.719]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.23it/s, accuracy=0.625, cost=0.567]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 164, pass acc: 0.711763, current acc: 0.711972\n", + "time taken: 107.81935429573059\n", + "epoch: 164, training loss: 0.561640, training acc: 0.712842, valid loss: 0.562671, valid acc: 0.711972\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.82it/s, accuracy=0.667, cost=0.468]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.21it/s, accuracy=0.529, cost=0.719]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:30, 184.97it/s, accuracy=0.719, cost=0.587]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 165, pass acc: 0.711972, current acc: 0.712069\n", + "time taken: 107.61496877670288\n", + "epoch: 165, training loss: 0.561448, training acc: 0.712995, valid loss: 0.562482, valid acc: 0.712069\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.87it/s, accuracy=0.667, cost=0.467]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.59it/s, accuracy=0.529, cost=0.719]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.43it/s, accuracy=0.719, cost=0.587]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 166, pass acc: 0.712069, current acc: 0.712263\n", + "time taken: 107.55763673782349\n", + "epoch: 166, training loss: 0.561258, training acc: 0.713114, valid loss: 0.562294, valid acc: 0.712263\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.80it/s, accuracy=0.667, cost=0.467]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.61it/s, accuracy=0.529, cost=0.719]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:28, 189.91it/s, accuracy=0.719, cost=0.587]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 167, pass acc: 0.712263, current acc: 0.712270\n", + "time taken: 107.58727216720581\n", + "epoch: 167, training loss: 0.561068, training acc: 0.713263, valid loss: 0.562107, valid acc: 0.712270\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.68it/s, accuracy=0.667, cost=0.466]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.44it/s, accuracy=0.529, cost=0.719]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.01it/s, accuracy=0.719, cost=0.587]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 168, pass acc: 0.712270, current acc: 0.712293\n", + "time taken: 107.65625882148743\n", + "epoch: 168, training loss: 0.560879, training acc: 0.713347, valid loss: 0.561922, valid acc: 0.712293\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.64it/s, accuracy=0.667, cost=0.465]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.38it/s, accuracy=0.529, cost=0.719]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.25it/s, accuracy=0.719, cost=0.587]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 169, pass acc: 0.712293, current acc: 0.712561\n", + "time taken: 107.6815824508667\n", + "epoch: 169, training loss: 0.560692, training acc: 0.713515, valid loss: 0.561737, valid acc: 0.712561\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.65it/s, accuracy=0.667, cost=0.465]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.81it/s, accuracy=0.529, cost=0.718]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.96it/s, accuracy=0.719, cost=0.587]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 170, pass acc: 0.712561, current acc: 0.712800\n", + "time taken: 107.73226022720337\n", + "epoch: 170, training loss: 0.560506, training acc: 0.713655, valid loss: 0.561554, valid acc: 0.712800\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.67it/s, accuracy=0.667, cost=0.464]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.55it/s, accuracy=0.529, cost=0.718]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.20it/s, accuracy=0.719, cost=0.587]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 171, pass acc: 0.712800, current acc: 0.712882\n", + "time taken: 107.6500129699707\n", + "epoch: 171, training loss: 0.560321, training acc: 0.713883, valid loss: 0.561372, valid acc: 0.712882\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.58it/s, accuracy=0.667, cost=0.463]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.22it/s, accuracy=0.529, cost=0.718]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.12it/s, accuracy=0.625, cost=0.565]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 172, pass acc: 0.712882, current acc: 0.713054\n", + "time taken: 107.72283983230591\n", + "epoch: 172, training loss: 0.560136, training acc: 0.714032, valid loss: 0.561190, valid acc: 0.713054\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.59it/s, accuracy=0.667, cost=0.463]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.60it/s, accuracy=0.529, cost=0.718]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.82it/s, accuracy=0.719, cost=0.588]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 173, pass acc: 0.713054, current acc: 0.713151\n", + "time taken: 107.68479204177856\n", + "epoch: 173, training loss: 0.559953, training acc: 0.714215, valid loss: 0.561010, valid acc: 0.713151\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.63it/s, accuracy=0.667, cost=0.462]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.16it/s, accuracy=0.529, cost=0.718]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:28, 188.80it/s, accuracy=0.719, cost=0.588]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 174, pass acc: 0.713151, current acc: 0.713300\n", + "time taken: 107.70716571807861\n", + "epoch: 174, training loss: 0.559771, training acc: 0.714338, valid loss: 0.560831, valid acc: 0.713300\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.50it/s, accuracy=0.667, cost=0.461]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.75it/s, accuracy=0.529, cost=0.718]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:25, 194.99it/s, accuracy=0.781, cost=0.479]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 175, pass acc: 0.713300, current acc: 0.713509\n", + "time taken: 107.80689263343811\n", + "epoch: 175, training loss: 0.559590, training acc: 0.714498, valid loss: 0.560653, valid acc: 0.713509\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.76it/s, accuracy=0.667, cost=0.461]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.52it/s, accuracy=0.529, cost=0.718]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.74it/s, accuracy=0.625, cost=0.564]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 176, pass acc: 0.713509, current acc: 0.713606\n", + "time taken: 107.61398911476135\n", + "epoch: 176, training loss: 0.559410, training acc: 0.714642, valid loss: 0.560475, valid acc: 0.713606\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.51it/s, accuracy=0.667, cost=0.46] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.25it/s, accuracy=0.529, cost=0.717]\n", + "train minibatch loop: 0%| | 17/16751 [00:00<01:42, 163.94it/s, accuracy=0.594, cost=0.656]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 177, pass acc: 0.713606, current acc: 0.713830\n", + "time taken: 107.75412154197693\n", + "epoch: 177, training loss: 0.559231, training acc: 0.714750, valid loss: 0.560299, valid acc: 0.713830\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.39it/s, accuracy=0.667, cost=0.46] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.60it/s, accuracy=0.529, cost=0.717]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:29, 185.95it/s, accuracy=0.719, cost=0.588]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 178, pass acc: 0.713830, current acc: 0.713972\n", + "time taken: 107.7749593257904\n", + "epoch: 178, training loss: 0.559053, training acc: 0.714890, valid loss: 0.560124, valid acc: 0.713972\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.68it/s, accuracy=0.667, cost=0.459]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.19it/s, accuracy=0.529, cost=0.717]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.10it/s, accuracy=0.719, cost=0.588]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 179, pass acc: 0.713972, current acc: 0.714114\n", + "time taken: 107.68057012557983\n", + "epoch: 179, training loss: 0.558876, training acc: 0.715032, valid loss: 0.559950, valid acc: 0.714114\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.62it/s, accuracy=0.667, cost=0.458]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.05it/s, accuracy=0.529, cost=0.717]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.79it/s, accuracy=0.625, cost=0.563]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 180, pass acc: 0.714114, current acc: 0.714338\n", + "time taken: 107.72129654884338\n", + "epoch: 180, training loss: 0.558700, training acc: 0.715174, valid loss: 0.559777, valid acc: 0.714338\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.57it/s, accuracy=0.667, cost=0.458]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.13it/s, accuracy=0.529, cost=0.717]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.87it/s, accuracy=0.719, cost=0.589]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 181, pass acc: 0.714338, current acc: 0.714435\n", + "time taken: 107.73836421966553\n", + "epoch: 181, training loss: 0.558526, training acc: 0.715299, valid loss: 0.559605, valid acc: 0.714435\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.67it/s, accuracy=0.667, cost=0.457]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.68it/s, accuracy=0.529, cost=0.717]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.97it/s, accuracy=0.719, cost=0.589]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 182, pass acc: 0.714435, current acc: 0.714532\n", + "time taken: 107.64005160331726\n", + "epoch: 182, training loss: 0.558352, training acc: 0.715495, valid loss: 0.559433, valid acc: 0.714532\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.57it/s, accuracy=0.667, cost=0.456]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.37it/s, accuracy=0.529, cost=0.717]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.02it/s, accuracy=0.625, cost=0.562]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 183, pass acc: 0.714532, current acc: 0.714629\n", + "time taken: 107.71373867988586\n", + "epoch: 183, training loss: 0.558179, training acc: 0.715586, valid loss: 0.559263, valid acc: 0.714629\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.52it/s, accuracy=0.667, cost=0.456]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 209.73it/s, accuracy=0.529, cost=0.716]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.37it/s, accuracy=0.719, cost=0.589]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 184, pass acc: 0.714629, current acc: 0.714800\n", + "time taken: 107.76271986961365\n", + "epoch: 184, training loss: 0.558007, training acc: 0.715717, valid loss: 0.559094, valid acc: 0.714800\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.79it/s, accuracy=0.667, cost=0.455]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.89it/s, accuracy=0.529, cost=0.716]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.16it/s, accuracy=0.719, cost=0.589]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 185, pass acc: 0.714800, current acc: 0.714987\n", + "time taken: 107.643625497818\n", + "epoch: 185, training loss: 0.557835, training acc: 0.715855, valid loss: 0.558925, valid acc: 0.714987\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.97it/s, accuracy=0.667, cost=0.454]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.73it/s, accuracy=0.529, cost=0.716]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.13it/s, accuracy=0.719, cost=0.589]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 186, pass acc: 0.714987, current acc: 0.715166\n", + "time taken: 107.49872827529907\n", + "epoch: 186, training loss: 0.557665, training acc: 0.715948, valid loss: 0.558758, valid acc: 0.715166\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.59it/s, accuracy=0.667, cost=0.454]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.55it/s, accuracy=0.529, cost=0.716]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:29, 186.74it/s, accuracy=0.719, cost=0.589]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 187, pass acc: 0.715166, current acc: 0.715278\n", + "time taken: 107.69055104255676\n", + "epoch: 187, training loss: 0.557496, training acc: 0.716066, valid loss: 0.558591, valid acc: 0.715278\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.67it/s, accuracy=0.667, cost=0.453]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.55it/s, accuracy=0.529, cost=0.716]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.61it/s, accuracy=0.719, cost=0.589]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 188, pass acc: 0.715278, current acc: 0.715457\n", + "time taken: 107.65347504615784\n", + "epoch: 188, training loss: 0.557328, training acc: 0.716217, valid loss: 0.558426, valid acc: 0.715457\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.69it/s, accuracy=0.667, cost=0.453]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.84it/s, accuracy=0.529, cost=0.716]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.04it/s, accuracy=0.719, cost=0.59] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 189, pass acc: 0.715457, current acc: 0.715599\n", + "time taken: 107.70959854125977\n", + "epoch: 189, training loss: 0.557160, training acc: 0.716331, valid loss: 0.558261, valid acc: 0.715599\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.81it/s, accuracy=0.667, cost=0.452]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 209.96it/s, accuracy=0.529, cost=0.716]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.87it/s, accuracy=0.719, cost=0.59] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 190, pass acc: 0.715599, current acc: 0.715815\n", + "time taken: 107.65304231643677\n", + "epoch: 190, training loss: 0.556994, training acc: 0.716452, valid loss: 0.558097, valid acc: 0.715815\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.92it/s, accuracy=0.667, cost=0.451]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.06it/s, accuracy=0.529, cost=0.715]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.67it/s, accuracy=0.719, cost=0.59] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 191, pass acc: 0.715815, current acc: 0.715897\n", + "time taken: 107.58271789550781\n", + "epoch: 191, training loss: 0.556828, training acc: 0.716586, valid loss: 0.557934, valid acc: 0.715897\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.70it/s, accuracy=0.667, cost=0.451]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.22it/s, accuracy=0.529, cost=0.715]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.79it/s, accuracy=0.719, cost=0.59] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 192, pass acc: 0.715897, current acc: 0.716024\n", + "time taken: 107.66935706138611\n", + "epoch: 192, training loss: 0.556664, training acc: 0.716687, valid loss: 0.557772, valid acc: 0.716024\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.56it/s, accuracy=0.667, cost=0.45] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.68it/s, accuracy=0.529, cost=0.715]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.34it/s, accuracy=0.719, cost=0.59] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 193, pass acc: 0.716024, current acc: 0.716151\n", + "time taken: 107.69031834602356\n", + "epoch: 193, training loss: 0.556500, training acc: 0.716799, valid loss: 0.557611, valid acc: 0.716151\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.80it/s, accuracy=0.667, cost=0.45] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.86it/s, accuracy=0.529, cost=0.715]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:29, 186.37it/s, accuracy=0.719, cost=0.59] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 194, pass acc: 0.716151, current acc: 0.716255\n", + "time taken: 107.65877270698547\n", + "epoch: 194, training loss: 0.556337, training acc: 0.716924, valid loss: 0.557450, valid acc: 0.716255\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.70it/s, accuracy=0.667, cost=0.449]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.15it/s, accuracy=0.529, cost=0.715]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:28, 189.56it/s, accuracy=0.719, cost=0.59] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 195, pass acc: 0.716255, current acc: 0.716367\n", + "time taken: 107.67427062988281\n", + "epoch: 195, training loss: 0.556175, training acc: 0.717045, valid loss: 0.557291, valid acc: 0.716367\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.68it/s, accuracy=0.667, cost=0.448]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.58it/s, accuracy=0.529, cost=0.715]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:29, 187.40it/s, accuracy=0.719, cost=0.59] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 196, pass acc: 0.716367, current acc: 0.716457\n", + "time taken: 107.69263124465942\n", + "epoch: 196, training loss: 0.556014, training acc: 0.717138, valid loss: 0.557132, valid acc: 0.716457\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.88it/s, accuracy=0.667, cost=0.448]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.39it/s, accuracy=0.529, cost=0.715]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.22it/s, accuracy=0.719, cost=0.591]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 197, pass acc: 0.716457, current acc: 0.716621\n", + "time taken: 107.57024312019348\n", + "epoch: 197, training loss: 0.555854, training acc: 0.717275, valid loss: 0.556975, valid acc: 0.716621\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.58it/s, accuracy=0.667, cost=0.447]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.47it/s, accuracy=0.529, cost=0.714]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.24it/s, accuracy=0.719, cost=0.591]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 198, pass acc: 0.716621, current acc: 0.716778\n", + "time taken: 107.6981589794159\n", + "epoch: 198, training loss: 0.555694, training acc: 0.717400, valid loss: 0.556818, valid acc: 0.716778\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.65it/s, accuracy=0.667, cost=0.447]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.29it/s, accuracy=0.529, cost=0.714]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.66it/s, accuracy=0.719, cost=0.591]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 199, pass acc: 0.716778, current acc: 0.716994\n", + "time taken: 107.68266582489014\n", + "epoch: 199, training loss: 0.555536, training acc: 0.717521, valid loss: 0.556662, valid acc: 0.716994\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.82it/s, accuracy=0.667, cost=0.446]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.78it/s, accuracy=0.529, cost=0.714]\n", + "train minibatch loop: 0%| | 17/16751 [00:00<01:39, 167.62it/s, accuracy=0.594, cost=0.66] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 200, pass acc: 0.716994, current acc: 0.717084\n", + "time taken: 107.56338691711426\n", + "epoch: 200, training loss: 0.555378, training acc: 0.717635, valid loss: 0.556506, valid acc: 0.717084\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.83it/s, accuracy=0.667, cost=0.445]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 212.27it/s, accuracy=0.529, cost=0.714]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.19it/s, accuracy=0.719, cost=0.591]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 201, pass acc: 0.717084, current acc: 0.717143\n", + "time taken: 107.50891160964966\n", + "epoch: 201, training loss: 0.555221, training acc: 0.717748, valid loss: 0.556352, valid acc: 0.717143\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 191.09it/s, accuracy=0.667, cost=0.445]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 212.20it/s, accuracy=0.588, cost=0.714]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.28it/s, accuracy=0.625, cost=0.558]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 202, pass acc: 0.717143, current acc: 0.717284\n", + "time taken: 107.39833521842957\n", + "epoch: 202, training loss: 0.555065, training acc: 0.717909, valid loss: 0.556198, valid acc: 0.717284\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 191.12it/s, accuracy=0.667, cost=0.444]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.85it/s, accuracy=0.588, cost=0.714]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.18it/s, accuracy=0.719, cost=0.591]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 203, pass acc: 0.717284, current acc: 0.717434\n", + "time taken: 107.41530537605286\n", + "epoch: 203, training loss: 0.554909, training acc: 0.718019, valid loss: 0.556045, valid acc: 0.717434\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 191.32it/s, accuracy=0.667, cost=0.444]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.40it/s, accuracy=0.588, cost=0.714]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.97it/s, accuracy=0.625, cost=0.558]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 204, pass acc: 0.717434, current acc: 0.717538\n", + "time taken: 107.36838912963867\n", + "epoch: 204, training loss: 0.554755, training acc: 0.718155, valid loss: 0.555893, valid acc: 0.717538\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 191.10it/s, accuracy=0.667, cost=0.443]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.99it/s, accuracy=0.588, cost=0.713]\n", + "train minibatch loop: 0%| | 18/16751 [00:00<01:39, 168.23it/s, accuracy=0.594, cost=0.66] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 205, pass acc: 0.717538, current acc: 0.717628\n", + "time taken: 107.41381239891052\n", + "epoch: 205, training loss: 0.554601, training acc: 0.718280, valid loss: 0.555742, valid acc: 0.717628\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 191.01it/s, accuracy=0.667, cost=0.443]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.77it/s, accuracy=0.588, cost=0.713]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.02it/s, accuracy=0.625, cost=0.558]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 206, pass acc: 0.717628, current acc: 0.717755\n", + "time taken: 107.47273874282837\n", + "epoch: 206, training loss: 0.554448, training acc: 0.718448, valid loss: 0.555592, valid acc: 0.717755\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 191.11it/s, accuracy=0.667, cost=0.442]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 212.17it/s, accuracy=0.588, cost=0.713]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.42it/s, accuracy=0.719, cost=0.592]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 207, pass acc: 0.717755, current acc: 0.717769\n", + "time taken: 107.3911509513855\n", + "epoch: 207, training loss: 0.554296, training acc: 0.718556, valid loss: 0.555442, valid acc: 0.717769\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.94it/s, accuracy=0.667, cost=0.441]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.37it/s, accuracy=0.588, cost=0.713]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.50it/s, accuracy=0.625, cost=0.557]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 208, pass acc: 0.717769, current acc: 0.717889\n", + "time taken: 107.54506540298462\n", + "epoch: 208, training loss: 0.554145, training acc: 0.718681, valid loss: 0.555293, valid acc: 0.717889\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 191.14it/s, accuracy=0.667, cost=0.441]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.32it/s, accuracy=0.588, cost=0.713]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.47it/s, accuracy=0.625, cost=0.557]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 209, pass acc: 0.717889, current acc: 0.717919\n", + "time taken: 107.45844602584839\n", + "epoch: 209, training loss: 0.553994, training acc: 0.718801, valid loss: 0.555145, valid acc: 0.717919\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 191.13it/s, accuracy=0.667, cost=0.44] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.84it/s, accuracy=0.588, cost=0.713]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.12it/s, accuracy=0.688, cost=0.592]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 210, pass acc: 0.717919, current acc: 0.718053\n", + "time taken: 107.41161370277405\n", + "epoch: 210, training loss: 0.553845, training acc: 0.718933, valid loss: 0.554998, valid acc: 0.718053\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 191.12it/s, accuracy=0.667, cost=0.44] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.71it/s, accuracy=0.588, cost=0.713]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.99it/s, accuracy=0.625, cost=0.557]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 211, pass acc: 0.718053, current acc: 0.718255\n", + "time taken: 107.42704796791077\n", + "epoch: 211, training loss: 0.553696, training acc: 0.719012, valid loss: 0.554851, valid acc: 0.718255\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 191.11it/s, accuracy=0.667, cost=0.439]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 212.04it/s, accuracy=0.588, cost=0.712]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.95it/s, accuracy=0.625, cost=0.556]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 212, pass acc: 0.718255, current acc: 0.718411\n", + "time taken: 107.40523910522461\n", + "epoch: 212, training loss: 0.553547, training acc: 0.719142, valid loss: 0.554705, valid acc: 0.718411\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 191.15it/s, accuracy=0.667, cost=0.439]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.59it/s, accuracy=0.588, cost=0.712]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.98it/s, accuracy=0.688, cost=0.592]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 213, pass acc: 0.718411, current acc: 0.718523\n", + "time taken: 107.4277594089508\n", + "epoch: 213, training loss: 0.553400, training acc: 0.719262, valid loss: 0.554560, valid acc: 0.718523\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 191.26it/s, accuracy=0.667, cost=0.438]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.50it/s, accuracy=0.588, cost=0.712]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.29it/s, accuracy=0.625, cost=0.556]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 214, pass acc: 0.718523, current acc: 0.718613\n", + "time taken: 107.39873170852661\n", + "epoch: 214, training loss: 0.553253, training acc: 0.719429, valid loss: 0.554416, valid acc: 0.718613\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.96it/s, accuracy=0.667, cost=0.438]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 212.01it/s, accuracy=0.588, cost=0.712]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.34it/s, accuracy=0.625, cost=0.556]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 215, pass acc: 0.718613, current acc: 0.718777\n", + "time taken: 107.47700953483582\n", + "epoch: 215, training loss: 0.553107, training acc: 0.719558, valid loss: 0.554272, valid acc: 0.718777\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 191.11it/s, accuracy=0.667, cost=0.437]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.95it/s, accuracy=0.588, cost=0.712]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.58it/s, accuracy=0.625, cost=0.556]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 216, pass acc: 0.718777, current acc: 0.718978\n", + "time taken: 107.40990018844604\n", + "epoch: 216, training loss: 0.552962, training acc: 0.719704, valid loss: 0.554129, valid acc: 0.718978\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 191.00it/s, accuracy=0.667, cost=0.436]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 212.12it/s, accuracy=0.588, cost=0.712]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.62it/s, accuracy=0.656, cost=0.593]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 217, pass acc: 0.718978, current acc: 0.719053\n", + "time taken: 107.44641876220703\n", + "epoch: 217, training loss: 0.552817, training acc: 0.719875, valid loss: 0.553987, valid acc: 0.719053\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.96it/s, accuracy=0.667, cost=0.436]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.53it/s, accuracy=0.588, cost=0.712]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.67it/s, accuracy=0.625, cost=0.555]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 218, pass acc: 0.719053, current acc: 0.719143\n", + "time taken: 107.51818037033081\n", + "epoch: 218, training loss: 0.552674, training acc: 0.719993, valid loss: 0.553845, valid acc: 0.719143\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 191.06it/s, accuracy=0.667, cost=0.435]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.01it/s, accuracy=0.588, cost=0.711]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.13it/s, accuracy=0.656, cost=0.593]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 219, pass acc: 0.719143, current acc: 0.719352\n", + "time taken: 107.49406743049622\n", + "epoch: 219, training loss: 0.552530, training acc: 0.720131, valid loss: 0.553704, valid acc: 0.719352\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.88it/s, accuracy=0.667, cost=0.435]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.53it/s, accuracy=0.588, cost=0.711]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.11it/s, accuracy=0.656, cost=0.593]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 220, pass acc: 0.719352, current acc: 0.719501\n", + "time taken: 107.55705761909485\n", + "epoch: 220, training loss: 0.552388, training acc: 0.720200, valid loss: 0.553564, valid acc: 0.719501\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.58it/s, accuracy=0.667, cost=0.434]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.46it/s, accuracy=0.588, cost=0.711]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.02it/s, accuracy=0.625, cost=0.555]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 221, pass acc: 0.719501, current acc: 0.719628\n", + "time taken: 107.70329570770264\n", + "epoch: 221, training loss: 0.552246, training acc: 0.720314, valid loss: 0.553425, valid acc: 0.719628\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.97it/s, accuracy=0.667, cost=0.434]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.69it/s, accuracy=0.588, cost=0.711]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.00it/s, accuracy=0.656, cost=0.555]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 222, pass acc: 0.719628, current acc: 0.719814\n", + "time taken: 107.49812531471252\n", + "epoch: 222, training loss: 0.552105, training acc: 0.720420, valid loss: 0.553286, valid acc: 0.719814\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.99it/s, accuracy=0.667, cost=0.433]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.25it/s, accuracy=0.588, cost=0.711]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.50it/s, accuracy=0.656, cost=0.593]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 223, pass acc: 0.719814, current acc: 0.719934\n", + "time taken: 107.53368020057678\n", + "epoch: 223, training loss: 0.551965, training acc: 0.720586, valid loss: 0.553148, valid acc: 0.719934\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.73it/s, accuracy=0.667, cost=0.433]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.58it/s, accuracy=0.588, cost=0.711]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.29it/s, accuracy=0.656, cost=0.593]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 224, pass acc: 0.719934, current acc: 0.720075\n", + "time taken: 107.62362575531006\n", + "epoch: 224, training loss: 0.551825, training acc: 0.720696, valid loss: 0.553011, valid acc: 0.720075\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.77it/s, accuracy=0.667, cost=0.432]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.70it/s, accuracy=0.588, cost=0.711]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.39it/s, accuracy=0.625, cost=0.554]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 225, pass acc: 0.720075, current acc: 0.720232\n", + "time taken: 107.59197902679443\n", + "epoch: 225, training loss: 0.551686, training acc: 0.720819, valid loss: 0.552874, valid acc: 0.720232\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.79it/s, accuracy=0.667, cost=0.432]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.84it/s, accuracy=0.588, cost=0.71] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.24it/s, accuracy=0.656, cost=0.594]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 226, pass acc: 0.720232, current acc: 0.720307\n", + "time taken: 107.5679440498352\n", + "epoch: 226, training loss: 0.551548, training acc: 0.720885, valid loss: 0.552738, valid acc: 0.720307\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.80it/s, accuracy=0.667, cost=0.431]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.70it/s, accuracy=0.588, cost=0.71] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.72it/s, accuracy=0.625, cost=0.554]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 227, pass acc: 0.720307, current acc: 0.720426\n", + "time taken: 107.57614254951477\n", + "epoch: 227, training loss: 0.551411, training acc: 0.720974, valid loss: 0.552603, valid acc: 0.720426\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.85it/s, accuracy=0.667, cost=0.431]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.27it/s, accuracy=0.588, cost=0.71] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.27it/s, accuracy=0.656, cost=0.594]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 228, pass acc: 0.720426, current acc: 0.720560\n", + "time taken: 107.60646486282349\n", + "epoch: 228, training loss: 0.551274, training acc: 0.721097, valid loss: 0.552468, valid acc: 0.720560\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.94it/s, accuracy=0.667, cost=0.43] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.65it/s, accuracy=0.588, cost=0.71] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:25, 195.07it/s, accuracy=0.625, cost=0.554]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 229, pass acc: 0.720560, current acc: 0.720762\n", + "time taken: 107.51642370223999\n", + "epoch: 229, training loss: 0.551137, training acc: 0.721260, valid loss: 0.552334, valid acc: 0.720762\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.87it/s, accuracy=0.667, cost=0.43] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.43it/s, accuracy=0.588, cost=0.71] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.54it/s, accuracy=0.625, cost=0.554]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 230, pass acc: 0.720762, current acc: 0.720896\n", + "time taken: 107.56893658638\n", + "epoch: 230, training loss: 0.551002, training acc: 0.721390, valid loss: 0.552201, valid acc: 0.720896\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.80it/s, accuracy=0.667, cost=0.429]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.21it/s, accuracy=0.588, cost=0.71] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.72it/s, accuracy=0.656, cost=0.594]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 231, pass acc: 0.720896, current acc: 0.721075\n", + "time taken: 107.62152338027954\n", + "epoch: 231, training loss: 0.550867, training acc: 0.721521, valid loss: 0.552068, valid acc: 0.721075\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.46it/s, accuracy=0.667, cost=0.429]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.32it/s, accuracy=0.588, cost=0.709]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.62it/s, accuracy=0.625, cost=0.553]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 232, pass acc: 0.721075, current acc: 0.721128\n", + "time taken: 107.7709801197052\n", + "epoch: 232, training loss: 0.550733, training acc: 0.721610, valid loss: 0.551936, valid acc: 0.721128\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.77it/s, accuracy=0.667, cost=0.428]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.08it/s, accuracy=0.588, cost=0.709]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.21it/s, accuracy=0.625, cost=0.553]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 233, pass acc: 0.721128, current acc: 0.721202\n", + "time taken: 107.64918971061707\n", + "epoch: 233, training loss: 0.550599, training acc: 0.721747, valid loss: 0.551804, valid acc: 0.721202\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.62it/s, accuracy=0.667, cost=0.428]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.59it/s, accuracy=0.588, cost=0.709]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:28, 189.66it/s, accuracy=0.656, cost=0.594]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 234, pass acc: 0.721202, current acc: 0.721389\n", + "time taken: 107.66914916038513\n", + "epoch: 234, training loss: 0.550466, training acc: 0.721903, valid loss: 0.551674, valid acc: 0.721389\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.66it/s, accuracy=0.667, cost=0.427]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.40it/s, accuracy=0.588, cost=0.709]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.61it/s, accuracy=0.656, cost=0.594]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 235, pass acc: 0.721389, current acc: 0.721456\n", + "time taken: 107.67078232765198\n", + "epoch: 235, training loss: 0.550334, training acc: 0.722028, valid loss: 0.551543, valid acc: 0.721456\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.54it/s, accuracy=0.667, cost=0.427]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 212.07it/s, accuracy=0.588, cost=0.709]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:25, 195.04it/s, accuracy=0.625, cost=0.553]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 236, pass acc: 0.721456, current acc: 0.721516\n", + "time taken: 107.66136884689331\n", + "epoch: 236, training loss: 0.550202, training acc: 0.722116, valid loss: 0.551414, valid acc: 0.721516\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.85it/s, accuracy=0.667, cost=0.426]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.61it/s, accuracy=0.588, cost=0.709]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.85it/s, accuracy=0.625, cost=0.553]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 237, pass acc: 0.721516, current acc: 0.721643\n", + "time taken: 107.56287956237793\n", + "epoch: 237, training loss: 0.550071, training acc: 0.722222, valid loss: 0.551285, valid acc: 0.721643\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 192.08it/s, accuracy=0.667, cost=0.426]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.38it/s, accuracy=0.588, cost=0.709]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.68it/s, accuracy=0.625, cost=0.553]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 238, pass acc: 0.721643, current acc: 0.721792\n", + "time taken: 107.59082317352295\n", + "epoch: 238, training loss: 0.549940, training acc: 0.722332, valid loss: 0.551157, valid acc: 0.721792\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.81it/s, accuracy=0.667, cost=0.425]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.73it/s, accuracy=0.588, cost=0.708]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:30, 183.95it/s, accuracy=0.719, cost=0.546]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 239, pass acc: 0.721792, current acc: 0.721807\n", + "time taken: 107.56791663169861\n", + "epoch: 239, training loss: 0.549810, training acc: 0.722405, valid loss: 0.551029, valid acc: 0.721807\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.74it/s, accuracy=0.667, cost=0.425]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.50it/s, accuracy=0.588, cost=0.708]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:25, 194.66it/s, accuracy=0.625, cost=0.552]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 240, pass acc: 0.721807, current acc: 0.721837\n", + "time taken: 107.6245014667511\n", + "epoch: 240, training loss: 0.549681, training acc: 0.722512, valid loss: 0.550902, valid acc: 0.721837\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.68it/s, accuracy=0.667, cost=0.424]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.81it/s, accuracy=0.588, cost=0.708]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.26it/s, accuracy=0.625, cost=0.552]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 241, pass acc: 0.721837, current acc: 0.721978\n", + "time taken: 107.62227153778076\n", + "epoch: 241, training loss: 0.549552, training acc: 0.722646, valid loss: 0.550775, valid acc: 0.721978\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.76it/s, accuracy=0.667, cost=0.424]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.57it/s, accuracy=0.588, cost=0.708]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.21it/s, accuracy=0.656, cost=0.595]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 242, pass acc: 0.721978, current acc: 0.722187\n", + "time taken: 107.62856125831604\n", + "epoch: 242, training loss: 0.549424, training acc: 0.722786, valid loss: 0.550649, valid acc: 0.722187\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.94it/s, accuracy=0.667, cost=0.423]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.03it/s, accuracy=0.588, cost=0.708]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.19it/s, accuracy=0.656, cost=0.595]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 243, pass acc: 0.722187, current acc: 0.722247\n", + "time taken: 107.5746054649353\n", + "epoch: 243, training loss: 0.549297, training acc: 0.722872, valid loss: 0.550524, valid acc: 0.722247\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.94it/s, accuracy=0.667, cost=0.423]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.68it/s, accuracy=0.588, cost=0.708]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:28, 189.94it/s, accuracy=0.656, cost=0.595]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 244, pass acc: 0.722247, current acc: 0.722284\n", + "time taken: 107.51730728149414\n", + "epoch: 244, training loss: 0.549170, training acc: 0.722978, valid loss: 0.550399, valid acc: 0.722284\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.90it/s, accuracy=0.667, cost=0.422]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.52it/s, accuracy=0.588, cost=0.708]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.92it/s, accuracy=0.656, cost=0.595]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 245, pass acc: 0.722284, current acc: 0.722456\n", + "time taken: 107.55030274391174\n", + "epoch: 245, training loss: 0.549043, training acc: 0.723056, valid loss: 0.550275, valid acc: 0.722456\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.79it/s, accuracy=0.667, cost=0.422]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.18it/s, accuracy=0.588, cost=0.707]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.30it/s, accuracy=0.656, cost=0.595]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 246, pass acc: 0.722456, current acc: 0.722531\n", + "time taken: 107.5848696231842\n", + "epoch: 246, training loss: 0.548918, training acc: 0.723136, valid loss: 0.550151, valid acc: 0.722531\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 191.01it/s, accuracy=0.667, cost=0.421]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.72it/s, accuracy=0.588, cost=0.707]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.40it/s, accuracy=0.625, cost=0.551]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 247, pass acc: 0.722531, current acc: 0.722598\n", + "time taken: 107.48114824295044\n", + "epoch: 247, training loss: 0.548792, training acc: 0.723230, valid loss: 0.550028, valid acc: 0.722598\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.81it/s, accuracy=0.667, cost=0.421]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.30it/s, accuracy=0.588, cost=0.707]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.79it/s, accuracy=0.625, cost=0.551]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 248, pass acc: 0.722598, current acc: 0.722710\n", + "time taken: 107.61021685600281\n", + "epoch: 248, training loss: 0.548668, training acc: 0.723327, valid loss: 0.549905, valid acc: 0.722710\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.90it/s, accuracy=0.667, cost=0.421]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.83it/s, accuracy=0.588, cost=0.707]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.90it/s, accuracy=0.656, cost=0.596]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 249, pass acc: 0.722710, current acc: 0.722740\n", + "time taken: 107.51955556869507\n", + "epoch: 249, training loss: 0.548544, training acc: 0.723450, valid loss: 0.549784, valid acc: 0.722740\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.77it/s, accuracy=0.667, cost=0.42] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.27it/s, accuracy=0.588, cost=0.707]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.27it/s, accuracy=0.625, cost=0.551]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 250, pass acc: 0.722740, current acc: 0.722822\n", + "time taken: 107.6344747543335\n", + "epoch: 250, training loss: 0.548420, training acc: 0.723588, valid loss: 0.549662, valid acc: 0.722822\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.53it/s, accuracy=0.667, cost=0.42] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.77it/s, accuracy=0.588, cost=0.707]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.53it/s, accuracy=0.656, cost=0.596]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 251, pass acc: 0.722822, current acc: 0.722851\n", + "time taken: 107.69550681114197\n", + "epoch: 251, training loss: 0.548297, training acc: 0.723681, valid loss: 0.549541, valid acc: 0.722851\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 193.24it/s, accuracy=0.667, cost=0.419]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.33it/s, accuracy=0.588, cost=0.706]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.35it/s, accuracy=0.625, cost=0.551]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 252, pass acc: 0.722851, current acc: 0.722956\n", + "time taken: 107.68073749542236\n", + "epoch: 252, training loss: 0.548175, training acc: 0.723745, valid loss: 0.549421, valid acc: 0.722956\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.94it/s, accuracy=0.667, cost=0.419]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.56it/s, accuracy=0.588, cost=0.706]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.78it/s, accuracy=0.719, cost=0.545]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 253, pass acc: 0.722956, current acc: 0.723128\n", + "time taken: 107.52895927429199\n", + "epoch: 253, training loss: 0.548053, training acc: 0.723888, valid loss: 0.549301, valid acc: 0.723128\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.80it/s, accuracy=0.667, cost=0.418]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.78it/s, accuracy=0.588, cost=0.706]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.27it/s, accuracy=0.656, cost=0.596]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 254, pass acc: 0.723128, current acc: 0.723187\n", + "time taken: 107.56977033615112\n", + "epoch: 254, training loss: 0.547932, training acc: 0.724041, valid loss: 0.549182, valid acc: 0.723187\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.80it/s, accuracy=0.667, cost=0.418]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.50it/s, accuracy=0.588, cost=0.706]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.62it/s, accuracy=0.625, cost=0.551]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 255, pass acc: 0.723187, current acc: 0.723254\n", + "time taken: 107.59563302993774\n", + "epoch: 255, training loss: 0.547811, training acc: 0.724138, valid loss: 0.549063, valid acc: 0.723254\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.99it/s, accuracy=0.667, cost=0.417]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 212.76it/s, accuracy=0.588, cost=0.706]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.03it/s, accuracy=0.625, cost=0.55] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 256, pass acc: 0.723254, current acc: 0.723404\n", + "time taken: 107.391676902771\n", + "epoch: 256, training loss: 0.547691, training acc: 0.724217, valid loss: 0.548945, valid acc: 0.723404\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 191.11it/s, accuracy=0.667, cost=0.417]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.09it/s, accuracy=0.588, cost=0.706]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.69it/s, accuracy=0.656, cost=0.596]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 257, pass acc: 0.723404, current acc: 0.723531\n", + "time taken: 107.49431014060974\n", + "epoch: 257, training loss: 0.547572, training acc: 0.724338, valid loss: 0.548828, valid acc: 0.723531\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 191.20it/s, accuracy=0.667, cost=0.417]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.88it/s, accuracy=0.588, cost=0.706]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.85it/s, accuracy=0.625, cost=0.55] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 258, pass acc: 0.723531, current acc: 0.723628\n", + "time taken: 107.37835216522217\n", + "epoch: 258, training loss: 0.547453, training acc: 0.724433, valid loss: 0.548711, valid acc: 0.723628\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.93it/s, accuracy=0.667, cost=0.416]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.72it/s, accuracy=0.588, cost=0.705]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.43it/s, accuracy=0.656, cost=0.596]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 259, pass acc: 0.723628, current acc: 0.723643\n", + "time taken: 107.51334738731384\n", + "epoch: 259, training loss: 0.547334, training acc: 0.724594, valid loss: 0.548594, valid acc: 0.723643\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 191.07it/s, accuracy=0.667, cost=0.416]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.90it/s, accuracy=0.588, cost=0.705]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.07it/s, accuracy=0.656, cost=0.596]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 260, pass acc: 0.723643, current acc: 0.723710\n", + "time taken: 107.43742418289185\n", + "epoch: 260, training loss: 0.547216, training acc: 0.724692, valid loss: 0.548478, valid acc: 0.723710\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 191.10it/s, accuracy=0.667, cost=0.415]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.70it/s, accuracy=0.588, cost=0.705]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.86it/s, accuracy=0.656, cost=0.597]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 261, pass acc: 0.723710, current acc: 0.723814\n", + "time taken: 107.44021248817444\n", + "epoch: 261, training loss: 0.547098, training acc: 0.724776, valid loss: 0.548363, valid acc: 0.723814\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.80it/s, accuracy=0.667, cost=0.415]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.02it/s, accuracy=0.588, cost=0.705]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.32it/s, accuracy=0.625, cost=0.55] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 262, pass acc: 0.723814, current acc: 0.723926\n", + "time taken: 107.64266276359558\n", + "epoch: 262, training loss: 0.546981, training acc: 0.724885, valid loss: 0.548248, valid acc: 0.723926\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.66it/s, accuracy=0.667, cost=0.414]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 212.38it/s, accuracy=0.588, cost=0.705]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.52it/s, accuracy=0.625, cost=0.55] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 263, pass acc: 0.723926, current acc: 0.724351\n", + "time taken: 107.57905793190002\n", + "epoch: 263, training loss: 0.546865, training acc: 0.724982, valid loss: 0.548133, valid acc: 0.724351\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.92it/s, accuracy=0.667, cost=0.414]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.65it/s, accuracy=0.588, cost=0.705]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.29it/s, accuracy=0.656, cost=0.597]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 264, pass acc: 0.724351, current acc: 0.724441\n", + "time taken: 107.52903699874878\n", + "epoch: 264, training loss: 0.546749, training acc: 0.725060, valid loss: 0.548019, valid acc: 0.724441\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.93it/s, accuracy=0.667, cost=0.414]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.85it/s, accuracy=0.588, cost=0.704]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.26it/s, accuracy=0.656, cost=0.597]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 265, pass acc: 0.724441, current acc: 0.724546\n", + "time taken: 107.50232434272766\n", + "epoch: 265, training loss: 0.546634, training acc: 0.725166, valid loss: 0.547906, valid acc: 0.724546\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 191.06it/s, accuracy=0.667, cost=0.413]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.27it/s, accuracy=0.588, cost=0.704]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.27it/s, accuracy=0.656, cost=0.597]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 266, pass acc: 0.724546, current acc: 0.724620\n", + "time taken: 107.49893999099731\n", + "epoch: 266, training loss: 0.546519, training acc: 0.725312, valid loss: 0.547793, valid acc: 0.724620\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.95it/s, accuracy=0.667, cost=0.413]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.26it/s, accuracy=0.588, cost=0.704]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.67it/s, accuracy=0.625, cost=0.549]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 267, pass acc: 0.724620, current acc: 0.724687\n", + "time taken: 107.54972577095032\n", + "epoch: 267, training loss: 0.546404, training acc: 0.725418, valid loss: 0.547680, valid acc: 0.724687\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.99it/s, accuracy=0.667, cost=0.412]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 212.02it/s, accuracy=0.588, cost=0.704]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:30, 185.16it/s, accuracy=0.594, cost=0.667]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 268, pass acc: 0.724687, current acc: 0.724851\n", + "time taken: 107.45937490463257\n", + "epoch: 268, training loss: 0.546290, training acc: 0.725497, valid loss: 0.547568, valid acc: 0.724851\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.81it/s, accuracy=0.667, cost=0.412]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.98it/s, accuracy=0.588, cost=0.704]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.51it/s, accuracy=0.625, cost=0.549]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 269, pass acc: 0.724851, current acc: 0.724963\n", + "time taken: 107.5447187423706\n", + "epoch: 269, training loss: 0.546177, training acc: 0.725620, valid loss: 0.547457, valid acc: 0.724963\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.92it/s, accuracy=0.667, cost=0.411]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.91it/s, accuracy=0.588, cost=0.704]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.40it/s, accuracy=0.719, cost=0.544]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 270, pass acc: 0.724963, current acc: 0.725105\n", + "time taken: 107.50507664680481\n", + "epoch: 270, training loss: 0.546064, training acc: 0.725694, valid loss: 0.547346, valid acc: 0.725105\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.73it/s, accuracy=0.667, cost=0.411]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.52it/s, accuracy=0.588, cost=0.704]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.01it/s, accuracy=0.625, cost=0.549]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 271, pass acc: 0.725105, current acc: 0.725232\n", + "time taken: 107.62100458145142\n", + "epoch: 271, training loss: 0.545951, training acc: 0.725747, valid loss: 0.547235, valid acc: 0.725232\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.67it/s, accuracy=0.667, cost=0.411]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.20it/s, accuracy=0.588, cost=0.703]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.72it/s, accuracy=0.656, cost=0.597]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 272, pass acc: 0.725232, current acc: 0.725351\n", + "time taken: 107.68605375289917\n", + "epoch: 272, training loss: 0.545839, training acc: 0.725853, valid loss: 0.547125, valid acc: 0.725351\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 191.03it/s, accuracy=0.667, cost=0.41] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.97it/s, accuracy=0.588, cost=0.703]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:25, 194.60it/s, accuracy=0.656, cost=0.597]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 273, pass acc: 0.725351, current acc: 0.725448\n", + "time taken: 107.4482364654541\n", + "epoch: 273, training loss: 0.545728, training acc: 0.725948, valid loss: 0.547015, valid acc: 0.725448\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.64it/s, accuracy=0.667, cost=0.41] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.99it/s, accuracy=0.588, cost=0.703]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.38it/s, accuracy=0.625, cost=0.549]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 274, pass acc: 0.725448, current acc: 0.725560\n", + "time taken: 107.6266016960144\n", + "epoch: 274, training loss: 0.545617, training acc: 0.726103, valid loss: 0.546906, valid acc: 0.725560\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.67it/s, accuracy=0.667, cost=0.409]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.68it/s, accuracy=0.588, cost=0.703]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:30, 184.58it/s, accuracy=0.656, cost=0.598]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 275, pass acc: 0.725560, current acc: 0.725643\n", + "time taken: 107.6396963596344\n", + "epoch: 275, training loss: 0.545506, training acc: 0.726192, valid loss: 0.546798, valid acc: 0.725643\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 191.04it/s, accuracy=0.667, cost=0.409]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.25it/s, accuracy=0.588, cost=0.703]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:25, 194.94it/s, accuracy=0.625, cost=0.548]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 276, pass acc: 0.725643, current acc: 0.725762\n", + "time taken: 107.51140713691711\n", + "epoch: 276, training loss: 0.545396, training acc: 0.726331, valid loss: 0.546689, valid acc: 0.725762\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 191.12it/s, accuracy=0.667, cost=0.409]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.86it/s, accuracy=0.588, cost=0.703]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.46it/s, accuracy=0.656, cost=0.598]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 277, pass acc: 0.725762, current acc: 0.725866\n", + "time taken: 107.41480302810669\n", + "epoch: 277, training loss: 0.545286, training acc: 0.726422, valid loss: 0.546582, valid acc: 0.725866\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.93it/s, accuracy=0.667, cost=0.408]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.55it/s, accuracy=0.588, cost=0.702]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.28it/s, accuracy=0.656, cost=0.548]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 278, pass acc: 0.725866, current acc: 0.725926\n", + "time taken: 107.53371977806091\n", + "epoch: 278, training loss: 0.545177, training acc: 0.726491, valid loss: 0.546474, valid acc: 0.725926\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.90it/s, accuracy=0.667, cost=0.408]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.84it/s, accuracy=0.588, cost=0.702]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.88it/s, accuracy=0.656, cost=0.598]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 279, pass acc: 0.725926, current acc: 0.725978\n", + "time taken: 107.51607656478882\n", + "epoch: 279, training loss: 0.545068, training acc: 0.726577, valid loss: 0.546367, valid acc: 0.725978\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 191.19it/s, accuracy=0.667, cost=0.408]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.95it/s, accuracy=0.588, cost=0.702]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.14it/s, accuracy=0.656, cost=0.548]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 280, pass acc: 0.725978, current acc: 0.726068\n", + "time taken: 107.37685298919678\n", + "epoch: 280, training loss: 0.544960, training acc: 0.726623, valid loss: 0.546261, valid acc: 0.726068\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.92it/s, accuracy=0.667, cost=0.407]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.11it/s, accuracy=0.588, cost=0.702]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.42it/s, accuracy=0.688, cost=0.543]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 281, pass acc: 0.726068, current acc: 0.726210\n", + "time taken: 107.57996535301208\n", + "epoch: 281, training loss: 0.544852, training acc: 0.726655, valid loss: 0.546155, valid acc: 0.726210\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.91it/s, accuracy=0.667, cost=0.407]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.69it/s, accuracy=0.588, cost=0.702]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:25, 195.22it/s, accuracy=0.656, cost=0.598]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 282, pass acc: 0.726210, current acc: 0.726277\n", + "time taken: 107.52830004692078\n", + "epoch: 282, training loss: 0.544745, training acc: 0.726719, valid loss: 0.546050, valid acc: 0.726277\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.60it/s, accuracy=0.667, cost=0.406]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.81it/s, accuracy=0.588, cost=0.702]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.77it/s, accuracy=0.656, cost=0.548]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 283, pass acc: 0.726277, current acc: 0.726366\n", + "time taken: 107.66009879112244\n", + "epoch: 283, training loss: 0.544638, training acc: 0.726808, valid loss: 0.545945, valid acc: 0.726366\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.71it/s, accuracy=0.667, cost=0.406]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.29it/s, accuracy=0.588, cost=0.701]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.31it/s, accuracy=0.656, cost=0.548]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 284, pass acc: 0.726366, current acc: 0.726456\n", + "time taken: 107.65867567062378\n", + "epoch: 284, training loss: 0.544531, training acc: 0.726885, valid loss: 0.545840, valid acc: 0.726456\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.47it/s, accuracy=0.667, cost=0.406]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.38it/s, accuracy=0.588, cost=0.701]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.39it/s, accuracy=0.656, cost=0.548]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 285, pass acc: 0.726456, current acc: 0.726501\n", + "time taken: 107.76000905036926\n", + "epoch: 285, training loss: 0.544425, training acc: 0.726970, valid loss: 0.545736, valid acc: 0.726501\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.61it/s, accuracy=0.667, cost=0.405]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.19it/s, accuracy=0.588, cost=0.701]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.34it/s, accuracy=0.656, cost=0.548]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 286, pass acc: 0.726501, current acc: 0.726553\n", + "time taken: 107.71416282653809\n", + "epoch: 286, training loss: 0.544320, training acc: 0.727049, valid loss: 0.545632, valid acc: 0.726553\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.73it/s, accuracy=0.667, cost=0.405]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 212.00it/s, accuracy=0.588, cost=0.701]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:25, 194.67it/s, accuracy=0.656, cost=0.598]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 287, pass acc: 0.726553, current acc: 0.726650\n", + "time taken: 107.65807867050171\n", + "epoch: 287, training loss: 0.544215, training acc: 0.727159, valid loss: 0.545529, valid acc: 0.726650\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.65it/s, accuracy=0.667, cost=0.404]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.41it/s, accuracy=0.588, cost=0.701]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.94it/s, accuracy=0.656, cost=0.547]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 288, pass acc: 0.726650, current acc: 0.726769\n", + "time taken: 107.67429637908936\n", + "epoch: 288, training loss: 0.544110, training acc: 0.727245, valid loss: 0.545426, valid acc: 0.726769\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.72it/s, accuracy=0.667, cost=0.404]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.32it/s, accuracy=0.588, cost=0.701]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.46it/s, accuracy=0.656, cost=0.547]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 289, pass acc: 0.726769, current acc: 0.726822\n", + "time taken: 107.65183806419373\n", + "epoch: 289, training loss: 0.544006, training acc: 0.727342, valid loss: 0.545324, valid acc: 0.726822\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.58it/s, accuracy=0.667, cost=0.404]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.87it/s, accuracy=0.588, cost=0.701]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:31, 183.62it/s, accuracy=0.688, cost=0.542]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 290, pass acc: 0.726822, current acc: 0.726844\n", + "time taken: 107.75516629219055\n", + "epoch: 290, training loss: 0.543902, training acc: 0.727400, valid loss: 0.545221, valid acc: 0.726844\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.69it/s, accuracy=0.667, cost=0.403]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.06it/s, accuracy=0.588, cost=0.7] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.49it/s, accuracy=0.656, cost=0.599]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 291, pass acc: 0.726844, current acc: 0.726911\n", + "time taken: 107.68788576126099\n", + "epoch: 291, training loss: 0.543798, training acc: 0.727483, valid loss: 0.545120, valid acc: 0.726911\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.85it/s, accuracy=0.667, cost=0.403]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.19it/s, accuracy=0.588, cost=0.7] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.96it/s, accuracy=0.688, cost=0.547]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 292, pass acc: 0.726911, current acc: 0.727053\n", + "time taken: 107.6039662361145\n", + "epoch: 292, training loss: 0.543695, training acc: 0.727547, valid loss: 0.545019, valid acc: 0.727053\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.78it/s, accuracy=0.667, cost=0.403]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.35it/s, accuracy=0.588, cost=0.7] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.17it/s, accuracy=0.656, cost=0.599]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 293, pass acc: 0.727053, current acc: 0.727113\n", + "time taken: 107.6213812828064\n", + "epoch: 293, training loss: 0.543593, training acc: 0.727638, valid loss: 0.544918, valid acc: 0.727113\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.78it/s, accuracy=0.667, cost=0.402]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.45it/s, accuracy=0.588, cost=0.7] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.33it/s, accuracy=0.656, cost=0.599]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "time taken: 107.6103036403656\n", + "epoch: 294, training loss: 0.543491, training acc: 0.727733, valid loss: 0.544818, valid acc: 0.727083\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.85it/s, accuracy=0.667, cost=0.402]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.06it/s, accuracy=0.647, cost=0.7] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.74it/s, accuracy=0.656, cost=0.599]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 295, pass acc: 0.727113, current acc: 0.727119\n", + "time taken: 107.61555242538452\n", + "epoch: 295, training loss: 0.543389, training acc: 0.727834, valid loss: 0.544718, valid acc: 0.727119\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.71it/s, accuracy=0.667, cost=0.402]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.90it/s, accuracy=0.647, cost=0.7] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.81it/s, accuracy=0.656, cost=0.599]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 296, pass acc: 0.727119, current acc: 0.727171\n", + "time taken: 107.69703197479248\n", + "epoch: 296, training loss: 0.543287, training acc: 0.727916, valid loss: 0.544618, valid acc: 0.727171\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.82it/s, accuracy=0.667, cost=0.401]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.17it/s, accuracy=0.647, cost=0.699]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:28, 189.41it/s, accuracy=0.656, cost=0.599]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 297, pass acc: 0.727171, current acc: 0.727224\n", + "time taken: 107.61816334724426\n", + "epoch: 297, training loss: 0.543186, training acc: 0.727983, valid loss: 0.544519, valid acc: 0.727224\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.30it/s, accuracy=0.667, cost=0.401]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.89it/s, accuracy=0.647, cost=0.699]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.14it/s, accuracy=0.656, cost=0.599]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 298, pass acc: 0.727224, current acc: 0.727306\n", + "time taken: 107.88475036621094\n", + "epoch: 298, training loss: 0.543086, training acc: 0.728075, valid loss: 0.544420, valid acc: 0.727306\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.23it/s, accuracy=0.667, cost=0.401]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.73it/s, accuracy=0.647, cost=0.699]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.95it/s, accuracy=0.688, cost=0.546]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 299, pass acc: 0.727306, current acc: 0.727425\n", + "time taken: 107.92917490005493\n", + "epoch: 299, training loss: 0.542986, training acc: 0.728157, valid loss: 0.544322, valid acc: 0.727425\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.34it/s, accuracy=0.667, cost=0.4] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.50it/s, accuracy=0.647, cost=0.699]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.58it/s, accuracy=0.656, cost=0.599]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 300, pass acc: 0.727425, current acc: 0.727485\n", + "time taken: 107.90094494819641\n", + "epoch: 300, training loss: 0.542886, training acc: 0.728261, valid loss: 0.544224, valid acc: 0.727485\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.21it/s, accuracy=0.667, cost=0.4] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.46it/s, accuracy=0.647, cost=0.699]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.04it/s, accuracy=0.688, cost=0.546]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 301, pass acc: 0.727485, current acc: 0.727522\n", + "time taken: 107.968505859375\n", + "epoch: 301, training loss: 0.542787, training acc: 0.728301, valid loss: 0.544126, valid acc: 0.727522\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.51it/s, accuracy=0.667, cost=0.4] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.49it/s, accuracy=0.647, cost=0.699]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.70it/s, accuracy=0.656, cost=0.599]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 302, pass acc: 0.727522, current acc: 0.727649\n", + "time taken: 107.75833296775818\n", + "epoch: 302, training loss: 0.542688, training acc: 0.728317, valid loss: 0.544029, valid acc: 0.727649\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.38it/s, accuracy=0.667, cost=0.399]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.16it/s, accuracy=0.647, cost=0.698]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.90it/s, accuracy=0.688, cost=0.546]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 303, pass acc: 0.727649, current acc: 0.727657\n", + "time taken: 107.82089495658875\n", + "epoch: 303, training loss: 0.542589, training acc: 0.728390, valid loss: 0.543932, valid acc: 0.727657\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.60it/s, accuracy=0.667, cost=0.399]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.05it/s, accuracy=0.647, cost=0.698]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.78it/s, accuracy=0.656, cost=0.599]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 304, pass acc: 0.727657, current acc: 0.727813\n", + "time taken: 107.73215818405151\n", + "epoch: 304, training loss: 0.542491, training acc: 0.728472, valid loss: 0.543836, valid acc: 0.727813\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.41it/s, accuracy=0.667, cost=0.399]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.87it/s, accuracy=0.647, cost=0.698]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.42it/s, accuracy=0.688, cost=0.546]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 305, pass acc: 0.727813, current acc: 0.727940\n", + "time taken: 107.83611345291138\n", + "epoch: 305, training loss: 0.542393, training acc: 0.728530, valid loss: 0.543740, valid acc: 0.727940\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.50it/s, accuracy=0.667, cost=0.398]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.70it/s, accuracy=0.647, cost=0.698]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:28, 189.71it/s, accuracy=0.656, cost=0.6] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 306, pass acc: 0.727940, current acc: 0.728022\n", + "time taken: 107.81031322479248\n", + "epoch: 306, training loss: 0.542296, training acc: 0.728631, valid loss: 0.543644, valid acc: 0.728022\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.34it/s, accuracy=0.667, cost=0.398]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.91it/s, accuracy=0.647, cost=0.698]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.18it/s, accuracy=0.656, cost=0.6] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 307, pass acc: 0.728022, current acc: 0.728194\n", + "time taken: 107.86465096473694\n", + "epoch: 307, training loss: 0.542199, training acc: 0.728704, valid loss: 0.543549, valid acc: 0.728194\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.17it/s, accuracy=0.667, cost=0.398]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.32it/s, accuracy=0.647, cost=0.698]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:25, 194.73it/s, accuracy=0.688, cost=0.546]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 308, pass acc: 0.728194, current acc: 0.728313\n", + "time taken: 107.93775606155396\n", + "epoch: 308, training loss: 0.542102, training acc: 0.728788, valid loss: 0.543454, valid acc: 0.728313\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.51it/s, accuracy=0.667, cost=0.397]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.60it/s, accuracy=0.647, cost=0.698]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.05it/s, accuracy=0.656, cost=0.6] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 309, pass acc: 0.728313, current acc: 0.728448\n", + "time taken: 107.72343516349792\n", + "epoch: 309, training loss: 0.542006, training acc: 0.728918, valid loss: 0.543360, valid acc: 0.728448\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.65it/s, accuracy=0.667, cost=0.397]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.97it/s, accuracy=0.647, cost=0.697]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:25, 195.00it/s, accuracy=0.688, cost=0.546]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 310, pass acc: 0.728448, current acc: 0.728515\n", + "time taken: 107.7146863937378\n", + "epoch: 310, training loss: 0.541910, training acc: 0.728995, valid loss: 0.543265, valid acc: 0.728515\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.48it/s, accuracy=0.667, cost=0.397]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 207.39it/s, accuracy=0.647, cost=0.697]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.00it/s, accuracy=0.656, cost=0.6] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 311, pass acc: 0.728515, current acc: 0.728634\n", + "time taken: 107.7980945110321\n", + "epoch: 311, training loss: 0.541814, training acc: 0.729064, valid loss: 0.543172, valid acc: 0.728634\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.62it/s, accuracy=0.667, cost=0.396]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.23it/s, accuracy=0.647, cost=0.697]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:25, 195.18it/s, accuracy=0.688, cost=0.546]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 312, pass acc: 0.728634, current acc: 0.728679\n", + "time taken: 107.7034068107605\n", + "epoch: 312, training loss: 0.541719, training acc: 0.729146, valid loss: 0.543078, valid acc: 0.728679\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.44it/s, accuracy=0.667, cost=0.396]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.78it/s, accuracy=0.647, cost=0.697]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.10it/s, accuracy=0.656, cost=0.6] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 313, pass acc: 0.728679, current acc: 0.728694\n", + "time taken: 107.82958602905273\n", + "epoch: 313, training loss: 0.541624, training acc: 0.729226, valid loss: 0.542985, valid acc: 0.728694\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.38it/s, accuracy=0.667, cost=0.396]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.95it/s, accuracy=0.647, cost=0.697]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.00it/s, accuracy=0.656, cost=0.6] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 314, pass acc: 0.728694, current acc: 0.728813\n", + "time taken: 107.84244203567505\n", + "epoch: 314, training loss: 0.541530, training acc: 0.729325, valid loss: 0.542892, valid acc: 0.728813\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.44it/s, accuracy=0.667, cost=0.395]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.46it/s, accuracy=0.647, cost=0.697]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.45it/s, accuracy=0.688, cost=0.545]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 315, pass acc: 0.728813, current acc: 0.728918\n", + "time taken: 107.85835289955139\n", + "epoch: 315, training loss: 0.541436, training acc: 0.729394, valid loss: 0.542800, valid acc: 0.728918\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.68it/s, accuracy=0.667, cost=0.395]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.43it/s, accuracy=0.647, cost=0.696]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.30it/s, accuracy=0.688, cost=0.545]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 316, pass acc: 0.728918, current acc: 0.729007\n", + "time taken: 107.75244879722595\n", + "epoch: 316, training loss: 0.541342, training acc: 0.729457, valid loss: 0.542708, valid acc: 0.729007\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.57it/s, accuracy=0.667, cost=0.395]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.07it/s, accuracy=0.647, cost=0.696]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.78it/s, accuracy=0.656, cost=0.6] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 317, pass acc: 0.729007, current acc: 0.729186\n", + "time taken: 107.74424052238464\n", + "epoch: 317, training loss: 0.541249, training acc: 0.729526, valid loss: 0.542617, valid acc: 0.729186\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.70it/s, accuracy=0.667, cost=0.394]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 212.41it/s, accuracy=0.647, cost=0.696]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.06it/s, accuracy=0.688, cost=0.545]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 318, pass acc: 0.729186, current acc: 0.729283\n", + "time taken: 107.55879735946655\n", + "epoch: 318, training loss: 0.541156, training acc: 0.729608, valid loss: 0.542525, valid acc: 0.729283\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.64it/s, accuracy=0.667, cost=0.394]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.09it/s, accuracy=0.647, cost=0.696]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:25, 194.57it/s, accuracy=0.688, cost=0.545]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 319, pass acc: 0.729283, current acc: 0.729351\n", + "time taken: 107.71065497398376\n", + "epoch: 319, training loss: 0.541063, training acc: 0.729720, valid loss: 0.542434, valid acc: 0.729351\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.54it/s, accuracy=0.667, cost=0.394]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.88it/s, accuracy=0.647, cost=0.696]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.64it/s, accuracy=0.656, cost=0.6] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 320, pass acc: 0.729351, current acc: 0.729440\n", + "time taken: 107.77616763114929\n", + "epoch: 320, training loss: 0.540971, training acc: 0.729789, valid loss: 0.542344, valid acc: 0.729440\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.58it/s, accuracy=0.667, cost=0.393]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.19it/s, accuracy=0.647, cost=0.696]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:28, 190.11it/s, accuracy=0.656, cost=0.6] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 321, pass acc: 0.729440, current acc: 0.729552\n", + "time taken: 107.72877550125122\n", + "epoch: 321, training loss: 0.540879, training acc: 0.729847, valid loss: 0.542254, valid acc: 0.729552\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.47it/s, accuracy=0.667, cost=0.393]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.13it/s, accuracy=0.647, cost=0.695]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.99it/s, accuracy=0.688, cost=0.545]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "time taken: 107.7813868522644\n", + "epoch: 322, training loss: 0.540788, training acc: 0.729935, valid loss: 0.542164, valid acc: 0.729537\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.73it/s, accuracy=0.667, cost=0.393]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.44it/s, accuracy=0.647, cost=0.695]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:28, 188.89it/s, accuracy=0.656, cost=0.601]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 323, pass acc: 0.729552, current acc: 0.729582\n", + "time taken: 107.63419604301453\n", + "epoch: 323, training loss: 0.540696, training acc: 0.730004, valid loss: 0.542074, valid acc: 0.729582\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.21it/s, accuracy=0.667, cost=0.392]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.11it/s, accuracy=0.647, cost=0.695]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.70it/s, accuracy=0.656, cost=0.601]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 324, pass acc: 0.729582, current acc: 0.729716\n", + "time taken: 107.90370178222656\n", + "epoch: 324, training loss: 0.540606, training acc: 0.730084, valid loss: 0.541985, valid acc: 0.729716\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.32it/s, accuracy=0.667, cost=0.392]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.50it/s, accuracy=0.647, cost=0.695]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.78it/s, accuracy=0.656, cost=0.601]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 325, pass acc: 0.729716, current acc: 0.729880\n", + "time taken: 107.91086602210999\n", + "epoch: 325, training loss: 0.540515, training acc: 0.730163, valid loss: 0.541896, valid acc: 0.729880\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.62it/s, accuracy=0.667, cost=0.392]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.32it/s, accuracy=0.647, cost=0.695]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.80it/s, accuracy=0.656, cost=0.601]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 326, pass acc: 0.729880, current acc: 0.729977\n", + "time taken: 107.69626331329346\n", + "epoch: 326, training loss: 0.540425, training acc: 0.730224, valid loss: 0.541808, valid acc: 0.729977\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.40it/s, accuracy=0.667, cost=0.392]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.53it/s, accuracy=0.647, cost=0.695]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.80it/s, accuracy=0.656, cost=0.601]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 327, pass acc: 0.729977, current acc: 0.730104\n", + "time taken: 107.77745008468628\n", + "epoch: 327, training loss: 0.540335, training acc: 0.730314, valid loss: 0.541719, valid acc: 0.730104\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.56it/s, accuracy=0.667, cost=0.391]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.45it/s, accuracy=0.647, cost=0.694]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:28, 188.89it/s, accuracy=0.656, cost=0.601]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 328, pass acc: 0.730104, current acc: 0.730209\n", + "time taken: 107.71200633049011\n", + "epoch: 328, training loss: 0.540245, training acc: 0.730360, valid loss: 0.541632, valid acc: 0.730209\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.46it/s, accuracy=0.667, cost=0.391]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.37it/s, accuracy=0.647, cost=0.694]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.66it/s, accuracy=0.688, cost=0.545]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 329, pass acc: 0.730209, current acc: 0.730283\n", + "time taken: 107.76713943481445\n", + "epoch: 329, training loss: 0.540156, training acc: 0.730437, valid loss: 0.541544, valid acc: 0.730283\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.63it/s, accuracy=0.667, cost=0.391]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.39it/s, accuracy=0.647, cost=0.694]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.09it/s, accuracy=0.688, cost=0.545]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 330, pass acc: 0.730283, current acc: 0.730425\n", + "time taken: 107.68493580818176\n", + "epoch: 330, training loss: 0.540067, training acc: 0.730510, valid loss: 0.541457, valid acc: 0.730425\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.76it/s, accuracy=0.667, cost=0.39] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.28it/s, accuracy=0.647, cost=0.694]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.42it/s, accuracy=0.656, cost=0.601]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 331, pass acc: 0.730425, current acc: 0.730440\n", + "time taken: 107.63684582710266\n", + "epoch: 331, training loss: 0.539979, training acc: 0.730551, valid loss: 0.541370, valid acc: 0.730440\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.62it/s, accuracy=0.667, cost=0.39] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.38it/s, accuracy=0.647, cost=0.694]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.82it/s, accuracy=0.656, cost=0.601]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 332, pass acc: 0.730440, current acc: 0.730522\n", + "time taken: 107.72534704208374\n", + "epoch: 332, training loss: 0.539891, training acc: 0.730644, valid loss: 0.541283, valid acc: 0.730522\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.37it/s, accuracy=0.667, cost=0.39] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.13it/s, accuracy=0.647, cost=0.694]\n", + "train minibatch loop: 0%| | 18/16751 [00:00<01:33, 179.27it/s, accuracy=0.719, cost=0.539]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 333, pass acc: 0.730522, current acc: 0.730582\n", + "time taken: 107.8301305770874\n", + "epoch: 333, training loss: 0.539803, training acc: 0.730702, valid loss: 0.541197, valid acc: 0.730582\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.27it/s, accuracy=0.667, cost=0.39] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.22it/s, accuracy=0.647, cost=0.693]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.22it/s, accuracy=0.656, cost=0.601]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 334, pass acc: 0.730582, current acc: 0.730664\n", + "time taken: 107.86723804473877\n", + "epoch: 334, training loss: 0.539715, training acc: 0.730784, valid loss: 0.541111, valid acc: 0.730664\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.43it/s, accuracy=0.667, cost=0.389]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.34it/s, accuracy=0.647, cost=0.693]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.34it/s, accuracy=0.656, cost=0.601]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 335, pass acc: 0.730664, current acc: 0.730754\n", + "time taken: 107.8228964805603\n", + "epoch: 335, training loss: 0.539628, training acc: 0.730862, valid loss: 0.541026, valid acc: 0.730754\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.29it/s, accuracy=0.667, cost=0.389]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.92it/s, accuracy=0.647, cost=0.693]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.03it/s, accuracy=0.656, cost=0.601]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 336, pass acc: 0.730754, current acc: 0.730843\n", + "time taken: 107.88729333877563\n", + "epoch: 336, training loss: 0.539541, training acc: 0.730980, valid loss: 0.540940, valid acc: 0.730843\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.35it/s, accuracy=0.667, cost=0.389]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.20it/s, accuracy=0.647, cost=0.693]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.34it/s, accuracy=0.656, cost=0.601]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "time taken: 107.83304619789124\n", + "epoch: 337, training loss: 0.539454, training acc: 0.731060, valid loss: 0.540856, valid acc: 0.730843\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.50it/s, accuracy=0.667, cost=0.388]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.92it/s, accuracy=0.647, cost=0.693]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.57it/s, accuracy=0.656, cost=0.601]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 338, pass acc: 0.730843, current acc: 0.730895\n", + "time taken: 107.7906424999237\n", + "epoch: 338, training loss: 0.539368, training acc: 0.731107, valid loss: 0.540771, valid acc: 0.730895\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.45it/s, accuracy=0.667, cost=0.388]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.01it/s, accuracy=0.647, cost=0.693]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.42it/s, accuracy=0.688, cost=0.544]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 339, pass acc: 0.730895, current acc: 0.730977\n", + "time taken: 107.80194306373596\n", + "epoch: 339, training loss: 0.539282, training acc: 0.731198, valid loss: 0.540687, valid acc: 0.730977\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.58it/s, accuracy=0.667, cost=0.388]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.62it/s, accuracy=0.647, cost=0.693]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.25it/s, accuracy=0.656, cost=0.601]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 340, pass acc: 0.730977, current acc: 0.731045\n", + "time taken: 107.78237628936768\n", + "epoch: 340, training loss: 0.539197, training acc: 0.731237, valid loss: 0.540603, valid acc: 0.731045\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.43it/s, accuracy=0.667, cost=0.388]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.27it/s, accuracy=0.647, cost=0.692]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.66it/s, accuracy=0.656, cost=0.601]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 341, pass acc: 0.731045, current acc: 0.731149\n", + "time taken: 107.78995704650879\n", + "epoch: 341, training loss: 0.539111, training acc: 0.731284, valid loss: 0.540519, valid acc: 0.731149\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.32it/s, accuracy=0.667, cost=0.387]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.27it/s, accuracy=0.647, cost=0.692]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:28, 189.73it/s, accuracy=0.656, cost=0.601]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 342, pass acc: 0.731149, current acc: 0.731209\n", + "time taken: 107.83907222747803\n", + "epoch: 342, training loss: 0.539026, training acc: 0.731317, valid loss: 0.540435, valid acc: 0.731209\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.36it/s, accuracy=0.667, cost=0.387]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.21it/s, accuracy=0.647, cost=0.692]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.24it/s, accuracy=0.719, cost=0.539]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "time taken: 107.82528972625732\n", + "epoch: 343, training loss: 0.538941, training acc: 0.731422, valid loss: 0.540352, valid acc: 0.731201\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.42it/s, accuracy=0.667, cost=0.387]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.03it/s, accuracy=0.647, cost=0.692]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.30it/s, accuracy=0.656, cost=0.602]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 344, pass acc: 0.731209, current acc: 0.731306\n", + "time taken: 107.81521439552307\n", + "epoch: 344, training loss: 0.538857, training acc: 0.731465, valid loss: 0.540269, valid acc: 0.731306\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.68it/s, accuracy=0.667, cost=0.387]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.21it/s, accuracy=0.647, cost=0.692]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.37it/s, accuracy=0.688, cost=0.544]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 345, pass acc: 0.731306, current acc: 0.731336\n", + "time taken: 107.68172335624695\n", + "epoch: 345, training loss: 0.538773, training acc: 0.731513, valid loss: 0.540187, valid acc: 0.731336\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.69it/s, accuracy=0.667, cost=0.386]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.42it/s, accuracy=0.647, cost=0.692]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:30, 184.52it/s, accuracy=0.656, cost=0.602]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 346, pass acc: 0.731336, current acc: 0.731440\n", + "time taken: 107.65527248382568\n", + "epoch: 346, training loss: 0.538689, training acc: 0.731573, valid loss: 0.540105, valid acc: 0.731440\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.63it/s, accuracy=0.667, cost=0.386]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.59it/s, accuracy=0.647, cost=0.691]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.81it/s, accuracy=0.688, cost=0.544]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 347, pass acc: 0.731440, current acc: 0.731537\n", + "time taken: 107.66716957092285\n", + "epoch: 347, training loss: 0.538606, training acc: 0.731653, valid loss: 0.540023, valid acc: 0.731537\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.46it/s, accuracy=0.667, cost=0.386]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.90it/s, accuracy=0.647, cost=0.691]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.36it/s, accuracy=0.656, cost=0.602]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 348, pass acc: 0.731537, current acc: 0.731552\n", + "time taken: 107.80863523483276\n", + "epoch: 348, training loss: 0.538522, training acc: 0.731763, valid loss: 0.539941, valid acc: 0.731552\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.61it/s, accuracy=0.667, cost=0.386]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.07it/s, accuracy=0.647, cost=0.691]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.47it/s, accuracy=0.688, cost=0.544]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 349, pass acc: 0.731552, current acc: 0.731604\n", + "time taken: 107.72298336029053\n", + "epoch: 349, training loss: 0.538439, training acc: 0.731817, valid loss: 0.539860, valid acc: 0.731604\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.73it/s, accuracy=0.667, cost=0.385]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.77it/s, accuracy=0.647, cost=0.691]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.83it/s, accuracy=0.656, cost=0.602]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 350, pass acc: 0.731604, current acc: 0.731619\n", + "time taken: 107.69608092308044\n", + "epoch: 350, training loss: 0.538357, training acc: 0.731860, valid loss: 0.539779, valid acc: 0.731619\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.82it/s, accuracy=0.667, cost=0.385]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.40it/s, accuracy=0.647, cost=0.691]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.09it/s, accuracy=0.656, cost=0.602]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 351, pass acc: 0.731619, current acc: 0.731649\n", + "time taken: 107.59593343734741\n", + "epoch: 351, training loss: 0.538274, training acc: 0.731929, valid loss: 0.539698, valid acc: 0.731649\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.72it/s, accuracy=0.667, cost=0.385]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.11it/s, accuracy=0.647, cost=0.691]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.05it/s, accuracy=0.656, cost=0.602]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 352, pass acc: 0.731649, current acc: 0.731724\n", + "time taken: 107.66868543624878\n", + "epoch: 352, training loss: 0.538192, training acc: 0.731980, valid loss: 0.539618, valid acc: 0.731724\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.47it/s, accuracy=0.667, cost=0.384]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.37it/s, accuracy=0.647, cost=0.69] \n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:32, 181.16it/s, accuracy=0.719, cost=0.538]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 353, pass acc: 0.731724, current acc: 0.731791\n", + "time taken: 107.76131558418274\n", + "epoch: 353, training loss: 0.538111, training acc: 0.732047, valid loss: 0.539537, valid acc: 0.731791\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.85it/s, accuracy=0.667, cost=0.384]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.83it/s, accuracy=0.647, cost=0.69] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.53it/s, accuracy=0.656, cost=0.602]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 354, pass acc: 0.731791, current acc: 0.731948\n", + "time taken: 107.63868856430054\n", + "epoch: 354, training loss: 0.538029, training acc: 0.732123, valid loss: 0.539458, valid acc: 0.731948\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.60it/s, accuracy=0.667, cost=0.384]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.44it/s, accuracy=0.647, cost=0.69] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.71it/s, accuracy=0.656, cost=0.602]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 355, pass acc: 0.731948, current acc: 0.732037\n", + "time taken: 107.78818821907043\n", + "epoch: 355, training loss: 0.537948, training acc: 0.732209, valid loss: 0.539378, valid acc: 0.732037\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.64it/s, accuracy=0.667, cost=0.384]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.47it/s, accuracy=0.647, cost=0.69] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.66it/s, accuracy=0.656, cost=0.602]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "time taken: 107.67263698577881\n", + "epoch: 356, training loss: 0.537867, training acc: 0.732284, valid loss: 0.539299, valid acc: 0.732030\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.69it/s, accuracy=0.667, cost=0.383]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.25it/s, accuracy=0.647, cost=0.69] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.77it/s, accuracy=0.656, cost=0.602]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 357, pass acc: 0.732037, current acc: 0.732164\n", + "time taken: 107.66986751556396\n", + "epoch: 357, training loss: 0.537786, training acc: 0.732357, valid loss: 0.539220, valid acc: 0.732164\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.55it/s, accuracy=0.667, cost=0.383]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.08it/s, accuracy=0.647, cost=0.69] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.80it/s, accuracy=0.656, cost=0.602]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 358, pass acc: 0.732164, current acc: 0.732268\n", + "time taken: 107.75003719329834\n", + "epoch: 358, training loss: 0.537706, training acc: 0.732439, valid loss: 0.539141, valid acc: 0.732268\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.44it/s, accuracy=0.667, cost=0.383]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.09it/s, accuracy=0.647, cost=0.689]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.39it/s, accuracy=0.656, cost=0.602]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 359, pass acc: 0.732268, current acc: 0.732313\n", + "time taken: 107.80212306976318\n", + "epoch: 359, training loss: 0.537626, training acc: 0.732511, valid loss: 0.539062, valid acc: 0.732313\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.74it/s, accuracy=0.667, cost=0.383]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.76it/s, accuracy=0.647, cost=0.689]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:30, 184.43it/s, accuracy=0.656, cost=0.602]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 360, pass acc: 0.732313, current acc: 0.732358\n", + "time taken: 107.69521975517273\n", + "epoch: 360, training loss: 0.537546, training acc: 0.732564, valid loss: 0.538984, valid acc: 0.732358\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.59it/s, accuracy=0.667, cost=0.383]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.85it/s, accuracy=0.647, cost=0.689]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:28, 189.88it/s, accuracy=0.656, cost=0.602]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 361, pass acc: 0.732358, current acc: 0.732522\n", + "time taken: 107.73677611351013\n", + "epoch: 361, training loss: 0.537467, training acc: 0.732618, valid loss: 0.538906, valid acc: 0.732522\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.23it/s, accuracy=0.667, cost=0.382]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.14it/s, accuracy=0.647, cost=0.689]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.21it/s, accuracy=0.688, cost=0.543]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 362, pass acc: 0.732522, current acc: 0.732560\n", + "time taken: 107.89460015296936\n", + "epoch: 362, training loss: 0.537387, training acc: 0.732696, valid loss: 0.538828, valid acc: 0.732560\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.23it/s, accuracy=0.667, cost=0.382]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.26it/s, accuracy=0.647, cost=0.689]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.42it/s, accuracy=0.656, cost=0.602]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 363, pass acc: 0.732560, current acc: 0.732597\n", + "time taken: 107.88056921958923\n", + "epoch: 363, training loss: 0.537308, training acc: 0.732752, valid loss: 0.538751, valid acc: 0.732597\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.29it/s, accuracy=0.667, cost=0.382]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.83it/s, accuracy=0.647, cost=0.689]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.21it/s, accuracy=0.656, cost=0.602]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 364, pass acc: 0.732597, current acc: 0.732604\n", + "time taken: 107.89272022247314\n", + "epoch: 364, training loss: 0.537230, training acc: 0.732842, valid loss: 0.538674, valid acc: 0.732604\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.58it/s, accuracy=0.667, cost=0.382]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.97it/s, accuracy=0.647, cost=0.688]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.61it/s, accuracy=0.656, cost=0.602]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 365, pass acc: 0.732604, current acc: 0.732761\n", + "time taken: 107.75030708312988\n", + "epoch: 365, training loss: 0.537151, training acc: 0.732890, valid loss: 0.538597, valid acc: 0.732761\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.44it/s, accuracy=0.667, cost=0.381]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.36it/s, accuracy=0.647, cost=0.688]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.25it/s, accuracy=0.656, cost=0.602]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 366, pass acc: 0.732761, current acc: 0.732813\n", + "time taken: 107.77668714523315\n", + "epoch: 366, training loss: 0.537073, training acc: 0.732952, valid loss: 0.538520, valid acc: 0.732813\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.32it/s, accuracy=0.667, cost=0.381]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.51it/s, accuracy=0.647, cost=0.688]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.42it/s, accuracy=0.656, cost=0.602]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 367, pass acc: 0.732813, current acc: 0.732865\n", + "time taken: 107.81833744049072\n", + "epoch: 367, training loss: 0.536995, training acc: 0.733013, valid loss: 0.538444, valid acc: 0.732865\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.56it/s, accuracy=0.667, cost=0.381]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.66it/s, accuracy=0.647, cost=0.688]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.17it/s, accuracy=0.656, cost=0.603]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 368, pass acc: 0.732865, current acc: 0.732948\n", + "time taken: 107.69335985183716\n", + "epoch: 368, training loss: 0.536918, training acc: 0.733066, valid loss: 0.538368, valid acc: 0.732948\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.61it/s, accuracy=0.667, cost=0.381]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.27it/s, accuracy=0.647, cost=0.688]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.40it/s, accuracy=0.656, cost=0.603]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 369, pass acc: 0.732948, current acc: 0.732970\n", + "time taken: 107.70474791526794\n", + "epoch: 369, training loss: 0.536840, training acc: 0.733129, valid loss: 0.538292, valid acc: 0.732970\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.37it/s, accuracy=0.667, cost=0.38] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.10it/s, accuracy=0.647, cost=0.688]\n", + "train minibatch loop: 0%| | 16/16751 [00:00<01:47, 156.29it/s, accuracy=0.781, cost=0.443]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 370, pass acc: 0.732970, current acc: 0.733089\n", + "time taken: 107.83156943321228\n", + "epoch: 370, training loss: 0.536763, training acc: 0.733213, valid loss: 0.538216, valid acc: 0.733089\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.35it/s, accuracy=0.667, cost=0.38] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.26it/s, accuracy=0.647, cost=0.687]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.75it/s, accuracy=0.656, cost=0.603]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 371, pass acc: 0.733089, current acc: 0.733127\n", + "time taken: 107.82694721221924\n", + "epoch: 371, training loss: 0.536686, training acc: 0.733263, valid loss: 0.538141, valid acc: 0.733127\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.35it/s, accuracy=0.667, cost=0.38] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.56it/s, accuracy=0.647, cost=0.687]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.70it/s, accuracy=0.688, cost=0.543]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 372, pass acc: 0.733127, current acc: 0.733164\n", + "time taken: 107.79896545410156\n", + "epoch: 372, training loss: 0.536610, training acc: 0.733358, valid loss: 0.538066, valid acc: 0.733164\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.46it/s, accuracy=0.667, cost=0.38] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.20it/s, accuracy=0.647, cost=0.687]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.49it/s, accuracy=0.688, cost=0.543]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 373, pass acc: 0.733164, current acc: 0.733239\n", + "time taken: 107.78122067451477\n", + "epoch: 373, training loss: 0.536533, training acc: 0.733433, valid loss: 0.537991, valid acc: 0.733239\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.31it/s, accuracy=0.667, cost=0.38] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.44it/s, accuracy=0.647, cost=0.687]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.11it/s, accuracy=0.688, cost=0.543]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 374, pass acc: 0.733239, current acc: 0.733313\n", + "time taken: 107.82646226882935\n", + "epoch: 374, training loss: 0.536457, training acc: 0.733493, valid loss: 0.537917, valid acc: 0.733313\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.48it/s, accuracy=0.667, cost=0.379]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.33it/s, accuracy=0.647, cost=0.687]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:29, 187.09it/s, accuracy=0.656, cost=0.603]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 375, pass acc: 0.733313, current acc: 0.733395\n", + "time taken: 107.78704953193665\n", + "epoch: 375, training loss: 0.536381, training acc: 0.733541, valid loss: 0.537842, valid acc: 0.733395\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.49it/s, accuracy=0.667, cost=0.379]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.03it/s, accuracy=0.647, cost=0.687]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.51it/s, accuracy=0.656, cost=0.603]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "time taken: 107.78397035598755\n", + "epoch: 376, training loss: 0.536306, training acc: 0.733612, valid loss: 0.537768, valid acc: 0.733373\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.30it/s, accuracy=0.667, cost=0.379]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.32it/s, accuracy=0.647, cost=0.686]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.32it/s, accuracy=0.656, cost=0.603]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "time taken: 107.84577918052673\n", + "epoch: 377, training loss: 0.536231, training acc: 0.733694, valid loss: 0.537695, valid acc: 0.733388\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.35it/s, accuracy=0.667, cost=0.379]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.29it/s, accuracy=0.647, cost=0.686]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.30it/s, accuracy=0.688, cost=0.543]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 378, pass acc: 0.733395, current acc: 0.733477\n", + "time taken: 107.82575225830078\n", + "epoch: 378, training loss: 0.536155, training acc: 0.733748, valid loss: 0.537621, valid acc: 0.733477\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.58it/s, accuracy=0.667, cost=0.378]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.16it/s, accuracy=0.647, cost=0.686]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.00it/s, accuracy=0.656, cost=0.603]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 379, pass acc: 0.733477, current acc: 0.733485\n", + "time taken: 107.73209571838379\n", + "epoch: 379, training loss: 0.536081, training acc: 0.733802, valid loss: 0.537548, valid acc: 0.733485\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.42it/s, accuracy=0.667, cost=0.378]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.56it/s, accuracy=0.647, cost=0.686]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.15it/s, accuracy=0.656, cost=0.603]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 380, pass acc: 0.733485, current acc: 0.733537\n", + "time taken: 107.76585412025452\n", + "epoch: 380, training loss: 0.536006, training acc: 0.733862, valid loss: 0.537475, valid acc: 0.733537\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.71it/s, accuracy=0.667, cost=0.378]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.42it/s, accuracy=0.647, cost=0.686]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.80it/s, accuracy=0.656, cost=0.603]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 381, pass acc: 0.733537, current acc: 0.733589\n", + "time taken: 107.64309668540955\n", + "epoch: 381, training loss: 0.535932, training acc: 0.733918, valid loss: 0.537402, valid acc: 0.733589\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 192.64it/s, accuracy=0.667, cost=0.378]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.76it/s, accuracy=0.647, cost=0.686]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.74it/s, accuracy=0.656, cost=0.603]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 382, pass acc: 0.733589, current acc: 0.733679\n", + "time taken: 107.61491560935974\n", + "epoch: 382, training loss: 0.535858, training acc: 0.733982, valid loss: 0.537329, valid acc: 0.733679\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.65it/s, accuracy=0.667, cost=0.378]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.48it/s, accuracy=0.647, cost=0.685]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.45it/s, accuracy=0.656, cost=0.603]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 383, pass acc: 0.733679, current acc: 0.733731\n", + "time taken: 107.66997981071472\n", + "epoch: 383, training loss: 0.535784, training acc: 0.734024, valid loss: 0.537257, valid acc: 0.733731\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.76it/s, accuracy=0.667, cost=0.377]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.78it/s, accuracy=0.647, cost=0.685]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.25it/s, accuracy=0.656, cost=0.603]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 384, pass acc: 0.733731, current acc: 0.733858\n", + "time taken: 107.68535041809082\n", + "epoch: 384, training loss: 0.535710, training acc: 0.734120, valid loss: 0.537185, valid acc: 0.733858\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.68it/s, accuracy=0.667, cost=0.377]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.22it/s, accuracy=0.647, cost=0.685]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.64it/s, accuracy=0.656, cost=0.603]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 385, pass acc: 0.733858, current acc: 0.733970\n", + "time taken: 107.68002438545227\n", + "epoch: 385, training loss: 0.535637, training acc: 0.734176, valid loss: 0.537113, valid acc: 0.733970\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.63it/s, accuracy=0.667, cost=0.377]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.33it/s, accuracy=0.647, cost=0.685]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.61it/s, accuracy=0.656, cost=0.603]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 386, pass acc: 0.733970, current acc: 0.734022\n", + "time taken: 107.688711643219\n", + "epoch: 386, training loss: 0.535564, training acc: 0.734198, valid loss: 0.537041, valid acc: 0.734022\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.52it/s, accuracy=0.667, cost=0.377]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.70it/s, accuracy=0.647, cost=0.685]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.61it/s, accuracy=0.688, cost=0.542]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 387, pass acc: 0.734022, current acc: 0.734059\n", + "time taken: 107.70700216293335\n", + "epoch: 387, training loss: 0.535491, training acc: 0.734248, valid loss: 0.536970, valid acc: 0.734059\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.34it/s, accuracy=0.667, cost=0.377]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.89it/s, accuracy=0.647, cost=0.685]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.81it/s, accuracy=0.656, cost=0.603]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 388, pass acc: 0.734059, current acc: 0.734082\n", + "time taken: 107.86399555206299\n", + "epoch: 388, training loss: 0.535418, training acc: 0.734334, valid loss: 0.536899, valid acc: 0.734082\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.42it/s, accuracy=0.667, cost=0.376]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.45it/s, accuracy=0.647, cost=0.684]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.61it/s, accuracy=0.688, cost=0.542]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 389, pass acc: 0.734082, current acc: 0.734134\n", + "time taken: 107.78652477264404\n", + "epoch: 389, training loss: 0.535346, training acc: 0.734370, valid loss: 0.536828, valid acc: 0.734134\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.68it/s, accuracy=0.667, cost=0.376]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.46it/s, accuracy=0.647, cost=0.684]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.36it/s, accuracy=0.719, cost=0.536]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "time taken: 107.6543276309967\n", + "epoch: 390, training loss: 0.535274, training acc: 0.734392, valid loss: 0.536757, valid acc: 0.734127\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.48it/s, accuracy=0.667, cost=0.376]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.93it/s, accuracy=0.647, cost=0.684]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.25it/s, accuracy=0.688, cost=0.542]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 391, pass acc: 0.734134, current acc: 0.734157\n", + "time taken: 107.79523921012878\n", + "epoch: 391, training loss: 0.535202, training acc: 0.734493, valid loss: 0.536687, valid acc: 0.734157\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.37it/s, accuracy=0.667, cost=0.376]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.07it/s, accuracy=0.706, cost=0.684]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.38it/s, accuracy=0.688, cost=0.542]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 392, pass acc: 0.734157, current acc: 0.734268\n", + "time taken: 107.83480668067932\n", + "epoch: 392, training loss: 0.535130, training acc: 0.734545, valid loss: 0.536617, valid acc: 0.734268\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.48it/s, accuracy=0.667, cost=0.376]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.76it/s, accuracy=0.706, cost=0.684]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.05it/s, accuracy=0.656, cost=0.603]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "time taken: 107.81547474861145\n", + "epoch: 393, training loss: 0.535059, training acc: 0.734586, valid loss: 0.536547, valid acc: 0.734260\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.40it/s, accuracy=0.667, cost=0.375]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.80it/s, accuracy=0.706, cost=0.684]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.69it/s, accuracy=0.656, cost=0.603]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 394, pass acc: 0.734268, current acc: 0.734282\n", + "time taken: 107.84596729278564\n", + "epoch: 394, training loss: 0.534987, training acc: 0.734633, valid loss: 0.536477, valid acc: 0.734282\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.55it/s, accuracy=0.667, cost=0.375]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.01it/s, accuracy=0.706, cost=0.683]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:28, 188.94it/s, accuracy=0.656, cost=0.603]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 395, pass acc: 0.734282, current acc: 0.734327\n", + "time taken: 107.75808095932007\n", + "epoch: 395, training loss: 0.534916, training acc: 0.734700, valid loss: 0.536407, valid acc: 0.734327\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.48it/s, accuracy=0.667, cost=0.375]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.17it/s, accuracy=0.706, cost=0.683]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.37it/s, accuracy=0.656, cost=0.603]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 396, pass acc: 0.734327, current acc: 0.734365\n", + "time taken: 107.77717208862305\n", + "epoch: 396, training loss: 0.534846, training acc: 0.734778, valid loss: 0.536338, valid acc: 0.734365\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.31it/s, accuracy=0.667, cost=0.375]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.09it/s, accuracy=0.706, cost=0.683]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.53it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 397, pass acc: 0.734365, current acc: 0.734439\n", + "time taken: 107.85905957221985\n", + "epoch: 397, training loss: 0.534775, training acc: 0.734834, valid loss: 0.536269, valid acc: 0.734439\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.52it/s, accuracy=0.667, cost=0.375]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.86it/s, accuracy=0.706, cost=0.683]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.93it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 398, pass acc: 0.734439, current acc: 0.734491\n", + "time taken: 107.78372812271118\n", + "epoch: 398, training loss: 0.534705, training acc: 0.734873, valid loss: 0.536200, valid acc: 0.734491\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.52it/s, accuracy=0.667, cost=0.374]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.71it/s, accuracy=0.706, cost=0.683]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.33it/s, accuracy=0.688, cost=0.542]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 399, pass acc: 0.734491, current acc: 0.734559\n", + "time taken: 107.7996289730072\n", + "epoch: 399, training loss: 0.534635, training acc: 0.734939, valid loss: 0.536131, valid acc: 0.734559\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.40it/s, accuracy=0.667, cost=0.374]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.14it/s, accuracy=0.706, cost=0.683]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:28, 188.43it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 400, pass acc: 0.734559, current acc: 0.734641\n", + "time taken: 107.8136146068573\n", + "epoch: 400, training loss: 0.534565, training acc: 0.734987, valid loss: 0.536063, valid acc: 0.734641\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.28it/s, accuracy=0.667, cost=0.374]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.17it/s, accuracy=0.706, cost=0.682]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.68it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "time taken: 107.86513352394104\n", + "epoch: 401, training loss: 0.534495, training acc: 0.735051, valid loss: 0.535995, valid acc: 0.734618\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.46it/s, accuracy=0.667, cost=0.374]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.34it/s, accuracy=0.706, cost=0.682]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.58it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 402, pass acc: 0.734641, current acc: 0.734857\n", + "time taken: 107.76982021331787\n", + "epoch: 402, training loss: 0.534426, training acc: 0.735129, valid loss: 0.535927, valid acc: 0.734857\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.54it/s, accuracy=0.667, cost=0.374]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.94it/s, accuracy=0.706, cost=0.682]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.19it/s, accuracy=0.688, cost=0.542]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 403, pass acc: 0.734857, current acc: 0.734939\n", + "time taken: 107.76668572425842\n", + "epoch: 403, training loss: 0.534356, training acc: 0.735196, valid loss: 0.535859, valid acc: 0.734939\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.36it/s, accuracy=0.667, cost=0.373]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.58it/s, accuracy=0.706, cost=0.682]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.45it/s, accuracy=0.688, cost=0.542]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 404, pass acc: 0.734939, current acc: 0.734969\n", + "time taken: 107.88785290718079\n", + "epoch: 404, training loss: 0.534287, training acc: 0.735286, valid loss: 0.535791, valid acc: 0.734969\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.22it/s, accuracy=0.667, cost=0.373]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.25it/s, accuracy=0.706, cost=0.682]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.66it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 405, pass acc: 0.734969, current acc: 0.735021\n", + "time taken: 107.8892605304718\n", + "epoch: 405, training loss: 0.534218, training acc: 0.735392, valid loss: 0.535724, valid acc: 0.735021\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.47it/s, accuracy=0.667, cost=0.373]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.01it/s, accuracy=0.706, cost=0.682]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:28, 188.67it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 406, pass acc: 0.735021, current acc: 0.735059\n", + "time taken: 107.79383707046509\n", + "epoch: 406, training loss: 0.534150, training acc: 0.735444, valid loss: 0.535657, valid acc: 0.735059\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.32it/s, accuracy=0.667, cost=0.373]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.04it/s, accuracy=0.706, cost=0.681]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.28it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 407, pass acc: 0.735059, current acc: 0.735111\n", + "time taken: 107.86158871650696\n", + "epoch: 407, training loss: 0.534082, training acc: 0.735511, valid loss: 0.535590, valid acc: 0.735111\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.25it/s, accuracy=0.667, cost=0.373]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.68it/s, accuracy=0.706, cost=0.681]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.63it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "time taken: 107.92568802833557\n", + "epoch: 408, training loss: 0.534013, training acc: 0.735595, valid loss: 0.535523, valid acc: 0.735103\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.39it/s, accuracy=0.667, cost=0.373]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.67it/s, accuracy=0.706, cost=0.681]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.39it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 409, pass acc: 0.735111, current acc: 0.735215\n", + "time taken: 107.86372232437134\n", + "epoch: 409, training loss: 0.533945, training acc: 0.735661, valid loss: 0.535457, valid acc: 0.735215\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.56it/s, accuracy=0.667, cost=0.372]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.20it/s, accuracy=0.706, cost=0.681]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.73it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 410, pass acc: 0.735215, current acc: 0.735342\n", + "time taken: 107.73366451263428\n", + "epoch: 410, training loss: 0.533878, training acc: 0.735739, valid loss: 0.535390, valid acc: 0.735342\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.34it/s, accuracy=0.667, cost=0.372]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.81it/s, accuracy=0.706, cost=0.681]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.44it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 411, pass acc: 0.735342, current acc: 0.735387\n", + "time taken: 107.87421607971191\n", + "epoch: 411, training loss: 0.533810, training acc: 0.735804, valid loss: 0.535324, valid acc: 0.735387\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.37it/s, accuracy=0.667, cost=0.372]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.07it/s, accuracy=0.706, cost=0.681]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.51it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 412, pass acc: 0.735387, current acc: 0.735447\n", + "time taken: 107.83639454841614\n", + "epoch: 412, training loss: 0.533743, training acc: 0.735864, valid loss: 0.535259, valid acc: 0.735447\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.59it/s, accuracy=0.667, cost=0.372]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.74it/s, accuracy=0.706, cost=0.68] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.41it/s, accuracy=0.688, cost=0.542]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 413, pass acc: 0.735447, current acc: 0.735469\n", + "time taken: 107.7638750076294\n", + "epoch: 413, training loss: 0.533676, training acc: 0.735916, valid loss: 0.535193, valid acc: 0.735469\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.44it/s, accuracy=0.667, cost=0.372]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.72it/s, accuracy=0.706, cost=0.68] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.58it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 414, pass acc: 0.735469, current acc: 0.735484\n", + "time taken: 107.8341383934021\n", + "epoch: 414, training loss: 0.533609, training acc: 0.735939, valid loss: 0.535127, valid acc: 0.735484\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.55it/s, accuracy=0.667, cost=0.372]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.89it/s, accuracy=0.706, cost=0.68] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.84it/s, accuracy=0.719, cost=0.542]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 415, pass acc: 0.735484, current acc: 0.735536\n", + "time taken: 107.77057814598083\n", + "epoch: 415, training loss: 0.533542, training acc: 0.735957, valid loss: 0.535062, valid acc: 0.735536\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.23it/s, accuracy=0.667, cost=0.371]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.88it/s, accuracy=0.706, cost=0.68] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.74it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 416, pass acc: 0.735536, current acc: 0.735618\n", + "time taken: 107.91522288322449\n", + "epoch: 416, training loss: 0.533476, training acc: 0.736019, valid loss: 0.534997, valid acc: 0.735618\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.30it/s, accuracy=0.667, cost=0.371]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.09it/s, accuracy=0.706, cost=0.68] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.27it/s, accuracy=0.719, cost=0.542]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 417, pass acc: 0.735618, current acc: 0.735648\n", + "time taken: 107.86552047729492\n", + "epoch: 417, training loss: 0.533409, training acc: 0.736077, valid loss: 0.534932, valid acc: 0.735648\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.84it/s, accuracy=0.667, cost=0.371]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.91it/s, accuracy=0.706, cost=0.68] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.41it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 418, pass acc: 0.735648, current acc: 0.735700\n", + "time taken: 107.70768475532532\n", + "epoch: 418, training loss: 0.533343, training acc: 0.736125, valid loss: 0.534868, valid acc: 0.735700\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.54it/s, accuracy=0.667, cost=0.371]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.74it/s, accuracy=0.706, cost=0.679]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.26it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 419, pass acc: 0.735700, current acc: 0.735708\n", + "time taken: 107.78770399093628\n", + "epoch: 419, training loss: 0.533277, training acc: 0.736138, valid loss: 0.534803, valid acc: 0.735708\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.54it/s, accuracy=0.667, cost=0.371]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.05it/s, accuracy=0.706, cost=0.679]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.31it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 420, pass acc: 0.735708, current acc: 0.735745\n", + "time taken: 107.75721001625061\n", + "epoch: 420, training loss: 0.533212, training acc: 0.736205, valid loss: 0.534739, valid acc: 0.735745\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.31it/s, accuracy=0.667, cost=0.37] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.31it/s, accuracy=0.706, cost=0.679]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.73it/s, accuracy=0.719, cost=0.541]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 421, pass acc: 0.735745, current acc: 0.735782\n", + "time taken: 107.8394615650177\n", + "epoch: 421, training loss: 0.533146, training acc: 0.736258, valid loss: 0.534675, valid acc: 0.735782\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.37it/s, accuracy=0.667, cost=0.37] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.99it/s, accuracy=0.706, cost=0.679]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.27it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 422, pass acc: 0.735782, current acc: 0.735805\n", + "time taken: 107.8442645072937\n", + "epoch: 422, training loss: 0.533081, training acc: 0.736340, valid loss: 0.534611, valid acc: 0.735805\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.43it/s, accuracy=0.667, cost=0.37] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.39it/s, accuracy=0.706, cost=0.679]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:31, 183.29it/s, accuracy=0.781, cost=0.534]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 423, pass acc: 0.735805, current acc: 0.735872\n", + "time taken: 107.871169090271\n", + "epoch: 423, training loss: 0.533016, training acc: 0.736390, valid loss: 0.534547, valid acc: 0.735872\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.40it/s, accuracy=0.667, cost=0.37] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.56it/s, accuracy=0.706, cost=0.679]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.27it/s, accuracy=0.781, cost=0.534]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 424, pass acc: 0.735872, current acc: 0.735962\n", + "time taken: 107.8705632686615\n", + "epoch: 424, training loss: 0.532951, training acc: 0.736457, valid loss: 0.534484, valid acc: 0.735962\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.32it/s, accuracy=0.667, cost=0.37] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.14it/s, accuracy=0.706, cost=0.678]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.22it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "time taken: 107.85021162033081\n", + "epoch: 425, training loss: 0.532886, training acc: 0.736472, valid loss: 0.534420, valid acc: 0.735962\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.30it/s, accuracy=0.667, cost=0.37] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.19it/s, accuracy=0.706, cost=0.678]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.47it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 426, pass acc: 0.735962, current acc: 0.736021\n", + "time taken: 107.85811400413513\n", + "epoch: 426, training loss: 0.532822, training acc: 0.736513, valid loss: 0.534357, valid acc: 0.736021\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.10it/s, accuracy=0.667, cost=0.37] \n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.88it/s, accuracy=0.706, cost=0.678]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.86it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 427, pass acc: 0.736021, current acc: 0.736066\n", + "time taken: 107.97973465919495\n", + "epoch: 427, training loss: 0.532757, training acc: 0.736551, valid loss: 0.534294, valid acc: 0.736066\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.45it/s, accuracy=0.667, cost=0.369]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.69it/s, accuracy=0.706, cost=0.678]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:31, 182.13it/s, accuracy=0.781, cost=0.534]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 428, pass acc: 0.736066, current acc: 0.736171\n", + "time taken: 107.83313536643982\n", + "epoch: 428, training loss: 0.532693, training acc: 0.736607, valid loss: 0.534232, valid acc: 0.736171\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.35it/s, accuracy=0.667, cost=0.369]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.77it/s, accuracy=0.706, cost=0.678]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.48it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 429, pass acc: 0.736171, current acc: 0.736185\n", + "time taken: 107.87244868278503\n", + "epoch: 429, training loss: 0.532629, training acc: 0.736659, valid loss: 0.534169, valid acc: 0.736185\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.86it/s, accuracy=0.667, cost=0.369]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.01it/s, accuracy=0.706, cost=0.678]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.50it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 430, pass acc: 0.736185, current acc: 0.736275\n", + "time taken: 107.85274982452393\n", + "epoch: 430, training loss: 0.532566, training acc: 0.736717, valid loss: 0.534107, valid acc: 0.736275\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.23it/s, accuracy=0.667, cost=0.369]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.22it/s, accuracy=0.706, cost=0.677]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:29, 186.71it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 431, pass acc: 0.736275, current acc: 0.736342\n", + "time taken: 107.88406324386597\n", + "epoch: 431, training loss: 0.532502, training acc: 0.736778, valid loss: 0.534045, valid acc: 0.736342\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.23it/s, accuracy=0.667, cost=0.369]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.08it/s, accuracy=0.706, cost=0.677]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.45it/s, accuracy=0.781, cost=0.534]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 432, pass acc: 0.736342, current acc: 0.736432\n", + "time taken: 107.8997004032135\n", + "epoch: 432, training loss: 0.532439, training acc: 0.736834, valid loss: 0.533983, valid acc: 0.736432\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.36it/s, accuracy=0.667, cost=0.369]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.45it/s, accuracy=0.706, cost=0.677]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.33it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 433, pass acc: 0.736432, current acc: 0.736469\n", + "time taken: 107.89923453330994\n", + "epoch: 433, training loss: 0.532376, training acc: 0.736871, valid loss: 0.533921, valid acc: 0.736469\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.18it/s, accuracy=0.667, cost=0.368]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.65it/s, accuracy=0.706, cost=0.677]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.29it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 434, pass acc: 0.736469, current acc: 0.736506\n", + "time taken: 107.96008539199829\n", + "epoch: 434, training loss: 0.532313, training acc: 0.736924, valid loss: 0.533859, valid acc: 0.736506\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.49it/s, accuracy=0.667, cost=0.368]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.22it/s, accuracy=0.706, cost=0.677]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.47it/s, accuracy=0.656, cost=0.604]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 435, pass acc: 0.736506, current acc: 0.736551\n", + "time taken: 107.76551628112793\n", + "epoch: 435, training loss: 0.532250, training acc: 0.736983, valid loss: 0.533798, valid acc: 0.736551\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.25it/s, accuracy=0.667, cost=0.368]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.08it/s, accuracy=0.706, cost=0.677]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.38it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 436, pass acc: 0.736551, current acc: 0.736596\n", + "time taken: 107.88819551467896\n", + "epoch: 436, training loss: 0.532187, training acc: 0.737024, valid loss: 0.533737, valid acc: 0.736596\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.30it/s, accuracy=0.667, cost=0.368]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.85it/s, accuracy=0.706, cost=0.676]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.28it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "time taken: 107.88784074783325\n", + "epoch: 437, training loss: 0.532125, training acc: 0.737073, valid loss: 0.533676, valid acc: 0.736588\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.36it/s, accuracy=0.667, cost=0.368]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.34it/s, accuracy=0.706, cost=0.676]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.72it/s, accuracy=0.719, cost=0.541]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 438, pass acc: 0.736596, current acc: 0.736730\n", + "time taken: 107.90718102455139\n", + "epoch: 438, training loss: 0.532062, training acc: 0.737084, valid loss: 0.533615, valid acc: 0.736730\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.56it/s, accuracy=0.667, cost=0.368]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.07it/s, accuracy=0.706, cost=0.676]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.80it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 439, pass acc: 0.736730, current acc: 0.736753\n", + "time taken: 107.74730706214905\n", + "epoch: 439, training loss: 0.532000, training acc: 0.737127, valid loss: 0.533554, valid acc: 0.736753\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.38it/s, accuracy=0.667, cost=0.368]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.77it/s, accuracy=0.706, cost=0.676]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:25, 194.56it/s, accuracy=0.719, cost=0.541]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 440, pass acc: 0.736753, current acc: 0.736782\n", + "time taken: 107.81611132621765\n", + "epoch: 440, training loss: 0.531939, training acc: 0.737135, valid loss: 0.533494, valid acc: 0.736782\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.68it/s, accuracy=0.667, cost=0.367]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.44it/s, accuracy=0.706, cost=0.676]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.63it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 441, pass acc: 0.736782, current acc: 0.736812\n", + "time taken: 107.65632963180542\n", + "epoch: 441, training loss: 0.531877, training acc: 0.737189, valid loss: 0.533433, valid acc: 0.736812\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.42it/s, accuracy=0.667, cost=0.367]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.31it/s, accuracy=0.706, cost=0.676]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.50it/s, accuracy=0.719, cost=0.541]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 442, pass acc: 0.736812, current acc: 0.736879\n", + "time taken: 107.81651878356934\n", + "epoch: 442, training loss: 0.531815, training acc: 0.737217, valid loss: 0.533373, valid acc: 0.736879\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.36it/s, accuracy=0.667, cost=0.367]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.74it/s, accuracy=0.706, cost=0.675]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.44it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 443, pass acc: 0.736879, current acc: 0.736887\n", + "time taken: 107.87040090560913\n", + "epoch: 443, training loss: 0.531754, training acc: 0.737250, valid loss: 0.533313, valid acc: 0.736887\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.39it/s, accuracy=0.667, cost=0.367]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.02it/s, accuracy=0.706, cost=0.675]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:30, 184.32it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 444, pass acc: 0.736887, current acc: 0.736902\n", + "time taken: 107.82911205291748\n", + "epoch: 444, training loss: 0.531693, training acc: 0.737299, valid loss: 0.533254, valid acc: 0.736902\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.38it/s, accuracy=0.667, cost=0.367]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.42it/s, accuracy=0.706, cost=0.675]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.68it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 445, pass acc: 0.736902, current acc: 0.736962\n", + "time taken: 107.79885482788086\n", + "epoch: 445, training loss: 0.531632, training acc: 0.737364, valid loss: 0.533194, valid acc: 0.736962\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.31it/s, accuracy=0.667, cost=0.367]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.01it/s, accuracy=0.706, cost=0.675]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.03it/s, accuracy=0.719, cost=0.541]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 446, pass acc: 0.736962, current acc: 0.737029\n", + "time taken: 107.86731362342834\n", + "epoch: 446, training loss: 0.531571, training acc: 0.737375, valid loss: 0.533134, valid acc: 0.737029\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.51it/s, accuracy=0.667, cost=0.367]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.48it/s, accuracy=0.706, cost=0.675]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.42it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 447, pass acc: 0.737029, current acc: 0.737096\n", + "time taken: 107.77934503555298\n", + "epoch: 447, training loss: 0.531510, training acc: 0.737420, valid loss: 0.533075, valid acc: 0.737096\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.37it/s, accuracy=0.667, cost=0.366]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.14it/s, accuracy=0.706, cost=0.675]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.12it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 448, pass acc: 0.737096, current acc: 0.737148\n", + "time taken: 107.82680344581604\n", + "epoch: 448, training loss: 0.531450, training acc: 0.737459, valid loss: 0.533016, valid acc: 0.737148\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.73it/s, accuracy=0.667, cost=0.366]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.33it/s, accuracy=0.706, cost=0.674]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:28, 190.02it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 449, pass acc: 0.737148, current acc: 0.737215\n", + "time taken: 107.64492607116699\n", + "epoch: 449, training loss: 0.531390, training acc: 0.737504, valid loss: 0.532957, valid acc: 0.737215\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.11it/s, accuracy=0.667, cost=0.366]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.04it/s, accuracy=0.706, cost=0.674]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:25, 194.61it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 450, pass acc: 0.737215, current acc: 0.737305\n", + "time taken: 107.95821928977966\n", + "epoch: 450, training loss: 0.531329, training acc: 0.737560, valid loss: 0.532898, valid acc: 0.737305\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.31it/s, accuracy=0.667, cost=0.366]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.01it/s, accuracy=0.706, cost=0.674]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.18it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 451, pass acc: 0.737305, current acc: 0.737335\n", + "time taken: 107.8673620223999\n", + "epoch: 451, training loss: 0.531269, training acc: 0.737599, valid loss: 0.532840, valid acc: 0.737335\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.31it/s, accuracy=0.667, cost=0.366]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.38it/s, accuracy=0.706, cost=0.674]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:28, 189.54it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 452, pass acc: 0.737335, current acc: 0.737350\n", + "time taken: 107.87758541107178\n", + "epoch: 452, training loss: 0.531210, training acc: 0.737633, valid loss: 0.532782, valid acc: 0.737350\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.67it/s, accuracy=0.667, cost=0.366]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.66it/s, accuracy=0.706, cost=0.674]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.22it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "time taken: 107.73616981506348\n", + "epoch: 453, training loss: 0.531150, training acc: 0.737687, valid loss: 0.532723, valid acc: 0.737342\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.53it/s, accuracy=0.667, cost=0.366]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.36it/s, accuracy=0.706, cost=0.674]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.04it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 454, pass acc: 0.737350, current acc: 0.737417\n", + "time taken: 107.7330687046051\n", + "epoch: 454, training loss: 0.531091, training acc: 0.737691, valid loss: 0.532665, valid acc: 0.737417\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.32it/s, accuracy=0.667, cost=0.365]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.41it/s, accuracy=0.706, cost=0.673]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.02it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 455, pass acc: 0.737417, current acc: 0.737447\n", + "time taken: 107.82673048973083\n", + "epoch: 455, training loss: 0.531031, training acc: 0.737737, valid loss: 0.532607, valid acc: 0.737447\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.61it/s, accuracy=0.667, cost=0.365]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.40it/s, accuracy=0.706, cost=0.673]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.84it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 456, pass acc: 0.737447, current acc: 0.737491\n", + "time taken: 107.69286942481995\n", + "epoch: 456, training loss: 0.530972, training acc: 0.737780, valid loss: 0.532550, valid acc: 0.737491\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.46it/s, accuracy=0.667, cost=0.365]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.43it/s, accuracy=0.706, cost=0.673]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.52it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 457, pass acc: 0.737491, current acc: 0.737551\n", + "time taken: 107.85283374786377\n", + "epoch: 457, training loss: 0.530913, training acc: 0.737834, valid loss: 0.532492, valid acc: 0.737551\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.33it/s, accuracy=0.667, cost=0.365]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.00it/s, accuracy=0.706, cost=0.673]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.22it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 458, pass acc: 0.737551, current acc: 0.737596\n", + "time taken: 107.86071562767029\n", + "epoch: 458, training loss: 0.530855, training acc: 0.737875, valid loss: 0.532435, valid acc: 0.737596\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.57it/s, accuracy=0.667, cost=0.365]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.57it/s, accuracy=0.706, cost=0.673]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.09it/s, accuracy=0.719, cost=0.541]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 459, pass acc: 0.737596, current acc: 0.737671\n", + "time taken: 107.69423413276672\n", + "epoch: 459, training loss: 0.530796, training acc: 0.737937, valid loss: 0.532377, valid acc: 0.737671\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.45it/s, accuracy=0.667, cost=0.365]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.04it/s, accuracy=0.706, cost=0.673]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.03it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 460, pass acc: 0.737671, current acc: 0.737715\n", + "time taken: 107.80216908454895\n", + "epoch: 460, training loss: 0.530737, training acc: 0.738015, valid loss: 0.532320, valid acc: 0.737715\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.43it/s, accuracy=0.667, cost=0.365]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.01it/s, accuracy=0.706, cost=0.672]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.26it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 461, pass acc: 0.737715, current acc: 0.737745\n", + "time taken: 107.81535601615906\n", + "epoch: 461, training loss: 0.530679, training acc: 0.738049, valid loss: 0.532263, valid acc: 0.737745\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.48it/s, accuracy=0.667, cost=0.365]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.44it/s, accuracy=0.706, cost=0.672]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.15it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 462, pass acc: 0.737745, current acc: 0.737768\n", + "time taken: 107.84182572364807\n", + "epoch: 462, training loss: 0.530621, training acc: 0.738082, valid loss: 0.532207, valid acc: 0.737768\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.44it/s, accuracy=0.667, cost=0.364]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.55it/s, accuracy=0.706, cost=0.672]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.06it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 463, pass acc: 0.737768, current acc: 0.737865\n", + "time taken: 107.8542091846466\n", + "epoch: 463, training loss: 0.530563, training acc: 0.738133, valid loss: 0.532150, valid acc: 0.737865\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.36it/s, accuracy=0.667, cost=0.364]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.91it/s, accuracy=0.706, cost=0.672]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 194.07it/s, accuracy=0.719, cost=0.541]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 464, pass acc: 0.737865, current acc: 0.737969\n", + "time taken: 107.82948899269104\n", + "epoch: 464, training loss: 0.530505, training acc: 0.738166, valid loss: 0.532094, valid acc: 0.737969\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.48it/s, accuracy=0.667, cost=0.364]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.22it/s, accuracy=0.706, cost=0.672]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.62it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 465, pass acc: 0.737969, current acc: 0.738044\n", + "time taken: 107.77169370651245\n", + "epoch: 465, training loss: 0.530448, training acc: 0.738204, valid loss: 0.532037, valid acc: 0.738044\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.52it/s, accuracy=0.667, cost=0.364]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.26it/s, accuracy=0.706, cost=0.672]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:28, 190.04it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 466, pass acc: 0.738044, current acc: 0.738074\n", + "time taken: 107.76624774932861\n", + "epoch: 466, training loss: 0.530390, training acc: 0.738235, valid loss: 0.531981, valid acc: 0.738074\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.25it/s, accuracy=0.667, cost=0.364]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 209.61it/s, accuracy=0.706, cost=0.671]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:28, 189.82it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 467, pass acc: 0.738074, current acc: 0.738133\n", + "time taken: 108.02810478210449\n", + "epoch: 467, training loss: 0.530333, training acc: 0.738273, valid loss: 0.531925, valid acc: 0.738133\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.36it/s, accuracy=0.667, cost=0.364]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.83it/s, accuracy=0.706, cost=0.671]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.51it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 468, pass acc: 0.738133, current acc: 0.738230\n", + "time taken: 107.86330103874207\n", + "epoch: 468, training loss: 0.530276, training acc: 0.738276, valid loss: 0.531869, valid acc: 0.738230\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.12it/s, accuracy=0.667, cost=0.364]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.78it/s, accuracy=0.706, cost=0.671]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.89it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 469, pass acc: 0.738230, current acc: 0.738312\n", + "time taken: 107.97641921043396\n", + "epoch: 469, training loss: 0.530219, training acc: 0.738302, valid loss: 0.531814, valid acc: 0.738312\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.37it/s, accuracy=0.667, cost=0.364]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.15it/s, accuracy=0.706, cost=0.671]\n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:28, 189.97it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 470, pass acc: 0.738312, current acc: 0.738417\n", + "time taken: 107.82561540603638\n", + "epoch: 470, training loss: 0.530162, training acc: 0.738362, valid loss: 0.531758, valid acc: 0.738417\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.38it/s, accuracy=0.667, cost=0.363]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.93it/s, accuracy=0.706, cost=0.671]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.65it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 471, pass acc: 0.738417, current acc: 0.738454\n", + "time taken: 107.84345316886902\n", + "epoch: 471, training loss: 0.530105, training acc: 0.738399, valid loss: 0.531703, valid acc: 0.738454\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.21it/s, accuracy=0.667, cost=0.363]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.38it/s, accuracy=0.706, cost=0.671]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.63it/s, accuracy=0.719, cost=0.541]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "time taken: 107.97211694717407\n", + "epoch: 472, training loss: 0.530049, training acc: 0.738433, valid loss: 0.531648, valid acc: 0.738454\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.36it/s, accuracy=0.667, cost=0.363]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.61it/s, accuracy=0.706, cost=0.67] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.43it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 473, pass acc: 0.738454, current acc: 0.738462\n", + "time taken: 107.8833818435669\n", + "epoch: 473, training loss: 0.529992, training acc: 0.738457, valid loss: 0.531593, valid acc: 0.738462\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.22it/s, accuracy=0.667, cost=0.363]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.04it/s, accuracy=0.706, cost=0.67] \n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:30, 185.73it/s, accuracy=0.781, cost=0.531]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 474, pass acc: 0.738462, current acc: 0.738529\n", + "time taken: 107.90632462501526\n", + "epoch: 474, training loss: 0.529936, training acc: 0.738532, valid loss: 0.531538, valid acc: 0.738529\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.34it/s, accuracy=0.667, cost=0.363]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.20it/s, accuracy=0.706, cost=0.67] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:28, 189.82it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 475, pass acc: 0.738529, current acc: 0.738596\n", + "time taken: 107.83423590660095\n", + "epoch: 475, training loss: 0.529880, training acc: 0.738580, valid loss: 0.531483, valid acc: 0.738596\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.44it/s, accuracy=0.667, cost=0.363]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.05it/s, accuracy=0.706, cost=0.67] \n", + "train minibatch loop: 0%| | 19/16751 [00:00<01:28, 188.82it/s, accuracy=0.781, cost=0.531]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 476, pass acc: 0.738596, current acc: 0.738671\n", + "time taken: 107.8056800365448\n", + "epoch: 476, training loss: 0.529824, training acc: 0.738670, valid loss: 0.531428, valid acc: 0.738671\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.43it/s, accuracy=0.667, cost=0.363]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.58it/s, accuracy=0.706, cost=0.67] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:28, 190.05it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 477, pass acc: 0.738671, current acc: 0.738700\n", + "time taken: 107.85232019424438\n", + "epoch: 477, training loss: 0.529768, training acc: 0.738702, valid loss: 0.531374, valid acc: 0.738700\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.33it/s, accuracy=0.667, cost=0.363]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.30it/s, accuracy=0.706, cost=0.67] \n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.10it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 478, pass acc: 0.738700, current acc: 0.738768\n", + "time taken: 107.92780923843384\n", + "epoch: 478, training loss: 0.529713, training acc: 0.738763, valid loss: 0.531320, valid acc: 0.738768\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.11it/s, accuracy=0.667, cost=0.363]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.04it/s, accuracy=0.706, cost=0.669]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 192.77it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 479, pass acc: 0.738768, current acc: 0.738782\n", + "time taken: 107.95703792572021\n", + "epoch: 479, training loss: 0.529657, training acc: 0.738858, valid loss: 0.531266, valid acc: 0.738782\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.50it/s, accuracy=0.667, cost=0.362]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.12it/s, accuracy=0.706, cost=0.669]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.97it/s, accuracy=0.719, cost=0.541]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 480, pass acc: 0.738782, current acc: 0.738805\n", + "time taken: 107.77232909202576\n", + "epoch: 480, training loss: 0.529602, training acc: 0.738896, valid loss: 0.531212, valid acc: 0.738805\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.39it/s, accuracy=0.667, cost=0.362]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.13it/s, accuracy=0.706, cost=0.669]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:28, 189.66it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 481, pass acc: 0.738805, current acc: 0.738820\n", + "time taken: 107.8233892917633\n", + "epoch: 481, training loss: 0.529547, training acc: 0.738946, valid loss: 0.531158, valid acc: 0.738820\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.37it/s, accuracy=0.667, cost=0.362]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.76it/s, accuracy=0.706, cost=0.669]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.30it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 482, pass acc: 0.738820, current acc: 0.738872\n", + "time taken: 107.86444902420044\n", + "epoch: 482, training loss: 0.529492, training acc: 0.738969, valid loss: 0.531104, valid acc: 0.738872\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.53it/s, accuracy=0.667, cost=0.362]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.66it/s, accuracy=0.706, cost=0.669]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:25, 194.67it/s, accuracy=0.719, cost=0.541]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "time taken: 107.79980874061584\n", + "epoch: 483, training loss: 0.529437, training acc: 0.739013, valid loss: 0.531051, valid acc: 0.738857\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.51it/s, accuracy=0.667, cost=0.362]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.16it/s, accuracy=0.706, cost=0.669]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.64it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 484, pass acc: 0.738872, current acc: 0.738879\n", + "time taken: 107.7598979473114\n", + "epoch: 484, training loss: 0.529382, training acc: 0.739051, valid loss: 0.530997, valid acc: 0.738879\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.44it/s, accuracy=0.667, cost=0.362]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.82it/s, accuracy=0.706, cost=0.668]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.48it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 485, pass acc: 0.738879, current acc: 0.738976\n", + "time taken: 107.82730102539062\n", + "epoch: 485, training loss: 0.529327, training acc: 0.739099, valid loss: 0.530944, valid acc: 0.738976\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.48it/s, accuracy=0.667, cost=0.362]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.38it/s, accuracy=0.706, cost=0.668]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 190.36it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 486, pass acc: 0.738976, current acc: 0.739021\n", + "time taken: 107.75405263900757\n", + "epoch: 486, training loss: 0.529273, training acc: 0.739120, valid loss: 0.530891, valid acc: 0.739021\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.59it/s, accuracy=0.667, cost=0.362]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.37it/s, accuracy=0.706, cost=0.668]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.22it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 487, pass acc: 0.739021, current acc: 0.739103\n", + "time taken: 107.80053806304932\n", + "epoch: 487, training loss: 0.529219, training acc: 0.739135, valid loss: 0.530838, valid acc: 0.739103\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.27it/s, accuracy=0.667, cost=0.362]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.77it/s, accuracy=0.706, cost=0.668]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:26, 193.18it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 488, pass acc: 0.739103, current acc: 0.739156\n", + "time taken: 107.90867805480957\n", + "epoch: 488, training loss: 0.529165, training acc: 0.739159, valid loss: 0.530785, valid acc: 0.739156\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.47it/s, accuracy=0.667, cost=0.362]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.72it/s, accuracy=0.706, cost=0.668]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.92it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 489, pass acc: 0.739156, current acc: 0.739171\n", + "time taken: 107.82035303115845\n", + "epoch: 489, training loss: 0.529111, training acc: 0.739200, valid loss: 0.530732, valid acc: 0.739171\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:28<00:00, 190.32it/s, accuracy=0.667, cost=0.361]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.89it/s, accuracy=0.706, cost=0.668]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 192.05it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "time taken: 107.87554788589478\n", + "epoch: 490, training loss: 0.529057, training acc: 0.739200, valid loss: 0.530680, valid acc: 0.739148\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.39it/s, accuracy=0.667, cost=0.361]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 211.16it/s, accuracy=0.706, cost=0.667]\n", + "train minibatch loop: 0%| | 20/16751 [00:00<01:27, 191.79it/s, accuracy=0.656, cost=0.605]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "time taken: 107.81713533401489\n", + "epoch: 491, training loss: 0.529003, training acc: 0.739243, valid loss: 0.530627, valid acc: 0.739156\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 16751/16751 [01:27<00:00, 190.39it/s, accuracy=0.667, cost=0.361]\n", + "test minibatch loop: 100%|██████████| 4188/4188 [00:19<00:00, 210.78it/s, accuracy=0.706, cost=0.667]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "time taken: 107.8524854183197\n", + "epoch: 492, training loss: 0.528949, training acc: 0.739256, valid loss: 0.530575, valid acc: 0.739156\n", + "\n", + "break epoch:493\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "from tqdm import tqdm\n", + "import time\n", + "\n", + "batch_size = 32\n", + "EARLY_STOPPING, CURRENT_CHECKPOINT, CURRENT_ACC, EPOCH = 3, 0, 0, 0\n", + "\n", + "while True:\n", + " lasttime = time.time()\n", + " if CURRENT_CHECKPOINT == EARLY_STOPPING:\n", + " print('break epoch:%d\\n' % (EPOCH))\n", + " break\n", + "\n", + " train_acc, train_loss, test_acc, test_loss = 0, 0, 0, 0\n", + " pbar = tqdm(\n", + " range(0, len(train_X), batch_size), desc = 'train minibatch loop'\n", + " )\n", + " for i in pbar:\n", + " batch_x = bow_chars.transform(train_X[i : min(i + batch_size, len(train_X))])\n", + " batch_x = convert_sparse_matrix_to_sparse_tensor(batch_x)\n", + " batch_y = train_Y[i : min(i + batch_size, len(train_X))]\n", + " batch_x_expand = np.expand_dims(batch_x,axis = 1)\n", + " acc, cost, _, logits = sess.run(\n", + " [model.accuracy, model.cost, model.optimizer, model.logits],\n", + " feed_dict = {\n", + " model.Y: batch_y,\n", + " model.X: batch_x[0],\n", + " model.W: batch_x[1],\n", + " },\n", + " )\n", + " assert not np.isnan(cost)\n", + " train_loss += cost\n", + " train_acc += acc\n", + " pbar.set_postfix(cost = cost, accuracy = acc)\n", + "\n", + " pbar = tqdm(range(0, len(test_X), batch_size), desc = 'test minibatch loop')\n", + " for i in pbar:\n", + " batch_x = bow_chars.transform(test_X[i : min(i + batch_size, len(test_X))])\n", + " batch_x = convert_sparse_matrix_to_sparse_tensor(batch_x)\n", + " batch_y = test_Y[i : min(i + batch_size, len(test_X))]\n", + " batch_x_expand = np.expand_dims(batch_x,axis = 1)\n", + " acc, cost = sess.run(\n", + " [model.accuracy, model.cost],\n", + " feed_dict = {\n", + " model.Y: batch_y,\n", + " model.X: batch_x[0],\n", + " model.W: batch_x[1],\n", + " },\n", + " )\n", + " test_loss += cost\n", + " test_acc += acc\n", + " pbar.set_postfix(cost = cost, accuracy = acc)\n", + "\n", + " train_loss /= len(train_X) / batch_size\n", + " train_acc /= len(train_X) / batch_size\n", + " test_loss /= len(test_X) / batch_size\n", + " test_acc /= len(test_X) / batch_size\n", + "\n", + " if test_acc > CURRENT_ACC:\n", + " print(\n", + " 'epoch: %d, pass acc: %f, current acc: %f'\n", + " % (EPOCH, CURRENT_ACC, test_acc)\n", + " )\n", + " CURRENT_ACC = test_acc\n", + " CURRENT_CHECKPOINT = 0\n", + " else:\n", + " CURRENT_CHECKPOINT += 1\n", + " \n", + " print('time taken:', time.time() - lasttime)\n", + " print(\n", + " 'epoch: %d, training loss: %f, training acc: %f, valid loss: %f, valid acc: %f\\n'\n", + " % (EPOCH, train_loss, train_acc, test_loss, test_acc)\n", + " )\n", + " EPOCH += 1" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "validation minibatch loop: 100%|██████████| 4188/4188 [00:14<00:00, 289.71it/s]\n" + ] + } + ], + "source": [ + "real_Y, predict_Y = [], []\n", + "\n", + "pbar = tqdm(\n", + " range(0, len(test_X), batch_size), desc = 'validation minibatch loop'\n", + ")\n", + "for i in pbar:\n", + " batch_x = bow_chars.transform(test_X[i : min(i + batch_size, len(test_X))])\n", + " batch_x = convert_sparse_matrix_to_sparse_tensor(batch_x)\n", + " batch_y = test_Y[i : min(i + batch_size, len(test_X))]\n", + " predict_Y += np.argmax(\n", + " sess.run(\n", + " model.logits, feed_dict = {model.X: batch_x[0], model.W: batch_x[1], model.Y: batch_y}\n", + " ),\n", + " 1,\n", + " ).tolist()\n", + " real_Y += batch_y" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " precision recall f1-score support\n", + "\n", + " negative 0.75 0.76 0.75 70301\n", + " positive 0.73 0.71 0.72 63700\n", + "\n", + "avg / total 0.74 0.74 0.74 134001\n", + "\n" + ] + } + ], + "source": [ + "print(\n", + " metrics.classification_report(\n", + " real_Y, predict_Y, target_names = ['negative','positive']\n", + " )\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0.7648756 , 0.23512435]], dtype=float32)" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "text = classification_textcleaning('kerajaan sebenarnya sangat sayangkan rakyatnya dan benci')\n", + "transformed = bow_chars.transform([text])\n", + "batch_x = convert_sparse_matrix_to_sparse_tensor(transformed)\n", + "sess.run(tf.nn.softmax(model.logits), feed_dict = {model.X: batch_x[0], model.W: batch_x[1]})" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'fast-text-char/model.ckpt'" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "saver.save(sess, 'fast-text-char/model.ckpt')" + ] + }, + { + "cell_type": "code", + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ @@ -1243,7 +10480,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.2" + "version": "3.6.8" } }, "nbformat": 4, diff --git a/session/sentiment/fast-text.ipynb b/session/sentiment/fast-text.ipynb index 44440045..d0514242 100644 --- a/session/sentiment/fast-text.ipynb +++ b/session/sentiment/fast-text.ipynb @@ -4,16 +4,7 @@ "cell_type": "code", "execution_count": 1, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python3.5/dist-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n", - " \"This module will be removed in 0.20.\", DeprecationWarning)\n" - ] - } - ], + "outputs": [], "source": [ "import re\n", "import numpy as np\n", @@ -22,9 +13,8 @@ "from sklearn import metrics\n", "from sklearn.preprocessing import LabelEncoder\n", "import tensorflow as tf\n", - "from sklearn.cross_validation import train_test_split\n", + "from sklearn.model_selection import train_test_split\n", "from unidecode import unidecode\n", - "from nltk.util import ngrams\n", "from tqdm import tqdm\n", "import time" ] @@ -34,6 +24,565 @@ "execution_count": 2, "metadata": {}, "outputs": [], + "source": [ + "rules_normalizer = {\n", + " 'experience': 'pengalaman',\n", + " 'bagasi': 'bagasi',\n", + " 'kg': 'kampung',\n", + " 'kilo': 'kilogram',\n", + " 'g': 'gram',\n", + " 'grm': 'gram',\n", + " 'k': 'okay',\n", + " 'abgkat': 'abang dekat',\n", + " 'abis': 'habis',\n", + " 'ade': 'ada',\n", + " 'adoi': 'aduh',\n", + " 'adoii': 'aduhh',\n", + " 'aerodarat': 'kapal darat',\n", + " 'agkt': 'angkat',\n", + " 'ahh': 'ah',\n", + " 'ailior': 'air liur',\n", + " 'airasia': 'air asia x',\n", + " 'airasiax': 'penerbangan',\n", + " 'airline': 'penerbangan',\n", + " 'airlines': 'penerbangan',\n", + " 'airport': 'lapangan terbang',\n", + " 'airpot': 'lapangan terbang',\n", + " 'aje': 'sahaja',\n", + " 'ajelah': 'sahajalah',\n", + " 'ajer': 'sahaja',\n", + " 'ak': 'aku',\n", + " 'aq': 'aku',\n", + " 'all': 'semua',\n", + " 'ambik': 'ambil',\n", + " 'amek': 'ambil',\n", + " 'amer': 'amir',\n", + " 'amik': 'ambil',\n", + " 'ana': 'saya',\n", + " 'angkt': 'angkat',\n", + " 'anual': 'tahunan',\n", + " 'apapun': 'apa pun',\n", + " 'ape': 'apa',\n", + " 'arab': 'arab',\n", + " 'area': 'kawasan',\n", + " 'aritu': 'hari itu',\n", + " 'ask': 'tanya',\n", + " 'astro': 'astro',\n", + " 'at': 'pada',\n", + " 'attitude': 'sikap',\n", + " 'babi': 'khinzir',\n", + " 'back': 'belakang',\n", + " 'bag': 'beg',\n", + " 'bang': 'abang',\n", + " 'bangla': 'bangladesh',\n", + " 'banyk': 'banyak',\n", + " 'bard': 'pujangga',\n", + " 'bargasi': 'bagasi',\n", + " 'bawak': 'bawa',\n", + " 'bawanges': 'bawang',\n", + " 'be': 'jadi',\n", + " 'behave': 'berkelakuan baik',\n", + " 'belagak': 'berlagak',\n", + " 'berdisiplin': 'berdisplin',\n", + " 'berenti': 'berhenti',\n", + " 'beskal': 'basikal',\n", + " 'bff': 'rakan karib',\n", + " 'bg': 'bagi',\n", + " 'bgi': 'bagi',\n", + " 'biase': 'biasa',\n", + " 'big': 'besar',\n", + " 'bike': 'basikal',\n", + " 'bile': 'bila',\n", + " 'binawe': 'binatang',\n", + " 'bini': 'isteri',\n", + " 'bkn': 'bukan',\n", + " 'bla': 'bila',\n", + " 'blom': 'belum',\n", + " 'bnyak': 'banyak',\n", + " 'body': 'tubuh',\n", + " 'bole': 'boleh',\n", + " 'boss': 'bos',\n", + " 'bowling': 'boling',\n", + " 'bpe': 'berapa',\n", + " 'brand': 'jenama',\n", + " 'brg': 'barang',\n", + " 'briefing': 'taklimat',\n", + " 'brng': 'barang',\n", + " 'bro': 'abang',\n", + " 'bru': 'baru',\n", + " 'bruntung': 'beruntung',\n", + " 'bsikal': 'basikal',\n", + " 'btnggjwb': 'bertanggungjawab',\n", + " 'btul': 'betul',\n", + " 'buatlh': 'buatlah',\n", + " 'buh': 'letak',\n", + " 'buka': 'buka',\n", + " 'but': 'tetapi',\n", + " 'bwk': 'bawa',\n", + " 'by': 'dengan',\n", + " 'byr': 'bayar',\n", + " 'bz': 'sibuk',\n", + " 'camera': 'kamera',\n", + " 'camni': 'macam ini',\n", + " 'cane': 'macam mana',\n", + " 'cant': 'tak boleh',\n", + " 'carakerja': 'cara kerja',\n", + " 'care': 'jaga',\n", + " 'cargo': 'kargo',\n", + " 'cctv': 'kamera litar tertutup',\n", + " 'celako': 'celaka',\n", + " 'cer': 'cerita',\n", + " 'cheap': 'murah',\n", + " 'check': 'semak',\n", + " 'ciput': 'sedikit',\n", + " 'cite': 'cerita',\n", + " 'citer': 'cerita',\n", + " 'ckit': 'sikit',\n", + " 'ckp': 'cakap',\n", + " 'class': 'kelas',\n", + " 'cm': 'macam',\n", + " 'cmni': 'macam ini',\n", + " 'cmpak': 'campak',\n", + " 'committed': 'komited',\n", + " 'company': 'syarikat',\n", + " 'complain': 'aduan',\n", + " 'corn': 'jagung',\n", + " 'couldnt': 'tak boleh',\n", + " 'cr': 'cari',\n", + " 'crew': 'krew',\n", + " 'cube': 'cuba',\n", + " 'cuma': 'cuma',\n", + " 'curinyaa': 'curinya',\n", + " 'cust': 'pelanggan',\n", + " 'customer': 'pelanggan',\n", + " 'd': 'di',\n", + " 'da': 'dah',\n", + " 'dn': 'dan',\n", + " 'dahh': 'dah',\n", + " 'damaged': 'rosak',\n", + " 'dapek': 'dapat',\n", + " 'day': 'hari',\n", + " 'dazrin': 'dazrin',\n", + " 'dbalingnya': 'dibalingnya',\n", + " 'de': 'ada',\n", + " 'deep': 'dalam',\n", + " 'deliberately': 'sengaja',\n", + " 'depa': 'mereka',\n", + " 'dessa': 'desa',\n", + " 'dgn': 'dengan',\n", + " 'dh': 'dah',\n", + " 'didunia': 'di dunia',\n", + " 'diorang': 'mereka',\n", + " 'diorng': 'mereka',\n", + " 'direct': 'secara terus',\n", + " 'diving': 'junam',\n", + " 'dkt': 'dekat',\n", + " 'dlempar': 'dilempar',\n", + " 'dlm': 'dalam',\n", + " 'dlt': 'padam',\n", + " 'dlu': 'dulu',\n", + " 'done': 'siap',\n", + " 'dont': 'jangan',\n", + " 'dorg': 'mereka',\n", + " 'dpermudhkn': 'dipermudahkan',\n", + " 'dpt': 'dapat',\n", + " 'dr': 'dari',\n", + " 'dri': 'dari',\n", + " 'dsb': 'dan sebagainya',\n", + " 'dy': 'dia',\n", + " 'educate': 'mendidik',\n", + " 'ensure': 'memastikan',\n", + " 'everything': 'semua',\n", + " 'ewahh': 'wah',\n", + " 'expect': 'sangka',\n", + " 'fb': 'facebook',\n", + " 'fired': 'pecat',\n", + " 'first': 'pertama',\n", + " 'fkr': 'fikir',\n", + " 'flight': 'kapal terbang',\n", + " 'for': 'untuk',\n", + " 'free': 'percuma',\n", + " 'friend': 'kawan',\n", + " 'fyi': 'untuk pengetahuan anda',\n", + " 'gantila': 'gantilah',\n", + " 'gantirugi': 'ganti rugi',\n", + " 'gentlemen': 'lelaki budiman',\n", + " 'gerenti': 'jaminan',\n", + " 'gile': 'gila',\n", + " 'gk': 'juga',\n", + " 'gnti': 'ganti',\n", + " 'go': 'pergi',\n", + " 'gomen': 'kerajaan',\n", + " 'goment': 'kerajaan',\n", + " 'good': 'baik',\n", + " 'ground': 'tanah',\n", + " 'guarno': 'macam mana',\n", + " 'hampa': 'mereka',\n", + " 'hampeh': 'teruk',\n", + " 'hanat': 'jahanam',\n", + " 'handle': 'kawal',\n", + " 'handling': 'kawalan',\n", + " 'hanta': 'hantar',\n", + " 'haritu': 'hari itu',\n", + " 'hate': 'benci',\n", + " 'have': 'ada',\n", + " 'hawau': 'celaka',\n", + " 'henpon': 'telefon',\n", + " 'heran': 'hairan',\n", + " 'him': 'dia',\n", + " 'his': 'dia',\n", + " 'hmpa': 'mereka',\n", + " 'hntr': 'hantar',\n", + " 'hotak': 'otak',\n", + " 'hr': 'hari',\n", + " 'i': 'saya',\n", + " 'hrga': 'harga',\n", + " 'hrp': 'harap',\n", + " 'hu': 'sedih',\n", + " 'humble': 'merendah diri',\n", + " 'ibon': 'ikon',\n", + " 'ichi': 'inci',\n", + " 'idung': 'hidung',\n", + " 'if': 'jika',\n", + " 'ig': 'instagram',\n", + " 'iklas': 'ikhlas',\n", + " 'improve': 'menambah baik',\n", + " 'in': 'masuk',\n", + " 'isn t': 'tidak',\n", + " 'isyaallah': 'insyallah',\n", + " 'ja': 'sahaja',\n", + " 'japan': 'jepun',\n", + " 'jd': 'jadi',\n", + " 'je': 'saja',\n", + " 'jee': 'saja',\n", + " 'jek': 'saja',\n", + " 'jepun': 'jepun',\n", + " 'jer': 'saja',\n", + " 'jerr': 'saja',\n", + " 'jez': 'saja',\n", + " 'jg': 'juga',\n", + " 'jgk': 'juga',\n", + " 'jgn': 'jangan',\n", + " 'jgnla': 'janganlah',\n", + " 'jibake': 'celaka',\n", + " 'jjur': 'jujur',\n", + " 'job': 'kerja',\n", + " 'jobscope': 'skop kerja',\n", + " 'jogja': 'jogjakarta',\n", + " 'jpam': 'jpam',\n", + " 'jth': 'jatuh',\n", + " 'jugak': 'juga',\n", + " 'ka': 'ke',\n", + " 'kalo': 'kalau',\n", + " 'kalu': 'kalau',\n", + " 'kang': 'nanti',\n", + " 'kantoi': 'temberang',\n", + " 'kasi': 'beri',\n", + " 'kat': 'dekat',\n", + " 'kbye': 'ok bye',\n", + " 'kearah': 'ke arah',\n", + " 'kecik': 'kecil',\n", + " 'keja': 'kerja',\n", + " 'keje': 'kerja',\n", + " 'kejo': 'kerja',\n", + " 'keksongan': 'kekosongan',\n", + " 'kemana': 'ke mana',\n", + " 'kene': 'kena',\n", + " 'kenekan': 'kenakan',\n", + " 'kesah': 'kisah',\n", + " 'ketempat': 'ke tempat',\n", + " 'kije': 'kerja',\n", + " 'kijo': 'kerja',\n", + " 'kiss': 'cium',\n", + " 'kite': 'kita',\n", + " 'kito': 'kita',\n", + " 'kje': 'kerja',\n", + " 'kjr': 'kerja',\n", + " 'kk': 'okay',\n", + " 'kmi': 'kami',\n", + " 'kt': 'kat',\n", + " 'tlg': 'tolong',\n", + " 'kl': 'kuala lumpur',\n", + " 'klai': 'kalau',\n", + " 'klau': 'kalau',\n", + " 'klia': 'klia',\n", + " 'klo': 'kalau',\n", + " 'klu': 'kalau',\n", + " 'kn': 'kan',\n", + " 'knapa': 'kenapa',\n", + " 'kne': 'kena',\n", + " 'ko': 'kau',\n", + " 'kompom': 'sah',\n", + " 'korang': 'kamu semua',\n", + " 'korea': 'korea',\n", + " 'korg': 'kamu semua',\n", + " 'kot': 'mungkin',\n", + " 'krja': 'kerja',\n", + " 'ksalahan': 'kesalahan',\n", + " 'kta': 'kita',\n", + " 'kuar': 'keluar',\n", + " 'kut': 'mungkin',\n", + " 'la': 'lah',\n", + " 'laa': 'lah',\n", + " 'lahabau': 'celaka',\n", + " 'lahanat': 'celaka',\n", + " 'lainda': 'lain dah',\n", + " 'lak': 'pula',\n", + " 'last': 'akhir',\n", + " 'le': 'lah',\n", + " 'leader': 'ketua',\n", + " 'leave': 'pergi',\n", + " 'ler': 'lah',\n", + " 'less': 'kurang',\n", + " 'letter': 'surat',\n", + " 'lg': 'lagi',\n", + " 'lgi': 'lagi',\n", + " 'lngsong': 'langsung',\n", + " 'lol': 'hehe',\n", + " 'lorr': 'lah',\n", + " 'low': 'rendah',\n", + " 'lps': 'lepas',\n", + " 'luggage': 'bagasi',\n", + " 'lumbe': 'lumba',\n", + " 'lyak': 'layak',\n", + " 'maap': 'maaf',\n", + " 'maapkan': 'maafkan',\n", + " 'mahai': 'mahal',\n", + " 'mampos': 'mampus',\n", + " 'mart': 'kedai',\n", + " 'mau': 'mahu',\n", + " 'mcm': 'macam',\n", + " 'mcmtu': 'macam itu',\n", + " 'memerlukn': 'memerlukan',\n", + " 'mengembirakan': 'menggembirakan',\n", + " 'mengmbilnyer': 'mengambilnya',\n", + " 'mengtasi': 'mengatasi',\n", + " 'mg': 'memang',\n", + " 'mihak': 'memihak',\n", + " 'min': 'admin',\n", + " 'mingu': 'minggu',\n", + " 'mintak': 'minta',\n", + " 'mjtuhkn': 'menjatuhkan',\n", + " 'mkyong': 'mak yong',\n", + " 'mlibatkn': 'melibatkan',\n", + " 'mmg': 'memang',\n", + " 'mmnjang': 'memanjang',\n", + " 'mmpos': 'mampus',\n", + " 'mn': 'mana',\n", + " 'mna': 'mana',\n", + " 'mntak': 'minta',\n", + " 'mntk': 'minta',\n", + " 'mnyusun': 'menyusun',\n", + " 'mood': 'suasana',\n", + " 'most': 'paling',\n", + " 'mr': 'tuan',\n", + " 'msa': 'masa',\n", + " 'msia': 'malaysia',\n", + " 'mst': 'mesti',\n", + " 'mu': 'awak',\n", + " 'much': 'banyak',\n", + " 'muko': 'muka',\n", + " 'mum': 'emak',\n", + " 'n': 'dan',\n", + " 'nah': 'nah',\n", + " 'nanny': 'nenek',\n", + " 'napo': 'kenapa',\n", + " 'nati': 'nanti',\n", + " 'ngan': 'dengan',\n", + " 'ngn': 'dengan',\n", + " 'ni': 'ini',\n", + " 'nie': 'ini',\n", + " 'nii': 'ini',\n", + " 'nk': 'nak',\n", + " 'nmpk': 'nampak',\n", + " 'nye': 'nya',\n", + " 'ofis': 'pejabat',\n", + " 'ohh': 'oh',\n", + " 'oii': 'hoi',\n", + " 'one': 'satu',\n", + " 'online': 'dalam talian',\n", + " 'or': 'atau',\n", + " 'org': 'orang',\n", + " 'orng': 'orang',\n", + " 'otek': 'otak',\n", + " 'p': 'pergi',\n", + " 'paid': 'dah bayar',\n", + " 'palabana': 'kepala otak',\n", + " 'pasni': 'lepas ini',\n", + " 'passengers': 'penumpang',\n", + " 'passengger': 'penumpang',\n", + " 'pastu': 'lepas itu',\n", + " 'pd': 'pada',\n", + " 'pegi': 'pergi',\n", + " 'pekerje': 'pekerja',\n", + " 'pekrja': 'pekerja',\n", + " 'perabih': 'perabis',\n", + " 'perkerja': 'pekerja',\n", + " 'pg': 'pergi',\n", + " 'phuii': 'puih',\n", + " 'pikir': 'fikir',\n", + " 'pilot': 'juruterbang',\n", + " 'pk': 'fikir',\n", + " 'pkerja': 'pekerja',\n", + " 'pkerjaan': 'pekerjaan',\n", + " 'pki': 'pakai',\n", + " 'please': 'tolong',\n", + " 'pls': 'tolong',\n", + " 'pn': 'pun',\n", + " 'pnh': 'pernah',\n", + " 'pnt': 'penat',\n", + " 'pnya': 'punya',\n", + " 'pon': 'pun',\n", + " 'priority': 'keutamaan',\n", + " 'properties': 'harta benda',\n", + " 'ptugas': 'petugas',\n", + " 'pub': 'kelab malam',\n", + " 'pulak': 'pula',\n", + " 'puye': 'punya',\n", + " 'pwrcuma': 'percuma',\n", + " 'pyahnya': 'payahnya',\n", + " 'quality': 'kualiti',\n", + " 'quit': 'keluar',\n", + " 'ramly': 'ramly',\n", + " 'rege': 'harga',\n", + " 'reger': 'harga',\n", + " 'report': 'laporan',\n", + " 'resigned': 'meletakkan jawatan',\n", + " 'respect': 'hormat',\n", + " 'rizal': 'rizal',\n", + " 'rosak': 'rosak',\n", + " 'rosok': 'rosak',\n", + " 'rse': 'rasa',\n", + " 'sacked': 'buang',\n", + " 'sado': 'tegap',\n", + " 'salute': 'sanjung',\n", + " 'sam': 'sama',\n", + " 'same': 'sama',\n", + " 'samp': 'sampah',\n", + " 'sbb': 'sebab',\n", + " 'sbgai': 'sebagai',\n", + " 'sblm': 'sebelum',\n", + " 'sblum': 'sebelum',\n", + " 'sbnarnya': 'sebenarnya',\n", + " 'sbum': 'sebelum',\n", + " 'sdg': 'sedang',\n", + " 'sebb': 'sebab',\n", + " 'sebijik': 'sebiji',\n", + " 'see': 'lihat',\n", + " 'seen': 'dilihat',\n", + " 'selangor': 'selangor',\n", + " 'selfie': 'swafoto',\n", + " 'sempoi': 'cantik',\n", + " 'senaraihitam': 'senarai hitam',\n", + " 'seorg': 'seorang',\n", + " 'service': 'perkhidmatan',\n", + " 'sgt': 'sangat',\n", + " 'shared': 'kongsi',\n", + " 'shirt': 'kemeja',\n", + " 'shut': 'tutup',\n", + " 'sib': 'nasib',\n", + " 'skali': 'sekali',\n", + " 'sket': 'sikit',\n", + " 'sma': 'sama',\n", + " 'smoga': 'semoga',\n", + " 'smpoi': 'cantik',\n", + " 'sndiri': 'sendiri',\n", + " 'sndr': 'sendiri',\n", + " 'sndri': 'sendiri',\n", + " 'sne': 'sana',\n", + " 'so': 'jadi',\n", + " 'sop': 'tatacara pengendalian piawai',\n", + " 'sorang': 'seorang',\n", + " 'spoting': 'pembintikan',\n", + " 'sronok': 'seronok',\n", + " 'ssh': 'susah',\n", + " 'staff': 'staf',\n", + " 'standing': 'berdiri',\n", + " 'start': 'mula',\n", + " 'steady': 'mantap',\n", + " 'stiap': 'setiap',\n", + " 'stress': 'stres',\n", + " 'student': 'pelajar',\n", + " 'study': 'belajar',\n", + " 'studycase': 'kajian kes',\n", + " 'sure': 'pasti',\n", + " 'sykt': 'syarikat',\n", + " 'tah': 'entah',\n", + " 'taik': 'tahi',\n", + " 'takan': 'tak akan',\n", + " 'takat': 'setakat',\n", + " 'takde': 'tak ada',\n", + " 'takkan': 'tak akan',\n", + " 'taknak': 'tak nak',\n", + " 'tang': 'tentang',\n", + " 'tanggungjawab': 'bertanggungjawab',\n", + " 'taraa': 'sementara',\n", + " 'tau': 'tahu',\n", + " 'tbabit': 'terbabit',\n", + " 'team': 'pasukan',\n", + " 'terbaekk': 'terbaik',\n", + " 'teruknye': 'teruknya',\n", + " 'tgk': 'tengok',\n", + " 'that': 'itu',\n", + " 'thinking': 'fikir',\n", + " 'those': 'itu',\n", + " 'time': 'masa',\n", + " 'tk': 'tak',\n", + " 'tnggongjwb': 'tanggungjawab',\n", + " 'tngok': 'tengok',\n", + " 'tngu': 'tunggu',\n", + " 'to': 'kepada',\n", + " 'tosak': 'rosak',\n", + " 'tp': 'tapi',\n", + " 'tpi': 'tapi',\n", + " 'tpon': 'telefon',\n", + " 'transfer': 'pindah',\n", + " 'trgelak': 'tergelak',\n", + " 'ts': 'tan sri',\n", + " 'tstony': 'tan sri tony',\n", + " 'tu': 'itu',\n", + " 'tuh': 'itu',\n", + " 'tula': 'itulah',\n", + " 'umeno': 'umno',\n", + " 'unfortunately': 'malangnya',\n", + " 'unhappy': 'tidak gembira',\n", + " 'up': 'naik',\n", + " 'upkan': 'naikkan',\n", + " 'ur': 'awak',\n", + " 'utk': 'untuk',\n", + " 'very': 'sangat',\n", + " 'viral': 'tular',\n", + " 'vote': 'undi',\n", + " 'warning': 'amaran',\n", + " 'warranty': 'waranti',\n", + " 'wassap': 'whatsapp',\n", + " 'wat': 'apa',\n", + " 'weii': 'wei',\n", + " 'well': 'maklumlah',\n", + " 'win': 'menang',\n", + " 'with': 'dengan',\n", + " 'wt': 'buat',\n", + " 'x': 'tak',\n", + " 'tw': 'tahu',\n", + " 'ye': 'ya',\n", + " 'yee': 'ya',\n", + " 'yg': 'yang',\n", + " 'yng': 'yang',\n", + " 'you': 'awak',\n", + " 'your': 'awak',\n", + " 'sakai': 'selekeh',\n", + " 'rmb': 'billion ringgit',\n", + " 'rmj': 'juta ringgit',\n", + " 'rmk': 'ribu ringgit',\n", + " 'rm': 'ringgit',\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], "source": [ "permulaan = [\n", " 'bel',\n", @@ -56,22 +605,18 @@ "\n", "def naive_stemmer(word):\n", " assert isinstance(word, str), 'input must be a string'\n", - " hujung_result = re.findall(r'^(.*?)(%s)$' % ('|'.join(hujung)), word)\n", - " word = hujung_result[0][0] if len(hujung_result) else word\n", - " permulaan_result = re.findall(r'^(.*?)(%s)' % ('|'.join(permulaan[::-1])), word)\n", - " permulaan_result.extend(re.findall(r'^(.*?)(%s)' % ('|'.join(permulaan)), word))\n", - " mula = permulaan_result if len(permulaan_result) else ''\n", - " if len(mula):\n", - " mula = mula[1][1] if len(mula[1][1]) > len(mula[0][1]) else mula[0][1]\n", - " return word.replace(mula, '')" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ + " hujung_result = [e for e in hujung if word.endswith(e)]\n", + " if len(hujung_result):\n", + " hujung_result = max(hujung_result, key = len)\n", + " if len(hujung_result):\n", + " word = word[: -len(hujung_result)]\n", + " permulaan_result = [e for e in permulaan if word.startswith(e)]\n", + " if len(permulaan_result):\n", + " permulaan_result = max(permulaan_result, key = len)\n", + " if len(permulaan_result):\n", + " word = word[len(permulaan_result) :]\n", + " return word\n", + "\n", "def build_dataset(words, n_words):\n", " count = [['GO', 0], ['PAD', 1], ['EOS', 2], ['UNK', 3]]\n", " counter = collections.Counter(words).most_common(n_words)\n", @@ -101,19 +646,17 @@ " )\n", " string = unidecode(string).replace('.', ' . ').replace(',', ' , ')\n", " string = re.sub('[^A-Za-z ]+', ' ', string)\n", - " string = re.sub(r'[ ]+', ' ', string).strip()\n", - " string = ' '.join(\n", - " [i for i in re.findall('[\\\\w\\']+|[;:\\-\\(\\)&.,!?\"]', string) if len(i)]\n", - " )\n", - " string = string.lower().split()\n", + " string = re.sub(r'[ ]+', ' ', string.lower()).strip()\n", + " string = [rules_normalizer.get(w, w) for w in string.split()]\n", " string = [naive_stemmer(word) for word in string]\n", " return ' '.join([word for word in string if len(word) > 1])\n", "\n", "\n", - "def str_idx(corpus, dic, UNK = 3):\n", - " X = []\n", - " for sentence in corpus:\n", - " X.append([dic[w] if w in dic else UNK for w in sentence.split()[:maxlen]])\n", + "def str_idx(corpus, dic, maxlen, UNK = 3):\n", + " X = np.zeros((len(corpus), maxlen))\n", + " for i in range(len(corpus)):\n", + " for no, k in enumerate(corpus[i].split()[:maxlen][::-1]):\n", + " X[i, -1 - no] = dic.get(k, UNK)\n", " return X" ] }, @@ -121,131 +664,35 @@ "cell_type": "code", "execution_count": 4, "metadata": {}, - "outputs": [], - "source": [ - "def create_ngram_set(input_list, ngram_value):\n", - " return set(zip(*[input_list[i:] for i in range(ngram_value)]))\n", - "\n", - "\n", - "def build_ngram(x_train):\n", - " global max_features\n", - " ngram_set = set()\n", - " for input_list in tqdm(x_train, total = len(x_train), ncols = 70):\n", - " for i in range(2, 3):\n", - " set_of_ngram = create_ngram_set(input_list, ngram_value = i)\n", - " ngram_set.update(set_of_ngram)\n", - " start_index = max_features + 1\n", - " token_indice = {v: k + start_index for k, v in enumerate(ngram_set)}\n", - " indice_token = {token_indice[k]: k for k in token_indice}\n", - "\n", - " max_features = np.max(list(indice_token.keys())) + 1\n", - " return token_indice\n", - "\n", - "\n", - "def add_ngram(sequences, token_indice):\n", - " new_sequences = []\n", - " for input_list in sequences:\n", - " new_list = input_list[:]\n", - " for ngram_value in range(2, ngram_range + 1):\n", - " for i in range(len(new_list) - ngram_value + 1):\n", - " ngram = tuple(new_list[i : i + ngram_value])\n", - " if ngram in token_indice:\n", - " new_list.append(token_indice[ngram])\n", - " new_sequences.append(new_list)\n", - " return new_sequences" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
labeltext
0NegativeLebih-lebih lagi dengan  kemudahan internet da...
1Positiveboleh memberi teguran kepada parti tetapi perl...
2NegativeAdalah membingungkan mengapa masyarakat Cina b...
3PositiveKami menurunkan defisit daripada 6.7 peratus p...
4NegativeIni masalahnya. Bukan rakyat, tetapi sistem
\n", - "
" - ], "text/plain": [ - " label text\n", - "0 Negative Lebih-lebih lagi dengan  kemudahan internet da...\n", - "1 Positive boleh memberi teguran kepada parti tetapi perl...\n", - "2 Negative Adalah membingungkan mengapa masyarakat Cina b...\n", - "3 Positive Kami menurunkan defisit daripada 6.7 peratus p...\n", - "4 Negative Ini masalahnya. Bukan rakyat, tetapi sistem" + "'raja benar sangat benci rakyat minyak naik gala'" ] }, - "execution_count": 5, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df = pd.read_csv('dataset/sentiment-data-v2.csv')\n", - "Y = LabelEncoder().fit_transform(df.label)\n", - "df.head()" + "classification_textcleaning('kerajaan sebenarnya sangat bencikan rakyatnya, minyak naik dan segalanya')" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ - "with open('dataset/polarity-negative-translated.txt','r') as fopen:\n", + "df = pd.read_csv('sentiment-data-v2.csv')\n", + "Y = LabelEncoder().fit_transform(df.label)\n", + "with open('polarity-negative-translated.txt','r') as fopen:\n", " texts = fopen.read().split('\\n')\n", "labels = [0] * len(texts)\n", "\n", - "with open('dataset/polarity-positive-translated.txt','r') as fopen:\n", + "with open('polarity-positive-translated.txt','r') as fopen:\n", " positive_texts = fopen.read().split('\\n')\n", "labels += [1] * len(positive_texts)\n", "texts += positive_texts\n", @@ -257,77 +704,108 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ - "for i in range(len(texts)):\n", - " texts[i] = classification_textcleaning(texts[i])" + "import json\n", + "with open('bm-amazon.json') as fopen:\n", + " amazon = json.load(fopen)\n", + " \n", + "with open('bm-imdb.json') as fopen:\n", + " imdb = json.load(fopen)\n", + " \n", + "with open('bm-yelp.json') as fopen:\n", + " yelp = json.load(fopen)\n", + " \n", + "texts += amazon['negative']\n", + "labels += [0] * len(amazon['negative'])\n", + "texts += amazon['positive']\n", + "labels += [1] * len(amazon['positive'])\n", + "\n", + "texts += imdb['negative']\n", + "labels += [0] * len(imdb['negative'])\n", + "texts += imdb['positive']\n", + "labels += [1] * len(imdb['positive'])\n", + "\n", + "texts += yelp['negative']\n", + "labels += [0] * len(yelp['negative'])\n", + "texts += yelp['positive']\n", + "labels += [1] * len(yelp['positive'])" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "vocab from size: 13325\n", - "Most common words [('yang', 14899), ('tidak', 4588), ('untuk', 4038), ('filem', 3698), ('deng', 3350), ('ada', 3190)]\n", - "Sample data [1343, 196, 178, 98, 98, 126, 351, 4, 90, 210] ['ringkas', 'bodoh', 'bosan', 'kanak', 'kanak', 'lelaki', 'remaja', 'yang', 'begitu', 'muda']\n" - ] - } - ], + "outputs": [], "source": [ - "concat = ' '.join(texts).split()\n", - "vocabulary_size = len(list(set(concat)))\n", - "data, count, dictionary, rev_dictionary = build_dataset(concat, vocabulary_size)\n", - "print('vocab from size: %d'%(vocabulary_size))\n", - "print('Most common words', count[4:10])\n", - "print('Sample data', data[:10], [rev_dictionary[i] for i in data[:10]])" + "import os\n", + "for i in [i for i in os.listdir('negative') if 'Store' not in i]:\n", + " with open('negative/'+i) as fopen:\n", + " a = json.load(fopen)\n", + " texts += a\n", + " labels += [0] * len(a)" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ - "ngram_range = 2\n", - "max_features = len(dictionary)\n", - "maxlen = 80\n", - "batch_size = 32\n", - "embedded_size = 256" + "import os\n", + "for i in [i for i in os.listdir('positive') if 'Store' not in i]:\n", + " with open('positive/'+i) as fopen:\n", + " a = json.load(fopen)\n", + " texts += a\n", + " labels += [1] * len(a)" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ - "idx_trainset = str_idx(texts, dictionary, maxlen)" + "for i in range(len(texts)):\n", + " texts[i] = classification_textcleaning(texts[i])" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "metadata": {}, "outputs": [ { - "name": "stderr", + "name": "stdout", "output_type": "stream", "text": [ - "100%|███████████████████████| 14279/14279 [00:00<00:00, 196651.04it/s]\n" + "vocab from size: 120097\n", + "Most common words [('saya', 533028), ('yang', 204446), ('tidak', 164296), ('untuk', 129707), ('anda', 126091), ('hari', 88975)]\n", + "Sample data [2670, 229, 363, 235, 235, 94, 1358, 5, 78, 678] ['ringkas', 'bodoh', 'bosan', 'kanak', 'kanak', 'lelaki', 'remaja', 'yang', 'begitu', 'muda']\n" ] } ], "source": [ - "token_indice = build_ngram(idx_trainset)\n", - "X = add_ngram(idx_trainset, token_indice)\n", - "X = tf.keras.preprocessing.sequence.pad_sequences(X, maxlen)" + "concat = ' '.join(texts).split()\n", + "vocabulary_size = len(list(set(concat)))\n", + "data, count, dictionary, rev_dictionary = build_dataset(concat, vocabulary_size)\n", + "print('vocab from size: %d'%(vocabulary_size))\n", + "print('Most common words', count[4:10])\n", + "print('Sample data', data[:10], [rev_dictionary[i] for i in data[:10]])" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "max_features = len(dictionary)\n", + "maxlen = 100\n", + "batch_size = 32\n", + "embedded_size = 256" ] }, { @@ -336,7 +814,7 @@ "metadata": {}, "outputs": [], "source": [ - "train_X, test_X, train_Y, test_Y = train_test_split(X, \n", + "train_X, test_X, train_Y, test_Y = train_test_split(texts, \n", " labels,\n", " test_size = 0.2)" ] @@ -405,7 +883,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -424,7 +902,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -438,7 +916,7 @@ " 'logits']" ] }, - "execution_count": 27, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -455,7 +933,7 @@ { "data": { "text/plain": [ - "[,\n", + "[,\n", " ,\n", " ]" ] @@ -478,298 +956,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:12<00:00, 27.75it/s, accuracy=0.613, cost=0.679]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 473.03it/s, accuracy=0.5, cost=0.661] \n", - "train minibatch loop: 1%| | 3/357 [00:00<00:12, 28.37it/s, accuracy=0.594, cost=0.678]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch: 0, pass acc: 0.000000, current acc: 0.618697\n", - "time taken: 13.058606386184692\n", - "epoch: 0, training loss: 0.684708, training acc: 0.559626, valid loss: 0.685112, valid acc: 0.618697\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:12<00:00, 27.97it/s, accuracy=0.71, cost=0.638] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 480.48it/s, accuracy=0.625, cost=0.638]\n", - "train minibatch loop: 1%| | 3/357 [00:00<00:12, 28.19it/s, accuracy=0.625, cost=0.647]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch: 1, pass acc: 0.618697, current acc: 0.671569\n", - "time taken: 12.930449724197388\n", - "epoch: 1, training loss: 0.650780, training acc: 0.665474, valid loss: 0.665154, valid acc: 0.671569\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:12<00:00, 27.97it/s, accuracy=0.839, cost=0.576]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 508.81it/s, accuracy=0.75, cost=0.605] \n", - "train minibatch loop: 1%| | 3/357 [00:00<00:12, 28.02it/s, accuracy=0.688, cost=0.595]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch: 2, pass acc: 0.671569, current acc: 0.697479\n", - "time taken: 12.931367635726929\n", - "epoch: 2, training loss: 0.599222, training acc: 0.759419, valid loss: 0.638151, valid acc: 0.697479\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:12<00:00, 28.09it/s, accuracy=0.871, cost=0.496]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 459.92it/s, accuracy=0.75, cost=0.566] \n", - "train minibatch loop: 1%| | 3/357 [00:00<00:12, 28.34it/s, accuracy=0.875, cost=0.524]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch: 3, pass acc: 0.697479, current acc: 0.706583\n", - "time taken: 12.9458749294281\n", - "epoch: 3, training loss: 0.528589, training acc: 0.828142, valid loss: 0.610143, valid acc: 0.706583\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:12<00:00, 27.84it/s, accuracy=0.935, cost=0.41] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 486.81it/s, accuracy=0.75, cost=0.525] \n", - "train minibatch loop: 1%| | 3/357 [00:00<00:12, 28.28it/s, accuracy=0.938, cost=0.443]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch: 4, pass acc: 0.706583, current acc: 0.721639\n", - "time taken: 12.915259838104248\n", - "epoch: 4, training loss: 0.449895, training acc: 0.876997, valid loss: 0.587408, valid acc: 0.721639\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:12<00:00, 28.01it/s, accuracy=1, cost=0.329] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 451.63it/s, accuracy=0.75, cost=0.486] \n", - "train minibatch loop: 1%| | 3/357 [00:00<00:12, 28.21it/s, accuracy=0.969, cost=0.364]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch: 5, pass acc: 0.721639, current acc: 0.727241\n", - "time taken: 12.944233417510986\n", - "epoch: 5, training loss: 0.374340, training acc: 0.911319, valid loss: 0.571401, valid acc: 0.727241\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:12<00:00, 28.08it/s, accuracy=1, cost=0.26] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 480.98it/s, accuracy=0.75, cost=0.452] \n", - "train minibatch loop: 1%| | 3/357 [00:00<00:12, 28.08it/s, accuracy=1, cost=0.292] " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch: 6, pass acc: 0.727241, current acc: 0.730392\n", - "time taken: 12.933130741119385\n", - "epoch: 6, training loss: 0.307651, training acc: 0.934956, valid loss: 0.561384, valid acc: 0.730392\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:12<00:00, 28.23it/s, accuracy=1, cost=0.203] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 423.80it/s, accuracy=0.875, cost=0.423]\n", - "train minibatch loop: 1%| | 3/357 [00:00<00:12, 28.25it/s, accuracy=1, cost=0.233] " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch: 7, pass acc: 0.730392, current acc: 0.732493\n", - "time taken: 12.946501016616821\n", - "epoch: 7, training loss: 0.251594, training acc: 0.955003, valid loss: 0.556222, valid acc: 0.732493\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:12<00:00, 28.05it/s, accuracy=1, cost=0.159] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 408.76it/s, accuracy=0.875, cost=0.401]\n", - "train minibatch loop: 1%| | 3/357 [00:00<00:12, 28.06it/s, accuracy=1, cost=0.186] " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch: 8, pass acc: 0.732493, current acc: 0.734244\n", - "time taken: 12.982598066329956\n", - "epoch: 8, training loss: 0.205762, training acc: 0.967959, valid loss: 0.554813, valid acc: 0.734244\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:12<00:00, 28.02it/s, accuracy=1, cost=0.125] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 416.58it/s, accuracy=0.75, cost=0.384] \n", - "train minibatch loop: 1%| | 3/357 [00:00<00:12, 28.16it/s, accuracy=1, cost=0.149] " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "time taken: 12.974910020828247\n", - "epoch: 9, training loss: 0.168799, training acc: 0.976976, valid loss: 0.556227, valid acc: 0.732493\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:12<00:00, 27.96it/s, accuracy=1, cost=0.0985] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 462.13it/s, accuracy=0.75, cost=0.372] \n", - "train minibatch loop: 1%| | 3/357 [00:00<00:12, 28.19it/s, accuracy=1, cost=0.121] " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "time taken: 12.919354677200317\n", - "epoch: 10, training loss: 0.139141, training acc: 0.982491, valid loss: 0.559732, valid acc: 0.734244\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:12<00:00, 28.19it/s, accuracy=1, cost=0.0787] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 480.16it/s, accuracy=0.75, cost=0.362] \n", - "train minibatch loop: 1%| | 3/357 [00:00<00:12, 28.15it/s, accuracy=1, cost=0.0984] " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "time taken: 12.946474313735962\n", - "epoch: 11, training loss: 0.115342, training acc: 0.986431, valid loss: 0.564780, valid acc: 0.733543\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:12<00:00, 28.08it/s, accuracy=1, cost=0.0635] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 509.44it/s, accuracy=0.75, cost=0.355] \n", - "train minibatch loop: 1%| | 3/357 [00:00<00:12, 27.85it/s, accuracy=1, cost=0.0811]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch: 12, pass acc: 0.734244, current acc: 0.734594\n", - "time taken: 12.918270587921143\n", - "epoch: 12, training loss: 0.096186, training acc: 0.989407, valid loss: 0.570980, valid acc: 0.734594\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:12<00:00, 28.14it/s, accuracy=1, cost=0.0517] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 471.92it/s, accuracy=0.75, cost=0.35] \n", - "train minibatch loop: 1%| | 3/357 [00:00<00:12, 28.45it/s, accuracy=1, cost=0.0675]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "time taken: 12.941154479980469\n", - "epoch: 13, training loss: 0.080692, training acc: 0.991946, valid loss: 0.578069, valid acc: 0.733894\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:12<00:00, 28.07it/s, accuracy=1, cost=0.0424] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 422.17it/s, accuracy=0.875, cost=0.346]\n", - "train minibatch loop: 1%| | 3/357 [00:00<00:12, 28.39it/s, accuracy=1, cost=0.0567]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch: 14, pass acc: 0.734594, current acc: 0.736345\n", - "time taken: 12.950959205627441\n", - "epoch: 14, training loss: 0.068087, training acc: 0.993609, valid loss: 0.585878, valid acc: 0.736345\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:12<00:00, 28.15it/s, accuracy=1, cost=0.0351] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 488.96it/s, accuracy=0.875, cost=0.344]\n", - "train minibatch loop: 1%| | 3/357 [00:00<00:12, 28.05it/s, accuracy=1, cost=0.048] " + "train minibatch loop: 100%|██████████| 16876/16876 [08:00<00:00, 35.16it/s, accuracy=0.778, cost=0.409]\n", + "test minibatch loop: 100%|██████████| 4219/4219 [00:17<00:00, 243.38it/s, accuracy=0.897, cost=0.376]\n", + "train minibatch loop: 0%| | 4/16876 [00:00<07:45, 36.22it/s, accuracy=0.75, cost=0.425] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 12.926128149032593\n", - "epoch: 15, training loss: 0.057771, training acc: 0.995098, valid loss: 0.594289, valid acc: 0.736345\n", + "epoch: 0, pass acc: 0.000000, current acc: 0.769784\n", + "time taken: 497.35496950149536\n", + "epoch: 0, training loss: 0.542805, training acc: 0.738057, valid loss: 0.501338, valid acc: 0.769784\n", "\n" ] }, @@ -777,18 +975,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:12<00:00, 28.06it/s, accuracy=1, cost=0.0291] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 490.58it/s, accuracy=0.875, cost=0.342]\n", - "train minibatch loop: 1%| | 3/357 [00:00<00:12, 27.70it/s, accuracy=1, cost=0.0409]" + "train minibatch loop: 100%|██████████| 16876/16876 [07:59<00:00, 35.21it/s, accuracy=0.778, cost=0.403]\n", + "test minibatch loop: 100%|██████████| 4219/4219 [00:17<00:00, 242.70it/s, accuracy=0.931, cost=0.364]\n", + "train minibatch loop: 0%| | 4/16876 [00:00<07:41, 36.53it/s, accuracy=0.844, cost=0.386]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 16, pass acc: 0.736345, current acc: 0.738445\n", - "time taken: 12.923779964447021\n", - "epoch: 16, training loss: 0.049276, training acc: 0.996148, valid loss: 0.603219, valid acc: 0.738445\n", + "epoch: 1, pass acc: 0.769784, current acc: 0.774355\n", + "time taken: 496.7516872882843\n", + "epoch: 1, training loss: 0.494608, training acc: 0.774124, valid loss: 0.494465, valid acc: 0.774355\n", "\n" ] }, @@ -796,17 +994,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:12<00:00, 28.08it/s, accuracy=1, cost=0.0243] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 462.14it/s, accuracy=0.875, cost=0.342]\n", - "train minibatch loop: 1%| | 3/357 [00:00<00:12, 27.78it/s, accuracy=1, cost=0.0351]" + "train minibatch loop: 100%|██████████| 16876/16876 [08:01<00:00, 35.52it/s, accuracy=0.778, cost=0.401]\n", + "test minibatch loop: 100%|██████████| 4219/4219 [00:17<00:00, 243.54it/s, accuracy=0.897, cost=0.364]\n", + "train minibatch loop: 0%| | 4/16876 [00:00<07:55, 35.47it/s, accuracy=0.812, cost=0.373]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 12.94113302230835\n", - "epoch: 17, training loss: 0.042238, training acc: 0.997024, valid loss: 0.612601, valid acc: 0.737745\n", + "epoch: 2, pass acc: 0.774355, current acc: 0.774910\n", + "time taken: 498.412406206131\n", + "epoch: 2, training loss: 0.485827, training acc: 0.779785, valid loss: 0.493076, valid acc: 0.774910\n", "\n" ] }, @@ -814,18 +1013,17 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:12<00:00, 27.69it/s, accuracy=1, cost=0.0204] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 494.72it/s, accuracy=0.875, cost=0.343]\n", - "train minibatch loop: 1%| | 3/357 [00:00<00:12, 28.07it/s, accuracy=1, cost=0.0303]" + "train minibatch loop: 100%|██████████| 16876/16876 [08:01<00:00, 33.80it/s, accuracy=0.778, cost=0.399]\n", + "test minibatch loop: 100%|██████████| 4219/4219 [00:17<00:00, 240.68it/s, accuracy=0.897, cost=0.365]\n", + "train minibatch loop: 0%| | 4/16876 [00:00<08:09, 34.50it/s, accuracy=0.781, cost=0.364]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 18, pass acc: 0.738445, current acc: 0.739846\n", - "time taken: 12.922403812408447\n", - "epoch: 18, training loss: 0.036372, training acc: 0.997286, valid loss: 0.622383, valid acc: 0.739846\n", + "time taken: 499.4243206977844\n", + "epoch: 3, training loss: 0.480371, training acc: 0.783229, valid loss: 0.493079, valid acc: 0.774569\n", "\n" ] }, @@ -833,17 +1031,17 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:12<00:00, 27.73it/s, accuracy=1, cost=0.0172] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 499.13it/s, accuracy=0.875, cost=0.346]\n", - "train minibatch loop: 1%| | 3/357 [00:00<00:12, 28.05it/s, accuracy=1, cost=0.0262]" + "train minibatch loop: 100%|██████████| 16876/16876 [07:58<00:00, 35.25it/s, accuracy=0.778, cost=0.398]\n", + "test minibatch loop: 100%|██████████| 4219/4219 [00:17<00:00, 240.23it/s, accuracy=0.897, cost=0.367]\n", + "train minibatch loop: 0%| | 4/16876 [00:00<07:31, 37.39it/s, accuracy=0.812, cost=0.428]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 12.930727005004883\n", - "epoch: 19, training loss: 0.031456, training acc: 0.997549, valid loss: 0.632524, valid acc: 0.739496\n", + "time taken: 496.38273072242737\n", + "epoch: 4, training loss: 0.476212, training acc: 0.785920, valid loss: 0.493670, valid acc: 0.774784\n", "\n" ] }, @@ -851,53 +1049,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:12<00:00, 27.85it/s, accuracy=1, cost=0.0145] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 485.74it/s, accuracy=0.875, cost=0.348]\n", - "train minibatch loop: 1%| | 3/357 [00:00<00:12, 28.31it/s, accuracy=1, cost=0.0228]" + "train minibatch loop: 100%|██████████| 16876/16876 [08:00<00:00, 35.13it/s, accuracy=0.778, cost=0.397]\n", + "test minibatch loop: 100%|██████████| 4219/4219 [00:17<00:00, 241.52it/s, accuracy=0.897, cost=0.369]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 12.936310291290283\n", - "epoch: 20, training loss: 0.027314, training acc: 0.997899, valid loss: 0.642995, valid acc: 0.737045\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:12<00:00, 28.12it/s, accuracy=1, cost=0.0123] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 471.60it/s, accuracy=0.875, cost=0.352]\n", - "train minibatch loop: 1%| | 3/357 [00:00<00:12, 27.84it/s, accuracy=1, cost=0.0199]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "time taken: 12.928076267242432\n", - "epoch: 21, training loss: 0.023805, training acc: 0.998249, valid loss: 0.653774, valid acc: 0.735994\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:12<00:00, 28.17it/s, accuracy=1, cost=0.0105] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 482.40it/s, accuracy=0.875, cost=0.357]\n", - "train minibatch loop: 1%| | 3/357 [00:00<00:12, 28.22it/s, accuracy=1, cost=0.0174]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "time taken: 12.905269861221313\n", - "epoch: 22, training loss: 0.020820, training acc: 0.998424, valid loss: 0.664847, valid acc: 0.737045\n", + "time taken: 497.81911396980286\n", + "epoch: 5, training loss: 0.472773, training acc: 0.788124, valid loss: 0.494566, valid acc: 0.774362\n", + "\n", + "break epoch:6\n", "\n" ] }, @@ -905,34 +1068,15 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [00:12<00:00, 28.17it/s, accuracy=1, cost=0.00891] \n", - "test minibatch loop: 100%|██████████| 90/90 [00:00<00:00, 479.03it/s, accuracy=0.875, cost=0.362]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "time taken: 12.916682958602905\n", - "epoch: 23, training loss: 0.018268, training acc: 0.998687, valid loss: 0.676207, valid acc: 0.736695\n", - "\n", - "break epoch:24\n", "\n" ] - }, - { - "data": { - "text/plain": [ - "'fast-text/model.ckpt'" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ - "EARLY_STOPPING, CURRENT_CHECKPOINT, CURRENT_ACC, EPOCH = 5, 0, 0, 0\n", + "from tqdm import tqdm\n", + "import time\n", + "\n", + "EARLY_STOPPING, CURRENT_CHECKPOINT, CURRENT_ACC, EPOCH = 3, 0, 0, 0\n", "\n", "while True:\n", " lasttime = time.time()\n", @@ -945,13 +1089,14 @@ " range(0, len(train_X), batch_size), desc = 'train minibatch loop'\n", " )\n", " for i in pbar:\n", - " batch_x = train_X[i : min(i + batch_size, train_X.shape[0])]\n", - " batch_y = train_Y[i : min(i + batch_size, train_X.shape[0])]\n", + " batch_x = str_idx(train_X[i : min(i + batch_size, len(train_X))], dictionary, maxlen)\n", + " batch_y = train_Y[i : min(i + batch_size, len(train_X))]\n", + " batch_x_expand = np.expand_dims(batch_x,axis = 1)\n", " acc, cost, _ = sess.run(\n", " [model.accuracy, model.cost, model.optimizer],\n", " feed_dict = {\n", - " model.X: batch_x,\n", - " model.Y: batch_y\n", + " model.Y: batch_y,\n", + " model.X: batch_x\n", " },\n", " )\n", " assert not np.isnan(cost)\n", @@ -961,14 +1106,14 @@ "\n", " pbar = tqdm(range(0, len(test_X), batch_size), desc = 'test minibatch loop')\n", " for i in pbar:\n", - " batch_x = test_X[i : min(i + batch_size, test_X.shape[0])]\n", - " batch_y = test_Y[i : min(i + batch_size, test_X.shape[0])]\n", + " batch_x = str_idx(test_X[i : min(i + batch_size, len(test_X))], dictionary, maxlen)\n", + " batch_y = test_Y[i : min(i + batch_size, len(test_X))]\n", " batch_x_expand = np.expand_dims(batch_x,axis = 1)\n", " acc, cost = sess.run(\n", " [model.accuracy, model.cost],\n", " feed_dict = {\n", - " model.X: batch_x,\n", - " model.Y: batch_y\n", + " model.Y: batch_y,\n", + " model.X: batch_x\n", " },\n", " )\n", " test_loss += cost\n", @@ -989,15 +1134,13 @@ " CURRENT_CHECKPOINT = 0\n", " else:\n", " CURRENT_CHECKPOINT += 1\n", - "\n", + " \n", " print('time taken:', time.time() - lasttime)\n", " print(\n", " 'epoch: %d, training loss: %f, training acc: %f, valid loss: %f, valid acc: %f\\n'\n", " % (EPOCH, train_loss, train_acc, test_loss, test_acc)\n", " )\n", - " EPOCH += 1\n", - "\n", - "saver.save(sess, \"fast-text/model.ckpt\")" + " EPOCH += 1" ] }, { @@ -1006,26 +1149,29 @@ "metadata": {}, "outputs": [ { - "name": "stdout", + "name": "stderr", "output_type": "stream", "text": [ - " precision recall f1-score support\n", - "\n", - " negative 0.69 0.71 0.70 1261\n", - " positive 0.77 0.74 0.75 1595\n", - "\n", - "avg / total 0.73 0.73 0.73 2856\n", - "\n" + "validation minibatch loop: 100%|██████████| 4219/4219 [00:07<00:00, 539.93it/s]\n" ] } ], "source": [ - "logits = sess.run(model.logits, feed_dict = {model.X: test_X})\n", - "print(\n", - " metrics.classification_report(\n", - " test_Y, np.argmax(logits, 1), target_names = ['negative', 'positive']\n", - " )\n", - ")" + "real_Y, predict_Y = [], []\n", + "\n", + "pbar = tqdm(\n", + " range(0, len(test_X), batch_size), desc = 'validation minibatch loop'\n", + ")\n", + "for i in pbar:\n", + " batch_x = str_idx(test_X[i : min(i + batch_size, len(test_X))], dictionary, maxlen)\n", + " batch_y = test_Y[i : min(i + batch_size, len(test_X))]\n", + " predict_Y += np.argmax(\n", + " sess.run(\n", + " model.logits, feed_dict = {model.X: batch_x, model.Y: batch_y}\n", + " ),\n", + " 1,\n", + " ).tolist()\n", + " real_Y += batch_y" ] }, { @@ -1036,7 +1182,7 @@ { "data": { "text/plain": [ - "array([[0.99185514, 0.00814484]], dtype=float32)" + "'fast-text/model.ckpt'" ] }, "execution_count": 20, @@ -1045,9 +1191,7 @@ } ], "source": [ - "text = 'kerajaan sebenarnya sangat bencikan rakyatnya, minyak naik dan segalanya'\n", - "new_vector = add_ngram(str_idx([classification_textcleaning(text)], dictionary), token_indice)\n", - "sess.run(tf.nn.softmax(model.logits), feed_dict={model.X:new_vector})" + "saver.save(sess, 'fast-text/model.ckpt')" ] }, { @@ -1056,20 +1200,27 @@ "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "array([[4.792639e-07, 9.999995e-01]], dtype=float32)" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + " precision recall f1-score support\n", + "\n", + " negative 0.79 0.78 0.78 70568\n", + " positive 0.76 0.77 0.77 64437\n", + "\n", + " micro avg 0.77 0.77 0.77 135005\n", + " macro avg 0.77 0.77 0.77 135005\n", + "weighted avg 0.77 0.77 0.77 135005\n", + "\n" + ] } ], "source": [ - "text = 'kerajaan sebenarnya sangat sayangkan rakyatnya'\n", - "new_vector = add_ngram(str_idx([classification_textcleaning(text)], dictionary), token_indice)\n", - "sess.run(tf.nn.softmax(model.logits), feed_dict={model.X:new_vector})" + "print(\n", + " metrics.classification_report(\n", + " real_Y, predict_Y, target_names = ['negative', 'positive']\n", + " )\n", + ")" ] }, { @@ -1080,7 +1231,7 @@ { "data": { "text/plain": [ - "array([[0.97588885, 0.02411108]], dtype=float32)" + "array([[9.9983239e-01, 1.6761805e-04]], dtype=float32)" ] }, "execution_count": 22, @@ -1089,8 +1240,8 @@ } ], "source": [ - "text = 'kerajaan sebenarnya sangat sayangkan rakyatnya, tetapi sebenarnya benci'\n", - "new_vector = add_ngram(str_idx([classification_textcleaning(text)],dictionary), token_indice)\n", + "text = 'kerajaan sebenarnya sangat bencikan rakyatnya, minyak naik dan segalanya'\n", + "new_vector = str_idx([classification_textcleaning(text)], dictionary, len(text.split()))\n", "sess.run(tf.nn.softmax(model.logits), feed_dict={model.X:new_vector})" ] }, @@ -1142,7 +1293,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 25, "metadata": {}, "outputs": [ { @@ -1162,7 +1313,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 26, "metadata": {}, "outputs": [], "source": [ @@ -1177,7 +1328,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 27, "metadata": {}, "outputs": [ { @@ -1191,10 +1342,10 @@ { "data": { "text/plain": [ - "array([[0.97588885, 0.02411108]], dtype=float32)" + "array([[9.9983239e-01, 1.6761805e-04]], dtype=float32)" ] }, - "execution_count": 31, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -1207,17 +1358,6 @@ "test_sess.run(tf.nn.softmax(logits), feed_dict = {x: new_vector})" ] }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "import pickle\n", - "with open('token-indice.pkl','wb') as fopen:\n", - " pickle.dump(token_indice, fopen)" - ] - }, { "cell_type": "code", "execution_count": null, diff --git a/session/sentiment/hierarchical.ipynb b/session/sentiment/hierarchical.ipynb index cd546b73..817fae63 100644 --- a/session/sentiment/hierarchical.ipynb +++ b/session/sentiment/hierarchical.ipynb @@ -4,16 +4,7 @@ "cell_type": "code", "execution_count": 1, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python3.5/dist-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n", - " \"This module will be removed in 0.20.\", DeprecationWarning)\n" - ] - } - ], + "outputs": [], "source": [ "import re\n", "import numpy as np\n", @@ -22,9 +13,8 @@ "from sklearn import metrics\n", "from sklearn.preprocessing import LabelEncoder\n", "import tensorflow as tf\n", - "from sklearn.cross_validation import train_test_split\n", + "from sklearn.model_selection import train_test_split\n", "from unidecode import unidecode\n", - "from nltk.util import ngrams\n", "from tqdm import tqdm\n", "import time" ] @@ -34,6 +24,565 @@ "execution_count": 2, "metadata": {}, "outputs": [], + "source": [ + "rules_normalizer = {\n", + " 'experience': 'pengalaman',\n", + " 'bagasi': 'bagasi',\n", + " 'kg': 'kampung',\n", + " 'kilo': 'kilogram',\n", + " 'g': 'gram',\n", + " 'grm': 'gram',\n", + " 'k': 'okay',\n", + " 'abgkat': 'abang dekat',\n", + " 'abis': 'habis',\n", + " 'ade': 'ada',\n", + " 'adoi': 'aduh',\n", + " 'adoii': 'aduhh',\n", + " 'aerodarat': 'kapal darat',\n", + " 'agkt': 'angkat',\n", + " 'ahh': 'ah',\n", + " 'ailior': 'air liur',\n", + " 'airasia': 'air asia x',\n", + " 'airasiax': 'penerbangan',\n", + " 'airline': 'penerbangan',\n", + " 'airlines': 'penerbangan',\n", + " 'airport': 'lapangan terbang',\n", + " 'airpot': 'lapangan terbang',\n", + " 'aje': 'sahaja',\n", + " 'ajelah': 'sahajalah',\n", + " 'ajer': 'sahaja',\n", + " 'ak': 'aku',\n", + " 'aq': 'aku',\n", + " 'all': 'semua',\n", + " 'ambik': 'ambil',\n", + " 'amek': 'ambil',\n", + " 'amer': 'amir',\n", + " 'amik': 'ambil',\n", + " 'ana': 'saya',\n", + " 'angkt': 'angkat',\n", + " 'anual': 'tahunan',\n", + " 'apapun': 'apa pun',\n", + " 'ape': 'apa',\n", + " 'arab': 'arab',\n", + " 'area': 'kawasan',\n", + " 'aritu': 'hari itu',\n", + " 'ask': 'tanya',\n", + " 'astro': 'astro',\n", + " 'at': 'pada',\n", + " 'attitude': 'sikap',\n", + " 'babi': 'khinzir',\n", + " 'back': 'belakang',\n", + " 'bag': 'beg',\n", + " 'bang': 'abang',\n", + " 'bangla': 'bangladesh',\n", + " 'banyk': 'banyak',\n", + " 'bard': 'pujangga',\n", + " 'bargasi': 'bagasi',\n", + " 'bawak': 'bawa',\n", + " 'bawanges': 'bawang',\n", + " 'be': 'jadi',\n", + " 'behave': 'berkelakuan baik',\n", + " 'belagak': 'berlagak',\n", + " 'berdisiplin': 'berdisplin',\n", + " 'berenti': 'berhenti',\n", + " 'beskal': 'basikal',\n", + " 'bff': 'rakan karib',\n", + " 'bg': 'bagi',\n", + " 'bgi': 'bagi',\n", + " 'biase': 'biasa',\n", + " 'big': 'besar',\n", + " 'bike': 'basikal',\n", + " 'bile': 'bila',\n", + " 'binawe': 'binatang',\n", + " 'bini': 'isteri',\n", + " 'bkn': 'bukan',\n", + " 'bla': 'bila',\n", + " 'blom': 'belum',\n", + " 'bnyak': 'banyak',\n", + " 'body': 'tubuh',\n", + " 'bole': 'boleh',\n", + " 'boss': 'bos',\n", + " 'bowling': 'boling',\n", + " 'bpe': 'berapa',\n", + " 'brand': 'jenama',\n", + " 'brg': 'barang',\n", + " 'briefing': 'taklimat',\n", + " 'brng': 'barang',\n", + " 'bro': 'abang',\n", + " 'bru': 'baru',\n", + " 'bruntung': 'beruntung',\n", + " 'bsikal': 'basikal',\n", + " 'btnggjwb': 'bertanggungjawab',\n", + " 'btul': 'betul',\n", + " 'buatlh': 'buatlah',\n", + " 'buh': 'letak',\n", + " 'buka': 'buka',\n", + " 'but': 'tetapi',\n", + " 'bwk': 'bawa',\n", + " 'by': 'dengan',\n", + " 'byr': 'bayar',\n", + " 'bz': 'sibuk',\n", + " 'camera': 'kamera',\n", + " 'camni': 'macam ini',\n", + " 'cane': 'macam mana',\n", + " 'cant': 'tak boleh',\n", + " 'carakerja': 'cara kerja',\n", + " 'care': 'jaga',\n", + " 'cargo': 'kargo',\n", + " 'cctv': 'kamera litar tertutup',\n", + " 'celako': 'celaka',\n", + " 'cer': 'cerita',\n", + " 'cheap': 'murah',\n", + " 'check': 'semak',\n", + " 'ciput': 'sedikit',\n", + " 'cite': 'cerita',\n", + " 'citer': 'cerita',\n", + " 'ckit': 'sikit',\n", + " 'ckp': 'cakap',\n", + " 'class': 'kelas',\n", + " 'cm': 'macam',\n", + " 'cmni': 'macam ini',\n", + " 'cmpak': 'campak',\n", + " 'committed': 'komited',\n", + " 'company': 'syarikat',\n", + " 'complain': 'aduan',\n", + " 'corn': 'jagung',\n", + " 'couldnt': 'tak boleh',\n", + " 'cr': 'cari',\n", + " 'crew': 'krew',\n", + " 'cube': 'cuba',\n", + " 'cuma': 'cuma',\n", + " 'curinyaa': 'curinya',\n", + " 'cust': 'pelanggan',\n", + " 'customer': 'pelanggan',\n", + " 'd': 'di',\n", + " 'da': 'dah',\n", + " 'dn': 'dan',\n", + " 'dahh': 'dah',\n", + " 'damaged': 'rosak',\n", + " 'dapek': 'dapat',\n", + " 'day': 'hari',\n", + " 'dazrin': 'dazrin',\n", + " 'dbalingnya': 'dibalingnya',\n", + " 'de': 'ada',\n", + " 'deep': 'dalam',\n", + " 'deliberately': 'sengaja',\n", + " 'depa': 'mereka',\n", + " 'dessa': 'desa',\n", + " 'dgn': 'dengan',\n", + " 'dh': 'dah',\n", + " 'didunia': 'di dunia',\n", + " 'diorang': 'mereka',\n", + " 'diorng': 'mereka',\n", + " 'direct': 'secara terus',\n", + " 'diving': 'junam',\n", + " 'dkt': 'dekat',\n", + " 'dlempar': 'dilempar',\n", + " 'dlm': 'dalam',\n", + " 'dlt': 'padam',\n", + " 'dlu': 'dulu',\n", + " 'done': 'siap',\n", + " 'dont': 'jangan',\n", + " 'dorg': 'mereka',\n", + " 'dpermudhkn': 'dipermudahkan',\n", + " 'dpt': 'dapat',\n", + " 'dr': 'dari',\n", + " 'dri': 'dari',\n", + " 'dsb': 'dan sebagainya',\n", + " 'dy': 'dia',\n", + " 'educate': 'mendidik',\n", + " 'ensure': 'memastikan',\n", + " 'everything': 'semua',\n", + " 'ewahh': 'wah',\n", + " 'expect': 'sangka',\n", + " 'fb': 'facebook',\n", + " 'fired': 'pecat',\n", + " 'first': 'pertama',\n", + " 'fkr': 'fikir',\n", + " 'flight': 'kapal terbang',\n", + " 'for': 'untuk',\n", + " 'free': 'percuma',\n", + " 'friend': 'kawan',\n", + " 'fyi': 'untuk pengetahuan anda',\n", + " 'gantila': 'gantilah',\n", + " 'gantirugi': 'ganti rugi',\n", + " 'gentlemen': 'lelaki budiman',\n", + " 'gerenti': 'jaminan',\n", + " 'gile': 'gila',\n", + " 'gk': 'juga',\n", + " 'gnti': 'ganti',\n", + " 'go': 'pergi',\n", + " 'gomen': 'kerajaan',\n", + " 'goment': 'kerajaan',\n", + " 'good': 'baik',\n", + " 'ground': 'tanah',\n", + " 'guarno': 'macam mana',\n", + " 'hampa': 'mereka',\n", + " 'hampeh': 'teruk',\n", + " 'hanat': 'jahanam',\n", + " 'handle': 'kawal',\n", + " 'handling': 'kawalan',\n", + " 'hanta': 'hantar',\n", + " 'haritu': 'hari itu',\n", + " 'hate': 'benci',\n", + " 'have': 'ada',\n", + " 'hawau': 'celaka',\n", + " 'henpon': 'telefon',\n", + " 'heran': 'hairan',\n", + " 'him': 'dia',\n", + " 'his': 'dia',\n", + " 'hmpa': 'mereka',\n", + " 'hntr': 'hantar',\n", + " 'hotak': 'otak',\n", + " 'hr': 'hari',\n", + " 'i': 'saya',\n", + " 'hrga': 'harga',\n", + " 'hrp': 'harap',\n", + " 'hu': 'sedih',\n", + " 'humble': 'merendah diri',\n", + " 'ibon': 'ikon',\n", + " 'ichi': 'inci',\n", + " 'idung': 'hidung',\n", + " 'if': 'jika',\n", + " 'ig': 'instagram',\n", + " 'iklas': 'ikhlas',\n", + " 'improve': 'menambah baik',\n", + " 'in': 'masuk',\n", + " 'isn t': 'tidak',\n", + " 'isyaallah': 'insyallah',\n", + " 'ja': 'sahaja',\n", + " 'japan': 'jepun',\n", + " 'jd': 'jadi',\n", + " 'je': 'saja',\n", + " 'jee': 'saja',\n", + " 'jek': 'saja',\n", + " 'jepun': 'jepun',\n", + " 'jer': 'saja',\n", + " 'jerr': 'saja',\n", + " 'jez': 'saja',\n", + " 'jg': 'juga',\n", + " 'jgk': 'juga',\n", + " 'jgn': 'jangan',\n", + " 'jgnla': 'janganlah',\n", + " 'jibake': 'celaka',\n", + " 'jjur': 'jujur',\n", + " 'job': 'kerja',\n", + " 'jobscope': 'skop kerja',\n", + " 'jogja': 'jogjakarta',\n", + " 'jpam': 'jpam',\n", + " 'jth': 'jatuh',\n", + " 'jugak': 'juga',\n", + " 'ka': 'ke',\n", + " 'kalo': 'kalau',\n", + " 'kalu': 'kalau',\n", + " 'kang': 'nanti',\n", + " 'kantoi': 'temberang',\n", + " 'kasi': 'beri',\n", + " 'kat': 'dekat',\n", + " 'kbye': 'ok bye',\n", + " 'kearah': 'ke arah',\n", + " 'kecik': 'kecil',\n", + " 'keja': 'kerja',\n", + " 'keje': 'kerja',\n", + " 'kejo': 'kerja',\n", + " 'keksongan': 'kekosongan',\n", + " 'kemana': 'ke mana',\n", + " 'kene': 'kena',\n", + " 'kenekan': 'kenakan',\n", + " 'kesah': 'kisah',\n", + " 'ketempat': 'ke tempat',\n", + " 'kije': 'kerja',\n", + " 'kijo': 'kerja',\n", + " 'kiss': 'cium',\n", + " 'kite': 'kita',\n", + " 'kito': 'kita',\n", + " 'kje': 'kerja',\n", + " 'kjr': 'kerja',\n", + " 'kk': 'okay',\n", + " 'kmi': 'kami',\n", + " 'kt': 'kat',\n", + " 'tlg': 'tolong',\n", + " 'kl': 'kuala lumpur',\n", + " 'klai': 'kalau',\n", + " 'klau': 'kalau',\n", + " 'klia': 'klia',\n", + " 'klo': 'kalau',\n", + " 'klu': 'kalau',\n", + " 'kn': 'kan',\n", + " 'knapa': 'kenapa',\n", + " 'kne': 'kena',\n", + " 'ko': 'kau',\n", + " 'kompom': 'sah',\n", + " 'korang': 'kamu semua',\n", + " 'korea': 'korea',\n", + " 'korg': 'kamu semua',\n", + " 'kot': 'mungkin',\n", + " 'krja': 'kerja',\n", + " 'ksalahan': 'kesalahan',\n", + " 'kta': 'kita',\n", + " 'kuar': 'keluar',\n", + " 'kut': 'mungkin',\n", + " 'la': 'lah',\n", + " 'laa': 'lah',\n", + " 'lahabau': 'celaka',\n", + " 'lahanat': 'celaka',\n", + " 'lainda': 'lain dah',\n", + " 'lak': 'pula',\n", + " 'last': 'akhir',\n", + " 'le': 'lah',\n", + " 'leader': 'ketua',\n", + " 'leave': 'pergi',\n", + " 'ler': 'lah',\n", + " 'less': 'kurang',\n", + " 'letter': 'surat',\n", + " 'lg': 'lagi',\n", + " 'lgi': 'lagi',\n", + " 'lngsong': 'langsung',\n", + " 'lol': 'hehe',\n", + " 'lorr': 'lah',\n", + " 'low': 'rendah',\n", + " 'lps': 'lepas',\n", + " 'luggage': 'bagasi',\n", + " 'lumbe': 'lumba',\n", + " 'lyak': 'layak',\n", + " 'maap': 'maaf',\n", + " 'maapkan': 'maafkan',\n", + " 'mahai': 'mahal',\n", + " 'mampos': 'mampus',\n", + " 'mart': 'kedai',\n", + " 'mau': 'mahu',\n", + " 'mcm': 'macam',\n", + " 'mcmtu': 'macam itu',\n", + " 'memerlukn': 'memerlukan',\n", + " 'mengembirakan': 'menggembirakan',\n", + " 'mengmbilnyer': 'mengambilnya',\n", + " 'mengtasi': 'mengatasi',\n", + " 'mg': 'memang',\n", + " 'mihak': 'memihak',\n", + " 'min': 'admin',\n", + " 'mingu': 'minggu',\n", + " 'mintak': 'minta',\n", + " 'mjtuhkn': 'menjatuhkan',\n", + " 'mkyong': 'mak yong',\n", + " 'mlibatkn': 'melibatkan',\n", + " 'mmg': 'memang',\n", + " 'mmnjang': 'memanjang',\n", + " 'mmpos': 'mampus',\n", + " 'mn': 'mana',\n", + " 'mna': 'mana',\n", + " 'mntak': 'minta',\n", + " 'mntk': 'minta',\n", + " 'mnyusun': 'menyusun',\n", + " 'mood': 'suasana',\n", + " 'most': 'paling',\n", + " 'mr': 'tuan',\n", + " 'msa': 'masa',\n", + " 'msia': 'malaysia',\n", + " 'mst': 'mesti',\n", + " 'mu': 'awak',\n", + " 'much': 'banyak',\n", + " 'muko': 'muka',\n", + " 'mum': 'emak',\n", + " 'n': 'dan',\n", + " 'nah': 'nah',\n", + " 'nanny': 'nenek',\n", + " 'napo': 'kenapa',\n", + " 'nati': 'nanti',\n", + " 'ngan': 'dengan',\n", + " 'ngn': 'dengan',\n", + " 'ni': 'ini',\n", + " 'nie': 'ini',\n", + " 'nii': 'ini',\n", + " 'nk': 'nak',\n", + " 'nmpk': 'nampak',\n", + " 'nye': 'nya',\n", + " 'ofis': 'pejabat',\n", + " 'ohh': 'oh',\n", + " 'oii': 'hoi',\n", + " 'one': 'satu',\n", + " 'online': 'dalam talian',\n", + " 'or': 'atau',\n", + " 'org': 'orang',\n", + " 'orng': 'orang',\n", + " 'otek': 'otak',\n", + " 'p': 'pergi',\n", + " 'paid': 'dah bayar',\n", + " 'palabana': 'kepala otak',\n", + " 'pasni': 'lepas ini',\n", + " 'passengers': 'penumpang',\n", + " 'passengger': 'penumpang',\n", + " 'pastu': 'lepas itu',\n", + " 'pd': 'pada',\n", + " 'pegi': 'pergi',\n", + " 'pekerje': 'pekerja',\n", + " 'pekrja': 'pekerja',\n", + " 'perabih': 'perabis',\n", + " 'perkerja': 'pekerja',\n", + " 'pg': 'pergi',\n", + " 'phuii': 'puih',\n", + " 'pikir': 'fikir',\n", + " 'pilot': 'juruterbang',\n", + " 'pk': 'fikir',\n", + " 'pkerja': 'pekerja',\n", + " 'pkerjaan': 'pekerjaan',\n", + " 'pki': 'pakai',\n", + " 'please': 'tolong',\n", + " 'pls': 'tolong',\n", + " 'pn': 'pun',\n", + " 'pnh': 'pernah',\n", + " 'pnt': 'penat',\n", + " 'pnya': 'punya',\n", + " 'pon': 'pun',\n", + " 'priority': 'keutamaan',\n", + " 'properties': 'harta benda',\n", + " 'ptugas': 'petugas',\n", + " 'pub': 'kelab malam',\n", + " 'pulak': 'pula',\n", + " 'puye': 'punya',\n", + " 'pwrcuma': 'percuma',\n", + " 'pyahnya': 'payahnya',\n", + " 'quality': 'kualiti',\n", + " 'quit': 'keluar',\n", + " 'ramly': 'ramly',\n", + " 'rege': 'harga',\n", + " 'reger': 'harga',\n", + " 'report': 'laporan',\n", + " 'resigned': 'meletakkan jawatan',\n", + " 'respect': 'hormat',\n", + " 'rizal': 'rizal',\n", + " 'rosak': 'rosak',\n", + " 'rosok': 'rosak',\n", + " 'rse': 'rasa',\n", + " 'sacked': 'buang',\n", + " 'sado': 'tegap',\n", + " 'salute': 'sanjung',\n", + " 'sam': 'sama',\n", + " 'same': 'sama',\n", + " 'samp': 'sampah',\n", + " 'sbb': 'sebab',\n", + " 'sbgai': 'sebagai',\n", + " 'sblm': 'sebelum',\n", + " 'sblum': 'sebelum',\n", + " 'sbnarnya': 'sebenarnya',\n", + " 'sbum': 'sebelum',\n", + " 'sdg': 'sedang',\n", + " 'sebb': 'sebab',\n", + " 'sebijik': 'sebiji',\n", + " 'see': 'lihat',\n", + " 'seen': 'dilihat',\n", + " 'selangor': 'selangor',\n", + " 'selfie': 'swafoto',\n", + " 'sempoi': 'cantik',\n", + " 'senaraihitam': 'senarai hitam',\n", + " 'seorg': 'seorang',\n", + " 'service': 'perkhidmatan',\n", + " 'sgt': 'sangat',\n", + " 'shared': 'kongsi',\n", + " 'shirt': 'kemeja',\n", + " 'shut': 'tutup',\n", + " 'sib': 'nasib',\n", + " 'skali': 'sekali',\n", + " 'sket': 'sikit',\n", + " 'sma': 'sama',\n", + " 'smoga': 'semoga',\n", + " 'smpoi': 'cantik',\n", + " 'sndiri': 'sendiri',\n", + " 'sndr': 'sendiri',\n", + " 'sndri': 'sendiri',\n", + " 'sne': 'sana',\n", + " 'so': 'jadi',\n", + " 'sop': 'tatacara pengendalian piawai',\n", + " 'sorang': 'seorang',\n", + " 'spoting': 'pembintikan',\n", + " 'sronok': 'seronok',\n", + " 'ssh': 'susah',\n", + " 'staff': 'staf',\n", + " 'standing': 'berdiri',\n", + " 'start': 'mula',\n", + " 'steady': 'mantap',\n", + " 'stiap': 'setiap',\n", + " 'stress': 'stres',\n", + " 'student': 'pelajar',\n", + " 'study': 'belajar',\n", + " 'studycase': 'kajian kes',\n", + " 'sure': 'pasti',\n", + " 'sykt': 'syarikat',\n", + " 'tah': 'entah',\n", + " 'taik': 'tahi',\n", + " 'takan': 'tak akan',\n", + " 'takat': 'setakat',\n", + " 'takde': 'tak ada',\n", + " 'takkan': 'tak akan',\n", + " 'taknak': 'tak nak',\n", + " 'tang': 'tentang',\n", + " 'tanggungjawab': 'bertanggungjawab',\n", + " 'taraa': 'sementara',\n", + " 'tau': 'tahu',\n", + " 'tbabit': 'terbabit',\n", + " 'team': 'pasukan',\n", + " 'terbaekk': 'terbaik',\n", + " 'teruknye': 'teruknya',\n", + " 'tgk': 'tengok',\n", + " 'that': 'itu',\n", + " 'thinking': 'fikir',\n", + " 'those': 'itu',\n", + " 'time': 'masa',\n", + " 'tk': 'tak',\n", + " 'tnggongjwb': 'tanggungjawab',\n", + " 'tngok': 'tengok',\n", + " 'tngu': 'tunggu',\n", + " 'to': 'kepada',\n", + " 'tosak': 'rosak',\n", + " 'tp': 'tapi',\n", + " 'tpi': 'tapi',\n", + " 'tpon': 'telefon',\n", + " 'transfer': 'pindah',\n", + " 'trgelak': 'tergelak',\n", + " 'ts': 'tan sri',\n", + " 'tstony': 'tan sri tony',\n", + " 'tu': 'itu',\n", + " 'tuh': 'itu',\n", + " 'tula': 'itulah',\n", + " 'umeno': 'umno',\n", + " 'unfortunately': 'malangnya',\n", + " 'unhappy': 'tidak gembira',\n", + " 'up': 'naik',\n", + " 'upkan': 'naikkan',\n", + " 'ur': 'awak',\n", + " 'utk': 'untuk',\n", + " 'very': 'sangat',\n", + " 'viral': 'tular',\n", + " 'vote': 'undi',\n", + " 'warning': 'amaran',\n", + " 'warranty': 'waranti',\n", + " 'wassap': 'whatsapp',\n", + " 'wat': 'apa',\n", + " 'weii': 'wei',\n", + " 'well': 'maklumlah',\n", + " 'win': 'menang',\n", + " 'with': 'dengan',\n", + " 'wt': 'buat',\n", + " 'x': 'tak',\n", + " 'tw': 'tahu',\n", + " 'ye': 'ya',\n", + " 'yee': 'ya',\n", + " 'yg': 'yang',\n", + " 'yng': 'yang',\n", + " 'you': 'awak',\n", + " 'your': 'awak',\n", + " 'sakai': 'selekeh',\n", + " 'rmb': 'billion ringgit',\n", + " 'rmj': 'juta ringgit',\n", + " 'rmk': 'ribu ringgit',\n", + " 'rm': 'ringgit',\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], "source": [ "permulaan = [\n", " 'bel',\n", @@ -56,22 +605,18 @@ "\n", "def naive_stemmer(word):\n", " assert isinstance(word, str), 'input must be a string'\n", - " hujung_result = re.findall(r'^(.*?)(%s)$' % ('|'.join(hujung)), word)\n", - " word = hujung_result[0][0] if len(hujung_result) else word\n", - " permulaan_result = re.findall(r'^(.*?)(%s)' % ('|'.join(permulaan[::-1])), word)\n", - " permulaan_result.extend(re.findall(r'^(.*?)(%s)' % ('|'.join(permulaan)), word))\n", - " mula = permulaan_result if len(permulaan_result) else ''\n", - " if len(mula):\n", - " mula = mula[1][1] if len(mula[1][1]) > len(mula[0][1]) else mula[0][1]\n", - " return word.replace(mula, '')" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ + " hujung_result = [e for e in hujung if word.endswith(e)]\n", + " if len(hujung_result):\n", + " hujung_result = max(hujung_result, key = len)\n", + " if len(hujung_result):\n", + " word = word[: -len(hujung_result)]\n", + " permulaan_result = [e for e in permulaan if word.startswith(e)]\n", + " if len(permulaan_result):\n", + " permulaan_result = max(permulaan_result, key = len)\n", + " if len(permulaan_result):\n", + " word = word[len(permulaan_result) :]\n", + " return word\n", + "\n", "def build_dataset(words, n_words):\n", " count = [['GO', 0], ['PAD', 1], ['EOS', 2], ['UNK', 3]]\n", " counter = collections.Counter(words).most_common(n_words)\n", @@ -101,24 +646,17 @@ " )\n", " string = unidecode(string).replace('.', ' . ').replace(',', ' , ')\n", " string = re.sub('[^A-Za-z ]+', ' ', string)\n", - " string = re.sub(r'[ ]+', ' ', string).strip()\n", - " string = ' '.join(\n", - " [i for i in re.findall('[\\\\w\\']+|[;:\\-\\(\\)&.,!?\"]', string) if len(i)]\n", - " )\n", - " string = string.lower().split()\n", - " string = [(naive_stemmer(word), word) for word in string]\n", - " return (\n", - " ' '.join([word[0] for word in string if len(word[0]) > 1]),\n", - " ' '.join([word[1] for word in string if len(word[0]) > 1]),\n", - " )\n", + " string = re.sub(r'[ ]+', ' ', string.lower()).strip()\n", + " string = [rules_normalizer.get(w, w) for w in string.split()]\n", + " string = [naive_stemmer(word) for word in string]\n", + " return ' '.join([word for word in string if len(word) > 1])\n", "\n", "\n", - "def str_idx(corpus, dic, UNK = 3):\n", - " X = []\n", - " for sentence in corpus:\n", - " X.append(\n", - " [dic[w] if w in dic else UNK for w in sentence.split()[:maxlen]]\n", - " )\n", + "def str_idx(corpus, dic, maxlen, UNK = 3):\n", + " X = np.zeros((len(corpus), maxlen))\n", + " for i in range(len(corpus)):\n", + " for no, k in enumerate(corpus[i].split()[:maxlen][::-1]):\n", + " X[i, -1 - no] = dic.get(k, UNK)\n", " return X" ] }, @@ -126,131 +664,35 @@ "cell_type": "code", "execution_count": 4, "metadata": {}, - "outputs": [], - "source": [ - "def create_ngram_set(input_list, ngram_value):\n", - " return set(zip(*[input_list[i:] for i in range(ngram_value)]))\n", - "\n", - "\n", - "def build_ngram(x_train):\n", - " global max_features\n", - " ngram_set = set()\n", - " for input_list in tqdm(x_train, total = len(x_train), ncols = 70):\n", - " for i in range(2, 3):\n", - " set_of_ngram = create_ngram_set(input_list, ngram_value = i)\n", - " ngram_set.update(set_of_ngram)\n", - " start_index = max_features + 1\n", - " token_indice = {v: k + start_index for k, v in enumerate(ngram_set)}\n", - " indice_token = {token_indice[k]: k for k in token_indice}\n", - "\n", - " max_features = np.max(list(indice_token.keys())) + 1\n", - " return token_indice\n", - "\n", - "\n", - "def add_ngram(sequences, token_indice):\n", - " new_sequences = []\n", - " for input_list in sequences:\n", - " new_list = input_list[:]\n", - " for ngram_value in range(2, ngram_range + 1):\n", - " for i in range(len(new_list) - ngram_value + 1):\n", - " ngram = tuple(new_list[i : i + ngram_value])\n", - " if ngram in token_indice:\n", - " new_list.append(token_indice[ngram])\n", - " new_sequences.append(new_list)\n", - " return new_sequences" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
labeltext
0NegativeLebih-lebih lagi dengan  kemudahan internet da...
1Positiveboleh memberi teguran kepada parti tetapi perl...
2NegativeAdalah membingungkan mengapa masyarakat Cina b...
3PositiveKami menurunkan defisit daripada 6.7 peratus p...
4NegativeIni masalahnya. Bukan rakyat, tetapi sistem
\n", - "
" - ], "text/plain": [ - " label text\n", - "0 Negative Lebih-lebih lagi dengan  kemudahan internet da...\n", - "1 Positive boleh memberi teguran kepada parti tetapi perl...\n", - "2 Negative Adalah membingungkan mengapa masyarakat Cina b...\n", - "3 Positive Kami menurunkan defisit daripada 6.7 peratus p...\n", - "4 Negative Ini masalahnya. Bukan rakyat, tetapi sistem" + "'raja benar sangat benci rakyat minyak naik gala'" ] }, - "execution_count": 5, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df = pd.read_csv('dataset/sentiment-data-v2.csv')\n", - "Y = LabelEncoder().fit_transform(df.label)\n", - "df.head()" + "classification_textcleaning('kerajaan sebenarnya sangat bencikan rakyatnya, minyak naik dan segalanya')" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ - "with open('dataset/polarity-negative-translated.txt','r') as fopen:\n", + "df = pd.read_csv('sentiment-data-v2.csv')\n", + "Y = LabelEncoder().fit_transform(df.label)\n", + "with open('polarity-negative-translated.txt','r') as fopen:\n", " texts = fopen.read().split('\\n')\n", "labels = [0] * len(texts)\n", "\n", - "with open('dataset/polarity-positive-translated.txt','r') as fopen:\n", + "with open('polarity-positive-translated.txt','r') as fopen:\n", " positive_texts = fopen.read().split('\\n')\n", "labels += [1] * len(positive_texts)\n", "texts += positive_texts\n", @@ -260,28 +702,81 @@ "assert len(labels) == len(texts)" ] }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "with open('bm-amazon.json') as fopen:\n", + " amazon = json.load(fopen)\n", + " \n", + "with open('bm-imdb.json') as fopen:\n", + " imdb = json.load(fopen)\n", + " \n", + "with open('bm-yelp.json') as fopen:\n", + " yelp = json.load(fopen)\n", + " \n", + "texts += amazon['negative']\n", + "labels += [0] * len(amazon['negative'])\n", + "texts += amazon['positive']\n", + "labels += [1] * len(amazon['positive'])\n", + "\n", + "texts += imdb['negative']\n", + "labels += [0] * len(imdb['negative'])\n", + "texts += imdb['positive']\n", + "labels += [1] * len(imdb['positive'])\n", + "\n", + "texts += yelp['negative']\n", + "labels += [0] * len(yelp['negative'])\n", + "texts += yelp['positive']\n", + "labels += [1] * len(yelp['positive'])" + ] + }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ - "for i in range(len(texts)):\n", - " texts[i] = classification_textcleaning(texts[i])[0]" + "import os\n", + "for i in [i for i in os.listdir('negative') if 'Store' not in i]:\n", + " with open('negative/'+i) as fopen:\n", + " a = json.load(fopen)\n", + " texts += a\n", + " labels += [0] * len(a)\n", + " \n", + "import os\n", + "for i in [i for i in os.listdir('positive') if 'Store' not in i]:\n", + " with open('positive/'+i) as fopen:\n", + " a = json.load(fopen)\n", + " texts += a\n", + " labels += [1] * len(a)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, + "outputs": [], + "source": [ + "for i in range(len(texts)):\n", + " texts[i] = classification_textcleaning(texts[i])" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "vocab from size: 13325\n", - "Most common words [('yang', 14899), ('tidak', 4588), ('untuk', 4038), ('filem', 3698), ('deng', 3350), ('ada', 3190)]\n", - "Sample data [1317, 197, 178, 98, 98, 126, 354, 4, 90, 210] ['ringkas', 'bodoh', 'bosan', 'kanak', 'kanak', 'lelaki', 'remaja', 'yang', 'begitu', 'muda']\n" + "vocab from size: 120097\n", + "Most common words [('saya', 533028), ('yang', 204446), ('tidak', 164296), ('untuk', 129707), ('anda', 126091), ('hari', 88975)]\n", + "Sample data [2672, 229, 363, 235, 235, 94, 1360, 5, 78, 679] ['ringkas', 'bodoh', 'bosan', 'kanak', 'kanak', 'lelaki', 'remaja', 'yang', 'begitu', 'muda']\n" ] } ], @@ -296,7 +791,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -311,7 +806,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -395,7 +890,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -404,7 +899,7 @@ "'hierarchical/model.ckpt'" ] }, - "execution_count": 11, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -416,7 +911,7 @@ "dimension_output = 2\n", "learning_rate = 1e-4\n", "batch_size = 32\n", - "maxlen = 80\n", + "maxlen = 100\n", "dropout = 0.8\n", "\n", "tf.reset_default_graph()\n", @@ -436,7 +931,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -456,7 +951,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -497,7 +992,7 @@ " 'gradients/alphas_grad/mul_1']" ] }, - "execution_count": 13, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -508,13 +1003,13 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[,\n", + "[,\n", " ,\n", " ,\n", " ,\n", @@ -530,7 +1025,7 @@ " ]" ] }, - "execution_count": 14, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -541,75 +1036,36 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ - "vectors = str_idx(texts, dictionary, maxlen)\n", - "train_X, test_X, train_Y, test_Y = train_test_split(\n", - " vectors, labels, test_size = 0.2\n", - ")" + "train_X, test_X, train_Y, test_Y = train_test_split(texts, \n", + " labels,\n", + " test_size = 0.2)" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [01:10<00:00, 5.16it/s, accuracy=0.613, cost=0.612]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:06<00:00, 13.86it/s, accuracy=0.625, cost=0.529]\n", - "train minibatch loop: 0%| | 1/357 [00:00<01:10, 5.03it/s, accuracy=0.688, cost=0.609]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch: 0, pass acc: 0.000000, current acc: 0.643557\n", - "time taken: 77.14954423904419\n", - "epoch: 0, training loss: 0.663951, training acc: 0.597708, valid loss: 0.641403, valid acc: 0.643557\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 357/357 [01:10<00:00, 5.08it/s, accuracy=0.645, cost=0.576]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:06<00:00, 13.77it/s, accuracy=0.875, cost=0.412]\n", - "train minibatch loop: 0%| | 1/357 [00:00<01:08, 5.17it/s, accuracy=0.75, cost=0.553]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch: 1, pass acc: 0.643557, current acc: 0.672619\n", - "time taken: 76.84059190750122\n", - "epoch: 1, training loss: 0.600676, training acc: 0.676849, valid loss: 0.620196, valid acc: 0.672619\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 357/357 [01:10<00:00, 5.11it/s, accuracy=0.581, cost=0.556]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:06<00:00, 13.71it/s, accuracy=0.875, cost=0.385]\n", - "train minibatch loop: 0%| | 0/357 [00:00" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plt.figure(figsize = (15, 7))\n", - "labels = [word for word in text[1].split()]\n", - "val = [val for val in result[1][0]]\n", - "plt.bar(np.arange(len(labels)), val)\n", - "plt.xticks(np.arange(len(labels)), labels, rotation = 'vertical')\n", - "plt.title('negative %f positive %f' % (result[0][0,0], result[0][0,1]))\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/session/sentiment/luong.ipynb b/session/sentiment/luong.ipynb index 04ffce0d..bed9535b 100644 --- a/session/sentiment/luong.ipynb +++ b/session/sentiment/luong.ipynb @@ -9,7 +9,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/usr/local/lib/python3.5/dist-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n", + "/usr/local/lib/python3.6/dist-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n", " \"This module will be removed in 0.20.\", DeprecationWarning)\n" ] } @@ -17,13 +17,13 @@ "source": [ "import re\n", "import numpy as np\n", - "import pandas as pd\n", "import collections\n", "from sklearn import metrics\n", - "from sklearn.preprocessing import LabelEncoder\n", - "import tensorflow as tf\n", "from sklearn.cross_validation import train_test_split\n", + "import tensorflow as tf\n", + "import pandas as pd\n", "from unidecode import unidecode\n", + "from sklearn.preprocessing import LabelEncoder\n", "from tqdm import tqdm\n", "import time" ] @@ -33,6 +33,565 @@ "execution_count": 2, "metadata": {}, "outputs": [], + "source": [ + "rules_normalizer = {\n", + " 'experience': 'pengalaman',\n", + " 'bagasi': 'bagasi',\n", + " 'kg': 'kampung',\n", + " 'kilo': 'kilogram',\n", + " 'g': 'gram',\n", + " 'grm': 'gram',\n", + " 'k': 'okay',\n", + " 'abgkat': 'abang dekat',\n", + " 'abis': 'habis',\n", + " 'ade': 'ada',\n", + " 'adoi': 'aduh',\n", + " 'adoii': 'aduhh',\n", + " 'aerodarat': 'kapal darat',\n", + " 'agkt': 'angkat',\n", + " 'ahh': 'ah',\n", + " 'ailior': 'air liur',\n", + " 'airasia': 'air asia x',\n", + " 'airasiax': 'penerbangan',\n", + " 'airline': 'penerbangan',\n", + " 'airlines': 'penerbangan',\n", + " 'airport': 'lapangan terbang',\n", + " 'airpot': 'lapangan terbang',\n", + " 'aje': 'sahaja',\n", + " 'ajelah': 'sahajalah',\n", + " 'ajer': 'sahaja',\n", + " 'ak': 'aku',\n", + " 'aq': 'aku',\n", + " 'all': 'semua',\n", + " 'ambik': 'ambil',\n", + " 'amek': 'ambil',\n", + " 'amer': 'amir',\n", + " 'amik': 'ambil',\n", + " 'ana': 'saya',\n", + " 'angkt': 'angkat',\n", + " 'anual': 'tahunan',\n", + " 'apapun': 'apa pun',\n", + " 'ape': 'apa',\n", + " 'arab': 'arab',\n", + " 'area': 'kawasan',\n", + " 'aritu': 'hari itu',\n", + " 'ask': 'tanya',\n", + " 'astro': 'astro',\n", + " 'at': 'pada',\n", + " 'attitude': 'sikap',\n", + " 'babi': 'khinzir',\n", + " 'back': 'belakang',\n", + " 'bag': 'beg',\n", + " 'bang': 'abang',\n", + " 'bangla': 'bangladesh',\n", + " 'banyk': 'banyak',\n", + " 'bard': 'pujangga',\n", + " 'bargasi': 'bagasi',\n", + " 'bawak': 'bawa',\n", + " 'bawanges': 'bawang',\n", + " 'be': 'jadi',\n", + " 'behave': 'berkelakuan baik',\n", + " 'belagak': 'berlagak',\n", + " 'berdisiplin': 'berdisplin',\n", + " 'berenti': 'berhenti',\n", + " 'beskal': 'basikal',\n", + " 'bff': 'rakan karib',\n", + " 'bg': 'bagi',\n", + " 'bgi': 'bagi',\n", + " 'biase': 'biasa',\n", + " 'big': 'besar',\n", + " 'bike': 'basikal',\n", + " 'bile': 'bila',\n", + " 'binawe': 'binatang',\n", + " 'bini': 'isteri',\n", + " 'bkn': 'bukan',\n", + " 'bla': 'bila',\n", + " 'blom': 'belum',\n", + " 'bnyak': 'banyak',\n", + " 'body': 'tubuh',\n", + " 'bole': 'boleh',\n", + " 'boss': 'bos',\n", + " 'bowling': 'boling',\n", + " 'bpe': 'berapa',\n", + " 'brand': 'jenama',\n", + " 'brg': 'barang',\n", + " 'briefing': 'taklimat',\n", + " 'brng': 'barang',\n", + " 'bro': 'abang',\n", + " 'bru': 'baru',\n", + " 'bruntung': 'beruntung',\n", + " 'bsikal': 'basikal',\n", + " 'btnggjwb': 'bertanggungjawab',\n", + " 'btul': 'betul',\n", + " 'buatlh': 'buatlah',\n", + " 'buh': 'letak',\n", + " 'buka': 'buka',\n", + " 'but': 'tetapi',\n", + " 'bwk': 'bawa',\n", + " 'by': 'dengan',\n", + " 'byr': 'bayar',\n", + " 'bz': 'sibuk',\n", + " 'camera': 'kamera',\n", + " 'camni': 'macam ini',\n", + " 'cane': 'macam mana',\n", + " 'cant': 'tak boleh',\n", + " 'carakerja': 'cara kerja',\n", + " 'care': 'jaga',\n", + " 'cargo': 'kargo',\n", + " 'cctv': 'kamera litar tertutup',\n", + " 'celako': 'celaka',\n", + " 'cer': 'cerita',\n", + " 'cheap': 'murah',\n", + " 'check': 'semak',\n", + " 'ciput': 'sedikit',\n", + " 'cite': 'cerita',\n", + " 'citer': 'cerita',\n", + " 'ckit': 'sikit',\n", + " 'ckp': 'cakap',\n", + " 'class': 'kelas',\n", + " 'cm': 'macam',\n", + " 'cmni': 'macam ini',\n", + " 'cmpak': 'campak',\n", + " 'committed': 'komited',\n", + " 'company': 'syarikat',\n", + " 'complain': 'aduan',\n", + " 'corn': 'jagung',\n", + " 'couldnt': 'tak boleh',\n", + " 'cr': 'cari',\n", + " 'crew': 'krew',\n", + " 'cube': 'cuba',\n", + " 'cuma': 'cuma',\n", + " 'curinyaa': 'curinya',\n", + " 'cust': 'pelanggan',\n", + " 'customer': 'pelanggan',\n", + " 'd': 'di',\n", + " 'da': 'dah',\n", + " 'dn': 'dan',\n", + " 'dahh': 'dah',\n", + " 'damaged': 'rosak',\n", + " 'dapek': 'dapat',\n", + " 'day': 'hari',\n", + " 'dazrin': 'dazrin',\n", + " 'dbalingnya': 'dibalingnya',\n", + " 'de': 'ada',\n", + " 'deep': 'dalam',\n", + " 'deliberately': 'sengaja',\n", + " 'depa': 'mereka',\n", + " 'dessa': 'desa',\n", + " 'dgn': 'dengan',\n", + " 'dh': 'dah',\n", + " 'didunia': 'di dunia',\n", + " 'diorang': 'mereka',\n", + " 'diorng': 'mereka',\n", + " 'direct': 'secara terus',\n", + " 'diving': 'junam',\n", + " 'dkt': 'dekat',\n", + " 'dlempar': 'dilempar',\n", + " 'dlm': 'dalam',\n", + " 'dlt': 'padam',\n", + " 'dlu': 'dulu',\n", + " 'done': 'siap',\n", + " 'dont': 'jangan',\n", + " 'dorg': 'mereka',\n", + " 'dpermudhkn': 'dipermudahkan',\n", + " 'dpt': 'dapat',\n", + " 'dr': 'dari',\n", + " 'dri': 'dari',\n", + " 'dsb': 'dan sebagainya',\n", + " 'dy': 'dia',\n", + " 'educate': 'mendidik',\n", + " 'ensure': 'memastikan',\n", + " 'everything': 'semua',\n", + " 'ewahh': 'wah',\n", + " 'expect': 'sangka',\n", + " 'fb': 'facebook',\n", + " 'fired': 'pecat',\n", + " 'first': 'pertama',\n", + " 'fkr': 'fikir',\n", + " 'flight': 'kapal terbang',\n", + " 'for': 'untuk',\n", + " 'free': 'percuma',\n", + " 'friend': 'kawan',\n", + " 'fyi': 'untuk pengetahuan anda',\n", + " 'gantila': 'gantilah',\n", + " 'gantirugi': 'ganti rugi',\n", + " 'gentlemen': 'lelaki budiman',\n", + " 'gerenti': 'jaminan',\n", + " 'gile': 'gila',\n", + " 'gk': 'juga',\n", + " 'gnti': 'ganti',\n", + " 'go': 'pergi',\n", + " 'gomen': 'kerajaan',\n", + " 'goment': 'kerajaan',\n", + " 'good': 'baik',\n", + " 'ground': 'tanah',\n", + " 'guarno': 'macam mana',\n", + " 'hampa': 'mereka',\n", + " 'hampeh': 'teruk',\n", + " 'hanat': 'jahanam',\n", + " 'handle': 'kawal',\n", + " 'handling': 'kawalan',\n", + " 'hanta': 'hantar',\n", + " 'haritu': 'hari itu',\n", + " 'hate': 'benci',\n", + " 'have': 'ada',\n", + " 'hawau': 'celaka',\n", + " 'henpon': 'telefon',\n", + " 'heran': 'hairan',\n", + " 'him': 'dia',\n", + " 'his': 'dia',\n", + " 'hmpa': 'mereka',\n", + " 'hntr': 'hantar',\n", + " 'hotak': 'otak',\n", + " 'hr': 'hari',\n", + " 'i': 'saya',\n", + " 'hrga': 'harga',\n", + " 'hrp': 'harap',\n", + " 'hu': 'sedih',\n", + " 'humble': 'merendah diri',\n", + " 'ibon': 'ikon',\n", + " 'ichi': 'inci',\n", + " 'idung': 'hidung',\n", + " 'if': 'jika',\n", + " 'ig': 'instagram',\n", + " 'iklas': 'ikhlas',\n", + " 'improve': 'menambah baik',\n", + " 'in': 'masuk',\n", + " 'isn t': 'tidak',\n", + " 'isyaallah': 'insyallah',\n", + " 'ja': 'sahaja',\n", + " 'japan': 'jepun',\n", + " 'jd': 'jadi',\n", + " 'je': 'saja',\n", + " 'jee': 'saja',\n", + " 'jek': 'saja',\n", + " 'jepun': 'jepun',\n", + " 'jer': 'saja',\n", + " 'jerr': 'saja',\n", + " 'jez': 'saja',\n", + " 'jg': 'juga',\n", + " 'jgk': 'juga',\n", + " 'jgn': 'jangan',\n", + " 'jgnla': 'janganlah',\n", + " 'jibake': 'celaka',\n", + " 'jjur': 'jujur',\n", + " 'job': 'kerja',\n", + " 'jobscope': 'skop kerja',\n", + " 'jogja': 'jogjakarta',\n", + " 'jpam': 'jpam',\n", + " 'jth': 'jatuh',\n", + " 'jugak': 'juga',\n", + " 'ka': 'ke',\n", + " 'kalo': 'kalau',\n", + " 'kalu': 'kalau',\n", + " 'kang': 'nanti',\n", + " 'kantoi': 'temberang',\n", + " 'kasi': 'beri',\n", + " 'kat': 'dekat',\n", + " 'kbye': 'ok bye',\n", + " 'kearah': 'ke arah',\n", + " 'kecik': 'kecil',\n", + " 'keja': 'kerja',\n", + " 'keje': 'kerja',\n", + " 'kejo': 'kerja',\n", + " 'keksongan': 'kekosongan',\n", + " 'kemana': 'ke mana',\n", + " 'kene': 'kena',\n", + " 'kenekan': 'kenakan',\n", + " 'kesah': 'kisah',\n", + " 'ketempat': 'ke tempat',\n", + " 'kije': 'kerja',\n", + " 'kijo': 'kerja',\n", + " 'kiss': 'cium',\n", + " 'kite': 'kita',\n", + " 'kito': 'kita',\n", + " 'kje': 'kerja',\n", + " 'kjr': 'kerja',\n", + " 'kk': 'okay',\n", + " 'kmi': 'kami',\n", + " 'kt': 'kat',\n", + " 'tlg': 'tolong',\n", + " 'kl': 'kuala lumpur',\n", + " 'klai': 'kalau',\n", + " 'klau': 'kalau',\n", + " 'klia': 'klia',\n", + " 'klo': 'kalau',\n", + " 'klu': 'kalau',\n", + " 'kn': 'kan',\n", + " 'knapa': 'kenapa',\n", + " 'kne': 'kena',\n", + " 'ko': 'kau',\n", + " 'kompom': 'sah',\n", + " 'korang': 'kamu semua',\n", + " 'korea': 'korea',\n", + " 'korg': 'kamu semua',\n", + " 'kot': 'mungkin',\n", + " 'krja': 'kerja',\n", + " 'ksalahan': 'kesalahan',\n", + " 'kta': 'kita',\n", + " 'kuar': 'keluar',\n", + " 'kut': 'mungkin',\n", + " 'la': 'lah',\n", + " 'laa': 'lah',\n", + " 'lahabau': 'celaka',\n", + " 'lahanat': 'celaka',\n", + " 'lainda': 'lain dah',\n", + " 'lak': 'pula',\n", + " 'last': 'akhir',\n", + " 'le': 'lah',\n", + " 'leader': 'ketua',\n", + " 'leave': 'pergi',\n", + " 'ler': 'lah',\n", + " 'less': 'kurang',\n", + " 'letter': 'surat',\n", + " 'lg': 'lagi',\n", + " 'lgi': 'lagi',\n", + " 'lngsong': 'langsung',\n", + " 'lol': 'hehe',\n", + " 'lorr': 'lah',\n", + " 'low': 'rendah',\n", + " 'lps': 'lepas',\n", + " 'luggage': 'bagasi',\n", + " 'lumbe': 'lumba',\n", + " 'lyak': 'layak',\n", + " 'maap': 'maaf',\n", + " 'maapkan': 'maafkan',\n", + " 'mahai': 'mahal',\n", + " 'mampos': 'mampus',\n", + " 'mart': 'kedai',\n", + " 'mau': 'mahu',\n", + " 'mcm': 'macam',\n", + " 'mcmtu': 'macam itu',\n", + " 'memerlukn': 'memerlukan',\n", + " 'mengembirakan': 'menggembirakan',\n", + " 'mengmbilnyer': 'mengambilnya',\n", + " 'mengtasi': 'mengatasi',\n", + " 'mg': 'memang',\n", + " 'mihak': 'memihak',\n", + " 'min': 'admin',\n", + " 'mingu': 'minggu',\n", + " 'mintak': 'minta',\n", + " 'mjtuhkn': 'menjatuhkan',\n", + " 'mkyong': 'mak yong',\n", + " 'mlibatkn': 'melibatkan',\n", + " 'mmg': 'memang',\n", + " 'mmnjang': 'memanjang',\n", + " 'mmpos': 'mampus',\n", + " 'mn': 'mana',\n", + " 'mna': 'mana',\n", + " 'mntak': 'minta',\n", + " 'mntk': 'minta',\n", + " 'mnyusun': 'menyusun',\n", + " 'mood': 'suasana',\n", + " 'most': 'paling',\n", + " 'mr': 'tuan',\n", + " 'msa': 'masa',\n", + " 'msia': 'malaysia',\n", + " 'mst': 'mesti',\n", + " 'mu': 'awak',\n", + " 'much': 'banyak',\n", + " 'muko': 'muka',\n", + " 'mum': 'emak',\n", + " 'n': 'dan',\n", + " 'nah': 'nah',\n", + " 'nanny': 'nenek',\n", + " 'napo': 'kenapa',\n", + " 'nati': 'nanti',\n", + " 'ngan': 'dengan',\n", + " 'ngn': 'dengan',\n", + " 'ni': 'ini',\n", + " 'nie': 'ini',\n", + " 'nii': 'ini',\n", + " 'nk': 'nak',\n", + " 'nmpk': 'nampak',\n", + " 'nye': 'nya',\n", + " 'ofis': 'pejabat',\n", + " 'ohh': 'oh',\n", + " 'oii': 'hoi',\n", + " 'one': 'satu',\n", + " 'online': 'dalam talian',\n", + " 'or': 'atau',\n", + " 'org': 'orang',\n", + " 'orng': 'orang',\n", + " 'otek': 'otak',\n", + " 'p': 'pergi',\n", + " 'paid': 'dah bayar',\n", + " 'palabana': 'kepala otak',\n", + " 'pasni': 'lepas ini',\n", + " 'passengers': 'penumpang',\n", + " 'passengger': 'penumpang',\n", + " 'pastu': 'lepas itu',\n", + " 'pd': 'pada',\n", + " 'pegi': 'pergi',\n", + " 'pekerje': 'pekerja',\n", + " 'pekrja': 'pekerja',\n", + " 'perabih': 'perabis',\n", + " 'perkerja': 'pekerja',\n", + " 'pg': 'pergi',\n", + " 'phuii': 'puih',\n", + " 'pikir': 'fikir',\n", + " 'pilot': 'juruterbang',\n", + " 'pk': 'fikir',\n", + " 'pkerja': 'pekerja',\n", + " 'pkerjaan': 'pekerjaan',\n", + " 'pki': 'pakai',\n", + " 'please': 'tolong',\n", + " 'pls': 'tolong',\n", + " 'pn': 'pun',\n", + " 'pnh': 'pernah',\n", + " 'pnt': 'penat',\n", + " 'pnya': 'punya',\n", + " 'pon': 'pun',\n", + " 'priority': 'keutamaan',\n", + " 'properties': 'harta benda',\n", + " 'ptugas': 'petugas',\n", + " 'pub': 'kelab malam',\n", + " 'pulak': 'pula',\n", + " 'puye': 'punya',\n", + " 'pwrcuma': 'percuma',\n", + " 'pyahnya': 'payahnya',\n", + " 'quality': 'kualiti',\n", + " 'quit': 'keluar',\n", + " 'ramly': 'ramly',\n", + " 'rege': 'harga',\n", + " 'reger': 'harga',\n", + " 'report': 'laporan',\n", + " 'resigned': 'meletakkan jawatan',\n", + " 'respect': 'hormat',\n", + " 'rizal': 'rizal',\n", + " 'rosak': 'rosak',\n", + " 'rosok': 'rosak',\n", + " 'rse': 'rasa',\n", + " 'sacked': 'buang',\n", + " 'sado': 'tegap',\n", + " 'salute': 'sanjung',\n", + " 'sam': 'sama',\n", + " 'same': 'sama',\n", + " 'samp': 'sampah',\n", + " 'sbb': 'sebab',\n", + " 'sbgai': 'sebagai',\n", + " 'sblm': 'sebelum',\n", + " 'sblum': 'sebelum',\n", + " 'sbnarnya': 'sebenarnya',\n", + " 'sbum': 'sebelum',\n", + " 'sdg': 'sedang',\n", + " 'sebb': 'sebab',\n", + " 'sebijik': 'sebiji',\n", + " 'see': 'lihat',\n", + " 'seen': 'dilihat',\n", + " 'selangor': 'selangor',\n", + " 'selfie': 'swafoto',\n", + " 'sempoi': 'cantik',\n", + " 'senaraihitam': 'senarai hitam',\n", + " 'seorg': 'seorang',\n", + " 'service': 'perkhidmatan',\n", + " 'sgt': 'sangat',\n", + " 'shared': 'kongsi',\n", + " 'shirt': 'kemeja',\n", + " 'shut': 'tutup',\n", + " 'sib': 'nasib',\n", + " 'skali': 'sekali',\n", + " 'sket': 'sikit',\n", + " 'sma': 'sama',\n", + " 'smoga': 'semoga',\n", + " 'smpoi': 'cantik',\n", + " 'sndiri': 'sendiri',\n", + " 'sndr': 'sendiri',\n", + " 'sndri': 'sendiri',\n", + " 'sne': 'sana',\n", + " 'so': 'jadi',\n", + " 'sop': 'tatacara pengendalian piawai',\n", + " 'sorang': 'seorang',\n", + " 'spoting': 'pembintikan',\n", + " 'sronok': 'seronok',\n", + " 'ssh': 'susah',\n", + " 'staff': 'staf',\n", + " 'standing': 'berdiri',\n", + " 'start': 'mula',\n", + " 'steady': 'mantap',\n", + " 'stiap': 'setiap',\n", + " 'stress': 'stres',\n", + " 'student': 'pelajar',\n", + " 'study': 'belajar',\n", + " 'studycase': 'kajian kes',\n", + " 'sure': 'pasti',\n", + " 'sykt': 'syarikat',\n", + " 'tah': 'entah',\n", + " 'taik': 'tahi',\n", + " 'takan': 'tak akan',\n", + " 'takat': 'setakat',\n", + " 'takde': 'tak ada',\n", + " 'takkan': 'tak akan',\n", + " 'taknak': 'tak nak',\n", + " 'tang': 'tentang',\n", + " 'tanggungjawab': 'bertanggungjawab',\n", + " 'taraa': 'sementara',\n", + " 'tau': 'tahu',\n", + " 'tbabit': 'terbabit',\n", + " 'team': 'pasukan',\n", + " 'terbaekk': 'terbaik',\n", + " 'teruknye': 'teruknya',\n", + " 'tgk': 'tengok',\n", + " 'that': 'itu',\n", + " 'thinking': 'fikir',\n", + " 'those': 'itu',\n", + " 'time': 'masa',\n", + " 'tk': 'tak',\n", + " 'tnggongjwb': 'tanggungjawab',\n", + " 'tngok': 'tengok',\n", + " 'tngu': 'tunggu',\n", + " 'to': 'kepada',\n", + " 'tosak': 'rosak',\n", + " 'tp': 'tapi',\n", + " 'tpi': 'tapi',\n", + " 'tpon': 'telefon',\n", + " 'transfer': 'pindah',\n", + " 'trgelak': 'tergelak',\n", + " 'ts': 'tan sri',\n", + " 'tstony': 'tan sri tony',\n", + " 'tu': 'itu',\n", + " 'tuh': 'itu',\n", + " 'tula': 'itulah',\n", + " 'umeno': 'umno',\n", + " 'unfortunately': 'malangnya',\n", + " 'unhappy': 'tidak gembira',\n", + " 'up': 'naik',\n", + " 'upkan': 'naikkan',\n", + " 'ur': 'awak',\n", + " 'utk': 'untuk',\n", + " 'very': 'sangat',\n", + " 'viral': 'tular',\n", + " 'vote': 'undi',\n", + " 'warning': 'amaran',\n", + " 'warranty': 'waranti',\n", + " 'wassap': 'whatsapp',\n", + " 'wat': 'apa',\n", + " 'weii': 'wei',\n", + " 'well': 'maklumlah',\n", + " 'win': 'menang',\n", + " 'with': 'dengan',\n", + " 'wt': 'buat',\n", + " 'x': 'tak',\n", + " 'tw': 'tahu',\n", + " 'ye': 'ya',\n", + " 'yee': 'ya',\n", + " 'yg': 'yang',\n", + " 'yng': 'yang',\n", + " 'you': 'awak',\n", + " 'your': 'awak',\n", + " 'sakai': 'selekeh',\n", + " 'rmb': 'billion ringgit',\n", + " 'rmj': 'juta ringgit',\n", + " 'rmk': 'ribu ringgit',\n", + " 'rm': 'ringgit',\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], "source": [ "permulaan = [\n", " 'bel',\n", @@ -55,22 +614,18 @@ "\n", "def naive_stemmer(word):\n", " assert isinstance(word, str), 'input must be a string'\n", - " hujung_result = re.findall(r'^(.*?)(%s)$' % ('|'.join(hujung)), word)\n", - " word = hujung_result[0][0] if len(hujung_result) else word\n", - " permulaan_result = re.findall(r'^(.*?)(%s)' % ('|'.join(permulaan[::-1])), word)\n", - " permulaan_result.extend(re.findall(r'^(.*?)(%s)' % ('|'.join(permulaan)), word))\n", - " mula = permulaan_result if len(permulaan_result) else ''\n", - " if len(mula):\n", - " mula = mula[1][1] if len(mula[1][1]) > len(mula[0][1]) else mula[0][1]\n", - " return word.replace(mula, '')" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ + " hujung_result = [e for e in hujung if word.endswith(e)]\n", + " if len(hujung_result):\n", + " hujung_result = max(hujung_result, key = len)\n", + " if len(hujung_result):\n", + " word = word[: -len(hujung_result)]\n", + " permulaan_result = [e for e in permulaan if word.startswith(e)]\n", + " if len(permulaan_result):\n", + " permulaan_result = max(permulaan_result, key = len)\n", + " if len(permulaan_result):\n", + " word = word[len(permulaan_result) :]\n", + " return word\n", + "\n", "def build_dataset(words, n_words):\n", " count = [['GO', 0], ['PAD', 1], ['EOS', 2], ['UNK', 3]]\n", " counter = collections.Counter(words).most_common(n_words)\n", @@ -100,117 +655,53 @@ " )\n", " string = unidecode(string).replace('.', ' . ').replace(',', ' , ')\n", " string = re.sub('[^A-Za-z ]+', ' ', string)\n", - " string = re.sub(r'[ ]+', ' ', string).strip()\n", - " string = ' '.join(\n", - " [i for i in re.findall('[\\\\w\\']+|[;:\\-\\(\\)&.,!?\"]', string) if len(i)]\n", - " )\n", - " string = string.lower().split()\n", - " string = [(naive_stemmer(word), word) for word in string]\n", - " return (\n", - " ' '.join([word[0] for word in string if len(word[0]) > 1]),\n", - " ' '.join([word[1] for word in string if len(word[0]) > 1]),\n", - " )\n", + " string = re.sub(r'[ ]+', ' ', string.lower()).strip()\n", + " string = [rules_normalizer.get(w, w) for w in string.split()]\n", + " string = [naive_stemmer(word) for word in string]\n", + " return ' '.join([word for word in string if len(word) > 1])\n", + "\n", "\n", "def str_idx(corpus, dic, maxlen, UNK = 3):\n", " X = np.zeros((len(corpus), maxlen))\n", " for i in range(len(corpus)):\n", " for no, k in enumerate(corpus[i].split()[:maxlen][::-1]):\n", - " val = dic[k] if k in dic else UNK\n", - " X[i, -1 - no] = val\n", + " X[i, -1 - no] = dic.get(k, UNK)\n", " return X" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
labeltext
0NegativeLebih-lebih lagi dengan  kemudahan internet da...
1Positiveboleh memberi teguran kepada parti tetapi perl...
2NegativeAdalah membingungkan mengapa masyarakat Cina b...
3PositiveKami menurunkan defisit daripada 6.7 peratus p...
4NegativeIni masalahnya. Bukan rakyat, tetapi sistem
\n", - "
" - ], "text/plain": [ - " label text\n", - "0 Negative Lebih-lebih lagi dengan  kemudahan internet da...\n", - "1 Positive boleh memberi teguran kepada parti tetapi perl...\n", - "2 Negative Adalah membingungkan mengapa masyarakat Cina b...\n", - "3 Positive Kami menurunkan defisit daripada 6.7 peratus p...\n", - "4 Negative Ini masalahnya. Bukan rakyat, tetapi sistem" + "'raja benar sangat benci rakyat minyak naik gala'" ] }, - "execution_count": 5, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df = pd.read_csv('dataset/sentiment-data-v2.csv')\n", - "Y = LabelEncoder().fit_transform(df.label)\n", - "df.head()" + "classification_textcleaning('kerajaan sebenarnya sangat bencikan rakyatnya, minyak naik dan segalanya')" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ - "with open('dataset/polarity-negative-translated.txt','r') as fopen:\n", + "df = pd.read_csv('sentiment-data-v2.csv')\n", + "Y = LabelEncoder().fit_transform(df.label)\n", + "with open('polarity-negative-translated.txt','r') as fopen:\n", " texts = fopen.read().split('\\n')\n", "labels = [0] * len(texts)\n", "\n", - "with open('dataset/polarity-positive-translated.txt','r') as fopen:\n", + "with open('polarity-positive-translated.txt','r') as fopen:\n", " positive_texts = fopen.read().split('\\n')\n", "labels += [1] * len(positive_texts)\n", "texts += positive_texts\n", @@ -220,28 +711,157 @@ "assert len(labels) == len(texts)" ] }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "with open('bm-amazon.json') as fopen:\n", + " amazon = json.load(fopen)\n", + " \n", + "with open('bm-imdb.json') as fopen:\n", + " imdb = json.load(fopen)\n", + " \n", + "with open('bm-yelp.json') as fopen:\n", + " yelp = json.load(fopen)\n", + " \n", + "texts += amazon['negative']\n", + "labels += [0] * len(amazon['negative'])\n", + "texts += amazon['positive']\n", + "labels += [1] * len(amazon['positive'])\n", + "\n", + "texts += imdb['negative']\n", + "labels += [0] * len(imdb['negative'])\n", + "texts += imdb['positive']\n", + "labels += [1] * len(imdb['positive'])\n", + "\n", + "texts += yelp['negative']\n", + "labels += [0] * len(yelp['negative'])\n", + "texts += yelp['positive']\n", + "labels += [1] * len(yelp['positive'])" + ] + }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ - "for i in range(len(texts)):\n", - " texts[i] = classification_textcleaning(texts[i])[0]" + "import os\n", + "for i in [i for i in os.listdir('negative') if 'Store' not in i]:\n", + " with open('negative/'+i) as fopen:\n", + " a = json.load(fopen)\n", + " texts += a\n", + " labels += [0] * len(a)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "for i in [i for i in os.listdir('positive') if 'Store' not in i]:\n", + " with open('positive/'+i) as fopen:\n", + " a = json.load(fopen)\n", + " texts += a\n", + " labels += [1] * len(a)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(675023, 675023)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(texts),len(labels)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "for i in range(len(texts)):\n", + " texts[i] = classification_textcleaning(texts[i])" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['ada anda yiar tentang gatur tidur yang baru tidak lama lagi yusun mula ada yang baik ntiasa asa begitu jaya lepas itu',\n", + " 'lamat pagi dunia',\n", + " 'sini rumah pupu saya',\n", + " 'mungkin ini lebih anda',\n", + " 'ima kasih saya erlukan',\n", + " 'neraka windows luar dari julat harga saya cuali jika tidak',\n", + " 'neah saya harap ha enang mbali catat dalam tweet akhir saya',\n", + " 'aww saya benar benar minta maaf tentang itu tidak ada apa apa yang sa deng jadi asi tidak anda lihat quot quot malam kido',\n", + " 'saya tidak sabar untuk lihat apa kara yang akjub yang anda datang tidak nah lupa anda luar biasa',\n", + " 'deng cara saya embali dewi matahari malam tadi anda sasha sangat agum saya boleh onton filem itu ulang kali']" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "texts[-10:]" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "labels[-10:]" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "vocab from size: 13325\n", - "Most common words [('yang', 14899), ('tidak', 4588), ('untuk', 4038), ('filem', 3698), ('deng', 3350), ('ada', 3190)]\n", - "Sample data [1353, 196, 178, 98, 98, 126, 354, 4, 90, 210] ['ringkas', 'bodoh', 'bosan', 'kanak', 'kanak', 'lelaki', 'remaja', 'yang', 'begitu', 'muda']\n" + "vocab from size: 120097\n", + "Most common words [('saya', 533028), ('yang', 204446), ('tidak', 164296), ('untuk', 129707), ('anda', 126091), ('hari', 88975)]\n", + "Sample data [2667, 229, 363, 235, 235, 94, 1357, 5, 78, 678] ['ringkas', 'bodoh', 'bosan', 'kanak', 'kanak', 'lelaki', 'remaja', 'yang', 'begitu', 'muda']\n" ] } ], @@ -256,10 +876,11 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ + "\n", "class Model:\n", " def __init__(\n", " self,\n", @@ -281,7 +902,6 @@ " output_keep_prob = dropout,\n", " )\n", "\n", - "\n", " self.X = tf.placeholder(tf.int32, [None, None])\n", " self.Y = tf.placeholder(tf.int32, [None])\n", " encoder_embeddings = tf.Variable(\n", @@ -330,21 +950,21 @@ " self.accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))\n", " self.attention = tf.nn.softmax(\n", " tf.reduce_sum(self.alignments[0], 1), name = 'alphas'\n", - " )\n" + " )" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'bahdanau/model.ckpt'" + "'luong/model.ckpt'" ] }, - "execution_count": 12, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -356,7 +976,7 @@ "learning_rate = 1e-4\n", "batch_size = 32\n", "dropout = 0.8\n", - "maxlen = 80\n", + "maxlen = 100\n", "\n", "tf.reset_default_graph()\n", "sess = tf.InteractiveSession()\n", @@ -370,12 +990,12 @@ ")\n", "sess.run(tf.global_variables_initializer())\n", "saver = tf.train.Saver(tf.trainable_variables())\n", - "saver.save(sess, 'bahdanau/model.ckpt')" + "saver.save(sess, 'luong/model.ckpt')" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -395,7 +1015,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -426,7 +1046,7 @@ " 'alphas']" ] }, - "execution_count": 14, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -437,13 +1057,13 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[,\n", + "[,\n", " ,\n", " ,\n", " ,\n", @@ -454,7 +1074,7 @@ " ]" ] }, - "execution_count": 15, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -465,37 +1085,36 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ - "vectors = str_idx(texts, dictionary, maxlen)\n", "train_X, test_X, train_Y, test_Y = train_test_split(\n", - " vectors, labels, test_size = 0.2\n", + " texts, labels, test_size = 0.2\n", ")" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 357/357 [01:46<00:00, 2.77it/s, accuracy=0.516, cost=0.672]\n", - "test minibatch loop: 100%|██████████| 90/90 [00:13<00:00, 6.55it/s, accuracy=0.625, cost=0.569]\n", - "train minibatch loop: 0%| | 0/357 [00:00" + "
" ] }, "metadata": { @@ -988,7 +1564,7 @@ ], "source": [ "plt.figure(figsize = (15, 7))\n", - "labels = [word for word in text[1].split()]\n", + "labels = [word for word in text.split()]\n", "val = [val for val in result[1]]\n", "plt.bar(np.arange(len(labels)), val)\n", "plt.xticks(np.arange(len(labels)), labels, rotation = 'vertical')\n", @@ -1020,7 +1596,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.2" + "version": "3.6.8" } }, "nbformat": 4, diff --git a/session/subjectivity/fast-text-char.ipynb b/session/subjectivity/fast-text-char.ipynb index 40f0695d..1df15430 100644 --- a/session/subjectivity/fast-text-char.ipynb +++ b/session/subjectivity/fast-text-char.ipynb @@ -4,7 +4,16 @@ "cell_type": "code", "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.6/dist-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n", + " \"This module will be removed in 0.20.\", DeprecationWarning)\n" + ] + } + ], "source": [ "import re\n", "import numpy as np\n", @@ -13,8 +22,7 @@ "from sklearn import metrics\n", "from sklearn.preprocessing import LabelEncoder\n", "import tensorflow as tf\n", - "from sklearn.feature_extraction.text import CountVectorizer\n", - "from sklearn.model_selection import train_test_split\n", + "from sklearn.cross_validation import train_test_split\n", "from unidecode import unidecode\n", "from nltk.util import ngrams\n", "from tqdm import tqdm\n", @@ -48,19 +56,22 @@ "\n", "def naive_stemmer(word):\n", " assert isinstance(word, str), 'input must be a string'\n", - " hujung_result = re.findall(r'^(.*?)(%s)$' % ('|'.join(hujung)), word)\n", - " word = hujung_result[0][0] if len(hujung_result) else word\n", - " permulaan_result = re.findall(r'^(.*?)(%s)' % ('|'.join(permulaan[::-1])), word)\n", - " permulaan_result.extend(re.findall(r'^(.*?)(%s)' % ('|'.join(permulaan)), word))\n", - " mula = permulaan_result if len(permulaan_result) else ''\n", - " if len(mula):\n", - " mula = mula[1][1] if len(mula[1][1]) > len(mula[0][1]) else mula[0][1]\n", - " return word.replace(mula, '')" + " hujung_result = [e for e in hujung if word.endswith(e)]\n", + " if len(hujung_result):\n", + " hujung_result = max(hujung_result, key = len)\n", + " if len(hujung_result):\n", + " word = word[: -len(hujung_result)]\n", + " permulaan_result = [e for e in permulaan if word.startswith(e)]\n", + " if len(permulaan_result):\n", + " permulaan_result = max(permulaan_result, key = len)\n", + " if len(permulaan_result):\n", + " word = word[len(permulaan_result) :]\n", + " return word" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -79,22 +90,18 @@ " [i for i in re.findall('[\\\\w\\']+|[;:\\-\\(\\)&.,!?\"]', string) if len(i)]\n", " )\n", " string = string.lower().split()\n", - " string = [(naive_stemmer(word), word) for word in string]\n", - " return (\n", - " ' '.join([word[0] for word in string if len(word[0]) > 1]),\n", - " ' '.join([word[1] for word in string if len(word[0]) > 1]),\n", - " )\n", + " string = [naive_stemmer(word) for word in string]\n", + " return ' '.join([word for word in string if len(word) > 1])\n", "\n", - "def convert_sparse_matrix_to_sparse_tensor(X, limit = 5):\n", + "def convert_sparse_matrix_to_sparse_tensor(X):\n", " coo = X.tocoo()\n", " indices = np.mat([coo.row, coo.col]).transpose()\n", - " coo.data[coo.data > limit] = limit\n", " return tf.SparseTensorValue(indices, coo.col, coo.shape), tf.SparseTensorValue(indices, coo.data, coo.shape)" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -112,20 +119,25 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ + "x, y = [], []\n", "for i in range(len(texts)):\n", - " texts[i] = classification_textcleaning(texts[i])[0]" + " s = classification_textcleaning(texts[i])\n", + " if len(s) > 5:\n", + " x.append(s)\n", + " y.append(labels[i])" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ + "from sklearn.feature_extraction.text import CountVectorizer\n", "bow_chars = CountVectorizer(ngram_range=(3, 5), analyzer='char_wb', max_features=300000).fit(texts)\n", "delattr(bow_chars, 'stop_words_')\n", "feature_shape = bow_chars.transform(texts[:1]).shape[1]" @@ -133,7 +145,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -142,7 +154,7 @@ " self.X = tf.sparse_placeholder(tf.int32)\n", " self.W = tf.sparse_placeholder(tf.int32)\n", " self.Y = tf.placeholder(tf.int32, [None])\n", - " embeddings = tf.Variable(tf.truncated_normal([vocab_size,64]))\n", + " embeddings = tf.Variable(tf.truncated_normal([vocab_size,128]))\n", " embed = tf.nn.embedding_lookup_sparse(embeddings, self.X, self.W, combiner='mean')\n", " self.logits = tf.layers.dense(embed, 2)\n", " self.cost = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(\n", @@ -154,14 +166,14 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/gradients_impl.py:112: UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.\n", + "/usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/gradients_impl.py:112: UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.\n", " \"Converting sparse IndexedSlices to a dense Tensor of unknown shape. \"\n" ] } @@ -174,7 +186,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -183,7 +195,7 @@ "'fast-text-char/model.ckpt'" ] }, - "execution_count": 9, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -195,208 +207,37 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ - "vectors = bow_chars.transform(texts)\n", + "vectors = bow_chars.transform(x)\n", "train_X, test_X, train_Y, test_Y = train_test_split(\n", - " vectors, labels, test_size = 0.2\n", + " vectors, y, test_size = 0.2\n", ")" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 132.66it/s, accuracy=0, cost=0.723] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 368.76it/s, accuracy=0.333, cost=0.715]\n", - "train minibatch loop: 6%|▌ | 15/250 [00:00<00:01, 140.11it/s, accuracy=0.562, cost=0.689]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch: 0, pass acc: 0.000000, current acc: 0.584379\n", - "time taken: 2.057943344116211\n", - "epoch: 0, training loss: 0.691504, training acc: 0.547371, valid loss: 0.689925, valid acc: 0.584379\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 141.50it/s, accuracy=0, cost=0.707] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 386.29it/s, accuracy=0.444, cost=0.702]\n", - "train minibatch loop: 6%|▌ | 14/250 [00:00<00:01, 139.49it/s, accuracy=0.688, cost=0.657]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch: 1, pass acc: 0.584379, current acc: 0.672465\n", - "time taken: 1.940366506576538\n", - "epoch: 1, training loss: 0.676703, training acc: 0.641486, valid loss: 0.674847, valid acc: 0.672465\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 140.84it/s, accuracy=1, cost=0.691] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 381.39it/s, accuracy=0.556, cost=0.688]\n", - "train minibatch loop: 6%|▌ | 14/250 [00:00<00:01, 139.52it/s, accuracy=0.656, cost=0.655]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch: 2, pass acc: 0.672465, current acc: 0.731951\n", - "time taken: 1.9460294246673584\n", - "epoch: 2, training loss: 0.660657, training acc: 0.716276, valid loss: 0.658011, valid acc: 0.731951\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 141.21it/s, accuracy=1, cost=0.673] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 383.47it/s, accuracy=0.667, cost=0.675]\n", - "train minibatch loop: 6%|▌ | 14/250 [00:00<00:01, 139.29it/s, accuracy=0.719, cost=0.616]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch: 3, pass acc: 0.731951, current acc: 0.769861\n", - "time taken: 1.9369497299194336\n", - "epoch: 3, training loss: 0.642434, training acc: 0.762329, valid loss: 0.638832, valid acc: 0.769861\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 140.63it/s, accuracy=1, cost=0.652] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 382.93it/s, accuracy=0.667, cost=0.661]\n", - "train minibatch loop: 6%|▌ | 15/250 [00:00<00:01, 140.70it/s, accuracy=0.688, cost=0.613]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch: 4, pass acc: 0.769861, current acc: 0.797960\n", - "time taken: 1.9444482326507568\n", - "epoch: 4, training loss: 0.621668, training acc: 0.791316, valid loss: 0.617237, valid acc: 0.797960\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 140.84it/s, accuracy=1, cost=0.627] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 387.88it/s, accuracy=0.667, cost=0.646]\n", - "train minibatch loop: 6%|▌ | 15/250 [00:00<00:01, 140.67it/s, accuracy=0.75, cost=0.588] " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch: 5, pass acc: 0.797960, current acc: 0.815019\n", - "time taken: 1.939239263534546\n", - "epoch: 5, training loss: 0.598515, training acc: 0.810892, valid loss: 0.593676, valid acc: 0.815019\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 141.67it/s, accuracy=1, cost=0.599] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 380.66it/s, accuracy=0.667, cost=0.63] \n", - "train minibatch loop: 6%|▌ | 15/250 [00:00<00:01, 140.39it/s, accuracy=0.75, cost=0.562] " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch: 6, pass acc: 0.815019, current acc: 0.826058\n", - "time taken: 1.9318571090698242\n", - "epoch: 6, training loss: 0.573608, training acc: 0.827331, valid loss: 0.568980, valid acc: 0.826058\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 141.23it/s, accuracy=1, cost=0.567] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 320.40it/s, accuracy=0.667, cost=0.615]\n", - "train minibatch loop: 5%|▌ | 13/250 [00:00<00:01, 128.96it/s, accuracy=0.781, cost=0.559]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch: 7, pass acc: 0.826058, current acc: 0.838602\n", - "time taken: 1.9686055183410645\n", - "epoch: 7, training loss: 0.547853, training acc: 0.837244, valid loss: 0.544119, valid acc: 0.838602\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 138.95it/s, accuracy=1, cost=0.532] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 383.18it/s, accuracy=0.667, cost=0.599]\n", - "train minibatch loop: 6%|▌ | 14/250 [00:00<00:01, 139.49it/s, accuracy=0.75, cost=0.51] " - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch: 8, pass acc: 0.838602, current acc: 0.844121\n", - "time taken: 1.9654672145843506\n", - "epoch: 8, training loss: 0.522203, training acc: 0.846154, valid loss: 0.519986, valid acc: 0.844121\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 136.07it/s, accuracy=1, cost=0.495] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 386.74it/s, accuracy=0.667, cost=0.585]\n", - "train minibatch loop: 6%|▌ | 15/250 [00:00<00:01, 140.88it/s, accuracy=0.75, cost=0.485] " + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 70.09it/s, accuracy=1, cost=0.677] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 342.76it/s, accuracy=0.667, cost=0.643]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 73.91it/s, accuracy=0.594, cost=0.669]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 9, pass acc: 0.844121, current acc: 0.848135\n", - "time taken: 2.002082109451294\n", - "epoch: 9, training loss: 0.497461, training acc: 0.852177, valid loss: 0.497258, valid acc: 0.848135\n", + "epoch: 0, pass acc: 0.000000, current acc: 0.619836\n", + "time taken: 3.7533926963806152\n", + "epoch: 0, training loss: 0.685426, training acc: 0.569708, valid loss: 0.679796, valid acc: 0.619836\n", "\n" ] }, @@ -404,18 +245,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 140.88it/s, accuracy=1, cost=0.457] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 385.45it/s, accuracy=0.667, cost=0.571]\n", - "train minibatch loop: 6%|▌ | 15/250 [00:00<00:01, 140.58it/s, accuracy=0.812, cost=0.462]" + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 72.87it/s, accuracy=1, cost=0.676] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 358.85it/s, accuracy=0.778, cost=0.617]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 73.65it/s, accuracy=0.75, cost=0.647] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 10, pass acc: 0.848135, current acc: 0.849640\n", - "time taken: 1.9400067329406738\n", - "epoch: 10, training loss: 0.474194, training acc: 0.856695, valid loss: 0.476349, valid acc: 0.849640\n", + "epoch: 1, pass acc: 0.619836, current acc: 0.717957\n", + "time taken: 3.6083834171295166\n", + "epoch: 1, training loss: 0.663374, training acc: 0.668465, valid loss: 0.659503, valid acc: 0.717957\n", "\n" ] }, @@ -423,18 +264,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 141.15it/s, accuracy=1, cost=0.419] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 384.11it/s, accuracy=0.667, cost=0.559]\n", - "train minibatch loop: 6%|▌ | 15/250 [00:00<00:01, 141.41it/s, accuracy=0.844, cost=0.44] " + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 72.79it/s, accuracy=1, cost=0.67] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 364.50it/s, accuracy=0.889, cost=0.588]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 73.56it/s, accuracy=0.75, cost=0.622] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 11, pass acc: 0.849640, current acc: 0.855661\n", - "time taken: 1.9369804859161377\n", - "epoch: 11, training loss: 0.452712, training acc: 0.862718, valid loss: 0.457439, valid acc: 0.855661\n", + "epoch: 2, pass acc: 0.717957, current acc: 0.765401\n", + "time taken: 3.6092426776885986\n", + "epoch: 2, training loss: 0.639591, training acc: 0.741122, valid loss: 0.636817, valid acc: 0.765401\n", "\n" ] }, @@ -442,18 +283,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 140.92it/s, accuracy=1, cost=0.382] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 384.54it/s, accuracy=0.667, cost=0.549]\n", - "train minibatch loop: 6%|▌ | 15/250 [00:00<00:01, 140.83it/s, accuracy=0.844, cost=0.42] " + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 72.73it/s, accuracy=1, cost=0.66] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 361.53it/s, accuracy=0.889, cost=0.556]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 72.94it/s, accuracy=0.812, cost=0.594]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 12, pass acc: 0.855661, current acc: 0.858170\n", - "time taken: 1.9396755695343018\n", - "epoch: 12, training loss: 0.433118, training acc: 0.867863, valid loss: 0.440528, valid acc: 0.858170\n", + "epoch: 3, pass acc: 0.765401, current acc: 0.786977\n", + "time taken: 3.6130621433258057\n", + "epoch: 3, training loss: 0.612778, training acc: 0.789309, valid loss: 0.611288, valid acc: 0.786977\n", "\n" ] }, @@ -461,18 +302,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 141.31it/s, accuracy=1, cost=0.347] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 383.73it/s, accuracy=0.667, cost=0.54] \n", - "train minibatch loop: 6%|▌ | 15/250 [00:00<00:01, 140.98it/s, accuracy=0.844, cost=0.402]" + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 72.90it/s, accuracy=1, cost=0.645] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 359.34it/s, accuracy=0.889, cost=0.52] \n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 73.11it/s, accuracy=0.812, cost=0.565]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 13, pass acc: 0.858170, current acc: 0.861683\n", - "time taken: 1.9351062774658203\n", - "epoch: 13, training loss: 0.415371, training acc: 0.871000, valid loss: 0.425510, valid acc: 0.861683\n", + "epoch: 4, pass acc: 0.786977, current acc: 0.806043\n", + "time taken: 3.613224983215332\n", + "epoch: 4, training loss: 0.582990, training acc: 0.815284, valid loss: 0.583503, valid acc: 0.806043\n", "\n" ] }, @@ -480,18 +321,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 140.95it/s, accuracy=1, cost=0.313] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 383.26it/s, accuracy=0.667, cost=0.532]\n", - "train minibatch loop: 6%|▌ | 15/250 [00:00<00:01, 142.03it/s, accuracy=0.844, cost=0.384]" + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 72.82it/s, accuracy=1, cost=0.625] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 361.00it/s, accuracy=0.889, cost=0.484]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 72.96it/s, accuracy=0.812, cost=0.534]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 14, pass acc: 0.861683, current acc: 0.862686\n", - "time taken: 1.9404613971710205\n", - "epoch: 14, training loss: 0.399342, training acc: 0.872882, valid loss: 0.412217, valid acc: 0.862686\n", + "epoch: 5, pass acc: 0.806043, current acc: 0.814071\n", + "time taken: 3.6099295616149902\n", + "epoch: 5, training loss: 0.551289, training acc: 0.833605, valid loss: 0.554787, valid acc: 0.814071\n", "\n" ] }, @@ -499,18 +340,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 141.19it/s, accuracy=1, cost=0.282] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 382.06it/s, accuracy=0.667, cost=0.526]\n", - "train minibatch loop: 6%|▌ | 14/250 [00:00<00:01, 138.86it/s, accuracy=0.875, cost=0.393]" + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 72.70it/s, accuracy=1, cost=0.598] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 362.84it/s, accuracy=0.889, cost=0.449]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 72.90it/s, accuracy=0.812, cost=0.503]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 15, pass acc: 0.862686, current acc: 0.863188\n", - "time taken: 1.937262773513794\n", - "epoch: 15, training loss: 0.384863, training acc: 0.876522, valid loss: 0.400461, valid acc: 0.863188\n", + "epoch: 6, pass acc: 0.814071, current acc: 0.820594\n", + "time taken: 3.6144044399261475\n", + "epoch: 6, training loss: 0.519261, training acc: 0.843142, valid loss: 0.526669, valid acc: 0.820594\n", "\n" ] }, @@ -518,18 +359,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 139.86it/s, accuracy=1, cost=0.254] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 379.77it/s, accuracy=0.667, cost=0.521]\n", - "train minibatch loop: 6%|▌ | 15/250 [00:00<00:01, 140.81it/s, accuracy=0.875, cost=0.384]" + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 72.77it/s, accuracy=1, cost=0.566] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 359.75it/s, accuracy=0.889, cost=0.417]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 73.74it/s, accuracy=0.812, cost=0.474]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 16, pass acc: 0.863188, current acc: 0.865697\n", - "time taken: 1.9556941986083984\n", - "epoch: 16, training loss: 0.371752, training acc: 0.879659, valid loss: 0.390054, valid acc: 0.865697\n", + "epoch: 7, pass acc: 0.820594, current acc: 0.827117\n", + "time taken: 3.6120619773864746\n", + "epoch: 7, training loss: 0.488437, training acc: 0.850295, valid loss: 0.500409, valid acc: 0.827117\n", "\n" ] }, @@ -537,18 +378,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 141.06it/s, accuracy=1, cost=0.228] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 384.90it/s, accuracy=0.667, cost=0.517]\n", - "train minibatch loop: 6%|▌ | 14/250 [00:00<00:01, 139.95it/s, accuracy=0.875, cost=0.34] " + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 72.79it/s, accuracy=1, cost=0.529] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 345.64it/s, accuracy=0.889, cost=0.389]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 72.52it/s, accuracy=0.875, cost=0.447]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 17, pass acc: 0.865697, current acc: 0.867704\n", - "time taken: 1.9377660751342773\n", - "epoch: 17, training loss: 0.359836, training acc: 0.881917, valid loss: 0.380819, valid acc: 0.867704\n", + "epoch: 8, pass acc: 0.827117, current acc: 0.834142\n", + "time taken: 3.618224859237671\n", + "epoch: 8, training loss: 0.459905, training acc: 0.858075, valid loss: 0.476761, valid acc: 0.834142\n", "\n" ] }, @@ -556,18 +397,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 141.01it/s, accuracy=1, cost=0.204] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 385.50it/s, accuracy=0.667, cost=0.514]\n", - "train minibatch loop: 6%|▌ | 14/250 [00:00<00:01, 138.52it/s, accuracy=0.875, cost=0.37] " + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 72.80it/s, accuracy=1, cost=0.49] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 361.02it/s, accuracy=0.889, cost=0.364]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 73.07it/s, accuracy=0.906, cost=0.423]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 18, pass acc: 0.867704, current acc: 0.870714\n", - "time taken: 1.9382882118225098\n", - "epoch: 18, training loss: 0.348954, training acc: 0.884804, valid loss: 0.372599, valid acc: 0.870714\n", + "epoch: 9, pass acc: 0.834142, current acc: 0.839159\n", + "time taken: 3.6102097034454346\n", + "epoch: 9, training loss: 0.434198, training acc: 0.864977, valid loss: 0.455991, valid acc: 0.839159\n", "\n" ] }, @@ -575,18 +416,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 141.17it/s, accuracy=1, cost=0.183] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 383.95it/s, accuracy=0.667, cost=0.512]\n", - "train minibatch loop: 6%|▌ | 15/250 [00:00<00:01, 140.10it/s, accuracy=0.875, cost=0.315]" + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 72.82it/s, accuracy=1, cost=0.449] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 358.81it/s, accuracy=0.889, cost=0.342]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 73.16it/s, accuracy=0.938, cost=0.401]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 19, pass acc: 0.870714, current acc: 0.872219\n", - "time taken: 1.9366741180419922\n", - "epoch: 19, training loss: 0.338965, training acc: 0.886435, valid loss: 0.365256, valid acc: 0.872219\n", + "epoch: 10, pass acc: 0.839159, current acc: 0.842672\n", + "time taken: 3.6107470989227295\n", + "epoch: 10, training loss: 0.411403, training acc: 0.868867, valid loss: 0.438023, valid acc: 0.842672\n", "\n" ] }, @@ -594,18 +435,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 141.42it/s, accuracy=1, cost=0.164] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 383.66it/s, accuracy=0.667, cost=0.51] \n", - "train minibatch loop: 6%|▌ | 15/250 [00:00<00:01, 140.55it/s, accuracy=0.906, cost=0.359]" + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 72.80it/s, accuracy=1, cost=0.408] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 359.27it/s, accuracy=0.889, cost=0.324]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 72.93it/s, accuracy=0.906, cost=0.381]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 20, pass acc: 0.872219, current acc: 0.873223\n", - "time taken: 1.9462225437164307\n", - "epoch: 20, training loss: 0.329747, training acc: 0.889070, valid loss: 0.358671, valid acc: 0.873223\n", + "epoch: 11, pass acc: 0.842672, current acc: 0.844177\n", + "time taken: 3.61116623878479\n", + "epoch: 11, training loss: 0.391329, training acc: 0.872631, valid loss: 0.422596, valid acc: 0.844177\n", "\n" ] }, @@ -613,17 +454,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 140.52it/s, accuracy=1, cost=0.147] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 383.69it/s, accuracy=0.667, cost=0.509]\n", - "train minibatch loop: 6%|▌ | 15/250 [00:00<00:01, 140.95it/s, accuracy=0.875, cost=0.293]" + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 72.83it/s, accuracy=1, cost=0.369] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 359.83it/s, accuracy=0.889, cost=0.309]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 72.94it/s, accuracy=0.906, cost=0.363]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 1.9455444812774658\n", - "epoch: 21, training loss: 0.321195, training acc: 0.890952, valid loss: 0.352742, valid acc: 0.873223\n", + "epoch: 12, pass acc: 0.844177, current acc: 0.850198\n", + "time taken: 3.609103202819824\n", + "epoch: 12, training loss: 0.373658, training acc: 0.877525, valid loss: 0.409375, valid acc: 0.850198\n", "\n" ] }, @@ -631,18 +473,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 141.19it/s, accuracy=1, cost=0.131] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 280.02it/s, accuracy=0.667, cost=0.509]\n", - "train minibatch loop: 6%|▌ | 15/250 [00:00<00:01, 141.66it/s, accuracy=0.875, cost=0.282]" + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 72.84it/s, accuracy=1, cost=0.331] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 357.14it/s, accuracy=0.889, cost=0.295]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 73.50it/s, accuracy=0.906, cost=0.347]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 22, pass acc: 0.873223, current acc: 0.874226\n", - "time taken: 1.9974935054779053\n", - "epoch: 22, training loss: 0.313220, training acc: 0.893964, valid loss: 0.347384, valid acc: 0.874226\n", + "epoch: 13, pass acc: 0.850198, current acc: 0.851703\n", + "time taken: 3.610186815261841\n", + "epoch: 13, training loss: 0.358040, training acc: 0.881917, valid loss: 0.398026, valid acc: 0.851703\n", "\n" ] }, @@ -650,18 +492,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 140.80it/s, accuracy=1, cost=0.118] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 382.06it/s, accuracy=0.667, cost=0.509]\n", - "train minibatch loop: 6%|▌ | 15/250 [00:00<00:01, 141.55it/s, accuracy=0.875, cost=0.272]" + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 72.89it/s, accuracy=1, cost=0.296] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 349.37it/s, accuracy=0.889, cost=0.283]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 72.48it/s, accuracy=0.906, cost=0.333]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 23, pass acc: 0.874226, current acc: 0.875230\n", - "time taken: 1.943094253540039\n", - "epoch: 23, training loss: 0.305747, training acc: 0.896725, valid loss: 0.342522, valid acc: 0.875230\n", + "epoch: 14, pass acc: 0.851703, current acc: 0.855717\n", + "time taken: 3.6123716831207275\n", + "epoch: 14, training loss: 0.344145, training acc: 0.886435, valid loss: 0.388243, valid acc: 0.855717\n", "\n" ] }, @@ -669,17 +511,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 141.11it/s, accuracy=1, cost=0.106] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 381.89it/s, accuracy=0.667, cost=0.51] \n", - "train minibatch loop: 6%|▌ | 15/250 [00:00<00:01, 140.93it/s, accuracy=0.875, cost=0.263]" + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 72.68it/s, accuracy=1, cost=0.263] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 333.86it/s, accuracy=0.889, cost=0.273]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 70.37it/s, accuracy=0.906, cost=0.319]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 1.9383635520935059\n", - "epoch: 24, training loss: 0.298715, training acc: 0.898356, valid loss: 0.338095, valid acc: 0.874728\n", + "epoch: 15, pass acc: 0.855717, current acc: 0.857724\n", + "time taken: 3.630380868911743\n", + "epoch: 15, training loss: 0.331682, training acc: 0.889447, valid loss: 0.379764, valid acc: 0.857724\n", "\n" ] }, @@ -687,17 +530,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 141.28it/s, accuracy=1, cost=0.0949] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 383.35it/s, accuracy=0.667, cost=0.511]\n", - "train minibatch loop: 6%|▌ | 14/250 [00:00<00:01, 139.64it/s, accuracy=0.875, cost=0.254]" + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 72.44it/s, accuracy=1, cost=0.234] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 363.92it/s, accuracy=0.889, cost=0.264]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 72.11it/s, accuracy=0.906, cost=0.307]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 1.935624599456787\n", - "epoch: 25, training loss: 0.292069, training acc: 0.900238, valid loss: 0.334051, valid acc: 0.874728\n", + "epoch: 16, pass acc: 0.857724, current acc: 0.860233\n", + "time taken: 3.625947952270508\n", + "epoch: 16, training loss: 0.320406, training acc: 0.893462, valid loss: 0.372368, valid acc: 0.860233\n", "\n" ] }, @@ -705,18 +549,17 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 140.88it/s, accuracy=1, cost=0.0854] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 382.41it/s, accuracy=0.667, cost=0.512]\n", - "train minibatch loop: 6%|▌ | 14/250 [00:00<00:01, 137.77it/s, accuracy=0.906, cost=0.333]" + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 72.79it/s, accuracy=1, cost=0.207] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 363.38it/s, accuracy=0.778, cost=0.256]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 73.29it/s, accuracy=0.906, cost=0.295]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 26, pass acc: 0.875230, current acc: 0.876233\n", - "time taken: 1.9413058757781982\n", - "epoch: 26, training loss: 0.285767, training acc: 0.901493, valid loss: 0.330346, valid acc: 0.876233\n", + "time taken: 3.6094651222229004\n", + "epoch: 17, training loss: 0.310119, training acc: 0.897227, valid loss: 0.365877, valid acc: 0.859954\n", "\n" ] }, @@ -724,18 +567,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 139.93it/s, accuracy=1, cost=0.0769] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 382.77it/s, accuracy=0.667, cost=0.514]\n", - "train minibatch loop: 6%|▌ | 15/250 [00:00<00:01, 140.52it/s, accuracy=0.906, cost=0.238]" + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 72.86it/s, accuracy=1, cost=0.183] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 357.29it/s, accuracy=0.778, cost=0.249]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 72.64it/s, accuracy=0.906, cost=0.285]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 27, pass acc: 0.876233, current acc: 0.879244\n", - "time taken: 1.9531888961791992\n", - "epoch: 27, training loss: 0.279769, training acc: 0.903376, valid loss: 0.326941, valid acc: 0.879244\n", + "epoch: 18, pass acc: 0.860233, current acc: 0.861460\n", + "time taken: 3.6095030307769775\n", + "epoch: 18, training loss: 0.300658, training acc: 0.899736, valid loss: 0.360145, valid acc: 0.861460\n", "\n" ] }, @@ -743,18 +586,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 140.69it/s, accuracy=1, cost=0.0694] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 386.76it/s, accuracy=0.667, cost=0.516]\n", - "train minibatch loop: 6%|▌ | 15/250 [00:00<00:01, 141.85it/s, accuracy=0.906, cost=0.23] " + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 72.88it/s, accuracy=1, cost=0.162] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 359.76it/s, accuracy=0.778, cost=0.243]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 72.92it/s, accuracy=0.906, cost=0.275]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 28, pass acc: 0.879244, current acc: 0.880749\n", - "time taken: 1.9434189796447754\n", - "epoch: 28, training loss: 0.274044, training acc: 0.905634, valid loss: 0.323804, valid acc: 0.880749\n", + "epoch: 19, pass acc: 0.861460, current acc: 0.862463\n", + "time taken: 3.6069769859313965\n", + "epoch: 19, training loss: 0.291894, training acc: 0.901870, valid loss: 0.355054, valid acc: 0.862463\n", "\n" ] }, @@ -762,18 +605,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 140.90it/s, accuracy=1, cost=0.0627] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 381.16it/s, accuracy=0.667, cost=0.518]\n", - "train minibatch loop: 6%|▌ | 15/250 [00:00<00:01, 140.93it/s, accuracy=0.938, cost=0.222]" + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 72.76it/s, accuracy=1, cost=0.144] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 362.89it/s, accuracy=0.778, cost=0.237]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 72.37it/s, accuracy=0.906, cost=0.266]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 29, pass acc: 0.880749, current acc: 0.881753\n", - "time taken: 1.9414536952972412\n", - "epoch: 29, training loss: 0.268564, training acc: 0.907768, valid loss: 0.320907, valid acc: 0.881753\n", + "epoch: 20, pass acc: 0.862463, current acc: 0.863968\n", + "time taken: 3.611123561859131\n", + "epoch: 20, training loss: 0.283721, training acc: 0.904756, valid loss: 0.350509, valid acc: 0.863968\n", "\n" ] }, @@ -781,17 +624,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 140.54it/s, accuracy=1, cost=0.0568] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 382.64it/s, accuracy=0.667, cost=0.52] \n", - "train minibatch loop: 6%|▌ | 15/250 [00:00<00:01, 141.17it/s, accuracy=0.906, cost=0.319]" + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 72.65it/s, accuracy=1, cost=0.127] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 356.95it/s, accuracy=0.778, cost=0.232]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 72.66it/s, accuracy=0.906, cost=0.257]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 1.9452533721923828\n", - "epoch: 30, training loss: 0.263307, training acc: 0.910152, valid loss: 0.318228, valid acc: 0.881753\n", + "epoch: 21, pass acc: 0.863968, current acc: 0.864972\n", + "time taken: 3.619170665740967\n", + "epoch: 21, training loss: 0.276056, training acc: 0.906387, valid loss: 0.346434, valid acc: 0.864972\n", "\n" ] }, @@ -799,17 +643,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 141.52it/s, accuracy=1, cost=0.0515] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 382.33it/s, accuracy=0.667, cost=0.523]\n", - "train minibatch loop: 6%|▌ | 14/250 [00:00<00:01, 139.61it/s, accuracy=0.906, cost=0.316]" + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 72.75it/s, accuracy=1, cost=0.113] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 362.54it/s, accuracy=0.778, cost=0.227]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 72.87it/s, accuracy=0.906, cost=0.249]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 1.9482879638671875\n", - "epoch: 31, training loss: 0.258252, training acc: 0.911783, valid loss: 0.315743, valid acc: 0.880749\n", + "epoch: 22, pass acc: 0.864972, current acc: 0.865975\n", + "time taken: 3.6117050647735596\n", + "epoch: 22, training loss: 0.268832, training acc: 0.910152, valid loss: 0.342765, valid acc: 0.865975\n", "\n" ] }, @@ -817,18 +662,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 141.46it/s, accuracy=1, cost=0.0468] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 383.58it/s, accuracy=0.667, cost=0.525]\n", - "train minibatch loop: 6%|▌ | 15/250 [00:00<00:01, 140.72it/s, accuracy=0.938, cost=0.202]" + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 72.71it/s, accuracy=1, cost=0.1] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 360.50it/s, accuracy=0.778, cost=0.222]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 73.02it/s, accuracy=0.906, cost=0.241]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 32, pass acc: 0.881753, current acc: 0.882255\n", - "time taken: 1.9427552223205566\n", - "epoch: 32, training loss: 0.253383, training acc: 0.913791, valid loss: 0.313438, valid acc: 0.882255\n", + "epoch: 23, pass acc: 0.865975, current acc: 0.867982\n", + "time taken: 3.6148324012756348\n", + "epoch: 23, training loss: 0.261993, training acc: 0.913164, valid loss: 0.339452, valid acc: 0.867982\n", "\n" ] }, @@ -836,18 +681,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 141.49it/s, accuracy=1, cost=0.0425] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 383.16it/s, accuracy=0.667, cost=0.528]\n", - "train minibatch loop: 6%|▌ | 14/250 [00:00<00:01, 139.33it/s, accuracy=0.906, cost=0.309]" + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 72.84it/s, accuracy=1, cost=0.0894] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 359.41it/s, accuracy=0.889, cost=0.218]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 73.32it/s, accuracy=0.906, cost=0.233]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 33, pass acc: 0.882255, current acc: 0.883258\n", - "time taken: 1.9330670833587646\n", - "epoch: 33, training loss: 0.248683, training acc: 0.915799, valid loss: 0.311294, valid acc: 0.883258\n", + "epoch: 24, pass acc: 0.867982, current acc: 0.870268\n", + "time taken: 3.6091933250427246\n", + "epoch: 24, training loss: 0.255495, training acc: 0.915046, valid loss: 0.336452, valid acc: 0.870268\n", "\n" ] }, @@ -855,17 +700,17 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 140.84it/s, accuracy=1, cost=0.0388] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 381.17it/s, accuracy=0.667, cost=0.531]\n", - "train minibatch loop: 6%|▌ | 15/250 [00:00<00:01, 140.65it/s, accuracy=0.938, cost=0.19] " + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 72.80it/s, accuracy=1, cost=0.0798] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 360.80it/s, accuracy=0.889, cost=0.214]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 73.50it/s, accuracy=0.906, cost=0.226]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 1.942573070526123\n", - "epoch: 34, training loss: 0.244140, training acc: 0.917054, valid loss: 0.309300, valid acc: 0.882756\n", + "time taken: 3.610092878341675\n", + "epoch: 25, training loss: 0.249301, training acc: 0.916301, valid loss: 0.333730, valid acc: 0.869766\n", "\n" ] }, @@ -873,17 +718,17 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 140.65it/s, accuracy=1, cost=0.0354] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 387.62it/s, accuracy=0.667, cost=0.535]\n", - "train minibatch loop: 6%|▌ | 15/250 [00:00<00:01, 141.22it/s, accuracy=0.938, cost=0.185]" + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 72.78it/s, accuracy=1, cost=0.0715] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 349.51it/s, accuracy=0.889, cost=0.21] \n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 73.77it/s, accuracy=0.906, cost=0.22] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 1.9421100616455078\n", - "epoch: 35, training loss: 0.239742, training acc: 0.919061, valid loss: 0.307442, valid acc: 0.883258\n", + "time taken: 3.6166813373565674\n", + "epoch: 26, training loss: 0.243380, training acc: 0.919061, valid loss: 0.331257, valid acc: 0.869766\n", "\n" ] }, @@ -891,92 +736,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 140.86it/s, accuracy=1, cost=0.0323] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 384.79it/s, accuracy=0.667, cost=0.538]\n", - "train minibatch loop: 6%|▌ | 15/250 [00:00<00:01, 140.76it/s, accuracy=0.938, cost=0.18] " + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 72.87it/s, accuracy=1, cost=0.0642] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 359.48it/s, accuracy=0.889, cost=0.207]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 36, pass acc: 0.883258, current acc: 0.883760\n", - "time taken: 1.9409313201904297\n", - "epoch: 36, training loss: 0.235480, training acc: 0.919940, valid loss: 0.305711, valid acc: 0.883760\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 140.81it/s, accuracy=1, cost=0.0296] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 384.25it/s, accuracy=0.667, cost=0.542]\n", - "train minibatch loop: 6%|▌ | 15/250 [00:00<00:01, 140.39it/s, accuracy=0.938, cost=0.174]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "epoch: 37, pass acc: 0.883760, current acc: 0.884763\n", - "time taken: 1.9411437511444092\n", - "epoch: 37, training loss: 0.231344, training acc: 0.922449, valid loss: 0.304098, valid acc: 0.884763\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 140.70it/s, accuracy=1, cost=0.0271] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 381.36it/s, accuracy=0.667, cost=0.545]\n", - "train minibatch loop: 6%|▌ | 14/250 [00:00<00:01, 139.41it/s, accuracy=0.906, cost=0.294]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "time taken: 1.9439127445220947\n", - "epoch: 38, training loss: 0.227327, training acc: 0.924206, valid loss: 0.302595, valid acc: 0.884262\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 138.76it/s, accuracy=1, cost=0.0249] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 382.89it/s, accuracy=0.667, cost=0.549]\n", - "train minibatch loop: 6%|▌ | 14/250 [00:00<00:01, 138.93it/s, accuracy=0.906, cost=0.291]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "time taken: 1.968212366104126\n", - "epoch: 39, training loss: 0.223421, training acc: 0.925461, valid loss: 0.301193, valid acc: 0.884262\n", - "\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:01<00:00, 139.79it/s, accuracy=1, cost=0.0229] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 382.79it/s, accuracy=0.667, cost=0.553]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "time taken: 1.9546802043914795\n", - "epoch: 40, training loss: 0.219620, training acc: 0.926591, valid loss: 0.299888, valid acc: 0.884262\n", + "time taken: 3.6078076362609863\n", + "epoch: 27, training loss: 0.237706, training acc: 0.921571, valid loss: 0.329006, valid acc: 0.870268\n", "\n", - "break epoch:41\n", + "break epoch:28\n", "\n" ] }, @@ -1021,7 +792,6 @@ " train_loss += cost\n", " train_acc += acc\n", " pbar.set_postfix(cost = cost, accuracy = acc)\n", - "\n", " pbar = tqdm(range(0, test_X.shape[0], batch_size), desc = 'test minibatch loop')\n", " for i in pbar:\n", " batch_x = convert_sparse_matrix_to_sparse_tensor(test_X[i : min(i + batch_size, test_X.shape[0])])\n", @@ -1053,7 +823,6 @@ " CURRENT_CHECKPOINT = 0\n", " else:\n", " CURRENT_CHECKPOINT += 1\n", - "\n", " print('time taken:', time.time() - lasttime)\n", " print(\n", " 'epoch: %d, training loss: %f, training acc: %f, valid loss: %f, valid acc: %f\\n'\n", @@ -1064,14 +833,14 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "validation minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 623.93it/s]\n" + "validation minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 586.12it/s]\n" ] } ], @@ -1095,7 +864,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -1104,10 +873,10 @@ "text": [ " precision recall f1-score support\n", "\n", - " negative 0.88 0.88 0.88 1002\n", - " positive 0.88 0.87 0.88 991\n", + " negative 0.85 0.87 0.86 992\n", + " positive 0.87 0.85 0.86 1001\n", "\n", - "avg / total 0.88 0.88 0.88 1993\n", + "avg / total 0.86 0.86 0.86 1993\n", "\n" ] } @@ -1122,7 +891,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -1131,7 +900,7 @@ "'fast-text-char/model.ckpt'" ] }, - "execution_count": 14, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -1142,7 +911,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -1150,6 +919,13 @@ "with open('vectorizer-sparse-subjectivity.pkl','wb') as fopen:\n", " pickle.dump(bow_chars, fopen)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -1168,7 +944,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.2" + "version": "3.6.8" } }, "nbformat": 4, diff --git a/session/subjectivity/fast-text.ipynb b/session/subjectivity/fast-text.ipynb index 2610da14..42c9b90d 100644 --- a/session/subjectivity/fast-text.ipynb +++ b/session/subjectivity/fast-text.ipynb @@ -4,7 +4,16 @@ "cell_type": "code", "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.6/dist-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n", + " \"This module will be removed in 0.20.\", DeprecationWarning)\n" + ] + } + ], "source": [ "import re\n", "import numpy as np\n", @@ -13,7 +22,7 @@ "from sklearn import metrics\n", "from sklearn.preprocessing import LabelEncoder\n", "import tensorflow as tf\n", - "from sklearn.model_selection import train_test_split\n", + "from sklearn.cross_validation import train_test_split\n", "from unidecode import unidecode\n", "from nltk.util import ngrams\n", "from tqdm import tqdm\n", @@ -47,14 +56,17 @@ "\n", "def naive_stemmer(word):\n", " assert isinstance(word, str), 'input must be a string'\n", - " hujung_result = re.findall(r'^(.*?)(%s)$' % ('|'.join(hujung)), word)\n", - " word = hujung_result[0][0] if len(hujung_result) else word\n", - " permulaan_result = re.findall(r'^(.*?)(%s)' % ('|'.join(permulaan[::-1])), word)\n", - " permulaan_result.extend(re.findall(r'^(.*?)(%s)' % ('|'.join(permulaan)), word))\n", - " mula = permulaan_result if len(permulaan_result) else ''\n", - " if len(mula):\n", - " mula = mula[1][1] if len(mula[1][1]) > len(mula[0][1]) else mula[0][1]\n", - " return word.replace(mula, '')" + " hujung_result = [e for e in hujung if word.endswith(e)]\n", + " if len(hujung_result):\n", + " hujung_result = max(hujung_result, key = len)\n", + " if len(hujung_result):\n", + " word = word[: -len(hujung_result)]\n", + " permulaan_result = [e for e in permulaan if word.startswith(e)]\n", + " if len(permulaan_result):\n", + " permulaan_result = max(permulaan_result, key = len)\n", + " if len(permulaan_result):\n", + " word = word[len(permulaan_result) :]\n", + " return word" ] }, { @@ -97,55 +109,42 @@ " [i for i in re.findall('[\\\\w\\']+|[;:\\-\\(\\)&.,!?\"]', string) if len(i)]\n", " )\n", " string = string.lower().split()\n", - " string = [(naive_stemmer(word), word) for word in string]\n", - " return (\n", - " ' '.join([word[0] for word in string if len(word[0]) > 1]),\n", - " ' '.join([word[1] for word in string if len(word[0]) > 1]),\n", - " )\n", - "\n", + " string = [naive_stemmer(word) for word in string]\n", + " return ' '.join([word for word in string if len(word) > 1])\n", "\n", - "def str_idx(corpus, dic, UNK = 3):\n", - " X = []\n", - " for sentence in corpus:\n", - " X.append([dic.get(w,UNK) for w in sentence.split()[:maxlen]])\n", - " return X\n", "\n", - "def create_ngram_set(input_list, ngram_value):\n", - " return set(zip(*[input_list[i:] for i in range(ngram_value)]))\n", - "\n", - "\n", - "def build_ngram(x_train):\n", - " global max_features\n", - " ngram_set = set()\n", - " for input_list in tqdm(x_train, total = len(x_train), ncols = 70):\n", - " for i in range(2, 3):\n", - " set_of_ngram = create_ngram_set(input_list, ngram_value = i)\n", - " ngram_set.update(set_of_ngram)\n", - " start_index = max_features + 1\n", - " token_indice = {v: k + start_index for k, v in enumerate(ngram_set)}\n", - " indice_token = {token_indice[k]: k for k in token_indice}\n", - "\n", - " max_features = np.max(list(indice_token.keys())) + 1\n", - " return token_indice\n", - "\n", - "\n", - "def add_ngram(sequences, token_indice):\n", - " new_sequences = []\n", - " for input_list in sequences:\n", - " new_list = input_list[:]\n", - " for ngram_value in range(2, ngram_range + 1):\n", - " for i in range(len(new_list) - ngram_value + 1):\n", - " ngram = tuple(new_list[i : i + ngram_value])\n", - " if ngram in token_indice:\n", - " new_list.append(token_indice[ngram])\n", - " new_sequences.append(new_list)\n", - " return new_sequences" + "def str_idx(corpus, dic, maxlen, UNK = 3):\n", + " X = np.zeros((len(corpus), maxlen))\n", + " for i in range(len(corpus)):\n", + " for no, k in enumerate(corpus[i].split()[:maxlen][::-1]):\n", + " X[i, -1 - no] = dic.get(k, UNK)\n", + " return X" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'raja benar sangat benci rakyat minyak naik gala'" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "classification_textcleaning('kerajaan sebenarnya sangat bencikan rakyatnya, minyak naik dan segalanya')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, "outputs": [], "source": [ "with open('subjectivity-negative-translated.txt','r') as fopen:\n", @@ -162,26 +161,26 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "for i in range(len(texts)):\n", - " texts[i] = classification_textcleaning(texts[i])[0]" + " texts[i] = classification_textcleaning(texts[i])" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "vocab from size: 13222\n", - "Most common words [('yang', 11804), ('untuk', 3879), ('tidak', 2898), ('deng', 2827), ('ada', 2294), ('dalam', 2193)]\n", - "Sample data [10, 68, 13, 27, 55, 54, 11, 392, 34, 182] ['filem', 'mula', 'pada', 'masa', 'lalu', 'mana', 'orang', 'budak', 'lelaki', 'nama']\n" + "vocab from size: 13269\n", + "Most common words [('yang', 11804), ('untuk', 3879), ('tidak', 2898), ('deng', 2827), ('ada', 2298), ('dalam', 2193)]\n", + "Sample data [10, 68, 13, 28, 55, 53, 11, 387, 34, 186] ['filem', 'mula', 'pada', 'masa', 'lalu', 'mana', 'orang', 'budak', 'lelaki', 'nama']\n" ] } ], @@ -196,43 +195,23 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ - "ngram_range = 2\n", "max_features = len(dictionary)\n", - "maxlen = 80\n", + "maxlen = 100\n", "batch_size = 32\n", "embedded_size = 256" ] }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "idx_trainset = str_idx(texts, dictionary, maxlen)" - ] - }, { "cell_type": "code", "execution_count": 9, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|█████████████████████████| 9962/9962 [00:00<00:00, 200836.62it/s]\n" - ] - } - ], + "outputs": [], "source": [ - "token_indice = build_ngram(idx_trainset)\n", - "X = add_ngram(idx_trainset, token_indice)\n", - "X = tf.keras.preprocessing.sequence.pad_sequences(X, maxlen)" + "X = str_idx(texts, dictionary, maxlen)" ] }, { @@ -360,7 +339,7 @@ { "data": { "text/plain": [ - "[,\n", + "[,\n", " ,\n", " ]" ] @@ -383,18 +362,113 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:07<00:00, 33.18it/s, accuracy=0, cost=0.786] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 658.73it/s, accuracy=0.778, cost=0.643]\n", - "train minibatch loop: 2%|▏ | 4/250 [00:00<00:07, 33.91it/s, accuracy=0.875, cost=0.606]" + "train minibatch loop: 100%|██████████| 250/250 [00:03<00:00, 80.20it/s, accuracy=0, cost=0.779] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 231.76it/s, accuracy=0.667, cost=0.646]\n", + "train minibatch loop: 3%|▎ | 7/250 [00:00<00:03, 66.79it/s, accuracy=0.594, cost=0.666]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 0, pass acc: 0.000000, current acc: 0.609299\n", + "time taken: 3.391561985015869\n", + "epoch: 0, training loss: 0.685732, training acc: 0.553896, valid loss: 0.676238, valid acc: 0.609299\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 250/250 [00:02<00:00, 85.88it/s, accuracy=0, cost=0.736] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 222.72it/s, accuracy=0.667, cost=0.621]\n", + "train minibatch loop: 4%|▎ | 9/250 [00:00<00:02, 81.30it/s, accuracy=0.688, cost=0.632]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 1, pass acc: 0.609299, current acc: 0.761833\n", + "time taken: 3.1963703632354736\n", + "epoch: 1, training loss: 0.648177, training acc: 0.701845, valid loss: 0.635186, valid acc: 0.761833\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 250/250 [00:02<00:00, 87.14it/s, accuracy=1, cost=0.676] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 222.57it/s, accuracy=0.778, cost=0.59] \n", + "train minibatch loop: 4%|▍ | 11/250 [00:00<00:02, 106.93it/s, accuracy=0.875, cost=0.512]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 2, pass acc: 0.761833, current acc: 0.838881\n", + "time taken: 3.2188074588775635\n", + "epoch: 2, training loss: 0.598484, training acc: 0.799724, valid loss: 0.580830, valid acc: 0.838881\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 250/250 [00:02<00:00, 85.58it/s, accuracy=1, cost=0.607] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 236.82it/s, accuracy=0.778, cost=0.56] \n", + "train minibatch loop: 4%|▎ | 9/250 [00:00<00:02, 85.48it/s, accuracy=0.906, cost=0.44] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 3, pass acc: 0.838881, current acc: 0.852930\n", + "time taken: 3.1890017986297607\n", + "epoch: 3, training loss: 0.537547, training acc: 0.848162, valid loss: 0.521171, valid acc: 0.852930\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 250/250 [00:02<00:00, 85.20it/s, accuracy=1, cost=0.54] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 232.53it/s, accuracy=0.778, cost=0.538]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 73.89it/s, accuracy=0.875, cost=0.421]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "epoch: 4, pass acc: 0.852930, current acc: 0.859954\n", + "time taken: 3.206967353820801\n", + "epoch: 4, training loss: 0.475943, training acc: 0.868616, valid loss: 0.467396, valid acc: 0.859954\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "train minibatch loop: 100%|██████████| 250/250 [00:02<00:00, 89.77it/s, accuracy=1, cost=0.481] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 228.06it/s, accuracy=0.778, cost=0.523]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 76.36it/s, accuracy=0.875, cost=0.378]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 0, pass acc: 0.000000, current acc: 0.748564\n", - "time taken: 7.632977724075317\n", - "epoch: 0, training loss: 0.680961, training acc: 0.622412, valid loss: 0.653781, valid acc: 0.748564\n", + "epoch: 5, pass acc: 0.859954, current acc: 0.865975\n", + "time taken: 3.1982595920562744\n", + "epoch: 5, training loss: 0.422640, training acc: 0.880914, valid loss: 0.424664, valid acc: 0.865975\n", "\n" ] }, @@ -402,18 +476,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:07<00:00, 33.67it/s, accuracy=0, cost=0.756] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 696.41it/s, accuracy=0.778, cost=0.6]\n", - "train minibatch loop: 2%|▏ | 4/250 [00:00<00:07, 33.77it/s, accuracy=0.938, cost=0.508]" + "train minibatch loop: 100%|██████████| 250/250 [00:02<00:00, 85.60it/s, accuracy=1, cost=0.431] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 216.14it/s, accuracy=0.778, cost=0.514]\n", + "train minibatch loop: 5%|▍ | 12/250 [00:00<00:02, 117.18it/s, accuracy=0.844, cost=0.372]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 1, pass acc: 0.748564, current acc: 0.832358\n", - "time taken: 7.517005920410156\n", - "epoch: 1, training loss: 0.603597, training acc: 0.802610, valid loss: 0.583401, valid acc: 0.832358\n", + "epoch: 6, pass acc: 0.865975, current acc: 0.875509\n", + "time taken: 3.2150681018829346\n", + "epoch: 6, training loss: 0.379994, training acc: 0.888945, valid loss: 0.392454, valid acc: 0.875509\n", "\n" ] }, @@ -421,18 +495,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:07<00:00, 33.65it/s, accuracy=0, cost=0.698] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 684.95it/s, accuracy=0.778, cost=0.555]\n", - "train minibatch loop: 2%|▏ | 4/250 [00:00<00:07, 33.88it/s, accuracy=0.938, cost=0.394]" + "train minibatch loop: 100%|██████████| 250/250 [00:02<00:00, 83.97it/s, accuracy=1, cost=0.391] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 235.45it/s, accuracy=0.778, cost=0.508]\n", + "train minibatch loop: 4%|▎ | 9/250 [00:00<00:02, 84.60it/s, accuracy=0.719, cost=0.498]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 2, pass acc: 0.832358, current acc: 0.853933\n", - "time taken: 7.524259567260742\n", - "epoch: 2, training loss: 0.503871, training acc: 0.878529, valid loss: 0.501211, valid acc: 0.853933\n", + "epoch: 7, pass acc: 0.875509, current acc: 0.878018\n", + "time taken: 3.2466814517974854\n", + "epoch: 7, training loss: 0.346466, training acc: 0.894968, valid loss: 0.368386, valid acc: 0.878018\n", "\n" ] }, @@ -440,18 +514,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:07<00:00, 33.70it/s, accuracy=1, cost=0.611] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 692.77it/s, accuracy=0.889, cost=0.528]\n", - "train minibatch loop: 2%|▏ | 4/250 [00:00<00:07, 33.58it/s, accuracy=0.938, cost=0.297]" + "train minibatch loop: 100%|██████████| 250/250 [00:02<00:00, 84.28it/s, accuracy=1, cost=0.359] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 177.22it/s, accuracy=0.778, cost=0.504]\n", + "train minibatch loop: 4%|▎ | 9/250 [00:00<00:02, 84.59it/s, accuracy=0.906, cost=0.276]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 3, pass acc: 0.853933, current acc: 0.868763\n", - "time taken: 7.511051893234253\n", - "epoch: 3, training loss: 0.401316, training acc: 0.914167, valid loss: 0.432543, valid acc: 0.868763\n", + "epoch: 8, pass acc: 0.878018, current acc: 0.880025\n", + "time taken: 3.2371163368225098\n", + "epoch: 8, training loss: 0.319742, training acc: 0.899486, valid loss: 0.350208, valid acc: 0.880025\n", "\n" ] }, @@ -459,18 +533,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:07<00:00, 33.67it/s, accuracy=1, cost=0.513] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 687.21it/s, accuracy=0.889, cost=0.519]\n", - "train minibatch loop: 2%|▏ | 4/250 [00:00<00:07, 33.74it/s, accuracy=0.938, cost=0.226]" + "train minibatch loop: 100%|██████████| 250/250 [00:02<00:00, 85.55it/s, accuracy=1, cost=0.332] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 255.06it/s, accuracy=0.778, cost=0.501]\n", + "train minibatch loop: 3%|▎ | 7/250 [00:00<00:03, 65.36it/s, accuracy=0.906, cost=0.245]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 4, pass acc: 0.868763, current acc: 0.875787\n", - "time taken: 7.518678188323975\n", - "epoch: 4, training loss: 0.318071, training acc: 0.934120, valid loss: 0.384561, valid acc: 0.875787\n", + "epoch: 9, pass acc: 0.880025, current acc: 0.882533\n", + "time taken: 3.1710965633392334\n", + "epoch: 9, training loss: 0.297900, training acc: 0.905258, valid loss: 0.336245, valid acc: 0.882533\n", "\n" ] }, @@ -478,18 +552,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:07<00:00, 33.69it/s, accuracy=1, cost=0.417] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 685.18it/s, accuracy=0.778, cost=0.519]\n", - "train minibatch loop: 2%|▏ | 4/250 [00:00<00:07, 33.70it/s, accuracy=0.969, cost=0.175]" + "train minibatch loop: 100%|██████████| 250/250 [00:02<00:00, 86.30it/s, accuracy=1, cost=0.31] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 212.60it/s, accuracy=0.778, cost=0.499]\n", + "train minibatch loop: 4%|▍ | 11/250 [00:00<00:02, 104.89it/s, accuracy=0.938, cost=0.182]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 5, pass acc: 0.875787, current acc: 0.880526\n", - "time taken: 7.51415228843689\n", - "epoch: 5, training loss: 0.255521, training acc: 0.950809, valid loss: 0.352085, valid acc: 0.880526\n", + "epoch: 10, pass acc: 0.882533, current acc: 0.885042\n", + "time taken: 3.1959893703460693\n", + "epoch: 10, training loss: 0.279566, training acc: 0.911532, valid loss: 0.325334, valid acc: 0.885042\n", "\n" ] }, @@ -497,18 +571,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:07<00:00, 33.72it/s, accuracy=1, cost=0.332] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 694.75it/s, accuracy=0.778, cost=0.525]\n", - "train minibatch loop: 2%|▏ | 4/250 [00:00<00:07, 33.74it/s, accuracy=0.969, cost=0.137]" + "train minibatch loop: 100%|██████████| 250/250 [00:02<00:00, 86.02it/s, accuracy=1, cost=0.292] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 235.11it/s, accuracy=0.778, cost=0.498]\n", + "train minibatch loop: 4%|▎ | 9/250 [00:00<00:03, 79.07it/s, accuracy=0.75, cost=0.455] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 6, pass acc: 0.880526, current acc: 0.884039\n", - "time taken: 7.50698447227478\n", - "epoch: 6, training loss: 0.208035, training acc: 0.962856, valid loss: 0.329528, valid acc: 0.884039\n", + "epoch: 11, pass acc: 0.885042, current acc: 0.890060\n", + "time taken: 3.1764888763427734\n", + "epoch: 11, training loss: 0.263799, training acc: 0.914920, valid loss: 0.316681, valid acc: 0.890060\n", "\n" ] }, @@ -516,18 +590,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:07<00:00, 33.64it/s, accuracy=1, cost=0.26] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 687.90it/s, accuracy=0.778, cost=0.536]\n", - "train minibatch loop: 2%|▏ | 4/250 [00:00<00:07, 33.55it/s, accuracy=1, cost=0.108] " + "train minibatch loop: 100%|██████████| 250/250 [00:02<00:00, 85.31it/s, accuracy=1, cost=0.276] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 227.50it/s, accuracy=0.778, cost=0.498]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 74.38it/s, accuracy=0.906, cost=0.197]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 7, pass acc: 0.884039, current acc: 0.888053\n", - "time taken: 7.525402784347534\n", - "epoch: 7, training loss: 0.170951, training acc: 0.972895, valid loss: 0.313284, valid acc: 0.888053\n", + "epoch: 12, pass acc: 0.890060, current acc: 0.891063\n", + "time taken: 3.2097699642181396\n", + "epoch: 12, training loss: 0.249953, training acc: 0.920693, valid loss: 0.309735, valid acc: 0.891063\n", "\n" ] }, @@ -535,18 +609,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:07<00:00, 33.68it/s, accuracy=1, cost=0.201] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 699.15it/s, accuracy=0.778, cost=0.549]\n", - "train minibatch loop: 2%|▏ | 4/250 [00:00<00:07, 33.55it/s, accuracy=1, cost=0.0852] " + "train minibatch loop: 100%|██████████| 250/250 [00:02<00:00, 85.97it/s, accuracy=1, cost=0.263] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 231.38it/s, accuracy=0.778, cost=0.498]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 78.19it/s, accuracy=0.938, cost=0.179]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 8, pass acc: 0.888053, current acc: 0.891565\n", - "time taken: 7.515627861022949\n", - "epoch: 8, training loss: 0.141317, training acc: 0.980801, valid loss: 0.301207, valid acc: 0.891565\n", + "epoch: 13, pass acc: 0.891063, current acc: 0.893572\n", + "time taken: 3.184178590774536\n", + "epoch: 13, training loss: 0.237585, training acc: 0.924457, valid loss: 0.304114, valid acc: 0.893572\n", "\n" ] }, @@ -554,18 +628,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:07<00:00, 33.73it/s, accuracy=1, cost=0.156] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 690.38it/s, accuracy=0.778, cost=0.565]\n", - "train minibatch loop: 2%|▏ | 4/250 [00:00<00:07, 33.51it/s, accuracy=1, cost=0.0677] " + "train minibatch loop: 100%|██████████| 250/250 [00:02<00:00, 86.80it/s, accuracy=1, cost=0.252] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 219.03it/s, accuracy=0.778, cost=0.499]\n", + "train minibatch loop: 5%|▍ | 12/250 [00:00<00:02, 110.12it/s, accuracy=0.938, cost=0.147]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 9, pass acc: 0.891565, current acc: 0.894575\n", - "time taken: 7.505678415298462\n", - "epoch: 9, training loss: 0.117280, training acc: 0.986698, valid loss: 0.292013, valid acc: 0.894575\n", + "epoch: 14, pass acc: 0.893572, current acc: 0.894575\n", + "time taken: 3.2424464225769043\n", + "epoch: 14, training loss: 0.226381, training acc: 0.928473, valid loss: 0.299542, valid acc: 0.894575\n", "\n" ] }, @@ -573,18 +647,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:07<00:00, 33.73it/s, accuracy=1, cost=0.12] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 695.93it/s, accuracy=0.778, cost=0.584]\n", - "train minibatch loop: 2%|▏ | 4/250 [00:00<00:07, 33.57it/s, accuracy=1, cost=0.054] " + "train minibatch loop: 100%|██████████| 250/250 [00:02<00:00, 84.83it/s, accuracy=1, cost=0.243] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 213.38it/s, accuracy=0.778, cost=0.5] \n", + "train minibatch loop: 5%|▍ | 12/250 [00:00<00:02, 110.51it/s, accuracy=0.75, cost=0.414] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 10, pass acc: 0.894575, current acc: 0.898088\n", - "time taken: 7.503463268280029\n", - "epoch: 10, training loss: 0.097605, training acc: 0.990965, valid loss: 0.284905, valid acc: 0.898088\n", + "epoch: 15, pass acc: 0.894575, current acc: 0.895579\n", + "time taken: 3.2455670833587646\n", + "epoch: 15, training loss: 0.216118, training acc: 0.932739, valid loss: 0.295822, valid acc: 0.895579\n", "\n" ] }, @@ -592,18 +666,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:07<00:00, 33.71it/s, accuracy=1, cost=0.0932] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 681.82it/s, accuracy=0.778, cost=0.603]\n", - "train minibatch loop: 2%|▏ | 4/250 [00:00<00:07, 33.69it/s, accuracy=1, cost=0.0432]" + "train minibatch loop: 100%|██████████| 250/250 [00:02<00:00, 86.58it/s, accuracy=1, cost=0.234] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 211.03it/s, accuracy=0.778, cost=0.502]\n", + "train minibatch loop: 4%|▎ | 9/250 [00:00<00:03, 78.15it/s, accuracy=0.75, cost=0.403] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 11, pass acc: 0.898088, current acc: 0.899091\n", - "time taken: 7.510956048965454\n", - "epoch: 11, training loss: 0.081416, training acc: 0.993726, valid loss: 0.279370, valid acc: 0.899091\n", + "epoch: 16, pass acc: 0.895579, current acc: 0.897084\n", + "time taken: 3.1893484592437744\n", + "epoch: 16, training loss: 0.206631, training acc: 0.935626, valid loss: 0.292807, valid acc: 0.897084\n", "\n" ] }, @@ -611,17 +685,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:07<00:00, 33.68it/s, accuracy=1, cost=0.0726] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 676.67it/s, accuracy=0.778, cost=0.625]\n", - "train minibatch loop: 2%|▏ | 4/250 [00:00<00:07, 33.90it/s, accuracy=1, cost=0.0347]" + "train minibatch loop: 100%|██████████| 250/250 [00:02<00:00, 85.59it/s, accuracy=1, cost=0.227] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 241.81it/s, accuracy=0.778, cost=0.504]\n", + "train minibatch loop: 3%|▎ | 7/250 [00:00<00:04, 59.32it/s, accuracy=0.969, cost=0.144]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 7.517028331756592\n", - "epoch: 12, training loss: 0.068056, training acc: 0.996235, valid loss: 0.275068, valid acc: 0.898590\n", + "epoch: 17, pass acc: 0.897084, current acc: 0.898088\n", + "time taken: 3.183919668197632\n", + "epoch: 17, training loss: 0.197800, training acc: 0.938888, valid loss: 0.290387, valid acc: 0.898088\n", "\n" ] }, @@ -629,18 +704,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:07<00:00, 33.73it/s, accuracy=1, cost=0.0569] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 634.37it/s, accuracy=0.778, cost=0.648]\n", - "train minibatch loop: 2%|▏ | 4/250 [00:00<00:07, 33.89it/s, accuracy=1, cost=0.0279]" + "train minibatch loop: 100%|██████████| 250/250 [00:02<00:00, 84.57it/s, accuracy=1, cost=0.221] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 238.50it/s, accuracy=0.889, cost=0.506]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 72.00it/s, accuracy=0.969, cost=0.13] " ] }, { "name": "stdout", "output_type": "stream", "text": [ - "epoch: 13, pass acc: 0.899091, current acc: 0.900597\n", - "time taken: 7.513111114501953\n", - "epoch: 13, training loss: 0.057012, training acc: 0.997992, valid loss: 0.271764, valid acc: 0.900597\n", + "epoch: 18, pass acc: 0.898088, current acc: 0.899872\n", + "time taken: 3.223072052001953\n", + "epoch: 18, training loss: 0.189530, training acc: 0.941272, valid loss: 0.288476, valid acc: 0.899872\n", "\n" ] }, @@ -648,17 +723,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:07<00:00, 33.74it/s, accuracy=1, cost=0.045] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 676.52it/s, accuracy=0.778, cost=0.672]\n", - "train minibatch loop: 2%|▏ | 4/250 [00:00<00:07, 33.89it/s, accuracy=1, cost=0.0226]" + "train minibatch loop: 100%|██████████| 250/250 [00:02<00:00, 85.54it/s, accuracy=1, cost=0.215] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 212.98it/s, accuracy=0.889, cost=0.509]\n", + "train minibatch loop: 5%|▍ | 12/250 [00:00<00:02, 111.31it/s, accuracy=0.938, cost=0.202]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 7.504401206970215\n", - "epoch: 14, training loss: 0.047870, training acc: 0.999498, valid loss: 0.269292, valid acc: 0.899091\n", + "epoch: 19, pass acc: 0.899872, current acc: 0.901377\n", + "time taken: 3.220914602279663\n", + "epoch: 19, training loss: 0.181752, training acc: 0.943657, valid loss: 0.287009, valid acc: 0.901377\n", "\n" ] }, @@ -666,17 +742,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:07<00:00, 33.72it/s, accuracy=1, cost=0.0358] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 640.80it/s, accuracy=0.778, cost=0.697]\n", - "train minibatch loop: 2%|▏ | 4/250 [00:00<00:07, 33.91it/s, accuracy=1, cost=0.0184]" + "train minibatch loop: 100%|██████████| 250/250 [00:02<00:00, 85.78it/s, accuracy=1, cost=0.21] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 235.75it/s, accuracy=0.889, cost=0.511]\n", + "train minibatch loop: 3%|▎ | 8/250 [00:00<00:03, 77.09it/s, accuracy=0.938, cost=0.197]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 7.51427149772644\n", - "epoch: 15, training loss: 0.040289, training acc: 1.000376, valid loss: 0.267529, valid acc: 0.898088\n", + "epoch: 20, pass acc: 0.901377, current acc: 0.901879\n", + "time taken: 3.183746099472046\n", + "epoch: 20, training loss: 0.174408, training acc: 0.947296, valid loss: 0.285935, valid acc: 0.901879\n", "\n" ] }, @@ -684,17 +761,17 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:07<00:00, 33.68it/s, accuracy=1, cost=0.0288] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 666.64it/s, accuracy=0.778, cost=0.722]\n", - "train minibatch loop: 2%|▏ | 4/250 [00:00<00:07, 33.62it/s, accuracy=1, cost=0.015] " + "train minibatch loop: 100%|██████████| 250/250 [00:02<00:00, 80.64it/s, accuracy=1, cost=0.205] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 247.81it/s, accuracy=0.889, cost=0.514]\n", + "train minibatch loop: 3%|▎ | 7/250 [00:00<00:03, 68.21it/s, accuracy=0.938, cost=0.176]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 7.519939184188843\n", - "epoch: 16, training loss: 0.033989, training acc: 1.001757, valid loss: 0.266378, valid acc: 0.898590\n", + "time taken: 3.181997060775757\n", + "epoch: 21, training loss: 0.167454, training acc: 0.950182, valid loss: 0.285210, valid acc: 0.899370\n", "\n" ] }, @@ -702,17 +779,17 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:07<00:00, 33.73it/s, accuracy=1, cost=0.0233] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 641.40it/s, accuracy=0.778, cost=0.748]\n", - "train minibatch loop: 2%|▏ | 4/250 [00:00<00:07, 33.80it/s, accuracy=1, cost=0.0123]" + "train minibatch loop: 100%|██████████| 250/250 [00:02<00:00, 87.21it/s, accuracy=1, cost=0.2] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 215.59it/s, accuracy=0.889, cost=0.517]\n", + "train minibatch loop: 4%|▍ | 11/250 [00:00<00:02, 106.46it/s, accuracy=0.938, cost=0.118]" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 7.512571334838867\n", - "epoch: 17, training loss: 0.028741, training acc: 1.002008, valid loss: 0.265757, valid acc: 0.897586\n", + "time taken: 3.1607871055603027\n", + "epoch: 22, training loss: 0.160853, training acc: 0.952441, valid loss: 0.284802, valid acc: 0.899872\n", "\n" ] }, @@ -720,18 +797,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "train minibatch loop: 100%|██████████| 250/250 [00:07<00:00, 33.69it/s, accuracy=1, cost=0.019] \n", - "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 698.68it/s, accuracy=0.778, cost=0.774]\n" + "train minibatch loop: 100%|██████████| 250/250 [00:02<00:00, 85.02it/s, accuracy=1, cost=0.196] \n", + "test minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 242.72it/s, accuracy=0.889, cost=0.52] \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "time taken: 7.5115885734558105\n", - "epoch: 18, training loss: 0.024360, training acc: 1.002259, valid loss: 0.265591, valid acc: 0.897586\n", + "time taken: 3.201809883117676\n", + "epoch: 23, training loss: 0.154575, training acc: 0.955076, valid loss: 0.284680, valid acc: 0.901879\n", "\n", - "break epoch:19\n", + "break epoch:24\n", "\n" ] }, @@ -747,7 +824,7 @@ } ], "source": [ - "EARLY_STOPPING, CURRENT_CHECKPOINT, CURRENT_ACC, EPOCH = 5, 0, 0, 0\n", + "EARLY_STOPPING, CURRENT_CHECKPOINT, CURRENT_ACC, EPOCH = 3, 0, 0, 0\n", "\n", "while True:\n", " lasttime = time.time()\n", @@ -811,6 +888,7 @@ " % (EPOCH, train_loss, train_acc, test_loss, test_acc)\n", " )\n", " EPOCH += 1\n", + "\n", "saver.save(sess, \"fast-text/model.ckpt\")" ] }, @@ -818,35 +896,82 @@ "cell_type": "code", "execution_count": 17, "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "validation minibatch loop: 100%|██████████| 63/63 [00:00<00:00, 718.86it/s]\n" + ] + } + ], + "source": [ + "real_Y, predict_Y = [], []\n", + "\n", + "pbar = tqdm(\n", + " range(0, len(test_X), batch_size), desc = 'validation minibatch loop'\n", + ")\n", + "for i in pbar:\n", + " batch_x = test_X[i : min(i + batch_size, test_X.shape[0])]\n", + " batch_y = test_Y[i : min(i + batch_size, test_X.shape[0])]\n", + " predict_Y += np.argmax(\n", + " sess.run(\n", + " model.logits, feed_dict = {model.X: batch_x, model.Y: batch_y}\n", + " ),\n", + " 1,\n", + " ).tolist()\n", + " real_Y += batch_y" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - " precision recall f1-score support\n", + " precision recall f1-score support\n", "\n", - " negative 0.88 0.91 0.89 1003\n", - " positive 0.90 0.87 0.89 990\n", + " - 0.88 0.89 0.89 953\n", + " + 0.90 0.89 0.90 1040\n", "\n", - " micro avg 0.89 0.89 0.89 1993\n", - " macro avg 0.89 0.89 0.89 1993\n", - "weighted avg 0.89 0.89 0.89 1993\n", + "avg / total 0.89 0.89 0.89 1993\n", "\n" ] } ], "source": [ - "logits = sess.run(model.logits, feed_dict = {model.X: test_X})\n", - "print(\n", - " metrics.classification_report(\n", - " test_Y, np.argmax(logits, 1), target_names = ['negative', 'positive']\n", - " )\n", - ")" + "from sklearn import metrics\n", + "print(metrics.classification_report(real_Y, predict_Y, target_names = ['-','+']))" ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[2.0217092e-05, 9.9997973e-01]], dtype=float32)" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "text = 'kerajaan sebenarnya sangat sayangkan rakyatnya, tetapi sebenarnya benci'\n", + "new_vector = str_idx([classification_textcleaning(text)],dictionary, len(text.split()))\n", + "sess.run(tf.nn.softmax(model.logits), feed_dict={model.X:new_vector})" + ] + }, + { + "cell_type": "code", + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -857,7 +982,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 21, "metadata": {}, "outputs": [], "source": [ @@ -892,7 +1017,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -912,7 +1037,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -934,14 +1059,14 @@ "name": "stderr", "output_type": "stream", "text": [ - "/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py:1702: UserWarning: An interactive session is already active. This can cause out-of-memory errors in some cases. You must explicitly call `InteractiveSession.close()` to release resources held by the other session(s).\n", + "/usr/local/lib/python3.6/dist-packages/tensorflow/python/client/session.py:1702: UserWarning: An interactive session is already active. This can cause out-of-memory errors in some cases. You must explicitly call `InteractiveSession.close()` to release resources held by the other session(s).\n", " warnings.warn('An interactive session is already active. This can '\n" ] }, { "data": { "text/plain": [ - "array([[0.00218716, 0.99781287]], dtype=float32)" + "array([[2.0217092e-05, 9.9997973e-01]], dtype=float32)" ] }, "execution_count": 24, @@ -954,22 +1079,9 @@ "x = g.get_tensor_by_name('import/Placeholder:0')\n", "logits = g.get_tensor_by_name('import/logits:0')\n", "test_sess = tf.InteractiveSession(graph = g)\n", - "text = 'kerajaan sebenarnya sangat sayangkan rakyatnya, tetapi sebenarnya benci'\n", - "new_vector = add_ngram(str_idx([classification_textcleaning(text)[0]],dictionary), token_indice)\n", "test_sess.run(tf.nn.softmax(logits), feed_dict = {x: new_vector})" ] }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "import pickle\n", - "with open('token-indice.pkl','wb') as fopen:\n", - " pickle.dump(token_indice, fopen)" - ] - }, { "cell_type": "code", "execution_count": null, @@ -994,7 +1106,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.2" + "version": "3.6.8" } }, "nbformat": 4, diff --git a/setup-gpu.py b/setup-gpu.py index ec2842d3..41201272 100644 --- a/setup-gpu.py +++ b/setup-gpu.py @@ -6,7 +6,7 @@ setuptools.setup( name = __packagename__, packages = setuptools.find_packages(), - version = '1.6.1.1', + version = '1.7', python_requires = '==3.6.*', description = 'Natural-Language-Toolkit for bahasa Malaysia, powered by Deep Learning. GPU Version', author = 'huseinzol05', diff --git a/setup.py b/setup.py index e722a5a6..215a8219 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ setuptools.setup( name = __packagename__, packages = setuptools.find_packages(), - version = '1.6.1.1', + version = '1.7', python_requires = '==3.6.*', description = 'Natural-Language-Toolkit for bahasa Malaysia, powered by Deep Learning.', author = 'huseinzol05',