Skapa ordlistor och bigram

Introduktion

Här beskrivs hur man kan skapa ordlistor och bigramsfiler från ordklasstaggad utdata från Machinese syntax med hjälp av några enkla Unix-kommandon.

Definition av bigram

Ett bigram utgörs av två ord ur en löpande text, som står direkt efter varandra. Exempelvis finns i texten:

   En fågel skriade till uppe på taket, och han vaknade.

 nedanstående bigram:

    En fågel
    fågel skriade
    skriade till
    till uppe
    uppe på
    på taket
    taket och
    och han
    han vaknade

Observera att skiljetecken inte räknas (inte är signifikanta), så att "taket och" blir ett bigram, även fast det i texten är ett kommatecken emellan orden.

Hur man tar fram alla bigram

För att göra en fil med bigram, av typen ovan, gör man först en fil med alla löpord:

   En
    fågel
    skriade
    til l
    uppe
    på
    taket
    och
    han
    ...

 Därefter kopierar man denna fil, men tar bort första raden ur den:

    fågel
    skriade
    till
    uppe
    på
    taket
    och
    han
    vaknade
    ...

Detta gör man enklast med kommandot tail, som allmänt ger svansen av en fil, dvs alla rader utom ett antal av de första raderna. T.ex. kan man skriva:

   tail  -10  <  fil  ; ger de 10 sista raderna
  
tail  +10  <  fil  ; ger alla rader fr.o.m. rad 10

Man kan då skriva:

   tail  +2 <  löpordsfil

för att ta bort bara första raden ur en löpordsfil.

Kalla den senare filen för löpordFrom2, så kan man skapa bigram genom att helt enkelt sätta ihop dessa filer med paste:

   paste löpordsfil löpordFrom2 > bigramsfil

En bild beskriver bäst vad som sker:

löpordsfil   löpordFrom2      bigramsfil

    En                            fågel                                 En fågel
    fågel                         skriade                             fågel skriade
    skriade                     till                                     skriade till
    till                             uppe                                 till uppe
    uppe                        på                                     uppe på
    på                            taket                                 på taket
    taket                        och                                   taket och
    och                          han                                   och han
    han                          vaknade                            han vaknade
    ...                            ...                                      ...

Skapa lexikon

De data vi utgår från är i dessa fall alltid ordnade i kolumner. t.ex. den fil med fem kolumner, som svenska FDG genererar. Idén är då följande:

Exempel

Skapa ett lexikon, med ordstam, som ingång/nyckel och ordklass som värde.

Givet nedanstående indata, infil:

   1          En           en         det:>2         %>N DET SG NOM
   2          fågel        fågel      subj:>3       %NH N SG NOM
   3          skriade    skria      main:>0      %MV V PAST
   4          till            till          advl:>3      %AH PREP
   5          uppe       uppe      ad:>6         %>A ADV
   6          på           på          advl:>3      %AH PREP
   7          taket       tak         pcomp:>6  %NH N SG NOM
   8          ,              ,
   9          och         och         cc:>3        %CC CC
  10         han         han         subj:>11    %NH PRON SG NOM
  11         vaknade vakna      cc:>3        %MV V PAST
  12         .          .

   ....

   ....

   29         när        när         advl:>32       %AH ADV
   30         jag        jag          subj:>31      %NH PRON SG NOM
   31         ska        skall       v-ch:>32      %AUX V PRES
   32         sätta      sätta       tmp:>23       %MV V INF
   33         i            i             advl:>32       %AH PREP
   34         nya        ny          attr:>35         %>N A NOM
   35         resårer   resår      pcomp:>33  %NH N PL NOM
   36         .             .
 

så ska vi alltså fixa till ett lexikon, typ:

   ...
   en                     DET
   fågel                 N
   han                   PRON
   ...
   jag                   PRON
   och                  CC
   ny                    A
   när                   ADV
   ...
   sätta                 V
   till                     PREP
   uppe                 ADV
   ...

Man ser då att vi behöver två saker: ordstammen (fält 3) och ordklass (del av fält 5). Gör därför:

  1. klipp ut kolumn 3 på egen fil:
    cut -f3 < infil > stamfil
     

  2. klipp ut kolumn 5 på egen fil:
    cut -f5 < infil > syntFunc-fil

För att komma åt bara ordklassen i fält 5, betraktar man syntFunc-fil, som en kolumnfil, men med ett blanktecken, som åtskiljare. Med cut -d separator kan man plocka ut fält i en fil, vars fält separereras av godtycklig separator:

    cut -d ' ' -f2 < syntFunc-fil > ordklass-fil

Nu har vi de två saker vi behöver: en kolumn med stammar (i stamfil), och en kolumn med enbart ordklasser (i ordklass-fil). Raderna i dessa är "parade", dvs första rad i ena filen hör ihop med första rad i andra, osv.

Vad som återstår nu är detta:

Detta görs med följande kommandon:

paste stamfil ordklass-fil > ord-stamOchKlass-fil

sort < ord-stamOchKlass-fil > sorterad-ordfil

uniq < sorterad-ordfil > grovt-lexikon

I grovt-lexikon kan finnas rader och tecken man inte vill ha. Inspektera alltid er resultatfil i emacs för att se vad, som ytterligare behöver göras. Ska ni ta bort alla förekomster av ett tecken, så kan ni använda tr.