WUT TWG 2006 WEDT Modelowanie języka Wykład 5 Piotr Gawrysiak [email protected] 2006 Modelowanie języka Model języka – model probabilistyczny pozwalający obliczyć prawdopodobieństwo zdania • • Jeśli w1:n oznacza ciąg wyrazów w1w2…wn. Jaka jest wartość P(w1:n) ? Możemy próbować określać prawdopodobieństwo wystąpień: • • poszczególnych liter (Shannon game) poszczególnych wyrazów Obliczenie prawdopodobieństwa wystąpienia słowa w zdaniu nie jest zadaniem prostym (ogólnie zależy od znaczenia wypowiadanego zdania), ale analiza poprzedzających słów może wiele pomóc: • • • kolokacje części mowy i struktura zdania dziedzina semantyczna WUT TWG 2006 Zadania projektowe Kilka wyjaśnień - Dostęp do Internetu - - Końcowa data oddania projektów - - Tydzień przed ostatnimi zajęciami, dla osób pragnących wziąć udział w konkursie 2 tygodnie Język przetwarzanych dokumentów - - Programy realizujące projekty mogą korzystać z dowolnych danych z sieci Internet pod warunkiem nie ściągania z sieci gotowych rozwiązań (np. jeśli ktoś znajdzie web service do klasyfikacji dokumentów to raczej nie bardzo powinien z niego bezpośrednio korzystać). Domyślnie angielski. Dla prac biorących udział w konkursie możliwość analizy dokumentów angielskich jest wymagana. Ocena, a konkurs - Prace oceniają prowadzący projekty, konkurs jest od tego niezależny (choć oczywiście jeśli np. wygra projekt oceniony bardzo źle, to pewnie będzie przesłanka do weryfikacji oceny, na życzenie autora projektu). WUT TWG 2006 Przykładowe zastosowania WUT TWG OCR / rozpoznawanie mowy wiele wypowiedzi brzmi podobnie np. • I went to a party • Eye went two a bar tea Rudolph the red nose reindeer. Rudolph the Red knows rain, dear. Rudolph the Red Nose reigned here. Poprawianie błędów ortograficznych np. metoda Kernighana nie brała pod uwagę kontekstu: • … I think they’re okay … • … I think there okay … • … I think their okay … Najbardziej prawdopodobne ze zdań-kandydatów Tłumaczenie automatyczne On • • • voit Jon à la télévision Jon appeared in TV. In Jon appeared TV. Jon appeared on TV. Analiza stylu pisania (wykrywanie plagiatów, autorstwa tekstów itp.) Identyfikacja języka Generowanie dużej ilości danych tekstowych 2006 Łańcuchy Markowa WUT TWG Jak obliczyć P(w1:n)? Możemy wykorzystać regułę łańcuchową, wtedy: historia dla wn P(w1:n) =P(w1:n-1)P(wn|w1:n-1) = P(w1:n-2)P(wn-1|w1:n-2)P(wn|w1:n-1) = itd. = = P(w1)P(w2|w1) P(w3|w1:2) P(w4|w1:3) …… P(wn-1|w1:n-2)P(wn|w1:n-1) wn Sue swallowed the large green ______. w1:n-1 : historia dla wn Problem – w naszym zbiorze danych (korpusie) będzie prawdopodobnie bardzo mało wystąpień w1:n-1 Możemy potraktować generację słów składających się na zdanie jako proces Markowa i przyjąć założenie Markowa (markov assumption): tylko N najbliższych słów ma wpływ na to jakie będzie wn : P(wn|w1:n-1)≈P(wn|wn-N+1:n-1) Bigram: bierzemy pod uwagę tylko poprzednie słowo Trigram: bierzemy pod uwagę dwa poprzedzające słowa Tetragram: ... cztery itd. Wtedy P(w1:n) ≈k=1,n P(wk|wk-N+1:k-1) 2006 N-gramy WUT TWG 2006 N-gramy określają zbiór klas na które dzielimy zbiór danych trenujących (equivalence classes, bins) Czy większe wartości n są lepsze? “large green ___________” tree? mountain? frog? car? “swallowed the large green ________” pill? broccoli? Reliability vs Discrimination Im większe n tym więcej informacji o kontekście (discrimination) ale... Im większe n tym mniej jest dostępnych przykładów n-gramu w zbiorze trenującym (reliability) WUT TWG N-gramy 2006 Dla większych wartości n to podejście staje się niepraktyczne Załóżmy, iż słownik zawiera 20000 słów wtedy: n Liczba klas 2 (bigrams) 400,000,000 3 (trigrams) 8,000,000,000,000 4 (tetragrams) 1.6 x 1017 Tworzenie modelu • Najprostszym podejściem do budowania modelu języka jest posłużenie się MLE i policzenie wystąpień odpowiednich n-gramów w korpusie: • • • korpus: <s> a b a b </s> MLE P(a|b)= ½, P(b|a)=1, P(a|<s>)=1, P(</s>|b) = ½ P(<s> a b a b </s>) = 1*1*1*½*1* ½ = ¼ W praktyce lepiej przejść na logarytmy Przykład (Manning, Shuetze): Korpus – powieści Jane Austen N = 617,091 słów V = 14,585 słów Zadanie – jakie jest kolejne słowo w trigramie “inferior to ________” W korpusie, “[In person, she was] inferior to both [sisters.]” WUT TWG 2006 Tworzenie modelu cd. Liczba wystąpień trigramu “inferior to ________” w korpusie: WUT TWG 2006 Tworzenie modelu cd. • Zgodnie z MLE nie zaobserwowane wystąpienia trigramów otrzymują zerowe prawdopodobieństwa • Nasz korpus jest jednak ograniczony i brak wystąpienia pewnego ciągu wyrazów może być przypadkowy WUT TWG 2006 Wygładzanie • Rzeczywisty rozkład prawdopodobieństwa wygląda zapewne tak: • Należy zatem : a) Zmniejszyć (discount) nieco „masę prawdopodobieństwa” przypadającą na obserwowane przypadki b) Rozdzielić (reallocate) uzyskany nadmiar na pozostałe przypadki WUT TWG 2006 WUT TWG Metoda Lidstone’a • 2006 Wersja Laplace’a – uznajemy, iż każdy n-gram występuję przynajmniej 1 raz, lub wersja Jeffrey’s-Parks – dopuszczamy wystąpienia „ułamkowe” • Ogólnie: gdzie PLid (w1 wn ) C(w1 wn ) λ N Bλ C = liczba wystąpień n-gramu w danych trenującyh N = liczba wystąpień wszystkich n-gramów w danych trenujących B = liczba różnych n-gramów MLE: = 0, LaPlace: = 1, Jeffreys-Perks: = ½ WUT TWG Held-out estimator 2006 • W metodzie Lidstone’a przyporządkowujemy arbitralnie pewne prawdopodobieństwo nie obserwowanym przypadkom – czy nie jest ono zbyt duże / małe? • Możemy to sprawdzić empirycznie, dzieląc zbiór trenujący na dwie części i zachowując jedną z nich (hold-out) do weryfikacji przyjętej hipotezy – np. badając jak często bigramy które wystąpiły r razy w pierwszej części pojawiają się w drugiej • W ten sposób możemy otrzymać (Jelinek, Mercer, 1985): Pho ( w1w2 ) C (w w ) 2 1 { w1w2 :C1 ( w1w2 ) r } 2 Ile razy bigramy które pojawiły się r razy w pierwszej części pojawiły się też w drugiej = Tr N rT Tr/ Nr – nowe r gdzie – Nr – liczba bigramów o częstości r w danych trenujących N - liczba bigramów w danych trenujących C1 – liczba wystąpień ciągu w danych trenujących = r C2 – liczba wystąpień ciągu w held-out data WUT TWG 2006 Held-out estimator, przykład Dane trenujące N-gram a b c d e Częstość 5 3 2 2 2 N-gram f g h d e Częstość 10 7 5 3 3 r = 2, Nr = 3 Dane testowe Tr = 6, Tr / Nr = 6/2 = 3 WUT TWG Cross validation 2006 • Podział na część trenującą i held-out jest także arbitralny • Najlepiej tego uniknąć – np. dokonując kilkakrotnych podziałów Podzielenie danych na 2 części A B Uczenie na A, sprawdzenie na B uczenie sprawdz. Model 1 Uczenie na B, sprawdzenie na A sprawdz. uczenie Model 2 Połączenie obu modeli Tr01 Pho 0 Nr N Tr10 Pho 1 Nr N Tr01 Tr10 Pho N ( N r0 N r1 ) Model 1 + Model 2 Model końcowy Nra = liczba n-gramów wystepujących r razy w a-tej części zbioru trenującego Trab = liczba tych znalezionych w b-tej częsci Średnia ważona obu prawdopodobieństw WUT TWG Good-Turing estimation 2006 • Przypisywana Turingowi • Metoda oszacowania prawdopodobieństwa: Wynika z założenia iż rozkład występowania E ( N r 1 ) * n-gramów jest dwumianowy PGT r * N r (r 1) E ( N ) r r* = “zmodyfikowana częstość” „frequency of frequency” Nr = liczba n-gramów które występują r razy w zbiorze trenującym E(Nr) = wartość oczekiwana zmiennej losowej Nr, E(Nr+1) < E(Nr) Suma prawdopodobieństw nieobserwowanych n-gramów wynosi wtedy E(N1)/N0 Możemy podstawić obserwowane wartości częstości w miejsce wartości oczekiwanych, ale to nie będzie działać dla dużych wartości r (w szczególności dla najczęściej występującego n-gramu PGT=0) Dwie metody: Bowiem E(Nr+1) będzie równe 0 – nie ma częściej występującego n-gramu niż najczęściej występujący n-gram • użycie Good-Turing estimation tylko dla częstości r < k (k = np. 10) • dopasowanie jakiejś funkcji S do obserwowanych wartości r i Nr Good-Turing cont., absolute discounting Przykład: Korpus: a b a b Obserwowane bigramy: b a: 1 a b: 2 a a, b b N0=2, N1=1, N2=1, N=3 Estymacja częstości dla nieobserwowanych bigramów: f0= N1 /N0 =0.5 Absolute i linear discounting Zaproponowane przez Ney i Essen (1994) Absolute discounting – od prawdopodobieństwa każdego obserwowanego ngramu odejmowana jest pewna stała Linear discounting – prawdopodobieństwa obserwowanych n-gramów skalowane są pewną wartością < 1 wartości parametrów mogą zostać oszacowane z held-out data WUT TWG 2006 Mixture models Metody mieszane Możemy wykorzystać informację o n-gramach niższego stopnia, gdy brak danych o wystąpieniach n-gramów wyższego stopnia Simple Linear Interpolation (Jelinek, Mercer 1980) np. dla trigramów: Pli (wn | wn2 , wn1 ) 1P1 (wn ) 2 P2 (wn | wn1 ) 1P3 (wn | wn2 , wn1 ) Katz backing-off a) gdy liczba wystąpień n-gramu > k, używamy MLE (nieco zmniejszając wartość prawdopodobieństwa np. przez GT est., rezerwując dla b) b) wpw wykorzystujemy rekurencyjnie oszacowanie dla n-1-gramu Obecnie najczęściej wykorzystywane w praktyce – GT estimation połączone z jakąś metodą mieszaną WUT TWG 2006 Na koniec... Jeśli ktoś się jeszcze nie zdecydował w jakim języku wykonywać implementację – może spróbować Python NLTK http://nltk.sourceforge.net >>> from nltk.corpus import gutenberg >>> gutenberg.items() ['austen-emma.txt', 'austen-persuasion.txt', 'austen-sense.txt', 'bible-kjv.txt', 'blake-poems.txt', 'blake-songs.txt', 'chesterton-ball.txt', 'chesterton-brown.txt', 'chestertonthursday.txt', 'milton-paradise.txt', 'shakespearecaesar.txt', 'shakespeare-hamlet.txt', 'shakespearemacbeth.txt', 'whitman-leaves.txt'] WUT TWG 2006 Python NLTK Wybrane moduły NLTK – token: klasy do reprezentacji i przetwarzania tokenów, takich jak zdania i słowa – probability: klasy służące do reprezentacji i przetwarzania danych statystycznych – tree: reprezentacja i przetwarzanie danych w postaci drzew – cfg: gramatyki bezkontekstowe – fsa: automaty skończone – tagger: tagger do części mowy i części zdania (angielski) – parser: zawiera parsery gramatyczne służące do budowy drzew rozbioru zdania – classifier: algorytmy klasyfikacji, włącznie z metodami doboru zawartości słownika – draw: pomocnicze klasy do wizualizacji danych – corpus: przykładowe korpusy tekstowe WUT TWG 2006 Python NLTK Prosty przykład użycia: >>> from nltk.tokenizer import * >>> text_token = Token(TEXT='Hello world. This is a test file.') >>> print text_token <Hello world. This is a test file.> >>> WhitespaceTokenizer(SUBTOKENS='WORDS').tokenize(text_to ken) >>> print text_token <[<Hello>, <world.>, <This>, <is>, <a>, <test>, <file.>]> >>> print text_token['TEXT'] Hello world. This is a test file. >>> print text_token['WORDS'] [<Hello>, <world.>, <This>, <is>, <a>, <test>, <file.>] WUT TWG 2006 Python NLTK Przykład - klasyfikacja: tokenizer = LineTokenizer() >>> statements = open('statements.txt').read() >>> statement_toks = tokenizer.tokenize(statements) >>> imperatives = open('imperatives.txt').read() >>> imperative_toks = tokenizer.tokenize(imperatives) >>> questions = open('questions.txt').read() >>> question_toks = tokenizer.tokenize(questions) >>> train_toks = (label_tokens(statement_toks, 'statement') + ... label_tokens(imperative_toks, 'imperative') + ... label_tokens(question_toks, 'question')) >>> trainer = NBClassifierTrainer(fd_list) >>> classifier = trainer.train(train_toks) >>> loc = Location(3, unit='s') >>> test_tok = Token("Do you enjoy classification?", loc) >>> classifier.classify(test_tok) "Do you enjoy classification?" >>> prob_dict = classifier.distribution_dictionary(test_tok) >>> for label in prob_dict.keys(): ... print "P(%s) = %.2f" % (label, prob_dict[label]) P(statement) = 0.24 P(imperative) = 0.02 P(question) = 0.74 WUT TWG 2006