[Trennmuster] Seltsames Verhalten von `abgleich-neueintraege.py`
Arthur Reutenauer
arthur.reutenauer at normalesup.org
Mi Apr 8 01:48:31 CEST 2020
Am Montag den 6. April 2020 um 16:31:36 +0200 hat Werner LEMBERG geschrieben:
> Also ich bin der Meinung, daß das *nichts* mit einem Speicherproblem
> zu tun hat.
Das Problem liegt an der Funktion „trenne_key“, die Einträge der
Wortliste manchmal verändert. Ein repräsentativer Auszug dieser Funktion
ist
for k1, k2 in zerlege(key):
...
e1 = words.get(k1)
e2 = words.get(k2)
...
if len(e1) != len(e2)
e1.complete()
e2.complete()
wobei „words“ die Wortliste ist, „key“ ein Eintrag deren und
„zerlege“ eine Funktion, die die Liste aller Zerlegungen eines Wort
ausgibt, wie z. B. aus
abenteuerbegeistert
die Liste
[
("a", "benteuerbegeistert"),
("ab", "enteuerbegeistert"),
("abe", "nteuerbegeistert"),
...
("abenteuerbegeist", "ert"),
("abenteuerbegeiste", "rt"),
("abenteuerbegeister", "t")
]
Nur diejenigen Wortteile sind relevant, die selbst beide in der
Wortliste zu finden sind. In diesem Fall findet man in der Wortliste
Abenteuer;A·ben-teu-er
und
begeistert;-2-;be<gei-stert;be<geis-tert
Die Länge eines Entrags von der Wortliste ist die Anzahl seiner
Felder, hier also 2 bzw. 4. Da diese nicht übereinstimmen, werden die
Einträge „ergänzt“, das ist zu sagen, dass sie beide mit Einträgen mit 8
Feldern ersetzt werden, hier
Abenteuer;A·ben-teu-er;A·ben-teu-er;A·ben-teu-er;A·ben-teu-er;A·ben-teu-er;A·ben-teu-er;A·ben-teu-er
und
begeistert;-2-;be<gei-stert;be<geis-tert;-5-;-6-;-7-;-8-
Diese Ergänzung erfolgt in der Wortliste direkt, weil e1 und e2 keine
selbstständige Variablen sind, sondern Pointer in die Wortliste. Das
kann später unerwünschte Folgen haben, wie etwa mit der fünfzeiligen
Eingabe
abenteuerbegeistert
Abenteuerbereiches
Abflugbereiches
Abflugflughagens
Abflughafens
Mit der ersten Zeile werden wie oben erklärt die Einträge „Abenteuer“
und „begeistert“ der Wortliste zu acht Felder ergänzt. Bei der zweiten
Zeile „kontaminiert“ dann „Abenteuer“ das Wort „Bereiches“, das nun auch
acht Felder besitzt. Weiter werden zur Zeile 3 „Abflug“ (durch
„Bereiches“) und Z. 4 „Flughafens“ (durch „Abflug“) mit mehreren
unnötigen Feldern erweitert.
Mit der letzten Zeile „Abflughafens“ kommt nun etwas Neues vor, weil
das Wort hier nicht von „trenne_key“, sondern von einer anderen Funktion
namens „praefixabgleich“ behandelt wird. Bisher hatten die Veränderungen
keinen Einfluss auf die Ausgabe des Skriptes, aber die Präfixfunktion
benutzt die aktuelle Wortliste, um ein vollkommen neues Objekt
herzustellen, etwa „Abflughafen;(Ab<flug=ha-fens)^7“ mit sechs
überflüssigen Feldern.
Das passiert ganz oft und erklärt viele anscheinend erstaunliche
Einträge im Ergebnis des Skriptes. Ich schlage vor, die Zeilen
e1.complete()
e2.complete()
durch
e1 = e1.completed()
e2 = e2.completed()
zu ersetzen, die eine Kopie der jeweiligen Worteile ausgeben, anstatt
sie an der Stelle zu verändern. Das korrigiert ganz viele Fehler und ich
habe keinen Unterschied mit der Laufzeit gemerkt (61-62 Minuten auf
meinem Server).
Mit freundlichen Grüßen,
Arthur
Mehr Informationen über die Mailingliste Trennmuster