Generiertes Gedicht

von Nora Lehmann

Ziel:

Ein Gedicht erzeugen, das einer Epoche entspricht und ein Versschema aufweist.

Aufgaben:

Verwendete Texte:

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. 
   

<code> „“„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) </code>

   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)

''