Modelowanie języka Model języka

advertisement
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 | wn2 , wn1 )  1P1 (wn )  2 P2 (wn | wn1 )  1P3 (wn | wn2 , wn1 )
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
Download