GÖTEBORGS UNIVERSITET Utbildningsprogrammet i datalingvistik Robert Andersson 14 november 2006 LABORATION 4: Textmanipulering Introduktion till lingvistik och datalingvistik XD1110 Inledning Samlingar av text, korpora, används inom många lingvistiska områden och som datalingvist förväntas du hantera ett antal verktyg för att göra automatisk analys av textmassor. Syftet med denna labb är att introducera dig till ett antal unix-verktyg för textmanipulering. Dessa verktyg kan användas för enklare analyser av texter, för mer avancerade textmanipulationer bör du kanske med åren lära dig använda programspråk som perl, awk eller sed. Dessa är imperativa så du kan med fördel vänta tills du har läst kursen imperativ programmering. Lathunden från datorintroduktionen som du själv satte ihop kommer väl till hands för denna laboration. Innan du börjar med uppgifterna i laborationen bör du öppna en terminal och logga in på hal.cling.gu.se via ssh för att komma åt vissa filer hemma hos användaren ra. Givetvis fungerar de flesta av kommandona i unix-liknande terminaler på andra maskiner och operativsystem t ex cygwin under windows eller terminalverktyget i MacOS X, men då kommer du inte åt filerna du behöver. Uppgift 1 De vanliga kommandona för att presentera text är echo, cat, more och less. Men kanske ännu viktigare är det att känna till man-kommandot som visar manualsidan för ett kommando. Till exempel visar man echo manualsidan för echo-kommandot. Fråga: Med hjälp av manualsidan för cat, använd cat för visa innehållet i filen ~ra/publik/ lab4/aa03.cge2 1 där varje rad föregås av ett dess radnummer. Utifrån din körning vilket är det sista egennamnet och på vilken/vilka rader står det på? För att kunna studera filen sida för sida kan du använda dig av så kallade pager-program som more eller less. Prova more-kommandot på filen ovan more ~ra/publik/lab4/aa03.cge2 Tryck på mellanslag några gånger och studera filen, du avslutar more genom att trycka på q- tangenten. Du kan använda wild cards för att matcha en eller flera tecken i filnamn. Vi har följande wild cards * matchar en sekvens av noll eller flera tecken? matchar exakt ett tecken [CSET] matchar något tecken i CSET 1 Samtliga filer är kortare utdrag hämtade ur Stockholm-Umeå Corpus, suc, version 2.0. Dock något manipulerade av mig för att göra laborationen mer givande... 1
Dessa används då du vill köra ett program på flera filer vars namn matchar ditt uttryck. Exempelvis så kan du med cat ~ra/publik/lab4/*.cge2 sammanfoga alla filer i biblioteket ~ra/publik/lab4/ som slutar med filändelsen.cge2. Hade du inte vetat ifall cge2 var i versaler eller gemener hade du kunnat gardera dig genom att skriva strängen.[cc][gg][ee]2 istället. När du läste manualsidan för cat såg du att detta kommando sammanfogar dess infiler till en utfil. Om inga infiler anges som argument tar cat indata från standard input, oftast tangentbordet om ingen omdirigering skett. Resultatet skickas till standard output, oftast skärmen om ingen omdirigering skett. De flesta av de kommandon du kommer använda dig av för textmanipulering tar indata via standard input och skickar ut resultat via standard output, så kallade filter. 2 Omdirigering av standard input och output sker med hjälp av < standard input kommer från en fil, > standard output går till en fil, finns den redan skrivs den över, >> standard output läggs till till en fil, finns den inte skapas den och pipe, resultatet från vänsterledet skickas som indata till högerledet. Här är några exempel som du i tur och ordning kan utföra för att prova på omdirigeringar och pipes: echo text som omdirigeras till en fil > filnamn.txt echo mer text till filen >> filnamn.txt cat < filnamn.txt > filnamn2.txt cat filnamn*.txt tr " " "\n" more I det sista exemplet ovan ser du hur du sammanfogar filnamn.txt och filnamn2.txt för att sedan skicka resultatet av den sammanfogningen vidare som indata till tr-kommandot som översätter alla mellanslag till nyrader \n som i sin tur skickar sitt resultat vidare till kommandot more. Till många av unix-kommandona kan du ofta ange en eller flera flaggor som används för att justera resultaten från ett kommando utan att förlora allt för mycket funktionalitet. Flaggorna följer kommandot som argument och kan i sin tur eventuellt ta egna argument. Ett exempel är flaggan -c för tr-kommandot som istället översätter komplementet. Från sista exemplet ovan hade du fått kommandot cat filnamn*.txt tr -c " " "\n" more där tr-delen istället fått betydelsen översätt alla tecken som som inte är mellanslag till nyrader. Ett annat är flaggan -k för sort-kommandot som istället sorterar på en angiven kolumn separerad av något blanktecken där flaggan kräver ytterligare argument. Du kan tex hitta din största fil genom kommandot ls -alr ~ sort -n -k 5,5 där ls -alr ~-delen listar alla ditt hemkontos, ~, filer rekursivt. Resultatet från ls skickas sedan vidare in i sort-kommandot där flaggan -n säger åt sort att sortera numeriskt och flaggan -k med det egna argumentet 5,5 säger åt sort att det är femte kolumnen som den ska sortera på. 2 Kommandon ger även utdata på standard error samt ett värde för hur exekveringen gick, 0 för ok och ett annat värde om ett fel inträffade. Du kommer inte gå in på dessa under detta labbtillfälle. 2
Fråga: Du måste använda dig av en flagga till cat för att få cat att visa radnummer. Använd igen cat för att visa det sammanfogade innehållet i filerna ~ra/publik/lab4/aa03.cge2 och ~ra/publik/lab4/kn11.cge2 så att varje rad föregås av ett radnummer, du bör få över 6000 rader. Vilket egennamn hittar du på rad 6167? Uppgift 2 Efter uppgift etts översikt över enklare unix-kommandon och hur de kan sammanlänkas ska du nu börja jobba med litet mer intressantare filter-kommandon. Med kommandot grep kan vi hämta bara de rader som matchar en sträng ur en fil. Till exempel kan du prova att grepa efter president i filen ~ra/publik/lab4/aa03.cge2. grep president ~ra/publik/lab4/aa03.cge2 Du bör få resultatet <title level=a>två samspelta presidenter</title> <w n=?>presidenter<ana><ps>nn<m>utr PLU IND NOM<b>president</w> <w n=?>presidenterna<ana><ps>nn<m>utr PLU DEF NOM<b>president</w> <w n=?>presidenten<ana><ps>nn<m>utr SIN DEF NOM<b>president</w> <w n=?>presidenterna<ana><ps>nn<m>utr PLU DEF NOM<b>president</w> <w n=?>presidentförslag<ana><ps>nn<m>neu SIN IND NOM<b>presidentförslag</w> <w n=?>presidentens<ana><ps>nn<m>utr SIN DEF GEN<b>president</w> Studera raderna i resultatet, du ser att den inte bara hämtar rader som bara innehåller strängen president utan det räcker att strängen finns med som delsträng. Dessutom anar du nog att det verkar finnas en struktur... Du ser att på första raden så omges texten Två samspelta presidenter av två SGML-taggar, <title level=a> och </title>. Dessa taggar markerar att texten i det här fallet är en titel, en titel varifrån texten är hämtat. Den raden är för oss idag ganska ointressant och vi vill igentligen inte ha med den så vi modifierar vår sökning. grep president ~ra/publik/lab4/aa03.cge2 grep "<w n=?>" De nio raderna vi nu har börjar samtliga med <w n=?> och slutar med </w> vilket säger att mellan dessa taggar finns ett ord och dess analys. Tittar vi närmare ser vi att varje rad verkar ha formatet <w n=?>ord <ana><ps>ordklass <m>morfosyntaktisk INFO <b>grundform </w> Där ORD är ett ord; ORDKLASS är en kod för vilken ordklass ordet tillhör; MORFOSYNTAKTISK INFO är ytterligare koder för information som t ex innehåller information om ordets genus, numerus, bestämdhet och kasus mm mm; slutligen GRUNDFORM som är någon grundform som ordet har. Studera filen ~ra/publik/lab4/tagset.txt för att ta reda på vad de olika koderna för ORDKLASS och MORFOSYNTAKTISK INFO betyder. Ur manualen för suc-2.0 får du även följande information <w> is the SGML-tag used for words in suc, <ana> stands for analysis, <ps> for partof-speech, <m> for morphosyntactic information and <b> for base form. Redovisa: Utifrån vad du vet ovan för hur suc är strukturerad Visa hur du kan konstruera en one-liner 3 som ur alla filer med filextensionen.cge2 under biblioteket ~ra/publik/lab4/, listar alla substantiv i neutrum, plural, bestämd form, nominativ. 3 En one-liner är en eller flera, kaskadkopplade, kommandon som ryms på en rad. Oftast sker detta m h a pipes, t ex com1 com2 com3 com4 > resfil.txt 3
Uppgift 3 Om du studerar resultatet från den one-liner du konstruerade i förra uppgiften så hittar du identiska rader. Med kommandot uniq kan du snabbt ta bort dubbletter av närliggande rader. Återanvänd din one-liner i föregående uppgift men lägg till så att du med uniq sorterar bort identiska rader... Tyvärr ligger inte alla identiska närliggande utan det krävs sortering, med sort, tillsammans med uniq. Redovisa: Med hjälp av uppgift 2, visa hur du kan lägga till fler led i denna one-liner så du konstruerar en ny som även sorterar bort samtliga dubbletter. Uppgift 4 Ibland vill du som datalingvist kunna undersöka hur många förekomster det finns av vissa graford i en korpus, en så kallad frekvensordlista, ett exempel 12 så[ab] 12 upp[pl] 13 om[sn] 14 de[pn] 14 vi[pn] 16 jan[pm] 16 mellan[pp] 16 när[ha] 16 under[pp] 17 gorbatjov[pm] Lägg märke till att alla tecken i orden har blivit översatta till gemener, varför tror du detta har gjorts? Från varje fil med filändelsen.cge2 i biblioteket ~ra/publik/lab4/ ska du skapa en sådan här frekvensordlista. Du kommer vara nödvändig att använda dig av kommandon som cat, tr, sort, uniq och givetvis man... vissa kommandon till och med mer än en gång. Manualsidorna är dina vänner studera manualsidan för uniq-kommandot för att hitta en flagga så att uniq även skriver ut antalet förekomster för varje rad. Till din hjälp har du även programmet suc2toktag som finns i biblioteket ~ra/publik/lab4/ som indata tar en suc-korpusfil och filtrerar den till utdata där varje mening i korpusfilen hamnar på en rad. Varje ord i en mening följs av en suc-kod för vilken ordklass den tillhör. En början är cat ~ra/publik/lab4/*.cge2 ~ra/publik/lab4/suc2toktag Redovisa: Studera resultatet från kommando-sekvensen ovan och visa hur du kan fortsätta konstruktionen med att översätta alla versala tecken till gemena, få exakt ett ord med dess suc-kod på var sin rad, ta bort onödiga blanktecken, 4 sortera bort dubbletter och skriva antalet förekomster för varje ord. 4 Blanktecken är t ex mellanslag, nyrader och tabbar. 4
Fråga: svara på Med hjälp av din genererade frekvenslista och eventuellt fler sekvenser i din one-liner, vilket ord som har flest förekomster, vilken ordklass har det ord som har flest förekomster och inte är en interpunktion, hur många olika typer av ord har du i korpusen och hur många hapaxord 5 finns i korpusen? Inlämning Det du minimalt ska lämna in är svar på samtliga frågor i uppgifterna. Dessutom ska du redovisa de one-liners du konstruerat i uppgift 2-4 med förklaringar till varje del i sekvensen, t ex kan kommando-sekvensen cat * wc förklaras cat * sammanfogar samtliga filer i det nuvarande arbetbiblioteket och skickar resultatet vidare till kommandot wc som räknar antalet rader, ord och tecken. Ytterligare ett exempel kommer här på hur en redovisning av en kommando-sekvens kan se ut cat *.txt tr " " "\n" sort cat tr denna del sammanfogar samtliga txt-filer i det nuvarande arbetsbiblioteket denna del översätter varje mellanslag till nyrad så att vi får varje ord på en egen rad sort denna del sorterar de inkommande orden. 5 Hapaxord är ord i korpusen som har förekomsten 1. 5