200 likes | 336 Views
WEDT Modelowanie języka. Wykład 7 Piotr Gawrysiak pgawrysiak@supermedia.pl. 2005. Modelowanie języka. Model języka – model probabilistyczny pozwalający obliczyć prawdopodobieństwo zdania Jeśli w 1:n oznacza ciąg wyrazów w 1 w 2 …w n . Jaka jest wartość P(w 1:n ) ?
E N D
WEDTModelowanie języka Wykład 7 Piotr Gawrysiak pgawrysiak@supermedia.pl 2005
Modelowanie języka Model języka – model probabilistyczny pozwalający obliczyć prawdopodobieństwo zdania • Jeśli w1:noznacza 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
Przykładowe zastosowania Rudolph the red nose reindeer. Rudolph the Red knows rain, dear. Rudolph the Red Nose reigned here. OCR / rozpoznawanie mowy wiele wypowiedzi brzmi podobnie np. • I went to a party • Eye went two a bar tea 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 … 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.) Generowanie dużej ilości danych tekstowych Najbardziej prawdopodobne ze zdań-kandydatów
Łańcuchy Markowa historia dla wn Jak obliczyć P(w1:n)? Możemy wykorzystać regułę łańcuchową, wtedy: 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) Sue swallowed the large green ______. 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) wn w1:n-1 : historia dla wn
N-gramy 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)
N-gramy Dla większych wartości n to podejście staje się niepraktyczne Załóżmy, iż słownik zawiera 20000 słów wtedy:
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(korpus)=1/2. 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.]”
Tworzenie modelu cd. Liczba wystąpień trigramu “inferior to ________” w korpusie:
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
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
Metoda Lidstone’a • 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 C = liczba wystąpień n-gramuw 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: = ½
Held-out estimator • 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): gdzie – Nr – liczba bigramów o częstości r C1 – liczba wystąpień ciągu w danych trenujących C2 – liczba wystąpień ciągu w held-out data
Cross validation • 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 • Uczenie na A, sprawdzenie na B • Uczenie na B, sprawdzenie na A • Połączenie obu modeli A B uczenie sprawdz. Model 1 sprawdz. uczenie Model 2 + 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-tejczęsci
Good-Turing estimation • Przypisywana Turingowi • Metoda oszacowania prawdopodobieństwa: • r* = “zmodyfikowana częstość” • 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: • 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 N0=2, N1=1, N2=1, N=3 Estymacja częstości dla niobserwowanych 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 n-gramu 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
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 • np. dla trigramów: • Katz backing-off • gdy liczba wystąpień n-gramu > k, używamy MLE (nieco zmniejszając wartość prawdopodobieństwa np. przez GT est., rezerwując dla b) • wpw wykorzystujemy rekurencyjnie oszacowanie dla n-1-gramu • Obecnie najczęściej wykorzystywane w praktyce – GT estimation połączone z jakąś metodą mieszaną
Na koniec... • Przypomnienie - Dzisiaj upływa termin przysyłania dokumentacji wstępnej projektu • 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', 'chesterton-thursday.txt', 'milton-paradise.txt', 'shakespeare-caesar.txt', 'shakespeare-hamlet.txt', 'shakespeare-macbeth.txt', 'whitman-leaves.txt']
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
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_token) >>> 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.>]
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