Namengenerierungsmaschiene 2.0

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Als Sonntagnachmittagsprojekt habe ich heute (schon wieder) einen Namens Generator geschrieben. Meiner Meinung nach ist er jedoch etwas klüger als die Vorhergehenden. Diesen habe ich dann mit Informationen aus der Wikipedia gefüttert und fertig war die Namengenerierungsmaschiene 2.0.

Derzeit kann sie folgende Arten von Namen generieren:
- Männliche (Vor)namen
- Weibliche (Vor)namen
- Nachnamen
- Krankheiten (Nützlich für Absenzen :D)
- Staaten
und natürlich Pornodarsteller Namen.

Falls jemand weitere Ideen hat, nur her damit ;)

http://29a.ch/namegenerator/
Zuletzt geändert von veers am Sonntag 2. September 2007, 16:58, insgesamt 1-mal geändert.
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Nett, wobei ich den Pythonzusammenhang (oder den Pythoncode?) nicht sehe.

Idee:
Film/Buch/Musiktitel
Bandnamen
Schiffnamen (?)
Tiernamen
...
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Der Python zusammenhang ist dass es in Python geschrieben wurde (:
Den Code will ich euch auch nicht vorenthalten ;)
Das CGI:

Code: Alles auswählen

#!/usr/bin/python
# vim: set fileencoding=utf-8 :
import cgi
import cgitb; cgitb.enable()
import os, re, pickle
from random import choice

print "content-type: text/html; charset=utf-8\r\n\r\n"

def main():
    depth = 3
    fs = cgi.FieldStorage()
    nametype = fs["type"].value
    if not re.match("^[a-z]+$", nametype): return
    namedata = pickle.load(open(os.path.join("names/", nametype + ".pickle")))
    print "<ul>"
    for i in range(10):
        print "<li>" + generate_name(namedata, depth) + "</li>"
    print "</ul>"
    

def generate_name(namedata, depth):
    current = ""
    name = ""
    while True:
        letter = choice(namedata[current])
        if letter == "\n":
            return name
        else:
            name += letter
            current = name[-depth:]
main()
Die Pickle Files werden mit analyze.py erstellt:

Code: Alles auswählen

#!/usr/bin/env python
# vim: set fileencoding=utf-8 :
import pickle
import sys
def main():
    depth = 3
    if len(sys.argv) != 3:
        sys.exit("Usage: " + sys.argv[0] + " input.txt ouput.pickle")
    result = analyze(sys.argv[1], depth)
    f = open(sys.argv[2],"w")
    pickle.dump(result, f)
    f.close()

def analyze(path, depth):
    result = {}
    f = open(path)
    for line in f:
        combination = ""
        for i, letter in enumerate(line):
            result[combination] = result.get(combination, []) + [letter]
            combination = combination[-(depth-1):] +  letter
    f.close()
    return result
            
if __name__ == "__main__":
    main()
Um aus einer Wikipedia Kategorie ein Textfile für analyze.py zu machen gibt es fetchwikinames.py:

Code: Alles auswählen

# vim: set fileencoding=utf-8 :
import urllib2
import re
def main():
    category = raw_input("Kategorie:")#"Weiblicher_Vorname"
    url = "http://de.wikipedia.org/w/query.php?what=category&cptitle=%s&format=xml"\
          "&cpfrom=" % urllib2.quote(category)
    cpfrom = ""
    while True:
        u = urllib2.urlopen(url + urllib2.quote(cpfrom))
        xml = u.read()
        matches = re.findall("<title>(.*?)</title>", xml)[1:]
        for match in matches:
            print match
        next = re.search(r'<category next=\"(.*?)\"', xml)
        if next: cpfrom = next.group(1)
        else: break

if __name__ == "__main__":
    main()
Ist ein ziemliches gebastel.;)
pythonist
User
Beiträge: 40
Registriert: Sonntag 14. Mai 2006, 17:28

Nett, Nett du könntest ja vieleicht noch anderstsprachige Wikipedias auslesen und andere Verzeichnisse damits noch n bisl Vielfalt gibt. Und ich würd für Sowas ne DB verwenden weil Pickle wird glaub bisl langsam werden wenns mehr werden vorallem in Verbindung mit CGI.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

pythonist hat geschrieben:Nett, Nett du könntest ja vieleicht noch anderstsprachige Wikipedias auslesen und andere Verzeichnisse damits noch n bisl Vielfalt gibt.
Spanische oder Chinesische Namen würden sich sicher auch Nett machen.
Habe nun mal die Given Names aus der Englischen Wikipedia importiert (1187 Stück). Mal sehen wie die Anzahl Namen das Ergebnis beeinflusst. Es scheint aber relativ komische Ergebnisse zu geben weil Namen aus sehr verschiedenen Sprachen gemischt werden.
pythonist hat geschrieben:Und ich würd für Sowas ne DB verwenden weil Pickle wird glaub bisl langsam werden wenns mehr werden vorallem in Verbindung mit CGI.
Spielt in dem Fall keine Rolle ;) Pickle war ist einfacher, ist in der stdlib etc. Würde mich die Geschwindigkeit wirklich interessieren würde ich cPickle verwenden.
Abgesehen davon:

Die cPickle Variante:
Interpreter starten, cPickle Modul laden, Daten werde in einem Rutsch geladen
Mit DB:
Interpreter starten, db Modul laden, Socket öffnen, Login, Select, Resultat vom Select in entsprechende Datenstruktur bringen

Ich zweifle daran das die DB Variante schneller ist :)

Edit:
Wahaha mir ist die ultimative Idee gekommen.
Ein Random EULA Generator ;)
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Hab mir jetzt den Code noch nicht angesehen (Kaffeetasse ist noch halb voll :-)), aber irgendwie kann ich nicht erkennen, dass was generiert wird. Es wird immer nur pro Kategorie die selbe Liste ausgegeben. Ich hätte ja erwartet, dass, wenn ich zweimal Vornamen aufrufe, ich zwei verschiedene Listen von Vornamen bekomme.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Vielleicht koennte man den Namensgenerator noch mit ein wenig mehr Zufall wuerzen? Man bekommt zu oft Namen, die es schon gibt oder die vorhandenen extrem aehnlich sind. (Katja + Tatjana = Katjana).

PS: Sieht auf den ersten Blick aehnlich aus wie ein Namensgenerator, den ich selbt mal programmiert habe. Da war das mit dem Random nicht so einfach hinzubekommen: Entweder obiges Problem oder zu viele unaussprechliche Namen. Schwer, ein Mittelmass zu finden...

PPS: Ich kann heute leider nicht arbeiten, habe Pseudoxanthomationskrankung... ;)
BlackJack

Gute Besserung! Ich hätte Dir ja jetzt gerne ein Heilmittel empfohlen, aber dafür fehlt noch der Medikamentennamengenerator. :-)
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Ah, wenn man die Seite komplett neu aufruft, dann gehts.

Mann, hab ich heut wieder Zivilisationserparasitentrahlenkrampf (zuerst dachte ich, es sei eine einfache Zivilität :? ) und Idiopathie :lol:
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Es scheint als würden einige Browser das Ergebnis cachen (IE?!). Hab nun mal noch Math.random() zu dem Aufruf angehängt.
Der Zufall kommt durch eine grosse Namensliste. Es wäre auch möglich Depth zu reduzieren aber dann kommt nichts brauchbares mehr heraus.

Medikamente können nun auch generiert werden!
Für Rebecca zum Beispiel Alfentobarbocuramin ;)
Antworten