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:
-
"klipp ut" de
"intressanta" kolumnerna
-
skifta kolumnernas
ordning, så att "nyckeln" (ingångskolumnen/-erna) kommer
först
-
sortera alla rader
i bokstavsordning
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:
-
klipp ut kolumn
3 på egen fil:
cut -f3 < infil >
stamfil
-
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:
-
sätt ihop
singel-kolumn-filerna till en tvåkolumnsfil
-
sortera
raderna/stammarna i bokstavsordning
-
ta bort
duplicerade rader (samma ord finns på flera ställen i den
löpande texten)
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.