Automatisch nonsens genereren
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)
Banana Me
–
17-04-2009 11:06
Geef mij maar weer de schuld
Gratz met je 42e post
Sybren
–
21-04-2009 19:12
Vet
hij zegt : gebruik nonsens grammatica.txt
bij de runnable .jar
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.