Wörterbuch-Skript - Verbesserungen/Verwerfungen?

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.
Antworten
Kelhim
User
Beiträge: 16
Registriert: Donnerstag 17. Mai 2007, 13:18
Wohnort: Köln

Hallo - die deutsche Rechtschreibprüfung für OpenOffice.org ist bekanntlich nicht die beste, darum habe ich ein Skript entworfen, das aus einer Textdatei alle Wörter herausliest, sinnvoll filtert und in eine für OpenOffice.org geeignete Form bringt. Ich bin aber noch sehr neu bei Python und glaube, dass es da noch einiges zu verbessern gibt ... Wenn jemand Interesse hat, kann er mir vielleicht etwas helfen. :)

Das Skript funktioniert bisher sehr gut, und OOo Writer kann mit dem fertigen Wörterbuch umgehen, wenn man es manuell einbindet. Im Wörterbuch-Dialog im Writer selbst wird es aber leider nicht angezeigt, Änderungen müssen also an der Wörterbuch-Datei selbst vorgenommen werden!

http://paste.pocoo.org/show/1526/
(BlackJack: Quelltext in Pocoo ausgelagert.)

Über Ratschläge/Hinweise würde ich mich freuen!
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Ohne genau weitergelesen zu haben:

Die Replace Kaskade könntest du ungefair so lösen:

Code: Alles auswählen

In [1]: chars = ['.', ':', ',', '!', '?', '"', "'", '`', '<', '>', '(', ')', '{', '}', '[', ']', '/', '\\', '$', '%', '&', '=', '#', '+', '*', '~', '|', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

In [9]: for c in text:
   ...:     if c in chars:
   ...:         text = text.replace(chars[chars.index(c)], ' ')
Oder gleich mit regular expressions:

Code: Alles auswählen

In [1]: chars = ['.', ':', ',', '!', '?', '"', "'", '`', '<', '>', '(', ')', '{', '}', '[', ']', '/', '\\', '$', '%', '&', '=', '#', '+', '*', '~', '|', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
In [13]: text
Out[13]: 'ldadadadad ##****'
In [17]: rex = r'|'.join([re.escape(x) for x in chars])
In [18]: rex
Out[18]: '\\.|\\:|\\,|\\!|\\?|\\"|\\\'|\\`|\\<|\\>|\\(|\\)|\\{|\\}|\\[|\\]|\\/|\\\\|\\$|\\%|\\&|\\=|\\#|\\+|\\*|\\~|\\||0|1|2|3|4|5|6|7|8|9'

In [19]: text = re.sub(re.compile(rex), ' ', text)

In [20]: text
Out[20]: 'ldadadadad       '
MfG EnTeQuAk
BlackJack

Da sind Einrückungsfehler, dass läuft so nicht. Zum Beispiel Zeile 110 ff.

Ich sollte mir mal einen Textbaustein für folgenden Satz bereitlegen: Werte sollten Funktionen in aller Regel als Argumente betreten und als Rückgabewerte verlassen. Entferne mal alle ``global``-Anweisungen aus dem Programm. Sonst ist der Datenfluss im Programm absolut undurchsichtig.

Der Quelltext enthält Zeilen die länger als 80 Zeichen sind. Der Backslash zum fortsetzen einer Zeile ist in "triple-quoted"-Zeichenketten nicht nötig, bei Doctsrings macht er deren Formatierung kaputt. Lass Dir mal einen im Interpreter anzeigen.

Diese unglaublich vielen nahezu gleichen Zeilen in `zusammenstellung()` sind unschön. Das kann man entweder mit einer Schleife lösen, oder die `translate()`-Methode auf (Unicode-)Zeichenketten verwenden.

Die Anzahl der Wörter kann man vor dem Zusammenfügen per `join()` von der Liste abfragen, statt nach dem Zusammenfügen die Zeilenenden-Zeichen zu zählen.

Die Rekursion in `dic_erweitern()` sollte man durch eine Schleife ersetzen. Und die Funktion ist sehr eigenartig. `out_file` wird geöffnet und nicht benutzt oder geschlossen. Dann wird der Text in `j` (unpassender und nichtssagender Name) als 'latin-1' kodiert angehängt um danach wieder eingelesen zu werden. Dann wird versucht als 'utf-8' zu dekodieren, was total sinnlos ist, da es sowieso nur funktioniert wenn der Text in ASCII ist. Sobald etwas ausserhalb von ASCII vorkommt klappt dekodieren als 'utf-8' nicht, weil der Text ja 'latin-1' kodiert geschrieben wurde.

Ausserdem enthält doch die erste Zeile der Datei die Anzahl der Einträge. Die stimmt dann ja nicht mehr, wenn weitere Worte einfach angehängt werden. Die Worte sind auch nicht mehr sortiert und die neuen Worte können welche enthalten die schon in den Alten vorkommen.

In `quelldatei_angeben()` ist wieder dieses ungewöhnliche Konstrukt, dass eine Datei erst geöffnet wird um zu testen ob es geht um sie danach gleich nochmal zu öffnen. Einmal reicht, daran sieht man dann ja ob es klappt oder nicht. Das ``try``/``except`` muss einfach nur richtig um das Öffnen und Einlesen gelegt werden.

Das Suchen in `avoid_words()` ist furchtbar umständlich und langsam. Für jede Zeile, wird für jedes Zeichen in der Zeile **nochmal jede Zeile** durchgegangen! Nimm Dir ein Stück Papier und eine Liste, mit sagen wir mal drei Worten, und geh diesen Algorithmus mal per Hand durch.

Hier wird auch wieder Rekursion verwendet wo eigentlich Iteration angebrachter wäre.

Der Quelltext ist übrigens lang genug, dass das Sch…-Board schon wieder Probleme bekommt. :-(
Antworten