Bitte um Tipps

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Mittwoch 24. Oktober 2007, 16:02

keppla hat geschrieben:implementiert ist er afaik aber als utf-32, will heissen: u'x' hätte eine "Nutzlast" von 4 Bytes im speicher.

Es gibt sowohl UCS2 als auch UCS4-Versionen von Python...
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Beitragvon keppla » Donnerstag 25. Oktober 2007, 10:54

Leonidas hat geschrieben:
keppla hat geschrieben:implementiert ist er afaik aber als utf-32, will heissen: u'x' hätte eine "Nutzlast" von 4 Bytes im speicher.

Es gibt sowohl UCS2 als auch UCS4-Versionen von Python...


Was ich eigentlich sagen wollte, war, dass man über unicodestrings keine annahmen Treffen sollte, die über länge und inhalt hinausgehen. Das intern verwendete encoding ist afaik nicht ermittelbar (ist auch gut so), und es kann eben auch mal utf32 sein.
Imho sollte man sich über sowas keine Gedanken machen (Zustimmung zu BlackJacks Post).
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 25. Oktober 2007, 20:20

keppla hat geschrieben:Das intern verwendete encoding ist afaik nicht ermittelbar (ist auch gut so), und es kann eben auch mal utf32 sein.

Direkt nicht, indirekt schon. Habe aber gerade keine UCS2-Version von Python zur Hand um das zu prüfen.

keppla hat geschrieben:Imho sollte man sich über sowas keine Gedanken machen (Zustimmung zu BlackJacks Post).

Von mir auch Zustimmung.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
TEXTiX-X
User
Beiträge: 20
Registriert: Montag 22. Oktober 2007, 08:40
Wohnort: Dortmund
Kontaktdaten:

Bitte nochmal um Hilfe

Beitragvon TEXTiX-X » Freitag 26. Oktober 2007, 10:32

Kann mir einer helfen indem er mir vielleicht zeigt wie man bei meinem code alles sequentiell einlesen und abfragen kann?

Ich habe eine wörterbuch datei. da sind regelrecht richtige wörter drin. so um die 500000.

jetzt hab ich eine datei mit sätzen. eine normale text datei mit ca. 11 mb sätze.

das ganze dauert schon im moment eine lange zeit wenn ich das mit diesem code mache:

Code: Alles auswählen

# -*- coding: cp1252 -*-
import time

def readWordlist(filename):
    words = set()
    for line in open(filename, "r"):
        words.update(set([w for w in line.strip().split()]))
    return words

def main():
    start = time.time()
    wordList = readWordlist("vollform.txt")
    for line in open("sentences.txt", "r"):
        words = line.strip() \
                    .replace('.', '') \
                    .replace('"', '') \
                    .replace('!', '') \
                    .replace('?', '') \
                    .replace('---', '') \
                    .replace(',', '') \
                    .replace('“', '') \
                    .replace('”', '') \
                    .replace("'", '' ) \
                    .split()
        for w in words:
            f = open("words.txt", "w")
            g = open("wordsinvollform.txt", "w")
            if w in wordList:
                g.write(w)
            else:
                f.write(w)
               
    print time.time() - start, "s"

    print f

if __name__ == "__main__":
    main()


das ganze muss ja irgendwie praktischer berbeitet werden können das das schneller und besser geht.

p.s.: ja ich weiß das mit den sonderzeichen ist nicht gerade ideal gelöst. aber ich hab auch keine ahnung wie ich da erstmal alle sonderzeichen einlese die's gibt... noch nix im net gefunden.. *schäm, ich noob*
TEXTiX-X
User
Beiträge: 20
Registriert: Montag 22. Oktober 2007, 08:40
Wohnort: Dortmund
Kontaktdaten:

Beitragvon TEXTiX-X » Freitag 26. Oktober 2007, 12:25

Okay ich hab's herausgefunden.. das ganze läuft jetzt nicht mehr allzu langsam.

allerdings will man ja das ding so genau wie möglich machen.... jetzt hab ich natürlich noch ein paar sonderzeichen hinzugefügt die durch leerzeichen ersetzt werden, aber je mehr sonderzeichen ich da natürlich rein mache desto länger dauert das.

also theoretisch brauch der jetzt 45 sek für einen durchlauf:

kann mir jemand erklären wie genau ich das ganze schneller machen kann und trotzdem noch genau bin?
ich weiß das es schneller geht.... aber nicht wie-.-

Code: Alles auswählen

# -*- coding: cp1252 -*-
import time

def readWordlist(filename):
    words = set()
    for line in open(filename, "r"):
        words.update(set([w for w in line.strip().split()]))
    return words

def main():
    start = time.time()
    wordList = readWordlist("vollform.txt")
    data = readWordlist("sentences.txt")
    #positiv = ["J" , "j", "y", "yes", "jap", "Y", "Yes", "Jo"] (für erweiterung)
    #negativ = ["nein","ne","Nein","Ne","noe","Noe","n","N","nE","nope"] (für erweiterung)
    for line in data:
        words = line.strip() \
                    .replace('ue', 'ü') \
                    .replace('oe', 'ö') \
                    .replace('ae', 'ä') \
                    .replace('Ae', 'Ä') \
                    .replace('Oe', 'Ö') \
                    .replace('Ue', 'Ü') \
                    .replace('.', '') \
                    .replace('"', '') \
                    .replace('!', '') \
                    .replace('?', '') \
                    .replace('-', '') \
                    .replace(',', '') \
                    .replace('“', '') \
                    .replace('”', '') \
                    .replace('_', '') \
                    .replace(';', '') \
                    .replace('(', '') \
                    .replace(')', '') \
                    .replace('[', '') \
                    .replace(']', '') \
                    .replace('}', '') \
                    .replace('=', '') \
                    .replace('{', '') \
                    .replace(':', '') \
                    .replace("'", '' ) \
                    .replace("1", '' ) \
                    .replace("2", '' ) \
                    .replace("3", '' ) \
                    .replace("4", '' ) \
                    .replace("5", '' ) \
                    .replace("6", '' ) \
                    .replace("7", '' ) \
                    .replace("8", '' ) \
                    .replace("9", '' ) \
                    .replace("0", '' ) \
                    .split()
        for w in words:
            f = open("wordsnotinvollform.txt", "a")
            g = open("wordsinvollform.txt", "a")
            wl = w + "\n"
            if w in wordList:
                g.writelines(wl)
            else:
                f.writelines(wl)
               
    print time.time() - start, "s"


    f.close()
    g.close()
   

if __name__ == "__main__":
    main()
BlackJack

Beitragvon BlackJack » Freitag 26. Oktober 2007, 12:56

Schau Dir mal die `translate()`-Methode auf Zeichenketten an.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Freitag 26. Oktober 2007, 12:59

Mmh, wenn du nicht zwei Zeichen mit einem Zeichen erzetzen wolltest, sondern jeweils ein Zeichen mit genau einem Zeichen, wuerde ich dir translate ans Herz legen:

Code: Alles auswählen

>>> import string
>>> s = "asldfk{sdf{sdf}ASd[AS]2lkj(h342346534lk)6j.erZZZ"
>>> transtable = string.maketrans("Z", "A")
>>> deletechars = string.punctuation + string.digits
>>> print s.translate(transtable, deletechars)
asldfksdfsdfASdASlkjhlkjerAAA

Du koenntest es zumindest verwenden, um die ueberfluessigen Zeichen loszuwerden, wenn du in Zeile 3 schreibst:

Code: Alles auswählen

>>> transtable = string.maketrans("", "")


Aber da du ja ausserdem "Ae" mit "Ä" ersetzen willst... eventuell kann man da seinen eigenen Codec fuer schreiben und mit encode arbeiten? K.A., wieviel Aufwand das zu Programmieren waere, und wie die Performance da ist.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Beitragvon HWK » Freitag 26. Oktober 2007, 13:05

Mehrere Dingen fallen mir auf:
Warum öffnest Du die Dateien bei jedem Schleifendurchlauf neu? Sie nur einmal vor den Schleifen zu öffnen, würde sicher viel Zeit sparen.

Code: Alles auswählen

[w for w in line.strip().split()]
dürfte dasselbe Ergebnis wie

Code: Alles auswählen

line.strip().split()
liefern.
Enthalten line und words wirklich mehrere Worte?
Reicht statt writelines nicht auch write?
MfG
HWK
TEXTiX-X
User
Beiträge: 20
Registriert: Montag 22. Oktober 2007, 08:40
Wohnort: Dortmund
Kontaktdaten:

Beitragvon TEXTiX-X » Freitag 26. Oktober 2007, 14:17

Puuuhhh danke erstmal.....

Sitze grad ein bisschen dran und ist irgendwie schiwierig umzusetzen. der nimmt words nicht als variable (in Rebecca's Beispiel "s") an. spuckt deshlab nen fehler aus

die translate methode sieht plausibel aus (gut das es sowas gibt) auf die ö's, ä's, und ü's verzichte ich diesmal... denn die kann man auch noch hinterher vom programm korrigieren lassen.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Freitag 26. Oktober 2007, 14:39

Rebecca hat geschrieben:eventuell kann man da seinen eigenen Codec fuer schreiben

Mmh, das codecs-Modul bringt anscheinend auch nur Helfer fuer das Umwandeln einzelner Zeichen in einzelne Zeichen mit (charmaps). Den Rest muss man da anscheinend auch von Hand machen, bringt also nichts.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 26. Oktober 2007, 14:42

Rebecca hat geschrieben:Mmh, das codecs-Modul bringt anscheinend auch nur Helfer fuer das Umwandeln einzelner Zeichen in einzelne Zeichen mit (charmaps).

In Python 3.0 wird man Codecs auch nur für Zeichen -> Zeichen verwenden können, daher ist das auch nicht zukunftssicher.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Freitag 26. Oktober 2007, 20:00

Leonidas hat geschrieben:
keppla hat geschrieben:Das intern verwendete encoding ist afaik nicht ermittelbar (ist auch gut so), und es kann eben auch mal utf32 sein.

Direkt nicht, indirekt schon. Habe aber gerade keine UCS2-Version von Python zur Hand um das zu prüfen.

Es geht auch direkt und ohne Umwege.

Code: Alles auswählen

>>> import sys
>>> sys.maxunicode
1114111

Das ist ucs4, bei ucs2 wärs 65535.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Samstag 27. Oktober 2007, 09:24

Leonidas hat geschrieben:In Python 3.0 wird man Codecs auch nur für Zeichen -> Zeichen verwenden können, daher ist das auch nicht zukunftssicher.

Also kein decode("bz2") mehr?
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 27. Oktober 2007, 09:26

Rebecca hat geschrieben:Also kein decode("bz2") mehr?

Nein:
http://www.artima.com/weblogs/viewpost.jsp?thread=208549 hat geschrieben:We are adopting a slightly different approach to codecs: while in Python 2, codecs can accept either Unicode or 8-bits as input and produce either as output, in Py3k, encoding is always a translation from a Unicode (text) string to an array of bytes, and decoding always goes the opposite direction. This means that we had to drop a few codecs that don't fit in this model, for example rot13, base64 and bz2 (those conversions are still supported, just not through the encode/decode API).
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main
Kontaktdaten:

Beitragvon Markus12 » Samstag 27. Oktober 2007, 15:29

Damit man das besser überblicken kann würde ich gerne wissen was in den Textdateien zu finden ist mit den Namen "vollform.txt" und "sentences.txt".
Das sind für mich nicht aussagende Namen.
"story.txt" allerdings konnte ich mir denken, dass dies die datei sein soll, in der dein Text steht.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]