Werkoverleg met GvN.
Taken:
✔ waarvoor gebruikt PaQu de error-uitvoer van Alpino?
- ✻ Fouten van Alpino verzamelen voor in het overzicht bij het corpus
- ✻ Weergeven van fouten na klikken op link in overzicht bij het corpus
- ❏ Alpino-server
- ✔ API (zie beneden)
❏ pqalpino
- ❏ kijken naar andere corpus-applicaties
- ✻ bijvoorbeeld: INESS
- ❏ andere manieren van corpus bevragen, gegevens aggregeren, visualiseren van resultaten
- ❏ verzoeken:
❏ kan PaQu ook expliciet aangeven als er 0 matches zijn?
- ❏ kunnen telresultaten ook dichtklapbaar worden gemaakt?
- Alpino in docker
- ✔ voorbeeld toevoegen
- ❏ op Windows: testen tijdens komend werkoverleg
- Inloggen via surfnet
- → zie e-mail van surfnet
→ zie nieuwe login in PaQu
API Alpino-server
TODO:
- back-off policy
aanvullingen op request: info
Request API
return status:
code |
status |
betekenis |
200 |
OK |
|
202 |
Accepted |
na upload van tekst |
400 |
Bad Request |
fout van gebruiker |
403 |
Forbidden |
bijvoorbeeld: ip-adres geblokkerd vanwege misbruik |
429 |
Too Many Requests |
toegang geweigerd vanwege te veel teksten tegelijk |
500 |
Internal Server Error |
|
501 |
Not Implemented |
|
503 |
Service Unavailable |
server is overbelast, probeer later opnieuw |
Gelijk aan HTTP status codes
- geen json-uitvoer bij welke code?
return als code 400 of groter is:
|
type |
omschrijving |
code |
int |
zie boven |
status |
string |
zie boven |
message |
string |
de foutmelding |
request: parse
doel: zend corpus naar server om te laten parsen
parameters:
|
type |
default |
voorwaarde |
omschrijving |
lines |
bool |
false |
|
true: één zin per regel / false: doorlopenede tekst |
tokens |
bool |
false |
lines: true |
zinnen zijn getokeniseerd |
labels |
bool |
false |
lines: true |
zinnen hebben labels |
label |
string |
"doc" |
lines: false |
prefix voor labels |
hints |
bool |
false |
tokens: true |
special betekenis voor [ en ] |
voorbeeld aanroep, tekst volgt na json-object:
{
"request": "parse",
"lines": true,
"tokens": true,
"labels": true
}
doc.1.p.1.s.1|ik besta
doc.1.p.1.s.2|jij bestaat
return voor status is ok:
|
type |
omschrijving |
code |
int |
202 |
status |
string |
Accepted |
id |
string |
id van job |
lines |
int |
aantal zinnen, eventueel na splitsen van lopende tekst in zinnen |
timeout |
int |
tijd in seconden waarbinnen output opgevraagd moet worden voordat job wordt gecanceld |
voorbeeld uitvoer:
{
"code": 202,
"status": "Accepted",
"id": "118587257602604880",
"lines": 2,
"timeout": 300
}
request: output
doel: opvragen van (deel van) de uitvoer van een job, momenteel alleen jobs van type parse
parameters:
|
type |
omschrijving |
id |
string |
id van job |
voorbeeld aanroep:
{
"request": "output",
"id": "118587257602604880"
}
return voor status is ok, voor job van type "parse":
|
type |
omschrijving |
code |
int |
200 |
status |
string |
OK |
finished |
bool |
true als parsen van alle zinnen is voltooid |
batch |
array van items |
de zinnen geparst tot nu toe sinds laatste aanroep |
batch item:
|
type |
omschrijving |
status |
string |
ok, fail |
lineno |
int |
zinnummer |
label |
string |
label van de zin, alleen als die aanwezig is |
xml |
string |
de parse van de zin, alleen voor status=ok |
log |
string |
error-uitvoer van de parser, of van een andere fout |
voorbeeld uitvoer:
{
"code": 200,
"status": "OK",
"finished": true,
"batch": [
{"status":"ok","lineno":2,"label":"doc.1.p.1.s.2","xml":"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<alpino_ds version=\"1.5\">\n <node begin=\"0\" cat=\"top\" end=\"2\" id=\"0\" rel=\"top\">\n <node begin=\"0\" cat=\"smain\" end=\"2\" id=\"1\" rel=\"--\">\n <node begin=\"0\" case=\"nom\" def=\"def\" end=\"1\" frame=\"pronoun(nwh,je,sg,de,nom,def)\" gen=\"de\" getal=\"ev\" id=\"2\" lcat=\"np\" lemma=\"jij\" naamval=\"nomin\" num=\"sg\" pdtype=\"pron\" per=\"je\" persoon=\"2v\" pos=\"pron\" postag=\"VNW(pers,pron,nomin,vol,2v,ev)\" pt=\"vnw\" rel=\"su\" rnum=\"sg\" root=\"jij\" sense=\"jij\" status=\"vol\" vwtype=\"pers\" wh=\"nwh\" word=\"jij\"/>\n <node begin=\"1\" end=\"2\" frame=\"verb(hebben,sg3,intransitive)\" id=\"3\" infl=\"sg3\" lcat=\"smain\" lemma=\"bestaan\" pos=\"verb\" postag=\"WW(pv,tgw,met-t)\" pt=\"ww\" pvagr=\"met-t\" pvtijd=\"tgw\" rel=\"hd\" root=\"besta\" sc=\"intransitive\" sense=\"besta\" stype=\"declarative\" tense=\"present\" word=\"bestaat\" wvorm=\"pv\"/>\n </node>\n </node>\n <sentence sentid=\"82.161.115.144\">jij bestaat</sentence>\n</alpino_ds>\n","log":""},
{"status":"ok","lineno":1,"label":"doc.1.p.1.s.1","xml":"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<alpino_ds version=\"1.5\">\n <node begin=\"0\" cat=\"top\" end=\"2\" id=\"0\" rel=\"top\">\n <node begin=\"0\" cat=\"smain\" end=\"2\" id=\"1\" rel=\"--\">\n <node begin=\"0\" case=\"nom\" def=\"def\" end=\"1\" frame=\"pronoun(nwh,fir,sg,de,nom,def)\" gen=\"de\" getal=\"ev\" id=\"2\" lcat=\"np\" lemma=\"ik\" naamval=\"nomin\" num=\"sg\" pdtype=\"pron\" per=\"fir\" persoon=\"1\" pos=\"pron\" postag=\"VNW(pers,pron,nomin,vol,1,ev)\" pt=\"vnw\" rel=\"su\" rnum=\"sg\" root=\"ik\" sense=\"ik\" status=\"vol\" vwtype=\"pers\" wh=\"nwh\" word=\"ik\"/>\n <node begin=\"1\" end=\"2\" frame=\"verb(hebben,sg1,intransitive)\" id=\"3\" infl=\"sg1\" lcat=\"smain\" lemma=\"bestaan\" pos=\"verb\" postag=\"WW(pv,tgw,ev)\" pt=\"ww\" pvagr=\"ev\" pvtijd=\"tgw\" rel=\"hd\" root=\"besta\" sc=\"intransitive\" sense=\"besta\" stype=\"declarative\" tense=\"present\" word=\"besta\" wvorm=\"pv\"/>\n </node>\n </node>\n <sentence sentid=\"82.161.115.144\">ik besta</sentence>\n</alpino_ds>\n","log":""},
]
}
request: cancel
doel: een lopende job afbreken (jobs worden ook afgebroken als de timeout is verstreken)
parameters:
|
type |
omschrijving |
id |
string |
id van job |
voorbeeld aanroep:
{
"request": "cancel",
"id": "118587257602604880"
}
voorbeeld uitvoer:
{
"code": 200,
"status": "OK"
}
request: info
doel: details over de huidige status van de server opvragen
geen parameters
voorbeeld aanroep:
{
"request": "info"
}
return voor status is ok:
|
type |
|
omschrijving |
api |
object |
|
API-versie gebruikt door deze server |
api.major |
int |
|
major version number |
api.minor |
int |
|
minor version number |
server |
object |
optioneel |
gegevens over server |
server.about |
string |
optioneel |
vrije tekst, beschrijving, contact-info, etc. |
server.workers |
int |
optioneel |
aantal werkers op dit moment, bezig of wachtend |
server.jobs |
int |
optioneel |
totaal aantal jobs (parse) die op dit moment verwerkt worden |
limits |
object |
|
regels voor de gebruiker |
limits.maxjobs |
int |
|
maximum aantal jobs per IP-adres |
voorbeeld uitvoer:
{
"code": 200,
"status": "OK"
"api": {
"major": 1,
"minor": 0
},
"server": {
"about": "Experimentele server om de API te testen.\nNiet voor productiedoeleinden.\nContact: Peter Kleiweg <p.c.j.kleiweg@rug.nl>",
"workers": 10,
"jobs": 45
},
"limits": {
"maxjobs": 6
}
}
Gebruik
Draait op zardoz → zie: /net/aistaff/kleiweg/paqu/tmp/alpserve
Voorbeeld aanroep:
curl -s -d '{"request": "parse", "lines": true, "tokens": true, "labels": true}
weer.p.1.s.1|Vandaag & morgen
weer.p.2.s.1|Kans op onweersbuien
weer.p.3.s.1|De buien boven het noorden van het land trekken spoedig weg , waarna de zon op veel plaatsen doorbreekt en het broeierig aanvoelt .
weer.p.3.s.2|In de loop van vanmiddag en vanavond neemt de kans op stevige onweersbuien van het zuidwesten uit toe .
weer.p.3.s.3|Vooral in het oosten kunnen deze lokaal fors uitpakken met veel regen in korte tijd , wat voor wateroverlast kan zorgen .
weer.p.3.s.4|Ook hagel en ( zware ) windstoten zijn mogelijk .
weer.p.3.s.5|De maximumtemperaturen lopen uiteen van 22 graden op de Wadden tot 30 graden in het zuidoosten van het land .
weer.p.3.s.6|De wind draait naar het zuiden en neemt toe naar matig .
weer.p.3.s.7|In de middag draait de wind in het westen naar noordwest en neemt af naar zwak .
weer.p.4.s.1|Komende nacht is er nog steeds kans op enkele forse onweersbuien .
weer.p.4.s.2|De minimumtemperaturen liggen rond de 20 graden en de wind is zwak uit uiteenlopende richtingen .
weer.p.5.s.1|Morgen overdag is het half tot zwaar bewolkt en kan er in het uiterste oosten nog een enkele bui voorkomen , maar de kans op onweer is klein .
weer.p.5.s.2|De middagtemperatuur loopt uiteen van 19 graden vlak aan zee tot 26 graden in het oosten van het land .
weer.p.5.s.3|De wind wordt geleidelijk westelijk en is zwak tot matig .
weer.p.5.s.4|( Bron : KNMI )' http://127.0.0.1:9456/json
Of:
curl -s --data-binary @/net/aistaff/kleiweg/paqu/tmp/alpserve/data http://127.0.0.1:9456/json
Voorbeeld antwoord:
{
"code": 202,
"status": "Accepted",
"id": "5577006791947779410",
"lines": 15,
"timeout": 300
}
Je moet resultaten opvragen binnen de gegeven timeout (in seconden), anders wordt de boel weggegooid. Voorbeeld:
curl -s -d '{"request": "output", "id": "5577006791947779410"}' http://127.0.0.1:9456/json
Je krijgt dan de verwerking van de zinnen geparst vanaf de vorige aanroep tot nu toe.
Als daarin staat "finished":false dan zijn dit nog niet alle zinnen. Herhaal dan bovenstaand commando opnieuw, weer binnen de timeout, die gereset is bij de vorige aanroep.