Morfologik.txt
4.19 KB
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
Import danych z Morfologika
---------------------------
1.
Najpierw potrzebne są pliki odm.txt z http://www.sjp.pl/slownik/odmiany/ oraz morfologik-tools-[nr wersji].jar z http://sourceforge.net/projects/morfologik/files/morfologik-stemming/ (paczka morfologik-stemming-[nr wersji].zip). Potrzebny jest też program enconv z pakietu enca (powinien być w repozytoriach większości dystrybucji Linuksa).
Ścieżki do tych plików wpisujemy do skrypty/prepare_odm.sh do zmiennych 'odm' i 'morfologik'. Następnie uruchamiamy ten skrypt:
$ sh skrypty/prepare_odm.sh
i dostajemy plik to_disamb.txt. Ten plik należy przepuścić przez polecenie
$ ./manage.py disamb to_disamb.txt > disamb_result.txt 2> disamb_errors.txt
(drugi plik nie przyda się do automatycznego importu, ale będzie zawierał informacje o leksemach, które nie przeszły dezambiguacji). Z pliku disamb_result.txt odsiewamy następnie poszczególne części mowy:
$ skrypty/filter_forms.py subst disamb_result.txt > rzeczowniki-odm.txt
$ skrypty/filter_forms.py adj disamb_result.txt > przymiotniki-odm.txt
$ skrypty/filter_forms.py v disamb_result.txt > czasowniki-odm.txt
$ skrypty/filter_forms.py ndm disamb_result.txt > nieodmienne-odm.txt
2.
Część rozpoznanych przymiotników to w rzeczywistości nazwiska, które należy rozdzielić na męskie i żeńskie. Listę tych nazwisk powinniśmy mieć w pliku tekstowym, po jednym nazwisku na wiersz. Załóżmy, że mamy taki plik nazwiska.txt w aktualnym katalogu. Uruchamiamy
$ skrypty/wytnij_wiele.py nazwiska.txt < przymiotniki-odm.txt > nazwiska
$ skrypty/wytnij_wiele.py nazwiska.txt -r < przymiotniki-odm.txt > tmp && mv tmp przymiotniki-odm.txt
$ skrypty/podziel_nazwiska.sh nazwiska > nazwiska-odm.txt
Generujemy dane do importu [uwaga: tutaj musi być ustawione DEBUG = False w settings.py, inaczej zapycha się pamięć]:
$ ./manage.py import_morfologik subst rzeczowniki-odm.txt > rzeczowniki.json 2> rzeczowniki-failed.txt
$ ./manage.py import_morfologik subst nazwiska-odm.txt > nazwiska.json 2> nazwiska-failed.txt
$ ./manage.py import_morfologik adj przymiotniki-odm.txt > przymiotniki.json 2> przymiotniki-failed.txt
$ ./manage.py import_morfologik v czasowniki-odm.txt > czasowniki.json 2> czasowniki-failed.txt
$ ./manage.py import_morfologik ndm nieodmienne-odm.txt > nieodmienne.json 2> nieodmienne-failed.txt
[UWAGA: generowanie danych dla rzeczowników trwa ponad dobę na chopinie, dla czasowników i przymiotników po parę godzin, dla nieodmiennych poniżej godziny]
Część nierozpoznanych przymiotników powinna być tak naprawdę rozpoznana jako rzeczowniki. Takie rzeczowniki trafiają do przymiotniki-failed.txt z odpowiednim prefiksem. Wycinamy je poleceniem:
$ grep 'rzeczownik#' przymiotniki-failed.txt | cut -d'#' -f2 > rzeczowniki2-odm.txt
i generujemy dane do importu:
$ ./manage.py import_morfologik subst rzeczowniki2-odm.txt > rzeczowniki2.json 2> rzeczowniki2-failed.txt
3.
Teraz możemy wszystko załadować do bazy:
$ cat rzeczowniki.json rzeczowniki2.json nazwiska.json przymiotniki.json czasowniki.json nieodmienne.json > morfologik.json
$ ./manage.py load_morfologik morfologik.json 2> load_errors.txt
To potrwa (na chopinie ponad 5 godzin). Następnie warto poprawić wciągnięte dane. Kilka drobnych rzeczy poprawiamy przez
$ ./manage.py fix_morfologik
Następnie poprawiamy nazwiska z homonimami w SGJP błędnie oznaczone jako przymiotniki:
$ ./manage.py fix_surnames 2> surnames.log
i przerabiamy na 'osc' rzeczowniki oznaczające cechy, zaimportowane jako 'subst':
$ ./manage.py fix_osc 2> osc.log
Generowanie list do importu odsyłaczy:
[$ python gen/adjadv.py < gen/to_disamb.txt > advadj]
$ grep advadj gen/disamb_errors.txt | cut -d" " -f2- > advadj2
$ grep adv:comp gen/to_disamb.txt | cut -f1-2> advcom
$ grep adv:neg gen/to_disamb.txt | cut -f1-2 > advnie
$ python skrypty/adjadv.py < gen/to_disamb.txt > /dev/null 2> advnie2
Importowanie odsyłaczy:
$ ./manage.py extra_crs advcom advcom 2> advcom.log
$ ./manage.py extra_crs advadj advadj2 2> advadj.log
$ ./manage.py extra_crs advnie advnie 2> advnie.log
$ ./manage.py extra_crs advnie advnie2 2> advnie2.log
[$ ./manage.py extra_crs adjadvc advnie 2> adjadvc.log]
TODO
* przymiotniki Dzierżawcze
* podwójne dopasowania