Algoritme-kloge: kender I et program, der, givet en dansk ordbog, kan konstruere det størst mullige ordkvadrat?

Steven 🌞 Snedkers billede
Af Steven 🌞 Snedker den 25. november 2012 - 21:16 [31]

Algoritme-kloge: kender I et program, der, givet en dansk ordbog, kan konstruere det størst mullige ordkvadrat? Et ordkvadrat ser sådan ud

HUN

ARA

LET

9 bogstaver skal give 3 ord vandret og 3 ord lodret. 16 ord skal give 4 ord vandret og 4 ord lodret.

3'ere kan laves i hånden. 4'ere er sværere og jeg tror ikke at man kan lave en 5'er i hånden inden for rimelig tid.

Kan man bevise at man ikke kan nå højere end en 5'er eller 6'er?

Kommentarer


          Claus Dahl
        s billede

"Bevise" vil jo nok blive noget med at godtgøre ved en søgning, for selvfølgelig findes der ordbøger hvor man kan konstruere arbitrært store kvadrater. Programmet der søger er til at forestille sig, men det er nemt at lave så forkert at det aldrig stopper....


          Toke Eskildsen
        s billede

Det er en sjov opgave, så jeg puslede lidt med den. Hovedet-under-armen brute force virker ikke spor godt, for med f.eks. 7 bogstaver er der "ord på 7 bogstaver"^7 kombinationer at kontrollere. Med min testordbog er det 5000^7 ~= 10^25, hvilket betyder at Solen brænder ud inden det bliver færdigt.

Der er nu er par nemme optimeringer: Hvis man starter oppefra og ned med at tilføje ord, er der ingen grund til tilføje flere ord, hvis man kan afgøre at der ikke findes ord der starter med de bogstaver fås ved at læse lodret ned. Dernæst kan man optimere ordbogsopslagene ved at lave en ordbog for hvert præfix fra længde 1 og op til ordenes længde. Med de to optimeringer røg tiden for ordlængde 6 ned fra anslået 20.000 år til 3 minutter, så jeg gad ikke rode med at tråde skidtet eller tænke videre (desuden er det sengetid).

Den eneste ordbog jeg havde ved hånden er den danske ispell (gys). Den siger at der er to løsninger af størrelse 6:

pragma

rumles

ambens

glente

mentor

assers

og

fisher

impala

spøgen

hagens

elende

ransel

hvoraf nummer to i hvert fald er noget hø og sikkert også nummer et.

Længder over 6 tager noget længere tid, så jeg sætter den til at køre resten af natten og melder tilbage i morgen hvor lang tid det tager. Hvis den ikke er færdig til den tid er de nævnte optimeringer ikke tilstrækkelige. Jeg kan hurtigt gøre koden mere generel og smide den et sted hvis du selv vil lege, men det bliver nok først i morgen aften. Det er skrevet i Java.


          Toke Eskildsen
        s billede

Okay, det toppede ved et kvarter for ord på 8 bogstaver, før processeringstiderne faldt igen, så det ser brugbart ud. Den rå udgave, der skal køres som JUnit-test, ligger på http://ekot.dk/diverse/SquareTest.java

Jeg laver det om til noget lidt mere direkte brugbart senere.

Steven Snedkers billede

Tak Toke! Det var dog fantastisk. Jeg blev interesseret i problemet i går eftermiddags da der dukkede et næsten perfekt ordkvadrat op under et spil Wordfeud.

Jeg tænkte på alle mulige snedige algoritmer og optimeringer, men kunne ikke lige se hvordan jeg bedst fik hul på problemet.

Steven Snedkers billede

Her til morgen har jeg så også søgt efter løsninger på problemet. Jeg kunne ikke umiddelbart finde kode, men fandt en fremragende Wikipedia-artikel:

http://en.wikipedia.org/wiki/Word_square
"A specimen of the order-six square (or 6-square) was first published in English in 1859; the 7-square in 1877; the 8-square in 1884; and the 9-square in 1897"

Det vi jager er dog en "Double word square", en lidt sværere variant. På engelsk er rekorden en 8'er - dog med 2 knap så korrekte ord. Hverdags-engelsk går altså, tror jeg,  til 7. Så er det spørgsmålet om dansk også går til 7?

Steven Snedkers billede

http://en.wikipedia.org/wiki/Word_square#Vocabulary har i øvrigt en interessant pointe om ordkvadratkvalitet. Hyppigt brugte ord er mere værd end sjældent brugte ord og et ordkvadrat med et højt hverdagssprogindex er mere imponerende end noget der føles fremmed og konstrueret.

Steven Snedkers billede

Ovenfor står der "ordkvadrat", "ordkvadratkvalitet" og "hverdagssprogindex". Tre udmærkede danske ord, der ikke findes i en ordbog, men giver mening. Spørgsmålet er om man med sammensatte ord (brødflov, bøgeflis, madmorforklæde) kunne nå længere end 7. -Ah, ved nærmere eftertanke: sammensatteord-dobbelt-ordkvadrater kunne konstrueres let ved at lægge 4'ere eller 5'ere side om side. Men de ville nok give 80% halvvrøvlede sammensatte ord.

Steven Snedkers billede

Logologens afhandling om at finde en 10'er har mange af dine midnats-pointer, Toke: http://digitalcommons.butler.edu/cgi/viewcontent.cgi?article=4858&context=wordways

Steven Snedkers billede

Og her er kode og eksempler, der - i min bog - viser at 7'ere nok er det længste man kan komme (på engelsk) uden at puste ordbogen op med lavkvalitetsord: http://gtoal.com/wordgames/wordsquare/


          Toke Eskildsen
        s billede

Både Logologens og gtoal's artikler ser gode ud (jeg har kun frokostpauseskimmet dem). Trie-tingen er nok det næste jeg vil benytte, hvis det bliver nødvendigt.

Det er ret sjovt med det historiske perspektiv, hvor det fremgår af artiklerne at der skulle spares på hukommelsen og i det hele taget laves mange tricks blot for at få overskuelige ordbøger og størrelser processeret.

Med moderne hardware og lidt tålmodighed (læs: Lad det køre natten over) vil jeg mene at den klart største udfordring bliver at skaffe en nogenlunde autoritativ ordliste. Det ser nu ud til at denne opgave falder ind under http://www.dsn.dk/nyt/nyheder/2012/sprognaevnets-ordliste


          Toke Eskildsen
        s billede

Bum bum. Jeg må nok æde mine ord i mig igen... Efter at have hapset de rå ord fra da-source på http://da.speling.org/filer/ er ordbogen vokset til 620K unikke ord og mit hurtige aftenhack har vist sig utilstrækkeligt. Nu lader jeg den lige køre natten over, men det ser ud til at der skal bruges flere tricks for at få acceptabel udførelsestid.

Jeg har rettet min kode så andre end mig kan bruge den, men du har jo givet link til langt mere modne implementationer. Skulle nogen alligevel være nysgerrige har jeg smidt mit foreløbige bud på http://ekot.dk/diverse/WordSquare.java


          Toke Eskildsen
        s billede

Jeps, der skal spises ord. Eller rettere: Optimeres implementation. Den nåede én procent gennem 5x5 i løbet af natten og mindre end det for 6x6, 7x7 og 8x8. Den nåede dog at finde

ankrene

kanelen

trolige

arkader

nektere

treeren

sildens

Meeen "nektere" lyder lidt mystisk i mine ører og "related" helt forkert.

Steven Snedkers billede

Det er dog alligevel utrolig blæret. Men jo, selv med 6'ere er det nok svært at få et 100% korrekt, dansk ordkvadrat. Når du har fundet rigtig mange tror jeg, at jeg vil lære nogle af dem udenad og så sidde og lave dem henkastet i toget til sidemændenes benovelse. Jeg er dog mere fascineret af kvalitet end af kvantitet. En elegant 5'er er min i bog sjovere end en haltende 6'er. De der, der hælder ordbøger og stednavnsindexer på for at nå en 10'er, forstår jeg ikke helt.


          Ricco Førgaard
        s billede

Meget interessant!

Dette problem findes også for tal, hvor man skal putte tallene fra 1-n i et m x m kvadrat, hvor n = m^2 og summen på alle led er n (også diagonalen). Enkelt for m=3, men allerede ved m=4 begynder det at blive utrolig vanskeligt.


          Thomas Egense
        s billede

Ricco Førgaard Det er faktisk ret trivielt at finde de "magiske kvadrater". For ulige tal vil en 10 årig være i stand til at lave, da metoden er meget let. Ved "magiske kvadrater" skal summen også passe diagonalt. Ellers kalder man det "semi-magic". Det kan fint udvides til ord kvadrater, og det vil være lidt finere hvis de 2 diagonaler også danner et ord.


          Toke Eskildsen
        s billede

Ikke overraskende er der forskel på folk, Steven Snedker: Med erkendelsen af at det ikke er nok med et hurtigt hack er det spændende for mig helt klart at lave noget der kan finde en 10'er. Elegante ordkvadrater er ... elegante, men mest som et kuriosum.

Lidt interessant fra tidligere tests med mindre ordbog er at større ordkvadrater ikke nødvendigvis er sværere. Jo længere ord, jo større sandsynlighed for at det tidligt i opbygningen kan afgøres at der ikke kan bygges videre. Dette skal så holdes op imod mængden af unikke ordbegyndelser ved den givne størrelse og det var så den kombination der toppede ved ordlængde 8 i mit gamle forsøg.

Lidt snak med kontorfællen Thomas Egense har resulteret i næste optimering der skal forsøges: Løbende reducering af ordbogens størrelse. Jeg kan selvfølgelig bare nærlæse de forskellige papers, men det er ikke sjovt at få den fulde løsning med det samme.

Steven Snedkers billede

Jeg er imponeret over jer, Toke Eskildsen og Thomas Egense . Jeg tror ikke på diagonaler. Ord har det med at have skiftevis vokaler og konsonanter og det duer slet ikke for den håndlavede 3'er, der startede tråden. 6'er-eksemplerne lover heller ikke godt for diagonal-ord. Jeg kan ikke forestille mig et ordkvadrat (størrelse 2-10) der kan levere bare to diagonal-ord.


          Toke Eskildsen
        s billede

Jeg synes bedre & bedre om den opgave du har stillet, Steven Snedker. Alternering mellem afprøvning af vandrette og lodrette ordkandidater gav mulighed for ordbogsreducering efter præfix og det gav såmænd også 10x højere hastighed (okay, det er løgn: Eftersom reduceringen betyder færre tests, relativt til korpus og kvadratstørrelse, er det nok snarere en ændring fra O(et eller andet) til O(noget mindre), men det er for langhåret til at jeg kan regne det ud). Det er bare slet ikke godt nok til en udtømmende søgning.

Den bedre hastighed resulterede dog i nogen bud hen over natten og fandt bl.a. 5000 5x5 ordkvadrater med diagonaler (den nåede til "afdet" som første ord, så det er langt fra det komplette svar). Et par af disse er

adict

tenes

opdra

moser

stuts

acids

genet

ordne

reren

asens

der begge har en diagonal med det fremragende ord 'aedes'. Den fandt også 4 8x8'ere der dog var uden diagonaler, f.eks.

abbedier

brunalge

buketten

eneboers

datoerne

ilterhed

egernene

rensedes

Nu vil jeg prøve at få fat i Sprognævnets ordliste, men ellers kunne man være så fræk at lave automatisk kontrol gennem deres webside, for de få kvadrater der er med større sidelængder.

Steven Snedkers billede

En perfekt 8'er! Jeg er imponeret! 5000 5x5 ordkvadrater med diagonaler! Endnu mere imponeret (og overrasket). Det bliver spændende at se de perfekte. 'aedes' optræder ikke i RO http://www.dsn.dk/ eller mit dagligdags ordforråd, men de ~4998 andre 4'ere med diagonaler må næsten indeholde perfekte ord og gøre min fornemmelse til skamme. Jeg begynder helt at tænke i en webtjeneste, der serverer ordkvadrater til de hungrende masser.


          Toke Eskildsen
        s billede

Ja, der er helt sikkert et enormt uudtalt behov for ordkvadrater blandt den danske befolkning! Men er det ikke en app man laver i disse tider? "Dagens ordkvadrat" eller måske "Ordfinurligheder"?

Jeg aer den ene af mine katte. Begge mine katte går hen og spiser. Den aedes madskål er størst.

Steven Snedkers billede

Ah! Jeg troede jeg blev spist af med ædes, fejlstavet. Vi har den første perfekte 5'er med 2 diagonaler!

Apps er yt, blev vi enige om i går https://plus.google.com/u/0/112786534420585287262/posts/8VkjE3Y9BWN , og de tager lang tid at lave. Men jeg kunne godt forestille mig at fundne ordkvadrater kunne publiceres på en knapt så arbejdskrævende måde.


          Thomas Emil Hansen
        s billede

Jeg tænker, kunne man lave det ligesom en slags Sudoku, hvor man skal udfylde de manglende bogstaver? Det ville være en app, der kunne sælge!


          Thomas Emil Hansen
        s billede

PS. Egentlig ville det bare være en slags kryds-og-tværs, men det ville der jo heller ikke nødvendigvis være noget galt i.

Steven Snedkers billede

Til eftertiden: ordkvadrat-projekt-side på http://ekot.dk/programmer/Ordkvadrat/


          Thomas Emil Hansen
        s billede

Et par tanker til optimering (som måske allerede er tænkt):

- Ordbogen skal naturligvis kun indeholde ord af den aktuelle længde. Laver man en 8'er skal alle ord i ordbogen være af længden 8.

- Ordbogen kan også optimeres med flere søgeindeks, så man ikke kun søger på ordenes begyndelsesbogstaver. Fordelen af en sådan optimering vil være afhængig af algoritmen, der benyttes.

- Parallelisering er opgaven er oplagt. Har man en maskine med flere processorer/kerner, kan de hver tage fra med næsten linær skalering.

- Jeg går ud fra, at ordbogen ligger i RAM. Selv en ordbog på 44.000 ord fylder kun meget lidt.

- En mere avanceret metode kunne være at vægte ordene efter anvendlighed. Ord med flere vokaler kunne f.eks. antages at kunne bruges i flere kombination end ord med et X i midten. Således kunne man starte med at søge efter ord, som er mere sandsynlige at få et godt resultat med. Man kommer ikke nødvendigvis hurtigere igennem det hele, men man vil hurtigere kunne få interessante resultater.


          Toke Eskildsen
        s billede

Thomas Emil Hansen: Jeps til det med ordlængden og RAM. Faktisk håber jeg at det hele kan pakkes ned så det ligger i level 2/3 cache. Langt størstedelen af processeringen handler om opslag og der giver det voldsomt meget at undgå forespørgsler til den langsomme RAM.

Jeg har ikke rodet med parallelisering, men du har ret i at det er meget nemt med denne opgave.

Det med flere søgeindex er interessant, da det er muligt at afgrænse de ord der skal afprøves ved at kigge på hvilke bogstaver der er mulige på bestemte pladser inde i ordene. Det er forøvrigt noget der passer rigtig godt til Trie-strukturen. Det svære er at lave afgrænsningslogikken så effektiv at det introducerede overhead er mindre end den tid der senere spares.

En af mine kollegaer var også inde på at anvende en heuristisk tilgang til at finde kvadraterne hurtigere. Min tilgang er lige nu er dog fokuseret på at bringe den samlede tid ned for en udtømmende søgning og en heuristik til at give en delmængde af resultaterne hurtigere vil (sandsynligvis) være på bekostning af den samlede udførelsestid.


          Thomas Emil Hansen
        s billede

> Faktisk håber jeg at det hele kan pakkes ned så det ligger i level 2/3 cache

Hvordan gør man det i Java?


          Toke Eskildsen
        s billede

Som med alle andre sprog: Lav strukturerne så små at der er plads til dem og til alt det andet skidt der konkurrerer om pladsen. Med Java er det så incl. den aktive del af JVMen, men med et så "lokalt" problem som ordkvadrater burde det også være muligt.


          Thomas Egense
        s billede

Ingen løsning for 15*15. Den var rimelig hurtig at køre igennem (1.5 time), og jeg vil nok også kunne afprøve alle 14*14 og måske 13*13...

Desværre er mit program  pt. for langsomt til 9*9 og 10*10 - vil formodentlig tage mere end 1 år CPU.


          Thomas Emil Hansen
        s billede

Hvor mange ord er der for de forskellige ordlængder?


          Thomas Egense
        s billede

#længde : #ord

15:35296

14:43995

13:53319

12:61885

11:65396

10:62270

9:54876

8:43921

Men det er ikke kun antal ord der bestemmer tiden. Ved min 15*15 udregning kunne man kun udfylde de første 3-4 rækker maximalt og dermed bliver muligheder hurtigt undersøgt. Og netop fordi jeg var så langt fra en løsning med 15*15 er jeg umådeligt overbevist om der ikke findes en højere, men det kan heldigvis hurtigt testet, og det vil jeg g're i løbet af ugen. Altså >= 13 tilfældene.

Tilføj kommentar

Ja, dette er et dumt spørgsmål med et nemt svar, men det er der kun fordi spam-robotter er for dumme til at besvare den slags, mens mennesker ikke er.
👍

Log ind eller registrer dig for at lægge langtidsholdbare, konstruktive kommentarer.
Registrerede brugere får bedre editor og flere likes.