Skip to content
Snippets Groups Projects
Commit af9a0a78 authored by Pawel Orlowicz's avatar Pawel Orlowicz
Browse files

wccl-qa.py user guide

parent 1a6b0501
No related branches found
No related tags found
No related merge requests found
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cesAna SYSTEM "xcesAnaIPI.dtd">
<chunkList xmlns:xlink="http://www.w3.org/1999/xlink">
<chunk id="ch1" type="p">
<sentence>
<tok>
<orth>Gdzie</orth>
<lex disamb="1"><base>gdzie</base><ctag>adv</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">0</ann>
<ann chan="chunk_np">0</ann>
<ann chan="chunk_vp">1</ann>
</tok>
<tok>
<orth>jest</orth>
<lex disamb="1"><base>być</base><ctag>fin:sg:ter:imperf</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">0</ann>
<ann chan="chunk_np">0</ann>
<ann chan="chunk_vp">1</ann>
</tok>
<tok>
<orth>Bagdad</orth>
<lex disamb="1"><base>Bagdad</base><ctag>subst:sg:nom:m3</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">1</ann>
<ann chan="chunk_np">1</ann>
<ann chan="chunk_vp">0</ann>
</tok>
<ns/>
<tok>
<orth>?</orth>
<lex disamb="1"><base>?</base><ctag>interp</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">0</ann>
<ann chan="chunk_np">0</ann>
<ann chan="chunk_vp">0</ann>
</tok>
</sentence>
</chunk>
</chunkList>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cesAna SYSTEM "xcesAnaIPI.dtd">
<chunkList xmlns:xlink="http://www.w3.org/1999/xlink">
<chunk id="ch1" type="p">
<sentence>
<tok>
<orth>Ile</orth>
<lex disamb="1"><base>ile</base><ctag>num:pl:acc:m3:rec</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">1</ann>
<ann chan="chunk_np">1</ann>
<ann chan="chunk_vp">0</ann>
</tok>
<tok>
<orth>kosztują</orth>
<lex disamb="1"><base>kosztować</base><ctag>fin:pl:ter:imperf</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">0</ann>
<ann chan="chunk_np">0</ann>
<ann chan="chunk_vp">1</ann>
</tok>
<tok>
<orth>buty</orth>
<lex disamb="1"><base>but</base><ctag>subst:pl:acc:m3</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">2</ann>
<ann chan="chunk_np">2</ann>
<ann chan="chunk_vp">0</ann>
</tok>
<tok>
<orth>do</orth>
<lex disamb="1"><base>do</base><ctag>prep:gen</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">3</ann>
<ann chan="chunk_np">2</ann>
<ann chan="chunk_vp">0</ann>
</tok>
<tok>
<orth>biegania</orth>
<lex disamb="1"><base>biegać</base><ctag>ger:sg:gen:n:imperf:aff</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">3</ann>
<ann chan="chunk_np">2</ann>
<ann chan="chunk_vp">0</ann>
</tok>
<ns/>
<tok>
<orth>?</orth>
<lex disamb="1"><base>?</base><ctag>interp</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">0</ann>
<ann chan="chunk_np">0</ann>
<ann chan="chunk_vp">0</ann>
</tok>
</sentence>
</chunk>
</chunkList>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cesAna SYSTEM "xcesAnaIPI.dtd">
<chunkList xmlns:xlink="http://www.w3.org/1999/xlink">
<chunk id="ch1" type="p">
<sentence>
<tok>
<orth>Po</orth>
<lex disamb="1"><base>po</base><ctag>prep:loc</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">1</ann>
<ann chan="chunk_np">1</ann>
<ann chan="chunk_vp">0</ann>
</tok>
<tok>
<orth>ilu</orth>
<lex disamb="1"><base>ile</base><ctag>num:pl:loc:m3:congr</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">1</ann>
<ann chan="chunk_np">1</ann>
<ann chan="chunk_vp">0</ann>
</tok>
<tok>
<orth>dniach</orth>
<lex disamb="1"><base>dzień</base><ctag>subst:pl:loc:m3</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">1</ann>
<ann chan="chunk_np">1</ann>
<ann chan="chunk_vp">0</ann>
</tok>
<tok>
<orth>mogę</orth>
<lex disamb="1"><base>móc</base><ctag>fin:sg:pri:imperf</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">0</ann>
<ann chan="chunk_np">0</ann>
<ann chan="chunk_vp">1</ann>
</tok>
<tok>
<orth>znowu</orth>
<lex disamb="1"><base>znowu</base><ctag>qub</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">0</ann>
<ann chan="chunk_np">0</ann>
<ann chan="chunk_vp">1</ann>
</tok>
<tok>
<orth>zacząć</orth>
<lex disamb="1"><base>zacząć</base><ctag>inf:perf</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">0</ann>
<ann chan="chunk_np">0</ann>
<ann chan="chunk_vp">1</ann>
</tok>
<tok>
<orth>śpiewać</orth>
<lex disamb="1"><base>śpiewać</base><ctag>inf:imperf</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">0</ann>
<ann chan="chunk_np">0</ann>
<ann chan="chunk_vp">1</ann>
</tok>
<ns/>
<tok>
<orth>?</orth>
<lex disamb="1"><base>?</base><ctag>interp</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">0</ann>
<ann chan="chunk_np">0</ann>
<ann chan="chunk_vp">0</ann>
</tok>
</sentence>
</chunk>
</chunkList>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cesAna SYSTEM "xcesAnaIPI.dtd">
<chunkList xmlns:xlink="http://www.w3.org/1999/xlink">
<chunk id="ch1" type="p">
<sentence>
<tok>
<orth>Za</orth>
<lex disamb="1"><base>za</base><ctag>prep:acc</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">1</ann>
<ann chan="chunk_np">1</ann>
<ann chan="chunk_vp">0</ann>
</tok>
<tok>
<orth>ile</orth>
<lex disamb="1"><base>ile</base><ctag>num:pl:acc:f:rec</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">1</ann>
<ann chan="chunk_np">1</ann>
<ann chan="chunk_vp">0</ann>
</tok>
<tok>
<orth>godzin</orth>
<lex disamb="1"><base>godzina</base><ctag>subst:pl:gen:f</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">2</ann>
<ann chan="chunk_np">1</ann>
<ann chan="chunk_vp">0</ann>
</tok>
<tok>
<orth>będzie</orth>
<lex disamb="1"><base>być</base><ctag>bedzie:sg:ter:imperf</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">0</ann>
<ann chan="chunk_np">0</ann>
<ann chan="chunk_vp">1</ann>
</tok>
<tok>
<orth>można</orth>
<lex disamb="1"><base>można</base><ctag>pred</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">0</ann>
<ann chan="chunk_np">0</ann>
<ann chan="chunk_vp">1</ann>
</tok>
<tok>
<orth>kupić</orth>
<lex disamb="1"><base>kupić</base><ctag>inf:perf</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">0</ann>
<ann chan="chunk_np">0</ann>
<ann chan="chunk_vp">1</ann>
</tok>
<tok>
<orth>telewizor</orth>
<lex disamb="1"><base>telewizor</base><ctag>subst:sg:acc:m3</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">3</ann>
<ann chan="chunk_np">2</ann>
<ann chan="chunk_vp">0</ann>
</tok>
<tok>
<orth>po</orth>
<lex disamb="1"><base>po</base><ctag>prep:loc</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">4</ann>
<ann chan="chunk_np">2</ann>
<ann chan="chunk_vp">0</ann>
</tok>
<tok>
<orth>niższej</orth>
<lex disamb="1"><base>niski</base><ctag>adj:sg:loc:f:com</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">4</ann>
<ann chan="chunk_np">2</ann>
<ann chan="chunk_vp">0</ann>
</tok>
<tok>
<orth>cenie</orth>
<lex disamb="1"><base>cena</base><ctag>subst:sg:loc:f</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">4</ann>
<ann chan="chunk_np">2</ann>
<ann chan="chunk_vp">0</ann>
</tok>
<ns/>
<tok>
<orth>?</orth>
<lex disamb="1"><base>?</base><ctag>interp</ctag></lex>
<ann chan="chunk_adjp">0</ann>
<ann chan="chunk_agp">0</ann>
<ann chan="chunk_np">0</ann>
<ann chan="chunk_vp">0</ann>
</tok>
</sentence>
</chunk>
</chunkList>
match_rules(
apply(
match(
and(
inter(lower(base[0]), ["za", "po"]),
inter(lower(base[1]), ["ile"])
)
),
actions(
setprop(M, "qtype2", "price"),
setprop(M, "qtype3", "time")
)
);
apply(
match(
inter(base[0], ["kupić", "płacić", "nabyć", "sprzedać", "kosztować"])
),
actions(
setprop(M, "qtype1", "price")
)
);
apply(
match(
inter(base[0], ["cena"])
),
actions(
setprop(M, "qtype2", "price")
)
);
apply(
match(
inter(base[0], ["gdzie"])
),
actions(
setprop(M, "qtype2", "where")
)
);
apply(
match(
inter(base[0], ["sekunda", "minuta", "godzina", "rok", "dzień"])
),
actions(
setprop(M, "qtype2", "time")
)
)
)
Przykład użycia skryptu wccl-qa.py
0. Uwagi:
*skrypt docelowo będzie wywoływany na tekście otagowanym i (może) ochunkowanym
*jeden plik interpretowany jest jako jedno pytanie, tzn. jedno uruchomienie skryptu zwraca jedną etykietę rodzaju pytania, który wynika z właściwości qtype1, qtype2, qtype3
*jeżeli użyto opcji -r (--result) wtedy wynik działania skryptu jest dołączany (append) do wskazanego pliku (nowa etykieta na nowej linii)
1. Przykład działania skryptu:
Pytania (przetworzone przy pomocy narzędzi MACA, WCRFT, IOBBER - opis znajduje się poniżej):
./qa-input0.xml: Gdzie jest Bagdad?
./qa-input1.xml: Za ile można kupić buty do biegania?
./qa-input2.xml: Po ilu dniach mogę znowu zacząć śpiewać?
./qa-input3.xml: Za ile godzin będzie można kupić telewizor po niższej cenie?
./qa-prop-match.wccl - plik z regułami definiującymi właściwoci qtype1, qtype2, qtype3
1.1 Uruchomienie skryptu:
Uwagi:
*qa-inputN.xml: N = {0,1,2,3}:
*opcjonalny plik: wccl_processed_output zawiera przetworzony plik wejściowy z dodanymi przez reguły WCCL elementami
Uruchomienie:
A) z plikiem wejściowym (-I):
$> cd ../doc
$> ./wccl-qa.py ../examples/qa-prop-match.ccl -I ../examples/qa-inputN.xml -t nkjp -O ~/wccl_processed_output
B) ze strumieniem wejściowym:
$> cd ../doc
$> cat ../examples/qa-inputN.xml | ./wccl-qa.py ../examples/qa-prop-match.ccl -t nkjp -O ~/wccl_processed_output
Wyniki działania skryptu (tylko wartość podana po 'OUTPUT: ') otrzymane dla przykładowych pytań oraz rozkład wartości qtypeX będący podstawą do wygenerowania wyniku:
* oznaczenie: {wartość właściwości qtypeX:liczba wystąpień na poziomie X:suma wystąpień na wszystkich poziomach}:
* położenie OUTPUT oznacza miejsce gdzie następuje podjęcie decyzji (nie są rozpatrywane niższe poziomy qtypeX)
qa-input0.xml: Gdzie jest Bagdad?
qtype1 = {}
qtype2 = {where:1:1} OUTPUT: where
qtype3 = {}
qa-input1.xml: Za ile można kupić buty do biegania?
qtype1 = {price:1:1} OUTPUT: price
qtype2 = {}
qtype3 = {}
qa-input2.xml: Po ilu dniach mogę znowu zacząć śpiewać?
qtype1 = {}
qtype2 = {price:1:1, time:1:1}
qtype3 = {price:0:1, time:1:2} OUTPUT: time
qa-input3.xml: Za ile godzin będzie można kupić telewizor po niższej cenie?
qtype1 = {price:1:1} OUTPUT: price
qtype2 = {price:2:3, time:1:1}
qtype3 = {price:0:3, time:1:2}
==================================================================
= Wygenerowanie plików wejściowych dla skryptu wccl-qa.py =
==================================================================
* %WCRFT_ROOT_DIR% - główny katalog projektu WCRFT
* do otagowania przykładowych pytań użyto WCRFT z opcją -i text która korzysta z instalacji programu MACA - może wystąpić konieczność dostosowania w pliku %WCRFT_ROOT_DIR%/config/nkjp.ini konfiguracji MACA'y:
macacfg = morfeusz-nkjp ; zależnie od zainstalowanej wersji Morfeusza
; patrz Available configurations w:
; maca-analyse --help
* konfiguracji wymaga:
- ścieżka do modelu WCRFT (można go pobrać z: http://156.17.129.129/share/)
- ścieżka do modelu IOBBERa (obecnie dostępny w projekcie IOBBER w katalogu %IOBBER_ROOT_DIR%/iobber/data/model-kpwr03/)
Użycie:
$> cd %WCRFT_ROOT_DIR%
$> echo "Za ile godzin będzie można kupić telewizor po niższej cenie?" | wcrft/wcrft.py -d /path/to/wcrft/model/model_nkjp10_wcrft -i text config/nkjp.ini - -o ccl | iobber kpwr.ini -d /path/to/iobber/model/model-kpwr03/ - > qa-input3.xml
Zamiast przekierowania wyjścia do pliku qa-input3.xml można od razu zastosować skrypt wccl-qa.py:
$> cd %WCRFT_ROOT_DIR%
$> echo "Za ile godzin będzie można kupić telewizor po niższej cenie?" | wcrft/wcrft.py -d /path/to/wcrft/model/model_nkjp10_wcrft -i text config/nkjp.ini - -o ccl | iobber kpwr.ini -d /path/to/iobber/model/model-kpwr03/ - | %WCCL_ROOT_DIR%/doc/wccl-qa.py %WCCL_ROOT_DIR%/examples/qa-prop-match.ccl -t nkjp
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment