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.
TEXTiX-X
User
Beiträge: 20
Registriert: Montag 22. Oktober 2007, 08:40
Wohnort: Dortmund
Kontaktdaten:

In vollform.txt befinden sich etwa 500000 Wörter die korrekt geschrieben sind.. etwa eine art wörtersammlung/Duden
In sentences.txt befindet sich im moment eine satzsammlung mit geschätzt 200000 sätzen.
story.txt ist ein ganz normaler text.. irgendetwas was ich aus dem internet per copy/paste reinkopiert habe (im grunde als testdatei damit ich das ganze fix testen kann.

story.txt und sentences.txt sind im grunde die dateien die überprüft werden, ob es fehler in dem text gibt, oder o sie wörter enthalten die in der Vollform noch nicht enthalten sind.

Das ganze soll hinterher so funktionieren, wie ein rechtschreib programm in msword.

was es im moment tut und zwar problemlos ist, dass es die wörter die noch nicht in vollform enthalten sind hinzufügt.

aber was ich noch nicht hinbekommen habe ist, dass das programm dieses wort im text korrigiert. das ganz soll natürlich per eingabeaufforung geregelt werden.

jetzt weiß ich das ich das auf 2 möglichkeiten realisieren kann.

1. Ich kann das programm dazubringen, den text den es überprüft, danach Wort für Wort in die datei wieder reinzuschreiben... was sehr unpraktisch wäre, denn satzzeichen reinzubringen wäre zusätzliche arbeit und das programm würde in der geschwindigkeit sehr drunter leiden.

2. ich finde einen befehl der das wort was überprüft wird und nicht passt durch das korrekt geschriebene ersetzt(replace-befehl)


meine frage ist: gibt es einen replace befehl in diesem fall oder wie kann man das umsetzen.

anbei der aktuelle code:

Code: Alles auswählen

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

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("story.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('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:
            d = open("story.txt", "a")
            v = open("vollform.txt", "a")
            f = open("wordsnotinvollform.txt", "a")
            g = open("wordsinvollform.txt", "a")
            wl = w + "\n"
            if w in wordList:
                g.writelines(wl)
            else:
                edit = raw_input("Möchten Sie den Begriff " + w + " zum Wörterbuch hinzufügen?")
                if edit in positiv:
                    v.writelines(wl)
                    print w + " wurde zum Wörterbuch hinzugefügt!"
                elif edit in negativ:
                    edit2 = raw_input("Möchten Sie den Begriff " + w + " im Text ändern?")
                    if edit2 in positiv:
                        editw = raw_input("Schreiben Sie das Wort bitte richtig.")
                        w = editw
                        d.write(w)
                    elif edit2 in negativ:
                        f.writelines(w)
               
    print time.time() - start, "sec"


    f.close()
    g.close()
   

if __name__ == "__main__":
    main()
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Hi TEXTiX-X!
  1. Dieses replace-Ding kannst du in einer Schleife oder mit re viel kürzer schreiben.
  2. Du öffnest für jedes Wort in der zu testenden Datei 4 Weitere Dateien, die 500.000 oder 200.000 Wörter enthalten.
  3. Die eingentliche Textdatei wird zu einem set-Objekt eingelesen.

    :arrow: So kannst du das Wort nicht ersetzen. Du kannst zwar die gesammte Textdatei einlesen, dann "dein text mit feler".replace("feler", "fehern") schreiben, und das ganze wieder in die datei schreiben, aber da hast du 3 große Probleme:
    1. Du ersetzt alle Worte im Text, was nicht erwünscht sein muss.
    2. Du weißt selbst nicht, welches Wort gemeint ist, da durch das set'ten
      viele Infos verloren gehen, und mit .find() ist da auch nix zu machen,
      denn die Identität der einzelnen Wörter wird durch set zerstört.
    3. Du erkennst keine Gramatik, so würdes du "felers" nach user-eingabe durch "fehler" ersetzen, im kontex ist es aber eine andere Form (~"des fehlers größter...")
:arrow: So ein Rechtschreibprogramm ist wesentlich komplizierter als man denkt, und "nur worte ersetzen" geht halt auch nicht. :wink:

Gruß, jj
TEXTiX-X
User
Beiträge: 20
Registriert: Montag 22. Oktober 2007, 08:40
Wohnort: Dortmund
Kontaktdaten:

danke für die antwort:

zu 1.: das mit re ist so ne sache... ich hab das noch nicht ganz verstanden.... irgendwie

zu 2.: 2 der texdateien sind leer. alle 4 dateien werde geöffnet damit aus ihnenn weiterhin gelesen werden kann dachte ich und das in ihnen auch geschrieben werden kann.

zu 3. das versteh ich nicht ganz. ich dachte mir das ich meine wörterbuch-datei mit dem set-datentyp einlese damit das programm schneller wird. was es letztendlich auch ist....

wenn dadurch das wort nicht ersetzbar ist, hhmmmm dann ist das ja doof -.-
BlackJack

Vielleicht ist dieses Projekt für den Anfang einfach eine Nummer zu gross.

zu 1.: Für das Erkennen und Ersetzen der Worte bietet sich `re.sub` an. Da kann man statt eines Ersetzungstextes auch eine Funktion angeben, die mit dem Match-Objekt aufgerufen wird und die Ersetzung zurückgibt. Wenn das Wort bekannt ist, gibt man es einfach zurück, sonst fragt man den Benutzer.

zu 2.: Das öffnen der Dateien geschieht an einer sehr ungünstigen Stelle. Du öffnest für *jedes Wort* diese vier Dateien. Wenn Du 1000 Worte hast, dann werden die Dateien auch 1000 mal geöffnet. Und nie geschlossen. Das funktioniert bei CPython zufällig, da sollte man sich aber nicht drauf verlassen. Und selbst hier verschwendet man einfach Zeit mit dem öffnen/erstellen von 3996 unnötigen Dateiobjekten.

Das schreiben eines neuen Wortes in die Wörterbuchdatei berücksichtigt das Wort im aktuellen Programmlauf noch nicht, es wird also trotzdem immer wieder als falsch angezeigt. Ich würde die Wörter in das `set()` speichern und das erst am Ende wieder (sortiert) in eine Textdatei schreiben.

zu 3.: Ja das einlesen des *Wörterbuchs* in ein `set()` beschleunigt das Programm. Weil man für ein Wort nun schnell testen kann, ob es in diesem `set()` enthalten ist. Das Problem ist das einlesen von `story.txt` in ein `set()`. Damit hast Du den Text nicht mehr sondern nur noch die Worte.

----

Es ist auch immer noch viel zu viel in der Hauptfunktion. Eine Funktion die den Benutzer nach einer Ja/Nein-Eingabe fragt und entsprechend `True` oder `False` zurückgibt, kann man da zum Beispiel rausziehen. Die ganzen Antwortmöglichkeiten sind Spielerei. Wenn die Frage in deutsch gestellt wird, sollte als Antwort Ja oder Nein bzw. der jeweilige Anfangsbuchstabe unabhängig von Gross-/Kleinschreibung genügen.

Wenn das ordentlich funktionieren soll, kommt man um Unicode nicht herum, nicht jeder benutzt 'cp1252' als Textkodierung, und ich denke auch um OOP ist schwer herumzukommen, wenn man das sauber schreiben möchte. Wie gesagt, ein relativ grosses Projekt.

Und eventuell ist es auch viel einfacher PyEnchant zu benutzen.
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

@TEXTiX-X:

(Nur falls du es nicht weißt...) OOP bedeutet Objekt Orientierte Programmierung, einfach gesagt gibt es keine einzelnen Funktionen wie bei deinem Programm, sondern Klassen, in denen sie zu finden sind. OOP bietet einige sinnvolle Möglichkeiten, solltest du meiner Meinung nach in naher Zukunft anfangen zu lernen :D
cyp++
User
Beiträge: 69
Registriert: Freitag 22. September 2006, 13:54

würde sich bei so vielen wörtern nicht eine datenbank lohnen? geht doch so schön in python.
BlackJack

So viele sind's doch gar nicht. Das hatten wir am Anfang ja schon einmal: Das sollte locker in den Hauptspeicher passen.

Die grossen Probleme, zumindest wenn das alles Neuland ist, sind eher reguläre Ausdrücke oder wie auch immer man die Worte aus dem Fliesstext isolieren möchte und Unicode. Und dass dann alles sinnvoll verbinden. Da wäre eine Datenbank statt eines einfachen `set()` wahrscheinlich nur noch mehr Neuland für den OP. :-)
Antworten