====== 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) ''