====== Generiertes Gedicht ======
//von Nora Lehmann//
=== Ziel: ===
//Ein Gedicht erzeugen, das einer Epoche entspricht und ein Versschema aufweist.//
=== Aufgaben: ===
* Gedichtsammlung erstellen
* Gedichte in Fragmente zerlegen und ins Wörterbuch abspeichern
* Zufallssatz mit 2-gram Modell erzeugen
* Gedichtstruktur mit Versen und Strophen bilden
* Extras einbauen
* Zufallssatz mit 2-gram Modell erzeugen
== Verwendete Texte: ==
* Menschheitsdämmerung von Kurt Pinthus
* selbsterstellte Gedichtesammlung von mehreren expressionistischen Künstlern
=== Protokolle: ===
== Protokoll vom 26.11.2015 ==
Ich hab erstmal die Wiki angelegt. Auf der Gutenberg Seite hab ich mir eine Gedichte Sammlung heruntergeladen,
die meine erste Datenbank wird. Zu zwei verschiedenen Epochen habe ich mich belesen, aber die Epochenauswahl
werde ich erst später machen. Meine erster große Aufgabe wird sein, ein Wörterbuch anzulegen,
das als key das Wort speichert und als value die darauffolgenden Wörter speichert.
Dass ich also ein Wörterbuch erstelle, das sozusagen die Wahrscheinlichkeiten
der Wortfolge speichert. Für diese Aufgabe hab ich mir den Code von der Bob Dylan Gruppe angeguckt und
versucht zu verstehen. Außerdem hab ich mir verschiedene Quellen zu Computeranalyse von Linguistik angeguckt.
Das Wörterbuch ist erfolgreich erstellt und speichert für ein Wort die darauffolgenden Wörter.
== Protokoll vom 03.12.2015 ==
In der einen Stunden, die ich da war, habe ich versucht einen Zufallsatz zu erzeugen. Ich wollte, dass ich dem
Computer ein Wort vorgebe und zufällig aus der gespeicherten Liste der nachfolgenden Wörter ein Wort ausgespuckt
bekomme. Das hab ich auch hinbekommen, aber ein Satz hatte ich immer noch nicht. Ich hab es auf die unelegante
Weise gelöst, dem Computer immer wieder ein Wort vorzugeben und er gab mir nachfolgendes Wort zurück. Das ist
aber nicht unbedingt praktisch. Eine verbesserte Variante musste her.
== Protokoll vom 10.12.2015 ==
Ich hab erneut an dem Zufallsatz gearbeitet und mit ein bisschen Rumprobieren, Hilfe und Nachlesen habe ich es
geschafft eine rekursive Funktion zu programmieren. Der Funktion füttert man ein Wort und sie erstellt ein
zufälligen Satz.
'' def zufallssatz(x,y):
"""Erzeugt einen Zufallssatz, indem die Funktionen zufällig das darauffolgende
Wort aus dem Wörterbuch auswählt. Dieser Prozess wird y-mal wiederholt"""
if y<=10:
if x in wb:
x=random.choice(wb[x])
print x,
zufallssatz(x,y+1) ''
Danach hab ich schon mal kleine Gedichte erstellt, indem ich vorgegeben hab, wie viel Wörter pro Zeile eingesetzt
werden sollen.
''
"""Kleines Gedicht"""
anfang=raw_input("Geben Sie ein Wort ein!")
zufallssatz(anfang,10)
print #fügt Leerzeile ein
s=raw_input("")
zufallssatz(s,5)
print
zufallssatz(s,3)
print
zufallssatz(s,5)
print
zufallssatz(s,3)
''
Dabei kamen auch schon lustige kleine Gedichte zustande.
Beispiele:
dunkle
stimmen starben, narziss im mai als siebenter und
brunnenraender, die abendglocke; schoen ist ein kanal rondel verflossen ist
stimmen starben, narziss im laub; sanfte nonnen unter
brunnenraender, die nacht das gesicht tropft schwarzer schnee; goldaeugige eulen
blut
vom maerchen gerne; auch weint im blick sich
vom fenster ein sanftes schweigen des hains auf die augen
in reinen haenden der tage hinsinkt o ihr
und rot die mauern schimmern kastanien leise klingen die amsel
glatt
das gold der nachtwind wuehlt in all walks
das laub faellt es ist dieses ist der graeber, das
das dach aus den blauen fluss hinunter die
das rohr im rauch gestalten aufgeloest hell verspruehn im brodem
== Protokoll vom 17.12.2015 ==
Wird nachgeholt.
== Protokoll vom 08.01.2016 ==
Ich hab noch ein bisschen mit der Zufallsatz probiert Gedichte zu erzeugen und versucht den gesamten Code zu
verbessern und zu strukturieren. Dann wusste ich nicht genau, was ich weiter machen sollte und habe dann
überlegt, wie ich endlich die Epoche ins Spiel bringen kann. Da jede Epoche besondere Schlagwörter hat,
wollt ich damit anfangen. Die bestimmten Schlagwörter kommen dann auch am häufigsten in den Werken vor,
deswegen kann man sie aus der eingelesenen Quelle ermitteln. Also habe ich eine if- schleife gemacht,
die die häufig vorkommenden Wörter zählt. Die hab ich jedoch nicht ganz fertig bekommen.
== Protokoll vom 14.01.2016 ==
Chronologisch gesehen, habe ich erst an den Schlagwörtern weiter gearbeitet. Mithilfe des Internets habe ich
heraus gefunden, wie man sich die 20 am häufigsten vorkommenden Wörter ermitteln lassen kann. Da ich keine
Füllwörter wie ein und das in meiner Liste der Schlagwörter haben wollte, habe ich noch eine Liste erstellt
mit Wörtern die nicht als Schlagwörter abgespeichert werden sollen. Mit ein bisschen Hilfe und Probieren hat
das dann auch geklappt und für den Text mit dem ich gerade arbeite, habe ich folgende Schlagwörter
ermittelt:
['ueber', 'dich', 'erde', 'nacht', 'welt', 'dein', 'gott', 'mensch', 'meine', 'herz', 'menschen',
'augen', 'blut', 'auch', 'zeit', 'himmel', 'werden', 'immer', 'licht', 'liebe']
Außerdem habe ich noch an Alliterationen gearbeitet. Ich hab ein Wörterbuch erstellt, dass für jedes
Wort in der Textquelle alle Wörter mit dem gleichen Anfangsbuchstaben abspeichert. Somit kann man
später auf die Funktion zugreifen und sich mit random.choice für ein Wort aus dem angelegten
Alliterationswörterbuch ein zufälliges Wort anzeigen lassen, das den gleichen Anfangsbuchstaben
wie das ursprüngliche Wort hat.
Weitere Änderung: Das Wörterbuch, das zuvor für jedes 'Anfangswort' die darauffolgenden Wörter gespeichert hat, speichert
nun alle Wörter die vor dem 'Anfangswort' vorkommen. Deswegen musste ich auch die Funktion zufallsatz nochmal ändern.
Nun speichert sie alle Wörter die zufällig ausgewählt werden ausgehend vom Anfangswort in einem String. Da immer das
Wort was eigentlich vor dem Wort steht mit dem die Funktion startet, muss man den String am Ende noch umdrehen und
dann hat man wieder einen Zufallsatz. Diese Änderungen erleichtern später das Einfügen von Reimen.
== Protokoll vom 21.01.2016 ==
Heute habe ich noch die Alliterationen verbessert und erstmal beendet. Danach hab ich mir als neues 'Modul'
Assonanzen vorgenommen. Assonanzen sind Häufungen eines Vokals. Dafür habe ich für jeden Vokal ein
Wörterbuch angelegt. Die Wörter werden nach dem am ersten vorkommenden Vokal eingeordnet. Wenn man dann ein
bestimmtes Wort der neu erstellten Funktion assonanzen gibt, guckt die Funktion welcher Vokal in dem Wort als
erster steckt und sucht dann aus den entsprechenden Wörterbuch zufällig ein neues Wort aus. Am Ende habe ich
versucht alle 'Module', die ich bis jetzt erstellt habe, zu vereinen und ein erstes Gedicht zu erzeugen.
Jedoch erwies sich das als recht schwer und wird jetzt mein Ziel für die nächste Woche.
== Protokoll vom 04.02.2016 ==
Funktionen geschrieben, die die Verse und Strophenanzahl und mit zufälligen Wörter die Zufallsätze generieren.
Erstes Gedicht:
['tuermen', 'aller', ':', 'heym', 'mit', 'seiner', 'taten']
['der', 'vaeter', 'hassen', 'diese', 'abgrenzung', 'ge', 'schieden']
['lasset', 'uns', 'im', 'schlaf', 'hypnotisieren', 'zwei', 'menschen']
['halb', 'schon', 'mit', 'jenen', 'furchtbaren', 'bewusstsein', 'des']
['regen', 'die', 'gaslaternen', 'und', 'wollen', 'wachen', 'ein']
['was', 'ich', 'ich', 'will', 'sich', 'die', 'arbeit']
['abschiednehmen', 'das', 'daliegen', 'in', 'dich', 'diese', 'blutet']
['schatten', 'schwankt', 'ueber', 'musik', 'ein', 'mensch', 'in']
['ueber', 'die', 'schneckenwindungen', 'des', 'gerechten', 'aber', 'wir']
['himmel', 'doch', 'ueber', 'eine', 'inatter', 'wenn', 'ich']
['die', 'schnur', 'boeses', 'tier', 'bricht', 'durch', 'roehricht']
['nacht', 'freunde', 'nicht', 'verhaengnis', 'mehr', 'nein', 'erdhosen']
['roten', 'fahnen', 'schwenken', 'isord', 'zieht', 'in', 'leidvoller']
['geist', 'der', 'geheimnisse', 'verschlafenes', 'land', 'ihr', 'viel']
['die', 'tempeljahre', 'die', 'schatten', 'halten', ':', 'toderschlagene']
Gedicht wird jetzt schöner ausgegeben:
arm des enzians durchsetzten beizenden geroell
welt so
rot (saemtlich vergriffen ) ich im vergifteten
aus der pfuetzen zwischen ihren werken verbunden dein
zischend der schiffe haengen verweste tiere stehn in die
augenbcdles umpulst den gefaengnissen
bin ich bin mir schreit tief meine stimmen :
welche stunde wie sie
mild wurden ploetzlich stand ich werde jetzt im traume ruehret
die ferne
die welt einschliessen herr und schaumluegenden Äusserungen der
sich die morgue die enge
vorbei als unfruchtbarer sand reibt aus den yebel menschenblut i
die taten sondern vereinigt wie grosse wolken
=== Code ===
''# -*- coding: utf-8 -*-
"""
Created on Thu Nov 26 15:34:12 2015
@author: Nora Lehmann
"""
import random
quelle=open("gedichte.txt")
s=quelle.read()
quelle.close()
na=["www","txt","http://",".","_","?","iii","!","&","0","1","2","3","4","5","6","7","8","9","-","...","*",">","<","1.E.1"]
s=s.lower()
s=s.replace("\xe4","ae")
s=s.replace("\xf6","oe")
s=s.replace("\xdf","ss")
s=s.replace("\xfc","ue")
for x in na:
s=s.replace(x," ")
s=s.split()
wb={}
for i,x in enumerate (s):
if i==len(s)-1:
break
if x not in wb:
wb[x]=[s[i+1]]
else:
wb[x].append(s[i+1])
def zufallssatz(x,y):
"""Erzeugt einen Zufallssatz, indem die Funktionen zufällig das darauffolgende
Wort aus dem Wörterbuch auswählt. Dieser Prozess wird y-mal wiederholt"""
if y<=12:
if x in wb:
x=random.choice(wb[x])
print x,
zufallssatz(x,y+1)
"""Kleines Gedicht """
anfang=raw_input("Geben Sie ein Wort ein!")
zufallssatz(anfang,12)
print #fügt Leerzeile ein
s=raw_input("")
zufallssatz(s,5)
print
zufallssatz(s,3)
print
zufallssatz(s,5)
print
zufallssatz(s,3)
''
=== Code von 14.01.2016 ===
# -*- coding: utf-8 -*-
"""
Created on Thu Jan 14 17:23:24 2016
@author: Nora Lehmann
"""
import random
quelle=open("menschheitsdaemmerung.txt")
s=quelle.read()
quelle.close()
na=["www","txt",",","http://",".","_","?","iii","!","&","0","1","2","3","4","5","6","7","8","9","-","...","*",">","<","1.E.1"]
s=s.lower()
s=s.replace("\xc3\x84","ae") #Text 'reinigen'
s=s.replace("\xf6","oe")
s=s.replace("\xc3\x9f","ss")
s=s.replace("\xc3\xbc","ue")
for x in na:
s=s.replace(x," ")
s=s.split() #String aller Wörter der Quelle
wb={}
'''wb speichert für jedes Wort die Wörter, die davor kamen'''
for i,x in enumerate (s):
if i==len(s)-1:
break
if x not in wb:
wb[x]=[s[i-1]]
else:
wb[x].append(s[i-1])
satz=[""]
def zufallssatz(x,y):
"""Erzeugt einen Zufallssatz, indem die Funktionen zufällig das darauffolgende
Wort aus dem Wörterbuch auswählt. Dieser Prozess wird y-mal wiederholt"""
satz=[x]
for i in range(y):
if x in wb:
x=random.choice(wb[x])
satz.append(x)
else:
break
return satz[::-1]
#SCHLAGWÖRTER
'''zählt die am meisten vorkommenden Wörter in der Quelle'''
fuellwoerter={'sich', 'nicht','oder', 'mich','dass', 'mein','herausgeber','gibt', 'hier','printed', 'herausgegeben', 'rowohlt','verlag','send', 'uerer', 'thus', 'antho', 'durch', 'da\xc3\x9f', '\xc3\xbcber', 'sind', 'eine', 'noch', 'sein','wenn','alle', 'doch', 'euch', 'wird', 'nach', 'schon', 'aber', 'alle', 'doch', 'euch', 'wird', 'nach', 'schon', 'aber'}
wob={}
for wort in s:
if wort in fuellwoerter:
continue
if not wort in wob and len (wort) >= 4:
wob[wort]=1 #Wort wird der Wert 1 zugeordnet
if wort in wob:
wob[wort]=wob[wort]+1 #Wert wird erhöht
else:
continue
import heapq
schlagwoerter=heapq.nlargest(20, wob, key=wob.get)
#ALLITERATION
al={}
def alliteration(w):
for x in s:
if w[0]==x[0]:
if w in al:
al[w].append(x)
else:
al[w]=[x]
alliteration ("affe")
print al
#alliteration("gewünschtes Wort") und dann al anzeigen lassen oder random.choice(al)
=== Code vom 21.01.2016 ===
'' # -*- coding: utf-8 -*-
"""
Created on Thu Jan 14 17:23:24 2016
@author: Nora Lehmann
"""
import random
quelle=open("menschheitsdaemmerung.txt")
s=quelle.read()
quelle.close()
na=["www","txt",",","\"",":","http://",".","_","?","iii","!","&","0","1","2","3","4","5","6","7","8","9","-","...","*",">","<","1.E.1"]
s=s.lower()
s=s.replace("\xc3\xa4","ae") #Text 'reinigen'
s=s.replace("\xc3\xbc","oe")
s=s.replace("\xc3\x9f","ss")
s=s.replace("\xc3\x9c","ue")
for x in na:
s=s.replace(x," ")
s=s.split()
wb={}
"""wb speichert für jedes Wort die Woerter, die davor kamen"""
for i,x in enumerate (s):
if i==len(s)-1:
break
if x not in wb:
wb[x]=[s[i-1]]
else:
wb[x].append(s[i-1])
satz=[""]
def zufallssatz(x,y):
"""Erzeugt einen Zufallssatz, indem die Funktionen zufällig das darauffolgende
Wort aus dem Wörterbuch auswählt. Dieser Prozess wird y-mal wiederholt"""
satz=[x]
for i in range(y):
if x in wb:
x=random.choice(wb[x])
satz.append(x)
else:
break
return satz[::-1]
#SCHLAGWÖRTER
'''zählt die am meisten vorkommenden Wörter in der Quelle'''
fuellwoerter={'sich', 'nicht','oder', 'mich','dass', 'mein','herausgeber','gibt', 'hier','printed', 'herausgegeben', 'rowohlt','verlag','send', 'uerer', 'thus', 'antho', 'durch', 'da\xc3\x9f', '\xc3\xbcber', 'sind', 'eine', 'noch', 'sein','wenn','alle', 'doch', 'euch', 'wird', 'nach', 'schon', 'aber', 'alle', 'doch', 'euch', 'wird', 'nach', 'schon', 'aber'}
wob={}
for wort in s:
if wort in fuellwoerter:
continue
if not wort in wob and len (wort) >= 4:
wob[wort]=1 #Wort wird der Wert 1 zugeordnet
if wort in wob:
wob[wort]=wob[wort]+1 #Wert wird erhöht
else:
continue
import heapq
schlagwoerter=heapq.nlargest(20, wob, key=wob.get)
#ALLITERATION
al={}
def alliteration(w):
for x in s:
if w[0]==x[0]:
if w in al:
al[w].append(x)
else:
al[w]=[x]
g="wort"
#print g
alliteration (g)
"""alliteration("gewünschtes Wort") und dann al anzeigen lassen oder random.choice(al)"""
#print random.choice(al[g])
#ASSONANZEN
avokal=[]
evokal=[]
ivokal=[]
ovokal=[]
uvokal=[]
for din in wb:
for x in din:
if x=="a":
avokal.append(din)
break
if x=="e":
evokal.append(din)
break
if x=="i":
ivokal.append(din)
break
if x=="o":
ovokal.append(din)
break
if x=="u":
uvokal.append(din)
break
else:
continue
def assonanzen(a):
"""Häufung eines Vokals. Funktion ermittelt für eine gegebene Funktion ein Wort mit den gleichen Vokal.
Das zweite Wort sollte als value vom ersten Wort in wb gespeichert sein."""
vokale={"a","e","i","o","u"}
asso=" "
for x in a:
if x in vokale:
if x=="a":
asso=asso+random.choice(avokal)
asso=asso+random.choice(avokal)
return asso
break
if x=="e":
return random.choice(evokal)
break
if x=="i":
return random.choice(ivokal)
break
if x=="o":
return random.choice(ovokal)
break
if x=="u":
return random.choice(uvokal)
break
else:
continue
print a
#GEDICHT
"""1.Assonanzen beachten
2.Alliterationen
3.Schlagwörter
Rest auffüllen"""
#1.Strophe
print zufallssatz(assonanzen("a"),5)
print zufallssatz("zarter",5)
print zufallssatz(assonanzen("a"),5)
print zufallssatz(assonanzen("a"),5)
print zufallssatz(assonanzen("a"),5)
''