Programmerer.com

Keeping fun in the house

Top Advantages of our payday loans Payday loans UK But now, you have an extra

Wordfeud – En uvelkomneste fråtsing i absurde ord, featuring grep

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.

Category: løsningsdesign
  • Elisabethmikalsen

    SS godtas ikke :

  • http://twitter.com/stenmorten Sten Misund-Asphaug

    Takk, jeg har oppdatert listen :)

  • Joaquen

    Kan bekrefte at NG fungerer , bruker det ofte .. Men har sett i VG at noen har klart og skrive MM

  • Joaquen

    Hvorfor står ikke CA der ?? Den funker jo

  • Joaquen

    Kan også bekrefte MS … Bruker den ofte, pluss at kona mi alltid skriver MM og jeg bruker OL til tider («,)

  • http://twitter.com/stenmorten Sten Misund-Asphaug

    Supert, har oppdatert lista.

  • Bård Dybwad Kristensen

    Ord i lista som er merket med 'fork' i fullform_bm.txt er ikke tillatt. Men de «forkortelsene» som likevel er tillatt står oppført i lista som noe annet enn forkortelser (i tillegg til også å stå oppført som forkortelser). Feks finnes følgende innslag med sv:

    Sv sv fork subst prop normert 000 0sv. sv fork adj unormert 000 0sv. sv. fork adj normert 000 0sv. sv. fork subst normert 000 0sv. sv fork subst unormert 000 0

    Alle innslag er merket med 'fork', og dermed er ikke sv tillatt. Men for feks cif finner man følgende innslag:

    cif cif adv normert 695 0cif. cif fork subst appell unormert 000 0cif. cif. fork subst appell normert 000 0

    Altså både som 'adv' og 'fork', og det er innslaget med 'adv' som gjør at cif er tillatt å bruke i Wordfeud.

    Dette gjelder for alle «forkortelser» som Wordfeud godtar.

  • Splitlocked

    Veldig bra! Jeg har prøvde grep i terminalen på Android, men jeg hadde bare en 500kb ordbok for bruteforcing. Takk for at du lenket til hvor man kan få tak i hele ordboken :)

  • Hvalen

    Bra post! Men siden noen av elementene består av flere ord (med tab som separator) så burde awk-kommandoen endres litt:
    $ egrep -i ‘bforkb’ fullform_bm.txt | awk ‘ BEGIN { FS = «t» } ; { print $2 }

  • http://twitter.com/stenmorten Sten Misund-Asphaug

    Nydelig :)