Automatisch nonsens genereren

Photo of Wilco

Wilco 16-04-2009 20:13
Afgelopen periode werd het vervelende vak vertalerbouw gegeven. Bij dit vak is het de bedoeling om gegeven een tekst en een CFG (een grammatica dus) een parsetree te maken.
Omdat ik nergens anders zin in had heb ik laatst een programma gegeven wat ongeveer het omgekeerde doet: Gegeven een grammatica (met terminals en nonterminals), genereer een willekeurige tekst die aan die grammatica voldoet.

Beschouw bijvoorbeeld de volgende relatief eenvoudige grammatica. Terminals staan tussen dubbele aanhalingstekens, verschillinde productieregels kunnen ook gescheiden worden door een komma, de eerste nonterminal is tevens het startsymbool.

verhaal := oorzaakzin " " gevolgzin

oorzaakzin := "Sinds " tijdindicatie " hebben " groep " zich afgevraagd waarom " groep " " eigenschap_m "."
oorzaakzin := oorzaakzin " " oorzaakzin
tijdindicatie := "afgelopen " tijdeenheid_e
tijdindicatie := "afgelopen " dag
tijdindicatie := "afgelopen " getal " " tijdeenheid_e
tijdindicatie := "een half jaar"
tijdeenheid_e := "uur"
tijdeenheid_e := "maand"
tijdeenheid_e := "week"
tijdeenheid_e := "milennium"
tijdeenheid_e := "jaar"
dag := "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag", "zondag"
getal := "12", "3", "6", "2,5", "24", "8"
groep := "apen"
groep := "batterijen"
groep := "onderzoekers"
groep := "informatici"
groep := "Cover-leden"
groep := "vissen"
groep := "borrelaars"
eigenschap_m := "graag borrelen"
eigenschap_m := "kunnen zwemmen"
eigenschap_m := "het altijd beter weten"
eigenschap_m := "nerds zijn"
eigenschap_m := "te laat komen"
eigenschap_m := "vliegend op vakantie gaan"
eigenschap_m := "seks hebben op het toilet"
eigenschap_m := "aan het torrenten zijn"
eigenschap_m := "in hun neus peuteren"


Gegeven deze input geneert het programma output als:
Sinds afgelopen 12 week hebben Cover-leden zich afgevraagd waarom informatici seks hebben op het toilet. 

of
Sinds afgelopen 6 maand hebben onderzoekers zich afgevraagd waarom vissen het altijd beter weten.

of
Sinds afgelopen maand hebben onderzoekers zich afgevraagd waarom borrelaars kunnen zwemmen.


Mocht je het zelf eens willen proberen, je kan de huidige sourcecode downloaden van http://wilco.svcover.nl/nonsens.tar.gz of de runnable jar van http://wilco.svcover.nl/nonsens.jar. Het programma is niet bepaald robuust.
De jar is uiteraard als volgt uit te voeren:
java -jar nonsens.jar


Joris vond dit een mooi idee en stelde voor dat ik dit via het Cover-forum met anderen zou gaan delen. Op die manier kunnen we samenwerken om een meer uitgebreide grammatica te schrijven. Als we onze nerd-krachten te bundelen zie ik twee geweldig mooie doelen voor ogen:

Automatisch spam genereren

Vele mensen over de hele wereld zetten zich dag in dag uit in om alle eigenaren van mailboxen op de hoogte te brengen van de beste aanbiedingen op het gebied van bijvoorbeeld pillen. Die mensen moeten steeds maar weer een creatieve manier verzinnen om je aandacht te trekken. Dit kunnen we automatiseren! Laten we een grammatica schrijven die hele verhalen genereert over hoe geweldig de nieuwe 'vi@gra' of 'generieke pil' is en hoeveel beter ieders sekslever daarvan wordt. Tevens kunnen we natuurlijk een grammatica schrijven die onderwerpen voor de e-mails genereert en een die namen en e-mailadressen van afzenders genereert. Als dit gelukt is kunnen moeten natuurlijk een cronjob op de coverserver maken die op willekeurige tijdsintervallen willekeurige spam verstuurt naar de leden van Cover.


Lopem ipsum verslaan

Hebben jullie ook zo'n hekel aan lopem ipsum? Wordt het niet eens tijd dat we voorbeelden met echt willekeurige tekst gaan vullen? Laten we een grammatica schrijven die niet-samenhangende lappen tekst met correct nederlandse tekst geneert. Dit is een veel beter alternatief dan steeds hetzelfde lorem ipsum!

(het moest van Joris)

Photo of Banana Me

Banana Me 17-04-2009 11:06
Geef mij maar weer de schuld tongue.gif

Gratz met je 42e postsmile.gif

Photo of Sybren

Sybren 21-04-2009 19:12
Vet tongue.gif

hij zegt : gebruik nonsens grammatica.txt
bij de runnable .jar

Photo of Wilco

Wilco 22-04-2009 09:52
Wat bij een jar betekent:
java -jar nonsens.jar /path/naar/je/grammatica.txt
De grammatica moet dus een tekstbestand zijn en moet je als argument aan het programma meegeven.

Photo of

22-04-2009 15:08
De laatste keer dat ik zoiets zag moest ik eerst nog "press play on tape" doen! wink.gif

Maar wel grappig hoor smile.gif