Seite 1 von 1

Namengenerierungsmaschiene 2.0

Verfasst: Sonntag 10. Juni 2007, 16:07
von veers
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/

Verfasst: Sonntag 10. Juni 2007, 17:46
von schlangenbeschwörer
Nett, wobei ich den Pythonzusammenhang (oder den Pythoncode?) nicht sehe.

Idee:
Film/Buch/Musiktitel
Bandnamen
Schiffnamen (?)
Tiernamen
...

Verfasst: Sonntag 10. Juni 2007, 17:59
von veers
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.;)

Verfasst: Sonntag 10. Juni 2007, 21:32
von pythonist
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.

Verfasst: Sonntag 10. Juni 2007, 22:05
von veers
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 ;)

Verfasst: Montag 11. Juni 2007, 08:18
von N317V
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.

Verfasst: Montag 11. Juni 2007, 08:25
von Rebecca
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... ;)

Verfasst: Montag 11. Juni 2007, 08:54
von BlackJack
Gute Besserung! Ich hätte Dir ja jetzt gerne ein Heilmittel empfohlen, aber dafür fehlt noch der Medikamentennamengenerator. :-)

Verfasst: Montag 11. Juni 2007, 09:08
von N317V
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:

Verfasst: Montag 11. Juni 2007, 11:02
von veers
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 ;)