1. Tujuan
a. Memahami apa itu Hidden Markov Model.
b. Mencari implementasi Hidden Markov Model
2. Alat dan Bahan
3. Materi
A. Apa itu Hidden Markov Model.
Hidden Markov Model (HMM) adalah salah satu varian supervised learning,7
diberikan
sekuens input dan output yang bersesuaian sebagai training data. Pada kasus POS tagging,
yaitu input -nya adalah sekuens kata
dan output -nya adalah sekuens kelas kata (masing-masing
kata/token berkorespondensi den- gan kelas kata).
Saat melatih HMM, kita ingin mengestimasi parameter A dan b yaitu transition probabilities dan
emission probabilities.
B. Probabilistic Reasoning
Pada logika matematika (first order logic), ketika
kita memiliki premis
“bila hujan, maka ayu terpeleset.” Pada level first order
logic, apabila “hujan” ter-jadi, maka “terpeleset” juga
pasti akan terjadi. Tetapi tidak sebaliknya, apa- bila kita “terpeleset”, belum tentu “hujan”
juga terjadi. Pada probabilistic reasoning kita mengkuantifikasi kepastian atau ketidakpastian itu. Apabila “hujan” terjadi, berapa besar kemungkinan
“terpeleset” juga terjadi (dan sebaliknya).
Hal ini disebut Bayesian network
Gambar ini menerangkan hubungan
pengkon- disian events, disebut
Bayesian Network. Panah dari
“hujan” ke “terpe- leset”
merepresentasikan bahwa “hujan” adalah kondisi yang menyebabkan “terpeleset” terjadi (causality
).
Dalam Bayesian network maka terbagi :
- Serial. Bila kita mengetahui A maka kita bisa mengetahui sesuatu tentang B dan C. Tetapi apabila kita mengetahui B, mengetahui A tidak akan membantu inferensi kita terhadap C. Mengetahui C akan membuat kita mengetahui sesuatu tentang A ketika kita tidak mengetahui B. Artinya, hubungan antara A dan C di-block ketika B diketahui.
- Diverging. Bila kita mengetahui A maka kita bisa mengetahui sesuatu tentang C, dan sebaliknya. Tetapi apabila B diketahui, maka hubungan antara A dan C menjadi terputus. Dengan bahasa lebih matematis, A dan C independen kondisional ketika B diketahui.
- Converging. Tanpa mengetahui B,
kita tidak bisa mencari tahu hubungan antara A dan C. Dengan bahasa lebih matematis, A dan C dependen kondisional ketika B diketahui.
Hubungan antara serial, diverging dan converging bisa dilihat di gambar ini:
C. Generative model
generative model memodelkan p(x,
y). Per- samaan itu dapat difaktorkan
sebagai p(x, y) = p(y x)p(x). sementara Pada supervised
learning kita memodelkan p(y x), memodelkan target
y (label) ketika diberikan input x,2 yaitu mencari tahu decision
boundary antara keputusan. x dan y dapat berupa vektor, skalar, gambar,
dan lain sebagainya. Sementara pada unsupervised learning, kita ingin mengaproksimasi distribusi asli dari sebuah input sebagai p(x)
D. POS Tagging
POS tagging adalah salah satu bentuk pekerjaan sequential classifi- cation. Diberikan sebuah
sekuens kata (membentuk satu kalimat), kita in- gin menentukan kelas setiap kata/token pada
kalimat tersebut. Kita ingin memilih sekuens kelas kata syntactic categories yang paling cocok
untuk kata- kata/tokens pada kalimat yang
diberikan. Secara formal, diberikan sekuens kata-kata
w1, w2, . . . , wT
, kita ingin mencari sekuens kelas kata c1, c2, . . . , cT sedemikian sehingga
kita memaksimalkan nilai probabilitas
contoh:
diberikan sebuah kalimat “Budi/Noun menendang/Verb bola/Noun” “Budi menendang bola”. Sete- lah proses POS tagging, kamu akan mendapat (Gambar 8.4).
POS tagging adalah salah satu bentuk pekerjaan sequential classifi- cation. Diberikan sebuah
sekuens kata (membentuk satu kalimat), kita in- gin menentukan kelas setiap kata/token pada
kalimat tersebut. Kita ingin memilih sekuens kelas kata syntactic categories yang paling cocok
untuk kata- kata/tokens pada kalimat yang
diberikan. Secara formal, diberikan sekuens kata-kata
w1, w2, . . . , wT
, kita ingin mencari sekuens kelas kata c1, c2, . . . , cT sedemikian sehingga
kita memaksimalkan nilai probabilitas
kata
sangat sulit untuk didaftar/sangat banyak). Teori Bayes digunakan untuk melakukan aproksimasi permasalahan ini.
Ingat kembali teori Bayes seperti
E. Hidden Markov Model Tagger
Markov chain adalah kasus spesial weighted automaton yang mana sekuens input menentukan states yang akan dilewati oleh automaton. Sederhananya, automaton mencapai goal states setelah mengunjungi berbagai states. Total bobot outgoing edges untuk masing - masing state pada automaton haruslah bernilai satu apabila dijumlahkan kasus spesial yang yang dimaksud adalah emission.
Sebagai Contoh pada gambar. ART adalah article, N adalah noun, V adalah verb dan P adalah preposition. Mereka adalah contoh kelas kata yang disederhanakan demi membuat contoh yang mudah. Tabel dibawah mempresentasikan probabilitas kelas kata, ketika dikonversi menjadi weighted automaton.
Seumpama kita mempunyai lexical emission probabilities seperti pada tabel. Setiap state pada automaton, dapat menghasilkan/meng-outputkan suatu kata (word) dengan probabilitas pada tabel kita bisa mengembangkan gambar weighted aytomaton tadi menjadi
Automaton ini disebut hidden markov model (HMM). Kata hidden berarti, untuk setiap kata pada sekuens, kita tidak mengetahui kata tersebut dihasilkan oleh state mana secara model. Misalkan kata flies dapat dihasilkan oleh state N(noun) atau V(verb).
F. Algoritma Viterbi
Algoritma Viterbi adalah salah satu algoritma dynamic programing yang prinsip kerjanya mirip dengan minimum edit distance. Ide utama algoritma viterbi adalah mengingat sekuens untuk setiap posisi tertentu( setiap iterasi, setiap panjang kalimat). apabila kita telah smpai pada kata terakhir, kita lakukan backtrace untuk mendapatkan sekuens terbaik.
Pada gambar diatas menunjukkan pseudo-code untuk algoritma Viterbi. Variabel c berarti kelas kata, a adalah transition probability, dan b adalah lexical-generation probability. Pertama-tama algoritma tersebut membuat suatu matrik berukuran SxT dengan S adalah banyaknya states ( tidak termasuk start state ) dan T (time) adalah panjang sekuens. Pada setiap iterasi, kita pindah ke observasi kata lainnya.
Gambat diatas adalah ilustrasi algoritma Viterbi untuk kalimat input (observed sequence ) "flies like a flowe" dengan lexical generation probability pada Lexical emisson probabilities dan transition probabilities pada probabilitas bigram.
Panah bewarna merah melambangkan backpointer yaitu state mana yang memberikan nilai tertinggi untuk melambangkan backpointer yaitu state mana yang memberikan nilai tertinggi untuk ekspansi ke state berikutnya. Setelah iteration step selesai, kita lakukan backtrace terhadap state terakhir yang memiliki nilai probabilitas tertinggi dan mendapat hasil seperti pada gambar dibawah.
G. Proses training Hidden Markov Model
Hidden Markov Model (HMM) adalah salah satu varian supervised learning, diberikan sekuens input dan output yang bersesuaian sebagai training data. Pada kasus POS tagging, yaitu inputnya adalah sekuens kata dan outputnya adalah sekuens kelas kata ( masing - masing kata/token berkorepondensi dengan kelas kata). Saat melatih HMM, kita ingin mengestimasi parameter A dan B yaitu transition probabilities dan emission probabilities/lexical-generation probabilitie. Kita melatih dengan menggunakan algoritma Forward-Backward (Baum-Welch Algorithm).
Dengan menggunakan teorema Bayes maka:
5. Contoh
Kita mulai dengan mengimport library
Source : https://www.mygreatlearning.com/blog/pos-tagging/
<atas input> || <bawah output>
# Importing libraries import nltk import numpy as np import pandas as pd import random from sklearn.model_selection import train_test_split import pprint, time #download the treebank corpus from nltk nltk.download( 'treebank' ) #download the universal tagset from nltk nltk.download( 'universal_tagset' ) # reading the Treebank tagged sentences nltk_data = list (nltk.corpus.treebank.tagged_sents(tagset = 'universal' )) #print the first two sentences along with tags print (nltk_data[: 2 ]) |
Output:
1 2 3 4 | #print each word with its respective tag for first two sentences for sent in nltk_data[: 2 ]: for tuple in sent: print ( tuple ) |
Output:
Bagi data menjadi testing data dan training data
Menggunakan data type untuk cek unique tag
Output:
1 2 3 4 | # convert the matrix to a df for better readability #the table is same as the transition table shown in section 3 of article tags_df = pd.DataFrame(tags_matrix, columns = list (tags), index = list (tags)) display(tags_df) |
Output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | def Viterbi(words, train_bag = train_tagged_words): state = [] T = list ( set ([pair[ 1 ] for pair in train_bag])) for key, word in enumerate (words): #initialise list of probability column for a given observation p = [] for tag in T: if key = = 0 : transition_p = tags_df.loc[ '.' , tag] else : transition_p = tags_df.loc[state[ - 1 ], tag] # compute emission and state probabilities emission_p = word_given_tag(words[key], tag)[ 0 ] / word_given_tag(words[key], tag)[ 1 ] state_probability = emission_p * transition_p p.append(state_probability) pmax = max (p) # getting state for which probability is maximum state_max = T[p.index(pmax)] state.append(state_max) return list ( zip (words, state)) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # Let's test our Viterbi algorithm on a few sample sentences of test dataset random.seed( 1234 ) #define a random seed to get same sentences when run multiple times # choose random 10 numbers rndom = [random.randint( 1 , len (test_set)) for x in range ( 10 )] # list of 10 sents on which we test the model test_run = [test_set[i] for i in rndom] # list of tagged words test_run_base = [tup for sent in test_run for tup in sent] # list of untagged words test_tagged_words = [tup[ 0 ] for sent in test_run for tup in sent] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #Here We will only test 10 sentences to check the accuracy #as testing the whole training set takes huge amount of time start = time.time() tagged_seq = Viterbi(test_tagged_words) end = time.time() difference = end - start print ( "Time taken in seconds: " , difference) # accuracy check = [i for i, j in zip (tagged_seq, test_run_base) if i = = j] accuracy = len (check) / len (tagged_seq) print ( 'Viterbi Algorithm Accuracy: ' ,accuracy * 100 ) |
Output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #Code to test all the test sentences #(takes alot of time to run s0 we wont run it here) # tagging the test sentences() test_tagged_words = [tup for sent in test_set for tup in sent] test_untagged_words = [tup[ 0 ] for sent in test_set for tup in sent] test_untagged_words start = time.time() tagged_seq = Viterbi(test_untagged_words) end = time.time() difference = end - start print ( "Time taken in seconds: " , difference) # accuracy check = [i for i, j in zip (test_tagged_words, test_untagged_words) if i = = j] accuracy = len (check) / len (tagged_seq) print ( 'Viterbi Algorithm Accuracy: ' ,accuracy * 100 ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #To improve the performance,we specify a rule base tagger for unknown words # specify patterns for tagging patterns = [ (r '.*ing$' , 'VERB' ), # gerund (r '.*ed$' , 'VERB' ), # past tense (r '.*es$' , 'VERB' ), # verb (r '.*\'s$' , 'NOUN' ), # possessive nouns (r '.*s$' , 'NOUN' ), # plural nouns (r '\*T?\*?-[0-9]+$' , 'X' ), # X (r '^-?[0-9]+(.[0-9]+)?$' , 'NUM' ), # cardinal numbers (r '.*' , 'NOUN' ) # nouns ] # rule based tagger rule_based_tagger = nltk.RegexpTagger(patterns) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #modified Viterbi to include rule based tagger in it def Viterbi_rule_based(words, train_bag = train_tagged_words): state = [] T = list ( set ([pair[ 1 ] for pair in train_bag])) for key, word in enumerate (words): #initialise list of probability column for a given observation p = [] for tag in T: if key = = 0 : transition_p = tags_df.loc[ '.' , tag] else : transition_p = tags_df.loc[state[ - 1 ], tag] # compute emission and state probabilities emission_p = word_given_tag(words[key], tag)[ 0 ] / word_given_tag(words[key], tag)[ 1 ] state_probability = emission_p * transition_p p.append(state_probability) pmax = max (p) state_max = rule_based_tagger.tag([word])[ 0 ][ 1 ] if (pmax = = 0 ): state_max = rule_based_tagger.tag([word])[ 0 ][ 1 ] # assign based on rule based tagger else : if state_max ! = 'X' : # getting state for which probability is maximum state_max = T[p.index(pmax)] state.append(state_max) return list ( zip (words, state)) |
1 2 3 4 5 6 7 8 9 10 11 12 13 | #test accuracy on subset of test data start = time.time() tagged_seq = Viterbi_rule_based(test_tagged_words) end = time.time() difference = end - start print ( "Time taken in seconds: " , difference) # accuracy check = [i for i, j in zip (tagged_seq, test_run_base) if i = = j] accuracy = len (check) / len (tagged_seq) print ( 'Viterbi Algorithm Accuracy: ' ,accuracy * 100 ) |
Output:
1 2 3 4 5 6 7 8 | #Check how a sentence is tagged by the two POS taggers #and compare them test_sent = "Will can see Marry" pred_tags_rule = Viterbi_rule_based(test_sent.split()) pred_tags_withoutRules = Viterbi(test_sent.split()) print (pred_tags_rule) print (pred_tags_withoutRules) #Will and Marry are tagged as NUM as they are unknown words for Viterbi Algorithm |
Output:
Di video diatas dijelaskan mengenai apa itu observable
lalu apa itu emission probabilities
No comments:
Post a Comment