Gränssnitt för FakeGranska av Lars Mattsson (larsmatt@kth.se)
Innehållsförteckning 1 Introduktion...3 2 Genomförande:...3 3 Användning...5 4 Kända buggar:...6 5 Källförteckning...6 2
1 Introduktion Taken med detta projekt var att skapa ett grafiskt gränssnitt till fakegranska åt Jonas Sjöberg på KTH. Jonas ville kunna demontera fakegranska med ett grafiskt program istället för Telnet. Programmet skulle kunna visa vilka ord i en given text var felaktiga genom någon form av färgkodning. Fakegranska klarar av idag 3 olika fel, kongruens fel, ordföljds fel och särskrivningar. Programmet skulle minst klara av att visa kongruens fel och felaktig ordföljd med olika färg för de två olika felen. Programmet skall även klara av att läsa från en fil och möjligtvis spara till en fil. Fakegranska är uppbyggt med separata program som för varje fel har en server som kan säga om en mening har något felaktigt ord. Dessa serverar tar lite olika former av ordklass taggade ord. Alla serverna vill den fullständiga ordklassen med ordklass, genus, numerus och bestämdhet. Men hur informationen om taggen skall skickas till servern varierar. Kongruens servern vill ha taggen uppdelad i 4 olika kolumner med antigen tabbar eller mellanslag mellan varje kolumn. Medan ordföljds servern och särskrivnings servern kan hela PoS(Part of Speech) informationen. Tekniken bakom hur kongruens fel och felaktig ordföljd är uppbyggd är denna: Med utgångspunkt från SUC (Stockholm-Uppsala-corpus) är korrekt så tilldelade man varje ord att det var okej. Sedan beroende på vilket av felen så gjorde man lite olika. För kongruens felen slumpades ett ord i varje mening fram och sedan tog man ett ord med samma lemma men med en annorlunda taggning. Sedan markerades det som felaktigt och fakegranska tränades på att känna igen detta fel. För att fakegranska skulle upptäcka felaktig ordföljd gjordes på liknade sätt. För varje mening i SUC så slumpades ett ord och bytte plats med ett annat ord som låg antigen ett eller två steg ifrån det slumpade ordet. Sedan märktes båda orden som felaktiga. Sedan tränades fakegranska på att känna igen detta fel. Träningen sker med någon form av maskininlärnings algoritm. 2 Genomförande: För det grafiska gränssnittet valdes java av dessa anledningar. Java är plattformsoberoende vilket var en av önskemålet för programmet. Java har enkla möjligheter att skapa ett grafiskt gränssnitt. Det första som behövdes göra var att ta reda på hur java kan behandla text och vilka möjligheter för färgning av text som fanns. I 1.4.2 fanns möjligheterna för att skapa en JTextPane som klarade av att ge olika format till texter, exempelvis färger och undertrycket. JTextPane ligger i javas swing paket och använder sig av ett dokument som innehåller text samt vilket stil texten har. Om ni är mer intresserad kan ni gå och läsa på sun tutorial om text i java[1]. Det som är viktigt att veta är att det går att ta bort en sträng samt att placera in en sträng i texten på givna positioner. Då fakegranska serverna måste ha ordklasserna så måste varje ord taggas i dess sammanhang. Detta görs genom att skicka alla meningar till en server som tolkar dessa och ger tillbaka ordet med dess PoS (Part of Speech). En utmaning här var att punkt (.), komma(,) och citattecken( ) inte får sitta ihop med ordet. Till detta använde jag mig av StringTokenizer och lite extra hackande. Programmet kan lätt luras att göra fel om flera citattecken används på eller liknade. 3
Som nämnt tidigare tog de olika serverna olika format på taggningen. För att tolka hur PoS taggen skall splittras upp i de olika kolumnerna som kongruens servern vill ha fick jag en fil av Jonas. Denna fil innehöll PoS följt av 4 stycken kolumner skilda med tabbar som motsvarar PoS ordklass, genus, numerus och bestämdhet. När programmet startas läser jag in hela filen och lägger PoS() delen av taggen som en nyckel i en hashtabell. Sedan lägger jag in en sträng med den info som kongruens servern vill ha som värde i hashtabellen. Sedan när har fått sina ord taggade i PoS så är det bara att fråga hashtabellen efter strängen för kongruens servern. Självklart fungerar detta för andra serverar som behöver splittrade taggar. För projektet skapades en menings klass(sentence.java) för att ha koll på de meningar som fanns i dokumentet. Den blev tyvärr inte utnyttjad till sin fulla kraft. Tanken var från början att den skulle innehålla information ifall en mening var ändrad efter att den blivit granskad av fakegranska. Då flera saker kan påverka att alla meningar måste kollas igen gör programmet en fullständig kontroll hela tiden. Dock så utnyttjas detta lite då meningar som inte är ändras inte läggs till i vektorn. av alla meningar, utan bara meningar som påverkas sedan förra kollen byts ut eller läggs till. Menings klassen innehåller också information om vart i dokumentet första ordet börjar och hur lång meningen är. Menings klassen innehåller också taggningen av varje ord ( punkt komma och citattecken räknas som ord). Både den splittrade och original PoS. Samt efter att meningen blivit kollad av fakegranska servern temporärt vilka av orden i meningen som är okej och vilka som är felaktiga. Programmet startas av en controller klass som skall sköta flödet av information mellan fakegranska servrarna och det grafiska gränssnittet. Den innehåller bland annat vektorn med alla meningar. Som från början är tom tills användaren väljer att kontrollera sin text. Den innehåller också en streamcontroller som tar hand om allt som skall skickas och tas emot av fakegranska. Denna är skapad på efterhand då kontroller klassen blev för stor. Det grafiska gränssnittet som använder kommer i kontakt med kontrollerars av klassen FakeGranskaWindow.java. Den är uppbyggd med en frame(jframe) ett antal paneler(jpanel) och en textarea(jtextpane). Den har även en referens till kontoller klassen. När användaren gör något med texten som finns i rutan, lägger till eller tar bort sköts det av java egna lyssnare för dokument och textpanes. Programmet lyssnar dock efter vart i texten det görs och säger till controller att här har det ändras. För att programmet skall veta vilka meningar är ändrade. Sen tar den alla meningar efter den första ändrade meningen och tolkar dom som ändrade också. Men som sagts tidigare så är detta egentligen meningslöst då allt ändå skickas till servarna. Det borde inte vara för svårt att fixa så att meningar som är ok inte skickas till servern för taggning exempelvis. När användaren väljer att granska texten gör detta med check knappen. Då skapas en ny tråd i för att ta hand om granskningen. Detta för att taggservern är otroligt seg och det annars ser ut att programmet har hängt sig. Medan allt kollas går det inte att ändra texten eller trycka på check knappen igen. Innan själva tråden skapas så skickas en sträng innehållandes ändrade meningar till controller klassen. Som där tar bort alla obsoleta meningar i vektorn av alla meningar och lägger dit dom nya istället. 4
Sedan i den nya tråden körs ett varv i kontroller klassens run metod (kontroller implementerar runnable). Där så först taggar den alla meningar, även de som har korrekt taggar. Sedan ifall användaren valt att kolla efter första feltypen (ordföljd förvald) går varje mening igenom ord för ord och skickas, ett ord per rad med den grundläggande PoS. till motsvarade fakegranska server. Därefter läser programmet svaret som kommer i from av ord ok/annat, där annat är fel. Då om det inte är ok så markeras det i meningsklassen att ord x inte är ok. När detta är gjort så anrops en metod som färgar de felaktiga orden i meningarna till vald färg. Den går igenom alla meningar i ett svep. Sedan görs nästan samma sak för igen, om användarn valt att kolla efter feltyp 2 (förvald kongruens). Skillnaden är att nu skickas den splittrade taggen istället. Varje feltyp har var sin funktion som gör dessa saker. Borde kunna använda samma metod med if-satser istället. 3 Användning. I menyn går det för användaren att öppna och spara filer under file menyn. Både öppna och stänga avvänder sig av JFile Chooser som är ett grafiskt gränssnitt över filsystemet. Det går att specificera en fil genom att antigen klicka på den eller skriva in namnet själv och sedan välja öppna eller spara beroende på vilket man gör. Det går att öppna alla typer av filer men bara om de sparade i ren textformat kommer det visas något vettigt. Under edit menyn går det att välja att klippa ut/kopiera markerad text samt att klistra in text. Den sista menyn options tillhandahåller möjligheter att ändra på förvalda värden. För går det att ändra antalet tecken som dokumentet får använda sig av (förvald 1500). Det går att ändra till mindre antal tecken än vad dokumentet för tillfället innehåller. Om ni gör detta kommer de tecken som är efter det valda antalet tecken försvinna. Det går också ändra vilken taggserver som skall användas istället för den förvalda på skrutten.nada.kth.se port 6151. Det går också att välja en ny fil som talar om hur taggar skall splittras. Detta kan kanske användas för andra språk. Sedan finns det två undermenyer som representerar de två felen som kan kollas. Dom får av enkelhet heta error type 1 och error type 2. Det första felet står till vänster om check och det andra felet till höger. Varje undermeny har lika utseende med look for this error som om ikryssad gör att programmet försöker upptäcka den typen av fel. Change url and port som först frågar efter ny adress till servern sen efter portrn. Change error color som visar en JColorChooser, vilket är ett fönster med en färg palett. Sedan tills sist finns det möjlighet att namnge felet vilket då gör att texten till vänster(fel 1) eller höger(fel 2) om check knappen byter namn. På figuren 1 kan ni se att det strå kongruens till höger om check knappen i rött. När användaren vill granska sin text efter att laddat in ny text från fil eller bara skrivit in ny text själv görs detta med check knappen. Därefter tar det en stund att få ett svar, mellan 10 till 30 sekunder pga av den förinställda tagservern. Sedan kommer texten att markeras med understreckning och med felets färg, se figur 1. 5
Figur 1 4 Kända buggar: Under mac verkar den inte klara av att skicka åäö eller linkade för den ger andra svar. På den texten som programmet statar med hittar den dock några felaktiga ordföljder som den borde alltid hitta? Samt under mac så visas det inte att Check this error är en check box ruta. Utan om det inte är markerad så ser den ut som vilket meny alternativ som helts. Om felaktiga adresser till serverna och tag filen specificeras så kommer programmet inte att fungera. 5 Källförteckning [1] http://java.sun.com/docs/books/tutorial/uiswing/components/text.html 6