Uwagi o tworzeniu korpusów

Transkrypt

Uwagi o tworzeniu korpusów
Krzysztof Szafran
Instytut Informatyki UW
Uwagi o tworzeniu korpusów
(wersja z 4 lipca 2012 )
1. Wprowadzenie
Tekst niniejszy stanowi zbiór uwag i notatek, których celem jest ułatwienie początkującemu
użytkownikowi poliqarpa i rozmaitych narzędzi z nim związanych przygotowywanie korpusów.
Tekst w żadnym wypadku nie stanowi samodzielnej dokumentacji wymienionych w nim
programów i narzędzi i w wielu miejscach odsyła do tej dokumentacji.
Ostatnia część tekstu zawiera również pewne uwagi dotyczące instalacji poliqarpa oraz marasca.
2. Budujemy korpus — na przykładzie Słownika polszczyzny XVI wieku
2.1. Przygotowanie pdf-u
Poszczególne tomy Słownika przygotowywane są zwykle w postaci plików pdf ale często rozmaite fragmenty tomu zawarte są w oddzielnych plikach.
Wszystkie fragmenty dokumentu zawarte w oddzielnych plikach pdf muszą zostać połączone w jeden plik z zachowaniem właściwej kolejności stron. Można do tego użyć programu o
nazwie pdftk1 . Przykładowe wywołanie pokazane jest niżej.
pdftk SpXVI_35t_kpbc.pdf SpXVI_35t_wkl1_kpbc.pdf SpXVI_35t_wkl2_kpbc.pdf
cat output SpXVI_35t.pdf
Trzy pierwsze argumenty programu są nazwami plików zawierających kolejno tekst 35. tomu
słownika oraz tekst dwóch wklejek dołączonych do każdego tomu. Kolejny argument (’cat’)
oznacza polecenie połączenia tych plików. Ostatni jest nazwą pliku wynikowego, do którego ma
zostać zapisany cały dokument.
2.2. Konwersja do formatu DjVu
Kolejnym etapem jest przygotowanie kopii dokumentu w formacie DjVu. Punktem wyjścia jest
plik w formacie pdf.
Do konwersji dokumentu z formatu pdf do formatu DjVu można użyć programu o nazwie
pdf2djvu2 .
pdf2djvu -d 600
--filter-text=unligature -i index.djvu SpXVI_35t.pdf
Uwagi:
1. Użycie parametru -i powoduje powstanie tak zwanego rozdzielonego dokumentu DjVu (por.
man pdf2djvu). Plik indeksowy tego dokumentu powinien nazywać się index.djvu.
1
2
Por. np.: http://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/
Por. np.: http://jwilk.net/software/pdf2djvu
1
2. pdf2djvu domyślnie robi normalizację NFKC tekstu (patrz man pdf2djvu oraz http://
unicode.org/reports/tr15/), która w szczególności zamienia długie s na zwykłe s. Aby
tego uniknąć, należy użyć opcji: –filter-text=unligature.
— Źródła programu unligature są dostępne pod adresem: https://bitbucket.org/
jwilk/unligature. Jego instalacja polega na wywołaniu programu make. Zawarty w
dystrybucji plik makefile odwołuje się do pliku: /usr/share/unicode/UnicodeData.
txt. Należy zadbać o to, aby plik był dostępny i aby umieszczona w pliku makefile
informacja o jego lokalizacji była zgodna ze stanem faktycznym.
— W wielu dystrybucjach Linuksa (Debian, Ubuntu) plik UnicodeData.txt znajduje się
w pakiecie o nazwie unicode-data.
— W trakcie instalacji programu unligature następuje odwołanie do programu lex. W
niektórych popularnych wersjach Linuksa (np. Ubuntu) dostępny on jest w pakiecie flex.
2.3. Przygotowanie hOCR z plików DjVu
Jednym ze sposobów uzyskania plików w formacie hOCR jest wykorzystanie plików DjVu3 .
W tym celu używamy programu djvu2hocr z pakietu ocrodjvu4 :
djvu2hocr
--word-segmentation=uax29 SpXVI_35t.djvu > SpXVI_35t_hocr.xml
Uwagi:
1. W starszych wersjach programu djvu2hocr występował błąd, który powodował obrócenie
„do góry nogami” pliku hocr. W konsekwencji, jeśli zaznaczenia wskazujące znalezione
formy miały działać prawidłowo, konieczne było użycie opcji –flip przy wzbogacaniu korpusu. Fakt ten może stwarzać pewne niedogodności w przypadku dodawania do istniejącego
korpusu nowych dokumentów albo w przypadku tworzenia korpusu z istniejących wcześniej
i tworzonych aktualnie plików hocr. Niestety program do wzbogacania korpusu nie daje możliwości zastosowania opcji –flip w sposób selektywny, tylko dla wybranych dokumentów.
2. Pominięcie opcji "–word-segmentation=uax29" oznacza użycie domyślnego sposobu segmentacji (por. man djvu2hocr), co może powodować ’przyklejanie’ do form tekstowych
różnych znaków, np. cudzysłowów.
2.4. Nadawanie struktury dokumentom
W przypadku dokumentów wielostronicowych możliwe jest umowne dzielenie dokumentu na
części, w skład których wchodzą określone strony. W trakcie przeszukiwania korpusu możliwe
jest ograniczenie poszukiwań do wybranych części.
Dokonanie takiego podziału możliwe jest za pomocą programu annotate-hocr5 . Wymaga
on opisania struktury przetwarzanych dokumentów w pliku tekstowym, w odpowiednim formacie.
Przykładowo, struktura tomu 35 Słownika polszczyzny xvi wieku może być opisana następująco:
1
front,1,4
list,5,9
vacat,10,10
3
4
5
Inna możliwość opisana jest w dalszej części niniejszego tekstu.
Por. np.: https://bitbucket.org/ jwilk/ocrodjvu/overview
Por. np.: https://bitbucket.org/jwilk/marasca-wbl/src/f3e00b9275a6/misc/annotate-hocr
2
body,11,481
vacat,482,482
inset,483,494
Liczba w pierwszym wierszu specyfikuje, który z kolei dokument tekstowy opisują dalsze
wiersze. Każdy kolejny wiersz opisuje jedną sekcję dokumentu: front (tytularia itp.), intro (wstępy zawarte w I tomie), list (listy haseł na początku poszczególnych tomów), body (hasła), errata
(erraty i uzupełnienia), back (końcowe strony tomu), inset (wkładki z wykazem źródeł i skrótów).
Opis każdej z sekcji składa się z co najmniej trzech części zakończonych przecinakami albo
znakiem końca wiersza. Pierwsza część to napis definiujący nazwę sekcji, dwie dalsze to para
liczb całkowitych określająca zakres stron tworzących sekcję. Pozostałe części opisu stanowią
komentarz. W pliku z opisem dopuszczalne są również całe wiersze komentarza — muszą rozpoczynać się znakiem ’#’.
W powyższym przykładzie dokument dzielony jest na rozłączne części obejmujące sąsiednie strony. W ogólności możliwe jest nadanie dokumentowi struktury drzewiastej. Ilustruje to
poniższy przykład.
1
front, 1,140, (4)
intro, 5,140
list, 141,146
body, 147,452, (449) = 306
errata, 450,452
back, 453,454, spis treści
inset, 455,457
back, 458,459
Tutaj segment o nazwie intro zawarty jest (jest podsegmentem) w segmencie front. Podobnie errata jest fragmentem body.
Nie istnieje ustalony zestaw nazw segmentów, które mogą pojawić się w opisie. Jedynymi
ograniczeniem są struktura, która musi być drzewem, oraz konieczność umieszczenia w opisie
ojca przed synem.
Użycie programu annotate-hocr pokazane jest niżej.
./annotate-hocr -h
usage: annotate-hocr [-h] [--dry-run] [--in-place]
<hocr-file> [<hocr-file> ...]
Uwaga: Wbrew temu, co widać wyżej, jeden z parametrów kontrolujących wyjście, czyli
–dry-run albo –in-place, jest obowiązkowy.
Poniżej widać przykład nadania struktury jednemu dokumentowi.
./annotate-hocr --in-place
+ volume 1
SpXVI_35t_hocr.xml < struktura35.txt
Możliwe jest również nadanie struktury wielu dokumentom w jednym przebiegu programu.
./annotate-hocr --in-place
*/*.xml < struktura.txt
W takim przypadku plik struktura.txt musi zawierać ciąg opisów struktury kolejnych
dokumentów.
Przykładowy fragment takiego pliku dla Słowinka polszczyzny XVI wieku pokazany jest niżej.
3
1
front, 1,140, (4)
intro, 5,140
list, 141,146
body, 147,452, (449) = 306
errata, 450,452
back, 453,454, spis treści
inset, 455,457
back, 458,459
2
front, 1,6
list, 7,13
body, 15,540, (535) = 526
errata, 536,540
back, 541,542,v
errata, 543,547
3
front, 1,4
list, 5,11
body, 13,741, = 729
back, 742,742
Opisuje on trzy kolejne tomy słownika. Oczywiście należy zadbać o to, aby kolejność opisu
poszczególnych dokumentów była zgodna z kolejnością przetwarzania plików przez program
oraz o to, aby faktyczna liczba stron w dokumencie była zgodna z numerami stron w opisie.
2.5. Konwersja do formatu xces
Konwersji na format xces należy poddać każdy z dokumentów tworzących korpus. W przypadku dzieł wielotomowych, takich jak słowniki, naturalnym podziałem na dokumenty jest podział
na tomy.
Do konwersji używamy programu hocr2xces6 (należy upewnić się, że używamy aktualnej wersji — w starszych wersjach występował błąd polegający na sklejaniu słów na granicach
wierszy). Program ten wykonuje konwersję dokumentu zapisanego w formacie hocr czytanego ze standardowego wejścia, do IPI PAN-owskiego wariantu formatu xces. Wynik konwersji
wypisywany jest na standardowe wyjście.
Przykładowe wywołanie dla jednego dokumentu pokazane jest niżej.
hocr2xces < SpXVI_35t_hocr.xml > SpXVI_35_xces.xml
Uwaga: Program nie zakłada żadnych ustalonych postaci rozszerzeń nazw plików. W sensie
technicznym wszystkie one są XML-em. Wskazane jest takie ustalanie tych nazw, aby określały
jednoznacznie zawartość pliku. Ułatwia to uniknięcie ewentualnych pomyłek. Użycie skrótów
hocr i xces jako rozszerzeń jest możliwe, ale powoduje, że pliki te nie zawsze są automatycznie
poprawnie rozpoznawane jako xml przez system operacyjny i niektóre aplikacje.
6
Por. np. https://bitbucket.org/jwilk/marasca-wbl/.
4
2.6. Budujemy korpus — bpng
Do budowy korpusu używamy programu bpng7 . Zgodnie z informacją podaną w manualu, poza
samymi dokumentami w odpowiedniej wersji formatu xces, konieczne jest przygotowanie dla
każdego dokumentu pliku nagłówkowego oraz jednego wspólnego pliku konfiguracyjnego dla
tworzonego korpusu.
2.6.1. Plik konfiguracyjny dla korpusu
Plik konfiguracyjny powinien mieć nazwę ’nazwa_korpusu’.bp.conf, gdzie ’nazwa_korpusu’ jest wybraną przez nas nazwą. Plik ten specyfikuje nazwy plików z dokumentami i
odpowiadających im plików nagłówkowych oraz, przez odwołanie się do zawartości tych plików nagłówkowych, specyfikuje metadane korpusu. Również metadane, podobnie jak elementy
struktury, mogą być wykorzystywane w zapytaniach służących do przeszukiwania korpusu.
Przykładowy plik konfiguracyjny dla 35. tomu Słownika polszczyzny XVI wieku o nazwie
(na przykład) spxvi35.bp.conf może wyglądać jak niżej.
[locale]
locale = pl_PL
[filenames]
header = header.xml
morphosyntax = morph.xml
[meta]
name = volume
path = /meta/volume
[meta]
name = year
path = /meta/year
[meta]
name = range
path = /meta/range
[meta]
name = origin
path = /meta/origin
Jak widać plik ten składa się z sekcji, których nazwy ujęte są w nawiasy kwadratowe8 .
W sekcji [filenames] podane są nazwy plików z dokumentami (tutaj morph.xml) oraz
ich nagłówkami (tu header.xml). W przypadku korpusu składającego się z wielu dokumentów,
każdy z nich powinien być zawarty w plikach o takich samych nazwach natomiast do przetwarzania programem bpng powinny one zostać umieszczone w odpowiedniej strukturze katalogowej
— każdy dokument (czyli opisujące go dwa pliki) w oddzielnym podkatalogu.
Kolejne cztery sekcje o nazwie [meta] definiują metadane przewidziane dla wszystkich
dokumentów w danym korpusie. Każda z tych sekcji definiuje jeden rodzaj informacji ujętej w
metadanych.
7
8
Por. np. http://poliqarp.sourceforge.net/man/bpng.html
Bardziej szczegółowy opis budowy tego pliku znajduje się na stronie manuala programu bpng.
5
Pierwszy wiersz sekcji, rozpoczynający się od napisu ’name’ definiuje rodzaj metadanej.
Tak więc w tym przypadku metadane składają się z pozycji: volume, year, range, origin.
Oczywiście liczba pozycji w metadanych, a co za tym idzie liczba odpowiadających im sekcji
może być dowolna, podobnie jak nazwy nadane tym pozycjom 9 .
Kolejny wiersz rozpoczynający się od słowa ’path’ pokazuje, gdzie w pliku nagłówkowym
można znaleźć wartość opisywanej metadanej.
W tych sekcjach dopuszczalne są jeszcze pewne dodatkowe wiersze, ułatwiające kontrolę
postaci danych (por. strona manuala programu bpng).
2.6.2. Pliki nagłówkowe
Pliki nagłówkowe nie maja ściśle określonego formatu ale pod względem formalnym powinny
stanowić poprawnie zbudowany plik XML-owy10 . Sposób wykorzystania ich zawartości opisany
jest w pliku konfiguracyjnym — jak już powiedzieliśmy wyżej, wyrażenia ’path’ definiują
dostęp do wartości dla poszczególnych elementów metadanych.
Przykładowa zawartość pliku header.xml dla 35. tomu słownika, odpowiadająca pokazanemu wyżej plikowi konfiguracyjnemu widoczna jest niżej.
<meta>
<volume>35</volume>
<year>2011</year>
<range>from Q to ROWNY</range>
<origin>pdf</origin>
</meta>
2.6.3. Tworzenie korpusu — program bpng
Samo wywołanie programu bpng może mieć postać pokazaną niżej.
bpng ’nazwa_korpusu’ <katalog_z _danymi>
Parametr <katalog_z_danymi> powinien wskazywać odpowiednią strukturę katalogów zawierającą podkatalogi — oddzielny dla każdego dokumentu — z plikami opisującymi dokument
i jego nagłówek. Poniżej przykładowe wywołania z konkretnymi parametrami.
bpng spxviw ../spxviw-xces/t*
bpng spxvi35 spxvi35.data/
Niektóre inne postaci wywołania (np. katalog bieżący zamiast <katalog_z_danymi>) mogą
powodować problemy.
2.6.4. Szacunkowa liczba tokenów w korpusie
Oszacowanie liczby tokenów w korpusie można uzyskać dzieląc wielkość pliku:
<nazwa>.poliqarp.corpus.image
przez 12.
9
Przeglądarka marasca traktuje metadane w specyficzny sposób. Ich postać, dla pewnych korpusów znanych
przeglądarce, jest ściśle określona i kontrolowana. Dla korpusów, których nazw przeglądarka nie zna, ich postać
jest dowolna.
10
Oznacza to w szczególności, że niektóre znaki, np. & nie mogą być używane w metadanych w sposób
dowolny.
6
2.6.5. Indeksy — bpindexer
Dodatkowym elementem korpusu mogą być indeksy, które nie są obowiązkowe i nie są bezpośrednio widoczne dla użytkownika z poziomu klienta używanego do przeglądania korpusu,
ale wyrażnie przyspieszają wykonywanie zapytań. Do ich tworzenia służy program o nazwie
bpindexer, który domyślnie tworzy trzy indeksy (por. man bpindexer). Dla korpusu Słownik
polszczyzny XVI wieku pożyteczny jest tylko indeks form ortograficznych.
Można go stworzyć używając opcji -i o.
bpindexer -i o <nazwa_korpusu>
2.7. Wzbogacanie korpusu
Wzbogacenie korpusu jest operacją, która pozwoli przeglądarce marasca na pokazanie wyniku
zapytania w postaci zaznaczenia znalezionego tokenu na obrazie strony pokazanej w formacie
DjVu. Aby korpus wzbogacić, należy użyć programu augment-djvu-corpus11 .
./augment-djvu-corpus -h
usage: augment-djvu-corpus [option...] <base-name> <hocr-file...>
Augment Poliqarp binary corpus with information about segment coordinates.
positional arguments:
base
corpus basename
files
hOCR files
optional arguments:
-h, --help show this help message and exit
--flip
flip hOCR vertically (to work around buggy djvu2hocr)
--append
append data to the existing corpus
Przykładowe wywołania pokazane są niżej.
augment-djvu-corpus spxvi35 SpXVI_35t.xml
augment-djvu-corpus --flip spxviw ../spxviw-hocr/t*/text.hocr
Uwagi:
1. Do wzbogacenia należy użyć plików hocr (nie xces!)
2. Jeśli w gotowym korpusie zaznaczenie, zamiast we właściwym miejscu, będzie pojawiać się
symetrycznie względem środka strony, oznacza to, że należało użyć opcji –flip (por. wyżej,
opis przygotowywania plików hocr).
3. W przypadku wielu dokumentów w korpusie należy zadbać o właściwą kolejność przetwarzania, zgodną z kolejnością wstawiania dokumentów do korpusu.
Następnie należy zmodyfikować zawartość pliku <basename>djvu.filenames tak, aby pokazywał faktyczne dokumenty djvu. Plik ten powinien zawierać adresy URL rozpoczynające się
od http: (niestety nie może to być adres typu file://).
Uwaga:
Jednym z możliwych rozwiązań w przypadku konieczności zorganizowania dostępu do djvu,
jeśli komputer nie ma zewnętrznego adresu internetowego natomiast ma poprawnie zainstalowaną marascę, którą widać np. pod adresem ’http://poliqarp/, jest umieszczenie w katalogu ’ma11
Por. np.: https://bitbucket.org/jwilk/marasca-wbl.
7
rasca/marasca/media/extra’ linku symbolicznego do katalogu z plikiem djvu. Wtedy w pliku
filenames należy umieścić informację:
http://poliqarp/extra/kpbc-spxvi35/index.djvu
(tutaj sam plik nazywa się ’index.djvu’).
2.8. Opisy
Do tworzenia opisów widocznych na stronie wyszukiwarki używany jest mechanizm stosowany
w django12 .
W katalogu /marasca/marasca/templates/ znajdują się pliki zawierające wzorce (templates) opisujące wspólne fragmenty strony, natomiast w podkatalogu /marasca/marasca/
ptemplates/coprpora/ umieszczone są wzorce dotyczące poszczególnych korpusów.
W dystrybucji marasca w tym miejscu znajdują się opisy pewnej liczby korpusów znanych
przeglądarce, co może ułatwić przygotowanie opisu nowego korpusu.
Na przykład plik zawierający pierwszą część opisu (będzie ona widoczna w oknie przeglądarki przed polem przewidzianym do wpisywania zapytań do korpusu) opisu słownika Lindego
(plik o nazwie slownik-lindego.html, gdzie fragment ’slownik-lindego’ odpowiada identyfikatorowi korpusu występującemu w plikach konfiguracyjnych marasca, może wyglądać jak
niżej.
{% load i18n %}
{% blocktrans %}<p>
<a href=’http://poliqarp.wbl.klf.uw.edu.pl/extra/linde/index.djvu’>A
preliminary electronic version</a> of the second edition of Linde’s dictionary
</p>
{% endblocktrans %}
{% blocktrans %}<p>
Scans were made with Fujitsu fi-6130 scanner and Kofax VRS software by Joanna
A. Bilińska. OCR was prepared with FineReader 10 (selected language Polish,
default values of other recognition parameters) and saved as PDF/A files with
MRC lossy compression. The scans has been converted to DjVu format by Jakub
Wilk, he also converted the OCR results to the suitable corpus format.
</p>
{% endblocktrans %}
{% blocktrans %}<p>
The corpus consists of ca. 7 million segments. This version of the
corpus is available since August 6, 2010.
</p>
{% endblocktrans %}
Druga część opisu (widoczna w oknie przeglądarki poniżej pola przewidzianego do wpisywania zapytań) zawarta w pliku o nazwie slownik-lindego_sufiks.html może mieć następującą postać.
{% load i18n %}
{% blocktrans %}<p>
12
Por. np. https://docs.djangoproject.com/en/dev/ref/templates/
8
It is recommended to switch on graphical concordances option in
<a href=’/settings/’>Settings</a>.
{% endblocktrans %}
{% blocktrans %}<p>
Search can be limited to a specific volume with the <code>within</code> clause,
e.g. <code>within vol6</code> or <code>within vol6part2</code>. The clause can
be also used to limit the search to the following sections:
<code>body</code> (entries and their corrections),
<code>errata</code> (just the corrections),
<code>intro</code> (introductory texts),
<code>info</code> (other informations),
<code>varia</code> (dedications, subscriber lists),
<code>front</code> (frontmatter),
<code>back</code> (backmatter).
</p>
{% endblocktrans %}
{% blocktrans %}<p>
Please send questions and comments to
<a href=’mailto:[email protected]’>[email protected]</a>.
</p>
{% endblocktrans %}
Po przygotowaniu nowego albo zmianie opisu istniejącego korpusu należy uruchomić skrypt
update-i18n, który zwykle znajduje się w katalogu marasca/marasca/.
Zaktualizuje on, między innymi, plik locale/pl/LC_MESSAGES/django.po, który powinien zawierać polskie tłumaczenia komunikatów (czyli fragmentów opisu ujętych w znaczniki
{% blocktrans %}, {% endlocktrans %} w plikach pokazanych wyżej).
W przypadku dodawania nowego opisu, w pliku znajdować się będą komunikaty, którym
nie przypisano polskich odpowiedników natomiast w przypadku modyfikacji opisu istniejącego
polskie wersje nie będą odpowiadać treści wersji angielskiej.
W obu przypadkach plik należy poddać edycji. Można do tego użyć dedykowanego edytora poedit (por. http://www.poedit.net/), ale możliwe jest też użycie dowolnego edytora
tekstowego.
Następnie należy wykonać polecenie:
./manage compilemessages
Aby wyniki były widoczne na stronie wyszukiwarki należy przeładować serwer WWW.
Uwagi:
1. Z formalnego punktu widzenia do tworzenia opisów należy używać standardu XHTML.
2. Warto zauważyć, że jako cudzysłowy, w które ujęte są wartości atrybutów użyte zostały znaki
apostrofu.
3. Przy przygotowywaniu opisów oraz ich tłumaczeń należy zwrócić szczególną uwagę na to,
aby w tekście wszystkie cudzysłowy były prawidłowo pozamykane oraz aby znacznikom <a
href= ... > zawsze odpowiadały znaczniki zamykające </a>.
9
3. Korpusy font sensitive — na przykładzie Słownika Lindego
Korpusy tego typu pokazują informację o fontach, którymi złożone są w dokumencie formy, stanowiące wynik zapytania. Tego typu informacja może być użyteczna w przypadku dokumentów
historycznych, które często w całości albo we fragmentach były składane czcionką gotycką.
3.1. Skrypt font_sensitive.py M.Zająca
Podstawowym narzędziem wykorzystywanym do tworzenia tego typu korpusów jest program
font_sensitive.py przygotowany przez Marcina Zająca 13 .
Zgodnie z informacją zawartą w README program przekształca pliki hOCR w korpus,
który może być oglądany programem poliqarp. Traktuje on informację o fontach jako kategorię
gramatyczną co pozwala użytkownikowi na wykorzystanie jej przy przeszukiwaniu korpusu.
Sposób wywołania widać niżej.
./font_sensitive.py corpus_name list_of_filenames_to_convert
Mankamentem programu jest brak parametryzacji pliku konfiguracyjnego korpusu oraz plików nagłówkowych poszczególnych dokumentów — ich treść wpisana jest na stałe w teść programu. Stwarza to pewne niedogodności zwłaszcza przy tworzeniu korpusów składających się
z wielu dokumentów, dla których zawartość plików nagłówkowych powinna być zróżnicowana.
W trakcie działania programu najpierw pliki hOCR zawierające dane przekształcane są do
formatu xces, dołączane są pliki nagłówkowe, tworzony jest plik konfiguracyjny korpusu a dopiero potem tworzony jest korpus. Drobna ingerencja w treść programu polegająca na usunięciu
wywołania programu bpng pozwala na dwuetapowe przygotowanie korpusu.
W pierwszym kroku, przy użyciu lekko zmodyfikowanego programu, z plików hOCR tworzone są dane w postaci plików xces i plików nagłówkowych. W kroku drugim, po dokonaniu
odpowiednich korekt w nagłówkach i pliku konfiguracyjnym, wywoływany jest program bpng i
tworzony korpus.
3.2. Przygotowanie plików hOCR z plików pdf
Danymi dla programu M. Zająca są pliki w formacie hOCR. Jednym ze sposobów przygotowania
takich plików jest użycie programu pdfa@hocr14 .
Przykładowe wywołanie (dla jednego z tomów drugiego wydania słownika Lindego) może
wyglądać jak niżej.
pdfa2hocr.py -v -i -p -u pl_PL -r 5107x6605 6iiFR11.pdf
Linde2-6ii.html
Bardzo istotnym parametrem wywołania tego programu jest parametr -r, w opisie użycia
oznaczony jako resolution.
-r RESOLUTION, --resolution=RESOLUTION
resolution of page in pixels
Należy pamiętać, że jest to parametr wejściowy określający wielkość strony dokumentu w
pixelach. Użycie nieprawidłowej wartości może powodować, że zaznaczenia wyszukanych w
korpusie form nie będą trafiać we właściwe miejsca w odpowiednich plikach djvu. Informację
13
Skrypt dostępny jest w repozytorium: https://bitbucket.org/jwilk/marasca-wbl.
Program ten, którego autorem jest T. Olejniczak dostępny jest w
https://bitbucket.org/tomek87/pdfautils.
14
10
repozytorium
o wielkości strony dokumentu w pliku djvu udostępnia np. przeglądarka DjView (menu kontekstowe, pozycja information).
Niestety parametr -r jest aktualny dla wszystkich stron w przetwarzanym dokumencie a dla
niektórych druków strony mogą mieć dość znacznie zróżnicowane wymiary. Taka sytuacja ma
miejsce np. dla pierwszego wydania słownika Lindego udostępnianego przez KPBC. W takim
przypadku konieczne jest przyjęcie najbardziej typowej albo uśrednionej wielkości strony.
3.3. Nadawanie struktury
Jak zostało powiedziane wcześniej, do nadawania struktury dokumentom hOCR używamy skryptu annotate-hocr. Skrypt ten wymaga aby plik miał odpowiednią strukturę formalną. W praktyce sprowadza się to do odpowiedniej postaci nagłówka takiego pliku. Powinien on rozpoczynać
się znacznikiem:
<html xmlns="http://www.w3.org/1999/xhtml">
Znacznik ten mówi, że plik zapisany jest w formacie xhtml. Natomiast pliki generowane
przez pdfa2hocr z formalnego punktu widzenia zapisane są w formacie html (mają nagłówki
rozpoczynające się od <html>.
W związku z tym konieczne jest wprowadzenie odpowiednich zmian w plikach hocr. Można
do tego wykorzystać polecenie:
sed -i -e ’s,<html>,<html xmlns="http://www.w3.org/1999/xhtml">,’ <plik-hocr>
Uwaga: Przy nadawaniu struktury wielu dokumentom umieszczonym w jednym katalogu
należy zwrócić baczną uwagę na kolejność w jakiej skrypt pobiera pliki do przetwarzania —
musi ona być zgodna z kolejnością opisów.
3.4. font_sensitive — przygotowanie danych dla bpng
Jak wspomniano już wcześniej skrypt font_sensitive ma wpisaną na stałe postać pliku konfiguracyjnego korpusu oraz treść plików nagłówkowych przetwarzanych dokumentów. Dla uproszczenia następnego kroku, czyli ręcznego edytowania tych plików, warto zmodyfikować treść
skryptu tak, aby edycja pliku konfiguracyjnego nie była konieczna a edycja nagłówków wymagała jak najmniejszych zmian15 .
Przykładowe wywołanie skryptu przystosowanego do tworzenia korpusu słownika Lindego
pokazane jest niżej.
/font_sensitive_forLinde.py LindeAll hocry-anotowane/*.xml
Wynikiem takiego wywołania będzie stworzenie w katalogu LindeAll podkatalogu o nazwie LindeAll.data zawierającego plik konfiguracyjny dla korpusu oraz podkatalogi, z których każdy zawiera plik z danymi w formacie xces i nagłówek dla niego.
3.5. Edycja danych i stworzenie korpusu
Kolejnym krokiem jest poddanie edycji plików nagłówkowych oraz wykonanie korpusu i jego
wzbogacenie. Kroki te wyglądają analogicznie, jak opisane w poprzedniej części tekstu.
15
Przy okazji zmodyfikowano nieco strukturę katalogów, w której skrypt umieszcza dokumenty wynikowe.
11
3.6. Uzyskany wynik
Niestety uzyskany w ten sposób korpus nie zawiera informacji o nadanej dokumentom strukturze. Bliższa analiza treści skryptu font_sensitive pokazuje, że ignoruje on znaczniki wprowadzone w trakcie nadawania struktury, co oznacza, że przynajmniej na razie, nie jest możliwe
wykonywanie korpusów zawierających informację o fontach i jednocześnie informację o strukturze dokumentu.
4. Instalacja podstawowych programów
4.1. Poliqarp
4.2. Instalacja z pakietów
Najprostszym sposobem instalacji poliqarpa jest wykorzystanie pakietów przygotowanych dla
systemu operacyjnego Linux w wersji Debian i pokrewnych, w formacie deb16 .
Poszczególne pakiety zawierają (numery mogą się zmieniać, w zależności od wersji):
— poliqarp-base_1.3.11_i386.deb:
1. bp — tworzy korpus binarny (format XCES),
2. bpindexer — buduje indeksy dla korpusu binarnego,
3. bpng — tworzy korpus binarny (formaty IPIPAN XCES, NKJP TEI)
4. bpupgrade — konwertuje korpusy binarne,
5. poliqarpc — klient uruchamiany z wiersza poleceń,
6. poliqarpd — serwer polqarpa.
Każdy z tych programów ma własny opis w manualu(1). Istnieje też strona manuala opisująca
składnię zapytań — poliqarp-query-syntax(7).
Ponadto podczas instalacji pakietu, w katalogu /usr/share/doc/poliqarp-base umieszczane są ważne pliki przykładowe, miedzy innymi konfiguracyjne, oraz plik README.gz
zawierający zwięzły opis instalacji poliqarpa ze źródeł oraz opis użytkowy podstawowych
programów.
— poliqarp-gui_1.2.11_i386.deb zawiera:
1. poliqarp — interfejs graficzny do poliqarpa.
Ma on również (skromną) stronę w manualu.
4.2.1. Konfiguracja
Po zainstalowaniu pakietów żadne pliki konfiguracyjne nie są tworzone automatycznie. Również
serwer poliqarpd nie startuje automatycznie — wymaga ręcznego uruchomienia, np tak:
poliqarp -d -c /home/kszafran/.poliqarp/poliqarpd.conf
gdzie plik poliqarpd.conf jest plikiem konfiguracyjnym dla serwera.
Uwaga: Przykładowy plik konfiguracyjny dostarczany z pakietem zawiera opcję max-match-size,
której nazwę należy ewentualnie zmienić na max-match-length.
4.2.2. Test poprawności działania
Do przetestowania poprawności instalacji oraz do oswojenia się z poliqarpem można wykorzystać materiały dostępne na stronie Korpus JP: http://korpus.pl/index.php?page=download
16
Por. http://jwilk.net/software/poliqarp
12
Niestety dostępne tam wersje binarne korpusów zostały przygotowane w tak zwanej wersji
1 i wymagaj konwersji za pomocą programu bpupgrade.
4.3. Instalacja ze źródeł
Osoby zainteresowane albo zmuszone do wykonania instalacji poliqarpa ze źródeł znajdą opis
postępowania we wspomnianym wyżej pliku README
4.4. marasca
Źródła programu marasca należy pobrać z odpowiedniego repozytorium. Najwygodniej można
to zrealizować przez stworzenie jego kopii:
hg clone https://bitbucket.org/jwilk/marasca-wbl
Przy pobieraniu plików z repozytorium marasca należy upewnić się, że właściwie ustawiony jest parametr branch — powinien on mieć wartość ’wbl’. Czy jest tak w istocie, można
sprawdzić w pliku ’branch’ w katalogu ’.hg’ klonu repozytorium.
Kopia repozytorium zawiera kilka katalogów. Przeglądarka marasca znajduje się w katalogu
o nazwie marasca.
4.4.1. Instalacja
Instalacja sprowadza się do:
1. Wykonania skryptu setup znajdującego się w katalogu marsca.
2. Wyedytowania powstałego w wyniku wykonania poprzedniego kroku pliku $hostname.py
znajdującego się w podkatalogu settings na wzór znajdującego się tam pliku wbl.py.
Po wykonaniu powyższych czynności należy upewnić się, że w pliku (/marasca/settings/
__init__.py) właściwie ustawiony jest dostęp do plików z opisami korpusów, np. tak, jak niżej
(ścieżki powinny być ścieżkami bezwzględnymi do odpowiedniego katalogu/katalogów):
LOCALE_PATHS = (
’/home/www/project/common_files/locale’,
’/var/local/translations/locale’
)
oraz, że uprawnienia do plików .mo są poprawne17 .
Poza katalogiem marasca z repozytorium do poprawnego działania aplikacji niezbędny jest
katalog locks, zwykle umieszczony na tym samym poziomie, co marasca. Jego dokładna lokalizacja określona jest w pliku konfiguracyjnym $hostname.py (na końcu pliku).
Uwaga: Problemy przy uruchamianiu przeglądarki mogą być spowodowane brakiem albo
niewłaściwymi prawami dostępu do plików logów albo katalogu locks.
5. Konfiguracja korpusów
W zależności od tego, jakiego klienta chcemy używać do oglądania korpusów, konieczne jest
umieszczenie odpowiednich informacji we właściwych plikach konfiguracyjnych.
17
W razie potrzeby należy wykonać najpierw polecenie ./manage compilemessages.
13
5.1. Plik konfiguracyjny serwera poliqarp
Niestety nie jest możliwe takie skonfigurowanie serwera poliqarpd aby można było oglądać
korpusy korzystając zarówno z klienta graficznego, jak też z marasca. W takiej sytuacji konieczne jest wykorzystanie dwóch kopii serwera, z których każda używa innego numeru portu
do komunikacji z klientem.
5.2. Klient graficzny
Klient graficzny uruchamiany poleceniem poliqarp korzysta z pliku konfiguracyjnego o nazwie
.poliqarp.cfg. W tym pliku możliwe jest ustawienie numeru portu, przez który będzie się on
komunikował z serwerem poliqarpd.
Analogicznie w pliku konfiguracyjnym serwera poliqarpa należy ustawić identyczny numer
portu.
5.3. marasca
W pliku konfiguracyjnym serwera poliqarpd (poliqarpd.conf), który ma współpracować z
marasca konieczne jest dodanie odpowiedniej informacji o lokalizacji korpusu. Może ona mieć
postać widoczną niżej.
corpus = slownik-lindego: /srv/poliqarp/corpora/LindeSE
Uwaga:
1. Wpisanie takiej informacji do pliku konfiguracyjnego serwera komunikującego się z klientem graficznym spowoduje zakłócenie jego pracy.
2. Po dodaniu opisu korpusu do pliku konfiguracyjnego należy ponownie uruchomić serwer
poliqarpa.
Następnie w pliku $hostname.py, o którym była mowa wyżej, w tablicy zwracanej przez
funkcję _get_corpora() dodajemy opis nowego korpusu:
DjVuCorpus(path=’/srv/poliqarp/corpora/LindeSE’
id=’slownik-lindego’,
title=_(u’Linde SE’),
abbreviation=’LindeSE’,
has_interps=True
)
Uwaga:
1. Nazwa ’DjVuCorpus’ nie może zostać zmieniona.
2. Należy się upewnić, że w opisach korpusów w pliku $hostname.py znajduje się wiersz
abbreviation = ... .
6. Konfiguracja Apache’a
Na to aby aplikacja marasca została w pełni zintegrowana z serwerem Apache należy wykonać
następujące operacje.
1. Zainstalować pakiet (libapache2-mod-wsgi) dostarczajacy wsgi (w katalogu /etc/apache/
mods-enabled/ pojawiają się linki wsgi.conf i wsgi.load do /mods-available/, gdzie są
opisy dostępnych modułów).
14
2. Umieścić w katalogu /apache2/sites-available/ odpowiednio zmodyfikowany plik
polqarp.
<VirtualHost *:80>
ServerName poliqarp.kanji.klf.uw.edu.pl
Alias /robots.txt /dev/null
Alias /favicon.ico /dev/null
Alias /css/ /home/kszafran/NEW/marasca/marasca/media/css/
Alias /js/ /home/kszafran/NEW/marasca/marasca/media/js/
Alias /extra/ /home/kszafran/NEW/marasca/marasca/media/extra/
AliasMatch ^/google(.*) /home/kszafran/NEW/marasca/marasca/media/google/$1
WSGIDaemonProcess marasca
WSGIProcessGroup marasca
WSGIScriptAlias / /home/kszafran/NEW/marasca/django.wsgi
CustomLog ${APACHE_LOG_DIR}/poliqarp-access.log vhost_combined
</VirtualHost>
Uwaga: W pewnych sytuacjach konieczne moż być dokonanie dodatkowego wpisu w pliku
/etc/hosts.
3. Umieścić w podkatalogu /sites-enabled/ link do pliku poliqarp
4. Umieścić w katalogu marasca (dokładna lokalizacja podana jest w pliku poliqarp) odpowiednio zmodyfikowany pliku django.wsgi, np. taki:
import os
import sys
os.environ[’DJANGO_SETTINGS_MODULE’] = ’settings’
sys.path.append(’/home/kszafran/NEW/marasca/marasca/’)
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
5. Zrestartować serwer Apache.
15

Podobne dokumenty