Etter å ha blitt banket ned i støvlene i Wordfeud av “venner” som synes det er okay å legge ord som gjura (perfektum-form av ordet gjure, norr gyrða, som betyr gjorde) og CIF (som er en engelsk forkortelse: Cost, Insurance, Freight, og betyr at en vare leveres uten at du må betale for omkostninger, forsikringer og frakt), og ikke minst klapr (jupp, en avart av klapre), så jeg meg nødt til å utforske den norske ordboka Wordfeud bruker. Wordfeud har samme ordbok i bånn som Bokmålsordboka på nett, og denne grunnordboka kan du laste ned etter å ha registret deg hos Norsk Ordbank.
Med i zip-filen er et par filer som beskriver den elektroniske ordbokens format, og en paradigme-fil som beskriver ordformer og deres bøyninger, men vi skal ikke gå inn i å sette ordene sammen til en komplett liste ved regelbruk. Istedenfor går vi rett i strupen på filen fullform_bm.txt.
Jeg startet min utforskning med å gjøre enkle søk i TextEdit, et Mac-program som tok frem den svære tekstfilen forbausende raskt, og som også søkte i den raskt. Jeg tror de fleste av oss ville ha noe å lære av å se på hvordan TextEdit er implementert, hvis vi fikk sjansen. For da jeg fant ut at jeg ville bruke regulære uttrykk (også kjent som regular expressions, også kjent som regexp eller regex) i mine søk, og dro opp TextMate, ble maskinen til sirup, og etter noen få søk kræsjet den. Det samme skjedde med AquaEmacs.
Det enkle er ofte det beste. Jeg hadde oversett den åpenbare løsningen: grep. Med grep -e (også kjent som egrep) går det lynraskt å søke med regulære uttrykk i den 82 MB store filen.Gå til kommandolinjen, eller terminalen, eller hva du kaller det. La oss gjøre noen enkle søk.
Finnes Ordet?
Lurer du på et spesifikt ord er i ordboken, før du legger det? Finnes ordet “gnu”?
egrep '\bgnu\b' fullform_bm.txt
\b betyr “en tom string ved kanten av et ord”, og du får listet ut alle treffene der ordet “gnu” står alene:
23846 gnu gnu verb inf <trans1> <trans11/p?> <refl9/i> normert 040 1 23847 gnu gnu subst mask appell ent ub normert 700 1 23846 gnu gnur verb pres <trans1> <trans11/p?> <refl9/i> normert 040 2 23847 gnu gnuen subst mask appell ent be normert 700 2 23846 gnu gnus verb inf pres pass <trans1> <trans11/p?> <refl9/i> normert 040 3 23847 gnu gnuer subst mask appell fl ub normert 700 3 23846 gnu gnudde verb pret <trans1> <trans11/p?> <refl9/i> normert 040 4 23847 gnu gnuene subst mask appell fl be normert 700 4 23846 gnu gnudd verb perf-part <trans1> <trans11/p?> <refl9/i> normert 040 5 23846 gnu gnudd adj <perf-part> n?yt ub ent <trans1> <trans11/p?> <refl9/i> normert 040 6 23846 gnu gnudd adj <perf-part> m/f ub ent <trans1> <trans11/p?> <refl9/i> normert 040 7 23846 gnu gnudde adj <perf-part> be ent <trans1> <trans11/p?> <refl9/i> normert 040 8 23846 gnu gnudde adj <perf-part> fl <trans1> <trans11/p?> <refl9/i> normert 040 9 23846 gnu gnuende adj <pres-part> <trans1> <trans11/p?> <refl9/i> normert 040 10 23846 gnu gnu verb imp <trans1> <trans11/p?> <refl9/i> normert 040 11
Andre kolonne er grunnform av ordet (det er den som har gitt oss treffene på det regulære uttrykket her,) tredje kolonne er fullformen av ordet. Gnu finnes selvfølgelig, med en del uventede avarter. Finnes ordet uvelkomneste, da?
egrep '\buvelkomneste\b' fullform_bm.txt
Jada.75803 uvelkommen uvelkomneste adj sup be normert 562 7
Hvilke ord inneholder bokstaven C?
egrep '\b[a-z]*c[a-z]*\b' fullform_bm.txt
Det vi sier her er: gi meg et ord som har 0 eller flere bokstaver mellom a-z (inklusive) og som så har en c, og som så har 0 eller flere bokstaver mellom a-z (inklusive). Listen er lenger enn du kanskje tror. Opsjonen -c gir oss antall linjer:
egrep -c '\b[a-z]*c[a-z]*\b' fullform_bm.txt
skriver ut 10889. Enjoy!
Finnes det ord som inneholder både C og W?
Oh yes, baby.
egrep -c '\b[a-z]*c[a-z]*w[a-z]*\b|\b[a-z]*w[a-z]*c[a-z]*\b' fullform_bm.txt
gir ikke mindre enn 206. Tegnet | betyr “eller”, så her har jeg kombinert de to uttrykkene:
1) finnes det ord med c og så w, med 0 eller flere bokstaver i mellom dem (\b[a-z]*c[a-z]*w[a-z]*\b) ?
med
2) finnes det ord med w og så c, med 0 eller flere bokstaver i mellom dem (\b[a-z]*w[a-z]*c[a-z]*\b) ?
Fra nr. 1 får vi ord som breitschwans, catwalk, cowboy, crawl, patchwork og rickshaw.
Fra nr. 2 får vi for eksempel worldcup, whitecoat og weltschmerz (men Z har vi vel ikke i Wordfeud, så det blir vanskelig å legge)
Forkortelser
Wordfeud skiller seg fra Scrabble ved at det er lov med forkortelser. Men hvilke forkortelser kan du bruke? CIF er lov, og vi finner det igjen i ordboken. Men jeg har f.eks. prøvd å legge SV, uten å få lov til det. Det fortvilede er at forkortelsen SV finnes i filen vår, fullform_bm.txt. Så hva som er lov og ikke lov i Wordfeud, er jeg ikke sikker på. Men som utgangspunkt kan vi i hvert fall ta alle de ordene som, bekvemt nok, er merket med “fork”. Vi kan altså bare gjøre det enkle søket
egrep '\bfork\b' fullform_bm.txt
… og få listet ut alle forkortelser som er lovlige. 1270 stykker, er det. Her er et lite knippe du kan prøve neste gang du er i en knipe:
AD
ADB
AL
AM
AS
ASA
CA (bekreftet)
CD (bekreftet)
CP (bekreftet)
DS
EDB
EEC
EF
EKG
ES
EU
FM
FN
GMT
GT
HMS
KT
krf
MS
MT
MS (bekreftet)
MM (bekreftet)
OL (bekreftet)
Ng (bekreftet)
PVC
PVRK
SI
SM
SS
UHF
UK
UNESCO
USA
YAP
Om du vil titte selv, og bare ønsker deg kolonne 2, den med ordene i, kan du pipe treffene til awk:
egrep -i '\bfork\b' fullform_bm.txt | awk '{ print $2 }'
Leke Mer?
Kjør
info grep
i kommandolinjen, og se under headingen “Regular Expressions” (du finner den samme informasjonen med Google-søket man:grep http://www.google.no/?q=man:grep ).
FAQ
Q: Uttrykkene over kan skrives mer elegant?
A: Ja, de kan nok det. Jeg har skrevet de regulære uttrykkene for å være enklest mulig å forstå.
Q: Hva med æ, ø, å?
A: Jeg har droppet det for enkelhets skyld. Dermed mister du endel ord ved å bruke uttrykkene slik de er beskrevet over.