Quellcode für pyzufall.satz

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
pyzufall.satz
-------------

Stellt Funktionen bereit, die Sätze nach diversen Satz-Schemata generieren.

Die Funktion :py:func:`pyzufall.satz.satz()` beinhaltet alle.
"""

from __future__ import (absolute_import, division, print_function, unicode_literals)
from builtins import *

import re
import random as r

from .helfer import erste_gross, chance, str_add, aufzaehlung
from .generator import adjektiv, band, bandart, baum, beilage, beruf_m, beruf_w, beziehung_m, beziehung_w, color, datum, essen, farbe, firma, geburtsdatum, gegenstand, interesse, koerperteil, nachname, objekt, objekt_m, objekt_w, ort, person, person_m, person_objekt_m, person_objekt_w, person_w, pflanze, sprichwort, stadt, stadt_bl, tier, trinken, verbd, verbi, verbi2, verbn, verbt, verbt2, vorname, vorname_m, vorname_w, wort, zahl

# Daten
from .generator import adjektive, farben, interessen


[Doku]def satz_nulltransitiv(): """ Generiert einen Satz mit einem nulltransitiven Verb. Beispiel: Im Park schneit es. """ if r.randint(0,1): s = ort() + ' ' + verbn() + ' es' + chance(25, ' ' + adjektiv()) + '.' else: s = 'Es ' + verbn() + chance(25, ' ' + adjektiv()) + '.' return erste_gross(s)
[Doku]def satz_baum(): """ Generiert einen Satz mit dem Thema Baum. Beispiel: Die gnadenlose Kerstin tritt gegen den Apfelbaum. """ if r.randint(0,1): #männlich person = person_m() objekt = objekt_m(baum()) else: # weiblich person = person_w() objekt = objekt_w(baum()) s = person + ' ' + r.choice(['pflanzt', 'klettert auf', 'fällt', 'zersägt', 'stellt sich unter', 'umarmt', 'tritt gegen']) + ' ' + objekt + '.' return erste_gross(s)
besetzung = ['Sänger', 'Gitarrist', 'Keyboarder', 'Bassist', 'Schlagzeuger', 'Manager', 'Geiger', 'Trompeter', 'Saxophonist', 'Backgroundsänger']
[Doku]def satz_band_mitglied(): """ Generiert einen Satz, in dem ein Bandmitglied vorgestellt wird. Beispiel: Annelise ist Gitarristin von der Gothicband "Kräuter in der Innenstadt". """ if r.randint(0,1): # männlich s = vorname_m() + chance(50, ' ' + nachname()) + ' ist ' + chance(50, 'der ') + r.choice(besetzung) + chance(50, ' von') + ' der ' + bandart() + ' "' + band() + '".' else: # weiblich s = vorname_w() + chance(50, ' ' + nachname()) + ' ist ' + chance(50, 'die ') + r.choice(besetzung) + 'in' + chance(50, ' von') + ' der ' + bandart() + ' "' + band() + '".' return erste_gross(s)
[Doku]def satz_band_gegruendet(): """ Generiert einen Satz, der den Zeitpunkt einer Bandgründung zum Thema hat. Beispiel: Die Electroband "Kartoffel auf dem Klo" wurde am 26.10.2009 in Selb gegründet. """ if r.randint(0,1): s = 'Die ' + bandart() + ' "' + band() + '" wurde ' else: s = band() + ' (' + bandart() + ') wurde ' if r.randint(0,1): # 50% Datum oder Jahr s += 'am ' + datum() else: s += chance(75, r.choice(['Anfang', 'Mitte', 'Mitte des Jahres', 'Ende', 'im Frühling', 'im Sommer', 'im Herbst', 'im Winter', 'im Jahr'])) + ' ' + str(r.randint(1950, 2013)) s += chance(50, ' in ' + stadt()) + ' gegründet.' return erste_gross(s)
[Doku]def satz_band_besetzung(): """ Generiert einen Satz mit den Mitgliedern einer Band. Beispiel: Die Black Metal Band "Die Oralen Nudeln" besteht aus Marlene, Gert, Stefanie, Timm, Andrej, Friederike und Dorothea. """ mit_nachname = r.randint(0,1) s = 'Die '+ bandart() + ' "' + band() + '" besteht aus ' + vorname() if mit_nachname: s += ' ' + nachname() for i in range(0,r.randint(0,6)): # 2 bis 8 Mitglieder s += ', ' + vorname() if mit_nachname: s += ' ' + nachname() s += ' und ' + vorname() if mit_nachname: s += ' ' + nachname() return erste_gross(s) + '.'
[Doku]def satz_band(): """ Generiert einen zufälligen Satz zum Thema Band. """ return r.choice([satz_band_mitglied, satz_band_gegruendet, satz_band_besetzung])()
[Doku]def satz_arbeit(): """ Generiert einen Satz über eine berufstätige Person. Beispiel: Achmed, der Grafiker aus Waldheim, spielt den Nasenbär. """ x = r.randint(1,4) if x == 1: s = vorname_m() + chance(50, ' ' + nachname()) + ' ist ' + chance(50, 'ein ') + beruf_m() + chance(50, ' aus ' + stadt()) if x == 2: s = vorname_w() + chance(50, ' ' + nachname()) + ' ist ' + chance(75, 'eine ') + beruf_w() + chance(50, ' aus ' + stadt()) if x == 3: s = vorname_m() + chance(50, ' ' + nachname()) + chance(50, ', der ' + beruf_m() + chance(50, ' aus ' + stadt()) + ',') + ' ' + verbt() + ' ' + r.choice([person_objekt_m(), objekt_m(objekt())]) if x == 4: s = vorname_w() + chance(50, ' ' + nachname()) + chance(50, ', die ' + beruf_w() + chance(50, ' aus ' + stadt()) + ',') + ' ' + verbt() + ' ' + r.choice([person_objekt_w(), objekt_w(objekt())]) return erste_gross(s) + '.'
[Doku]def satz_essen(): """ Generiert einen Satz mit Essen und/oder Trinken. Beispiel: Die Wärterin isst Orangen mit Mayonnaise und trinkt dazu Milch. """ x = r.randint(1,3) if x == 1: # Essen mit Beilage s = person() + chance(25, ' ' + r.choice(['ist', 'sitzt', 'befindet sich']) + ' ' + ort() + ' und') + ' isst ' + chance(50, r.choice(['gerade', 'oft', 'nicht oft', 'selten', 'gerne', 'nicht gerne']) + ' ') + essen() + chance(50, ' mit ' + r.choice(['viel', 'ganz viel', 'ein bischen', 'ein wenig', 'lecker', 'einer großen Portion']) + ' ' + beilage()) if x == 2: # Trinken s = person() + ' trinkt ' + chance(50, r.choice(['gerade', 'oft', 'nicht oft', 'selten', 'gerne', 'nicht gerne', 'jeden Abend ein Glas', 'zu viel']) + ' ') + trinken() if x == 3: # Essen und Trinken s = person() + ' isst ' + essen() + chance(50, ' mit ' + beilage()) + ' und trinkt ' + chance(50, 'dazu ') + trinken() return erste_gross(s) + '.'
[Doku]def satz_koerperteil(): """ Generiert einen Satz zum Thema Körperteile. Beispiel: Die ekelhafte Oma massiert ihren Fuß. """ x = r.randint(1,5) if x == 1: if r.randint(0,1): # Er s = koerperteil() s = re.sub('der ', 'den ', s) if r.randint(0,1): s = re.sub('den ', 'seinen ', s) s = re.sub('die ', 'seine ', s) s = re.sub('das ', 'sein ', s) s = person_m() + ' ' + r.choice(['verletzt sich', 'stößt sich', 'bricht' + chance(50, ' sich'), 'verstaucht' + chance(50, ' sich'), 'massiert']) + ' ' + s else: # Sie s = koerperteil() s = re.sub('der ', 'den ', s) if r.randint(0,1): s = re.sub('den ', 'ihren ', s) s = re.sub('die ', 'ihre ', s) s = re.sub('das ', 'ihr ', s) s = person_w() + ' ' + r.choice(['verletzt sich', 'stößt sich', 'bricht' + chance(50, ' sich'), 'verstaucht' + chance(50, ' sich'), 'massiert']) + ' ' + s if x == 2: # hat Kopfschmerzen s = koerperteil() s = re.sub('e$', 'en', s) # Lungen s = s.split()[1] # Körperteil ohne Artikel s = person() + ' hat ' + chance(50, r.choice(['schlimme', 'ein bischen', 'brutale', 'oft', 'manchmal']) + ' ') + s + 'schmerzen' if x == 3: s = koerperteil() s = re.sub('der ', 'am ', s) s = re.sub('die ', 'an der ', s) s = re.sub('das ', 'am ', s) s = person() + ' hat eine ' + chance(25, r.choice(['schmerzhafte ', 'brutale ', 'miese ', 'kleine ', 'eiternde '])) + r.choice(['Verletzung', 'Entzündung', 'Wunde', 'Beschädigung']) + ' ' + s if x == 4: s = koerperteil() s = re.sub('der ', 'Mein ', s) s = re.sub('die ', 'Meine ', s) s = re.sub('das ', 'Mein ', s) s = s + ' ' + r.choice(['tut weh', 'schmerzt', 'blutet', 'juckt', 'brennt', 'stinkt']) if x == 5: s = koerperteil() s = re.sub('der ', 'einen ' + str_add(adjektiv(), 'en '), s) s = re.sub('die ', 'eine ' + str_add(adjektiv(), 'e '), s) s = re.sub('das ', 'ein ' + str_add(adjektiv(), 'es '), s) s = person() + ' hat ' + s return erste_gross(s) + '.'
[Doku]def satz_kloster(): """ Generiert einen Satz über eine Person in einem Kloster. Beispiel: Bruder Ludwig ist der böseste Mönch im Kloster. """ _adj = adjektiv() # verhindert 'monströsste' und 'gerechtste' if _adj[-1] == 's' or _adj[-1] == 't': _adj += 'este' else: _adj += 'ste' if r.randint(0,1): # männlich s = chance(25, 'Der ') + 'Bruder ' + vorname_m() + r.choice([' war', ' ist']) + ' der ' + _adj + ' Mönch ' + r.choice(['im Kloster', 'im Orden', 'in der Abtei']) else: # weiblich s = chance(25, 'Die ') + 'Schwester ' + vorname_w() + r.choice([' war', ' ist']) + ' die ' + _adj + ' Nonne ' + r.choice(['im Kloster', 'im Orden', 'in der Abtei']) return erste_gross(s) + '.'
[Doku]def satz_folgehandlung(): """ Generiert einen Satz, der eine Folgehandlung beschreibt. Beispiel: Ohne dass Irmgard überlebt, bricht sie aggressiv ein. """ v1, v2 = verbi2().split(", ") v12 = '' if ' ' in v1: # bildet sich => bilder ER sich v1, v12 = v1.split(' ') v12 += ' ' verb2 = verbi() verb22 = ' ' if ' ' in verb2: verb2, verb22 = verb2.split(' ') verb22 = ' ' + verb22 + ' ' if r.randint(0,3): # Selbst if r.randint(0,1): # m erste_person, zweit_person = person_m(), ' er ' else: # w erste_person, zweit_person = person_w(), ' sie ' else: # Dritte if r.randint(0,1): # m erste_person, zweit_person = person_m(), r.choice([' sein ' + r.choice(beziehung_m), ' seine ' + r.choice(beziehung_w)]) + ' ' else: # w erste_person, zweit_person = person_w(), r.choice([' ihr ' + r.choice(beziehung_m), ' ihre ' + r.choice(beziehung_w)]) + ' ' s = r.choice(['Weil', 'Während', 'Obwohl', 'Ohne dass', 'Nur weil', 'Gerade weil']) + r.choice([verb22 + erste_person + ' ', ' ' + erste_person + verb22]) + chance(50, ort() + ' ') + chance(50, adjektiv() + ' ') + verb2 + ', ' + v1 + zweit_person + v12 + chance(50, adjektiv() + ' ') + v2 + '.' return erste_gross(s)
[Doku]def satz_absurde_farbfunktion(): """ Generiert einen Satz nach folgendem Muster: Gelb ist brauner als Türkis. """ farbe1, farbe2, farbe3 = r.sample(farben, 3) s = farbe1 + ' ist ' + str_add(r.choice([farbe2.lower, adjektiv])(), 'er') + ' als ' + farbe3 + '.' return erste_gross(s)
[Doku]def satz_freunde_lieben(): """ Generiert einen Satz über eine Person mit Eigenschaften. Beispiel: In der Garage ist das Mannsweib lesbisch. """ if r.randint(0,1): #männlich s = person_m() + ' ist ' + adjektiv() + chance(50, r.choice(['. Alle', ', aber']) + ' seine Freunde lieben ihn dafür') + '.' else: #weiblich s = person_w() + ' ist ' + adjektiv() + chance(50, r.choice(['. Alle', ', aber']) + ' ihre Freunde lieben sie dafür') + '.' return erste_gross(s)
[Doku]def satz_farbe(): """ Generiert einen Satz nach dem Muster: Braun ist eine unsittliche Farbe. """ s = farbe() + ' ist eine ' + str_add(adjektiv(), 'e ') + 'Farbe.' return erste_gross(s)
[Doku]def satz_adjektiv_sprichwort(): """ Generiert einen Satz nach dem Muster: Je untrainierter desto lächerlicher. """ _adj1, _adj2 = r.sample(adjektive, 2) _s = 'Je ' + str_add(_adj1, 'er') + ' desto ' + str_add(_adj2, 'er.') return erste_gross(_s)
[Doku]def satz_adjektiv_am_ort(): """ Generiert einen Satz nach dem Muster: <Ort> <Verb> <Person> <Adjektiv>. Beispiel: Auf dem Spielplatz ist die Freundin hilfsbereit. """ s = ort() + ' ' + r.choice(['war', 'ist']) + ' ' + person() + ' ' + chance(50, r.choice(['sehr', 'ziemlich', 'ein bischen', 'nicht sehr', 'garnicht', 'nicht']) + ' ') + adjektiv() + '.' return erste_gross(s)
[Doku]def satz_interessen(): """ Generiert einen Satz über die Interessen einer Person. """ if r.randint(0,1): _s = "{} Interessen sind {}.".format(str_add(vorname(), 's'), aufzaehlung(r.sample(interessen, r.randint(2,6)))) else: _s = "{} zählt zu {} Interessen.".format(interesse(), str_add(vorname(), 's')) return erste_gross(_s)
[Doku]def satz_thema(): """ Generiert einen Satz zu einem zufälligen Thema. """ return r.choice([satz_nulltransitiv, satz_baum, satz_band, satz_kloster, satz_folgehandlung, satz_freunde_lieben, satz_adjektiv_am_ort, satz_absurde_farbfunktion, satz_farbe, satz_adjektiv_sprichwort, satz_arbeit, satz_essen, satz_koerperteil, satz_interessen])()
[Doku]def satz_standard_1(): """ Generiert einen einfachen Satz nach dem Muster: <Person> <Verb> <Adjektiv> <Ort>. Beispiel: Die Geschmacklose bepisst sich cool in der Kirche. """ if r.randint(0,1): v1, v2 = verbi2().split(",") else: v1, v2 = verbi(), '' s = person() + ' ' + v1 + ' ' + r.choice([adjektiv(), ort(), adjektiv() + ' ' + ort()]) + v2 + '.' return erste_gross(s)
[Doku]def satz_standard_2(): """ Generiert einen einfachen Satz nach dem Muster: <Ort> <Verb> <Person> <Adjektiv>. Beispiel: Beim ersten Date flieht er. """ if r.randint(0,1): v1, v2 = verbi2().split(",") else: v1, v2 = verbi(), '' s = ort() + ' ' + v1 + ' ' + person() + chance(75, ' ' + adjektiv()) + v2 + '.' return erste_gross(s)
[Doku]def satz_standard_3(): """ Generiert einen einfachen Satz nach dem Muster: <Adjektiv> <Verb> <Person> <Ort>. Beispiel: Gehirntot weint die Schädlingsbekämpferin in der Psychiatrie. """ if r.randint(0,1): v1, v2 = verbi2().split(",") else: v1, v2 = verbi(), '' s = adjektiv() + ' ' + v1 + ' ' + person() + chance(75, ' ' + ort()) + v2 + '.' return erste_gross(s)
[Doku]def satz_standard_4(): """ Generiert einen einfachen Satz nach dem Muster: <Person> <Verb> <Person/Objekt> <Adjektiv> <Ort>. Beispiel: Der Ruhige raubt ein Schaf aus. """ if r.randint(0,1): # männlich _person = person_m() _objekt = r.choice([person_objekt_m(), objekt_m(objekt())]) else: # weiblich _person = person_w() _objekt = r.choice([person_objekt_w(), objekt_w(objekt())]) if r.randint(0,1): # getrenntes Verb v1, v2 = verbt2().split(",") else: v1, v2 = verbt(), '' s = _person + ' ' + v1 + ' ' + _objekt + r.choice([' ' + adjektiv(), ' ' + ort(), ' ' + adjektiv() + ' ' + ort(), '']) + v2 + '.' return erste_gross(s)
[Doku]def satz_standard(): """ Generiert einen zufälligen Standard-Satz. """ _funktion = 'satz_standard_' + str(r.randint(1, 4)) return eval(_funktion)()
[Doku]def satz_frage_1(): """ Generiert eine Frage nach dem Grund, aus dem eine Person eine Tätigkeit ausführt Beispiel: Wieso fällt dein Partner in Gedanken hin? """ if r.randint(0,1): # getrenntes Verb v1, v2 = verbi2().split(",") else: v1, v2 = verbi(), '' s = chance(50, r.choice(['Warum ', 'Wieso ', 'Weshalb '])) + v1 + ' ' + person() + r.choice([' ' + adjektiv(), ' ' + ort(), ' ' + adjektiv() + ' ' + ort(), '']) + v2 + '?' return erste_gross(s)
[Doku]def satz_frage_2(): """ Generiert eine Frage nach der Person, die eine Tätigkeit ausführt. Beispiel: Wer telefoniert bewusstlos in der Abtei? """ if r.randint(0,1): # getrenntes Verb v1, v2 = verbi2().split(",") else: v1, v2 = verbi(), '' s = 'Wer ' + v1 + ' ' + r.choice([adjektiv(), ort(), adjektiv() + ' ' + ort()]) + v2 + '?' return erste_gross(s)
[Doku]def satz_frage_3(): """ Generiert eine Frage nach dem Ort, an dem eine Person eine Tätigkeit ausführt. Beispiel: Wo singt ein Siebdrucker? """ if r.randint(0,1): # getrenntes Verb v1, v2 = verbi2().split(",") else: v1, v2 = verbi(), '' s = 'Wo ' + v1 + ' ' + person() + chance(25, ' ' + adjektiv()) + v2 + '?' return erste_gross(s)
[Doku]def satz_frage_4(): """ Generiert eine Frage nach der Art, wie eine Person eine Tätigkeit ausführt. Beispiel: Wie wird sie beim ersten Date angefasst? """ if r.randint(0,1): # getrenntes Verb v1, v2 = verbi2().split(",") else: v1, v2 = verbi(), '' s = 'Wie ' + v1 + ' ' + person() + chance(50, ' ' + ort()) + v2 + '?' return erste_gross(s)
[Doku]def satz_frage_5(): """ Generiert eine Frage nach dem Zeitpunkt, an dem eine Person eine Tätigkeit ausführt. Beispiel: Wann säuft eine Hure? """ if r.randint(0,1): v1, v2 = verbi2().split(",") else: v1, v2 = verbi(), '' s = 'Wann ' + v1 + ' ' + person() + chance(50, ' endlich') + chance(25, ' ' + ort()) + v2 + '?' return erste_gross(s)
[Doku]def satz_frage(): """ Generiert eine zufällige Frage. """ _funktion = 'satz_frage_' + str(r.randint(1, 5)) return eval(_funktion)()
[Doku]def satz(): """ Generiert einen zufälligen Satz. 20% Standard-Sätze, 20% Fragen und 60% Themen-Sätze """ x = r.randint(1,5) if x == 1: s = satz_standard() elif x == 2: s = satz_frage() else: s = satz_thema() return s