13. Dodatek: Przegl ˛ ad funkcjonalno´sci projektu
13.4. Ekstrakcja WW metod ˛ a DM
13.4. Ekstrakcja WW metod ˛a DM
Główn ˛a funkcjonalno´sci ˛a projektu jest ekstrakcja WW. Na pocz ˛atek przedstawiona zostanie
naj-prostsza metoda DM (patrz rozdział 7). Bazuje ona bezpo´srednio na hasłach Wikipedii, wi˛ec baza raw
utworzona w podrozdziale 13.2 jest wystarczaj ˛aca. U˙zyjemy jednak bazy labels zawieraj ˛acej etykiety
semantyczne, poniewa˙z chcieliby´smy przetestowa´c równie˙z wariant DM, który bierze pod uwag˛e tylko hasła z etykietami.
W pierwszej kolejno´sci nale˙zy utworzy´c automat rozpoznaj ˛acy wzorce. Istnieje mo˙zliwo´s´c
bezpo´sred-niego utworzenia automatu dla podanych haseł. W tym przypadku mo˙zna wykorzysta´c wariantDeepMap,
który implementuje automat w postaci zagnie˙zd˙zonych słowników (patrz podrozdział 7.3). Automat
konstruujemy, tworz ˛ac obiekt klasydpm.DeepMap10. Utwórzmy wi˛ec automat odpowiadaj ˛acy przykładowi
z podrozdziału 7.3.
>>> dmap = dpm.DeepMap([u'Park Narodowy Glacier',
u'Park Decjusza',
u'Park Narodowy Glacier Bay'])
>>> dmap.count_dicts() # liczba u˙zytych słowników (obiektów dict)
9
>>> for cp in dmap.cps: print cp.p # wzorce słownikowe
...
"Park","park",WACA-park:1,wACA-park:1 "Narodowy",WCC-narodowy:1,WCC-narodowy:8
"Glacier" ,→
WACA-park:1,wACA-park:1 "Decjusza"
"Park","park",WACA-park:1,wACA-park:1 "Narodowy",WCC-narodowy:1,WCC-narodowy:8
"Glacier" "Bay" ,→
Powy˙zszy automat rozpoznaje tylko trzy wzorce. Podstawowy sposób u˙zycia polega jednak na utworzeniu
automatu rozpoznaj ˛acego wszystkie hasła Wikipedii. W tym wypadku zaleca si˛e u˙zywanie wariantu
MDBMap, który zapisuje automat do bazy danych LMDB. Pozwala to utworzy´c automat tylko raz, dzi˛eki czemu kilkuminutowa operacja nie musi by´c powtarzana po ponownym uruchomieniu systemu. Pozwala to równie˙z znacz ˛aco zmniejszy´c zu˙zycie pami˛eci.
# upewniamy si˛e, ˙ze pracujemy na bazie 'labels'
>>> db.cur()
('default', 'labels')
# utwórz automat o nazwie 'dm' dla wszystkich haseł Wikipedii
>>> dpm.MDBMap('dm', patdb.gen_wiki_words())
10
Nazwa modułu jest skrótem od dictionary pattern matching.
146 13.4. Ekstrakcja WW metod ˛a DM
W porównaniu zDeepMapkonstruuj ˛ac obiekt klasyMDBMappodajemy dodatkowo jako pierwszy argument
nazw˛e tworzonej bazy. W katalogudata/mdbpowinny pojawi´c si˛e pliki bazy danych automatu:
$ ls -lh data/mdb/pmutil*.mdb
-rwxrwxr-x 1 pch users 416M 03-09 16:28 data/mdb/pmutil-cps-dm.mdb -rwxrwxr-x 1 pch users 166M 03-09 16:28 data/mdb/pmutil-map-dm.mdb
Przedrostekpmutilw nazwach plików to nazwa modułu, który zawiera definicje odpowiednich klas
odpowiadaj ˛acych za zapis i odczyt bazy. Plikpmutil-cps-dm.mdbzawiera list˛e wzorców słownikowych,
natomiast plikpmutil-map-dm.mdb zawiera opis kolejnych przej´s´c automatu – dla ka˙zdego przej´scia
s−→ t kluczem w tabeli jest para (s, p), a warto´sci ˛p a – nowy stan t.
Tworzenie automatu jest na tyle typow ˛a operacj ˛a, ˙ze w modulepatdbzdefiniowano funkcje
pomocni-cze, które upraszczaj ˛a t˛e operacj˛e. Utwórzmy wi˛ec automaty odpowiadaj ˛ace kolejnym wariantom metody
DM przedstawionym w tabeli z wynikami 7.4.
# automat 'dm' identyczny jak poprzednio
>>> patdb.create_we_dmap('dm')
# automat 'dm-df' tylko dla wyrazów z etykiet ˛a semantyczn ˛a
>>> patdb.create_we_dmap('dm-df', require_df=True)
# automat 'dm-mse' dla heurystycznie wyznaczonych wzorców odmiany
>>> patdb.create_mse_dmap('dm-mse')
Wykorzystajmy teraz automat dm do ekstrakcji WW z przykładowego zdania. Do przeprowadzenia
ekstrakcji słu˙zy klasaMultiMatcher– implementuje ona algorytm 4 z podrozdziału 7.4.2. Posiada ona
metod˛e match, która wymaga podania obiektu klasy CorpusEntry, zawieraj ˛acego tekst, dla którego
przeprowadzana jest ekstrakcja. Obiekt ten mo˙ze zosta´c odczytany z bazy danych lub utworzony r˛ecznie. W poni˙zszym przykładzie utworzono go r˛ecznie – pozwala to na przetestowanie ekstrakcji bez modyfikacji
bazy danych. Wyniki równie˙z nie s ˛a zapisywane do bazy.
>>> ce = CorpusEntry(text=u'W Parku Narodowym Glacier Bay zamieszkuj ˛a zaj ˛ace ameryka´nskie')
,→
>>> pmap = dpm.MDBMap('dm') # wczytaj automat 'dm' z bazy LMDB
>>> mm = dpm.MultiMatcher(pmap) # utwórz obiekt wykonuj ˛acy ekstrakcj˛e
>>> mm.match(ce) # wykonaj ekstrakcj˛e
>>> info(mm.results) # wypisz wyniki ekstrakcji
W Parku Narodowym Glacier Bay
1 Parku Narodowym Glacier Bay
1 Park Narodowy Glacier Bay ACA-park:1 CC-narodowy:1,8 6 1
2 3
13.4. Ekstrakcja WW metod ˛a DM 147
1 Park Narodowy Glacier ACA-park:1 CC-narodowy:1,8 6
zamieszkuj ˛a zaj ˛ace ameryka´nskie
1 zaj ˛ace ameryka´nskie
1 zaj ˛ac ameryka´nski ABA-zaj ˛ac:1 CC-ameryka´nski:1,8 8,11,14 5
6 7 8
Format wypisywania wyników jest wart omówienia. Pod´swietlone fragmenty oznaczaj ˛a sekcje
(obiek-tySection– patrz podrozdział 7.5.1). Dla ka˙zdej sekcji wypisywana jest statystyka wyników sekcji
(obiektySectionResult). Wynik wybrany (dla którego pos = 0) wy´swietlany jest nazielono, a pozostałe
naczerwono. Przed ka˙zdym wynikiem wypisywana jest ocena danego wyniku (dla metody DM wynosi ona 1). Widzimy wi˛ec, ˙ze podobnie jak w przykładzie w podrozdziale 7.5.2 wybrano dłu˙zszy wynik “Parku Narodowym Glacier Bay”. Dla ka˙zdego z wyników sekcji pokazywana jest z kolei statystyka
wyników wyrazu (WordResult). Tutaj równie˙z mo˙ze wyst ˛api´c wiele pozycji11, a ocena wybranego wyniku
jest oznaczona kolorem zielonym.
Format wyniku wyrazu przeanalizujemy na przykładzie linii 3. Na pocz ˛atku wypisywane s ˛a segmenty
wyrazu – odmienne naniebiesko, a nieodmienne na czarno. W omawianym przypadku dwa pierwsze
segmenty s ˛a odmienne, a dwa kolejne nieodmienne. Nast˛epnie znajdziemy zapisan ˛a naró˙zowo list˛e
znaczników słownikowych (atrybut tags) poszczególnych segmentów. W opisywanym przykładzie na
ko´ncu znajduj ˛a si˛e dodatkowe spacje oznaczaj ˛ace dwa segmenty nieodmienne. Ostatnie pole to lista
roz-poznanych numerów form WW, zapisana koloremjasnoniebieskim. W tym przypadku hasło rozpoznano
w formie miejscownika l.poj. (forma nr 6).
Je˙zeli chcemy przeprowadzi´c rozpoznawanie na wi˛ekszym korpusie tekstu, wówczas najlepiej u˙zy´c
funkcjipatdb.dmatch, która pozwala na zrównoleglenie całego procesu i zapis wyników do bazy. Podczas
zapisu wykorzystywany jest dodatkowy atrybut iteration – dotyczy on wszystkich tabel zwi ˛azanych z
wynikami i pozwala na jednoczesny zapis w tej samej bazie wyników kliku ró˙znych operacji ekstrakcji. Domy´slnie ka˙zda nowa operacja ekstrakcji otrzymuje numer iteracji o 1 wi˛ekszy od poprzedniej. Dla
przykładu poka˙zemy, w jaki sposób mo˙zna przeprowadzi´c ekstrakcj˛e metod ˛a DM na kompletnym korpusie
notatek prasowychPAP. Korpus ten mo˙zna przekonwertowa´c do postaci bazy danych poni˙zsz ˛a funkcj ˛a –
musi on by´c jednak dost˛epny w katalogudata/corp.
>>> ptxt.create_pap_corpus()
>>> CorpusEntry.objects.filter(corpus='pap').count() # liczba notatek prasowych
51573
>>> db.cp('dm-test'); db.set('dm-test') # nowa baza danych dla testu
>>> pm.get_iteration(Word) # pobierz obecny numer iteracji
0
11
W omawianym przykładzie wyst˛epuje zawsze jeden wynik – nie jest to reguł ˛a.