Lückentext ersetzen

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.
decoder
User
Beiträge: 12
Registriert: Dienstag 6. Oktober 2020, 11:18

Hallo! Ich habe folgendes Problem: Ich habe längere Lückentexte die z.B. so aussehen: _h __, _a_. Und dazu sind Worte gegeben : 'je', 'was', 'oh' . Wie kann ich diese Lücken richtig füllen?
Ich muss die Liste aus einer Datei auslesen und das habe ich auch schon hingekriegt und die Worte und den Lückentext in zwei verschieden Listen gepackt (Nur falls diese Tatsachen was ändern). Danke sehr!
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Im ersten Schritt überleger du dir, wie du die Aufgabe selbst, ohne Programm, lösen würdest. Die Schritte überträgst du dann in Code.
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@decoder: Die Aufgabe ist IMHO ein bisschen unterspezifiziert. Im Beispiel passt beispielsweise auf jedes ”Lückenwort” exakt ein Wort. Ist das garantiert, oder kann es auch sein, dass man mehrere Varianten durchprobieren muss, weil es sonst nicht aufgeht? Und das wäre auch eine Frage: geht es denn garantiert immer auf?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
decoder
User
Beiträge: 12
Registriert: Dienstag 6. Oktober 2020, 11:18

__blackjack__ hat geschrieben: Dienstag 6. Oktober 2020, 20:24 @decoder: Die Aufgabe ist IMHO ein bisschen unterspezifiziert. Im Beispiel passt beispielsweise auf jedes ”Lückenwort” exakt ein Wort. Ist das garantiert, oder kann es auch sein, dass man mehrere Varianten durchprobieren muss, weil es sonst nicht aufgeht? Und das wäre auch eine Frage: geht es denn garantiert immer auf?
So würde eins der schwereren Lückentexte aussehen, wenn es deine Frage beantwortet: __s __e___ _a___ e____ _____n_ _u_ _________ ____m__ ________, _a__ _r s___ _n _____m ___t _u ____m ___________ ______e___ _______e__.
Das sind die Worte zum ausfüllen:
er in zu Als aus Bett fand sich einem eines Samsa Gregor seinem Morgens Träumen erwachte unruhigen Ungeziefer verwandelt ungeheueren
decoder
User
Beiträge: 12
Registriert: Dienstag 6. Oktober 2020, 11:18

sparrow hat geschrieben: Dienstag 6. Oktober 2020, 13:34 Im ersten Schritt überleger du dir, wie du die Aufgabe selbst, ohne Programm, lösen würdest. Die Schritte überträgst du dann in Code.
Okay, danke sehr! Ich werde es mir überlegen!
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@decoder: Also sind die Lückenworte erst einmal nicht direkt eindeutig zuordnenbar. Bei dem Beispiel gibt es zwei Lückenworte mit jeweils zwei Kandidaten.

Code: Alles auswählen

         _n: in
         _r: er
         _u: zu
        __s: Als | aus
        _u_: aus
       ___t: Bett
       _a__: fand
       s___: sich
      ____m: einem
      _a___: Samsa
      e____: einem | eines
     _____m: seinem
     __e___: Gregor
    _____n_: Morgens
    ____m__: Träumen
   ________: erwachte
  _________: unruhigen
 _______e__: verwandelt
 ______e___: Ungeziefer
___________: ungeheueren
Man kann also schon mal nicht einfach linear zu jedem Lückenwort das eine passende Wort suchen wie das im ersten Beispiel noch möglich war.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
decoder
User
Beiträge: 12
Registriert: Dienstag 6. Oktober 2020, 11:18

__blackjack__ hat geschrieben: Mittwoch 7. Oktober 2020, 08:50 @decoder: Also sind die Lückenworte erst einmal nicht direkt eindeutig zuordnenbar. Bei dem Beispiel gibt es zwei Lückenworte mit jeweils zwei Kandidaten.

Code: Alles auswählen

         _n: in
         _r: er
         _u: zu
        __s: Als | aus
        _u_: aus
       ___t: Bett
       _a__: fand
       s___: sich
      ____m: einem
      _a___: Samsa
      e____: einem | eines
     _____m: seinem
     __e___: Gregor
    _____n_: Morgens
    ____m__: Träumen
   ________: erwachte
  _________: unruhigen
 _______e__: verwandelt
 ______e___: Ungeziefer
___________: ungeheueren
Man kann also schon mal nicht einfach linear zu jedem Lückenwort das eine passende Wort suchen wie das im ersten Beispiel noch möglich war.
Ja, ich habe mir überlegt, dass man überprüfen kann ob worte mit der gleichen Länge da sind und dann kann man noch gucken ob sie einen gleichen Buchstaben haben, aber da bin ich mir nicht sicher wie man das im Code umsetzen kann.
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das kombiniert man am besten in einer Funktion, also Länge vergleichen und ob die Buchstaben passen. Ich habe da eine Testfunktion geschrieben die ein Lückenwort und ein Wort als Argumente bekommt und `True` liefert wenn die beiden zusammen passen und `False` andernfalls:

Code: Alles auswählen

In [2]: does_match("_____n", "python")                                          
Out[2]: True

In [3]: does_match("_____n", "photon")                                          
Out[3]: True

In [4]: does_match("_____n", "java")                                            
Out[4]: False

In [5]: does_match("_____n", "foobar")                                          
Out[5]: False
Damit kann man sich dann beispielsweise Code schreiben der zu jedem Lückenwort alle passenden Worte sucht und das in einer passenden Datenstruktur speichern. So ist letztlich die Ausgabe in meinem letzten Beitrag entstanden.

Du musst Beiträge übrigens nicht in Gänze zitieren. Der steht ja direkt darüber schon im Original. 🙂
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
nezzcarth
User
Beiträge: 1636
Registriert: Samstag 16. April 2011, 12:47

@decoder:
Ein Stichwort für einen möglichen Lösungsansätze ist Backtracking.
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@nezzcarth: Bis jetzt aber noch nicht wirklich notwendig. Das aktuelle Beispiel lässt sich noch recht simpel ohne lösen. Und wenn man das tatsächlich zum lösen *braucht* funktioniert es eigentlich auch nicht mehr, denn dann hat man nicht mehr eine Lösung sondern mehrere von denen am Ende der Mensch sich den Text aussuchen muss der Sinn macht. Sofern man dann nicht mit „natural language processing“ anfangen will die Ergebnisse zu bewerten. 🙂
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
nezzcarth
User
Beiträge: 1636
Registriert: Samstag 16. April 2011, 12:47

@__blackjack__: Dann stehe ich gerade auch auf dem Schlauch, wie man ohne Backtracking, effizient z.B. an der ersten Position auf die richtige Lösung schließen kann, ohne die besonderen Regeln für die Großschreibung mit einzubeziehen. Bin schon später auf die Lösung gespannt :)
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@nezzcarth: Ich denke ich mache da eine Annahme die ich allgemein nicht machen dürfte. Aber bei dem Beispiel geht die.

@decoder: Auch in dem komplexen Beispiel sind alle Lückenworte und alle Worte paarweise verschieden und beide Listen sind gleich lang. Ist das immer so? Und falls nicht, kannst Du Beispiele zeigen?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
nezzcarth
User
Beiträge: 1636
Registriert: Samstag 16. April 2011, 12:47

Ich kann inzwischen bestätigen, dass es mit den Beispielen tatsächlich ohne Backtracking geht und ziehe meinen Vorschlag zurück. :)
decoder
User
Beiträge: 12
Registriert: Dienstag 6. Oktober 2020, 11:18

__blackjack__ hat geschrieben: Mittwoch 7. Oktober 2020, 20:05 @nezzcarth: Ich denke ich mache da eine Annahme die ich allgemein nicht machen dürfte. Aber bei dem Beispiel geht die.

@decoder: Auch in dem komplexen Beispiel sind alle Lückenworte und alle Worte paarweise verschieden und beide Listen sind gleich lang. Ist das immer so? Und falls nicht, kannst Du Beispiele zeigen?
Doch es ist so, wie du meinst
decoder
User
Beiträge: 12
Registriert: Dienstag 6. Oktober 2020, 11:18

__blackjack__ hat geschrieben: Mittwoch 7. Oktober 2020, 17:52 Das kombiniert man am besten in einer Funktion, also Länge vergleichen und ob die Buchstaben passen. Ich habe da eine Testfunktion geschrieben die ein Lückenwort und ein Wort als Argumente bekommt und `True` liefert wenn die beiden zusammen passen und `False` andernfalls:

Code: Alles auswählen

In [2]: does_match("_____n", "python")                                          
Out[2]: True

In [3]: does_match("_____n", "photon")                                          
Out[3]: True

In [4]: does_match("_____n", "java")                                            
Out[4]: False

In [5]: does_match("_____n", "foobar")                                          
Out[5]: False
Damit kann man sich dann beispielsweise Code schreiben der zu jedem Lückenwort alle passenden Worte sucht und das in einer passenden Datenstruktur speichern. So ist letztlich die Ausgabe in meinem letzten Beitrag entstanden.

Du musst Beiträge übrigens nicht in Gänze zitieren. Der steht ja direkt darüber schon im Original. 🙂
Okay, danke sehr, ich werde es ausprobieren! ;D
decoder
User
Beiträge: 12
Registriert: Dienstag 6. Oktober 2020, 11:18

__blackjack__ hat geschrieben: Mittwoch 7. Oktober 2020, 17:52 Das kombiniert man am besten in einer Funktion, also Länge vergleichen und ob die Buchstaben passen. Ich habe da eine Testfunktion geschrieben die ein Lückenwort und ein Wort als Argumente bekommt und `True` liefert wenn die beiden zusammen passen und `False` andernfalls:

Code: Alles auswählen

In [2]: does_match("_____n", "python")                                          
Out[2]: True

In [3]: does_match("_____n", "photon")                                          
Out[3]: True

In [4]: does_match("_____n", "java")                                            
Out[4]: False

In [5]: does_match("_____n", "foobar")                                          
Out[5]: False
Damit kann man sich dann beispielsweise Code schreiben der zu jedem Lückenwort alle passenden Worte sucht und das in einer passenden Datenstruktur speichern. So ist letztlich die Ausgabe in meinem letzten Beitrag entstanden.

Du musst Beiträge übrigens nicht in Gänze zitieren. Der steht ja direkt darüber schon im Original. 🙂


lueckenfuellen = ['arbeit', 'eine', 'für', 'je', 'oh', 'was']
luecken = ['_h','__,', '_a_',' __r', '___e', '__b','___!']
def does_match (a,b):
if len(a) == len(b): #und sie den gleichen buchstaben haben
return does_match

does_match(luecken[0], lueckenfuellen[1])

does_match(luecken[0], lueckenfuellen[1])

does_match(luecken[0], lueckenfuellen[2])

does_match(luecken[0], lueckenfuellen[3])

does_match(luecken[0], lueckenfuellen[4])

does_match(luecken[0], lueckenfuellen[5])

does_match(luecken[0], lueckenfuellen[6])

Ich bin mir nicht sicher wie ich nun überprüfen kann ob die Worte den gleichen Buchstaben enthalten, ich hoffe, dass ich da auch noch Hilfe bekommen kann und noch eine Frage, funktioniert die Abfrage unter der Funktion so oder beziehungsweise, was muss ich ändern, dass diese Funktioniert, da bei mir ein Error kam : "list index out of range". Danke nochmals!
nezzcarth
User
Beiträge: 1636
Registriert: Samstag 16. April 2011, 12:47

decoder hat geschrieben: Samstag 10. Oktober 2020, 11:05 Ich bin mir nicht sicher wie ich nun überprüfen kann ob die Worte den gleichen Buchstaben enthalten,
Wie würdest du das denn per Hand machen? In der Realität kann man es zwar meistens auf den ersten oder zweiten Blick erahnen, aber wenn du ganz systematisch vorgehen müsstest? Zum Beispiel kann man damit anfangen, die Zeichen der beiden Zeichenketten paarweise nacheinander zu vergleichen. Welche Fälle können bei den Vergleichen auftreten?
Zuletzt geändert von nezzcarth am Samstag 10. Oktober 2020, 11:54, insgesamt 2-mal geändert.
decoder
User
Beiträge: 12
Registriert: Dienstag 6. Oktober 2020, 11:18

nezzcarth hat geschrieben: Samstag 10. Oktober 2020, 11:46
decoder hat geschrieben: Samstag 10. Oktober 2020, 11:05 Ich bin mir nicht sicher wie ich nun überprüfen kann ob die Worte den gleichen Buchstaben enthalten,
Wie würdest du das denn per Hand machen? In der Realität kann man es zwar meistens auf den ersten oder zweiten Blick erahnen, aber wenn du ganz systematisch vorgehen müsste? Zum Beispiel kann man damit anfangen, die Zeichen der beiden Zeichenketten paarweise nacheinander zu vergleichen. Welche Fälle können bei den Vergleichen auftreten?
Ok, danke! Ich werds mir überlegen!
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@decoder: Irgendwo auf dem Weg der Daten hat was mit der Kodierung nicht geklappt: "für" sollte wohl "für" heissen. Falls das beim Einlesen passiert: Bei Textdateien ist es wichtig, dass man beim öffnen die korrekte Kodierung angibt. Die Vermutung liegt nahe, dass hier eine UTF-8 kodierte Textdatei fälschlicherweise als CP1252 eingelesen wurde:

Code: Alles auswählen

In [56]: "für".encode("cp1252").decode("utf-8")                                
Out[56]: 'für'
Bei den Lückenworten sind ja noch Satzzeichen dran. Das geht natürlich nicht:

Code: Alles auswählen

In [58]: len("je")                                                             
Out[58]: 2

In [59]: len("__,")                                                            
Out[59]: 3

In [60]: does_match("__,", "je")                                              
Out[60]: False
Ich habe in meinem kleinen Testcode eine `fill()`-Funktion die als erstes Argument den kompletten Lückentext als Zeichenkette bekommt und (mit Hilfe einer weiteren Funktion) da nur die Lückenworte ohne Satzzeichen draus ermittelt. Für das ermitteln der Füllworte aus dem Lückentext sind reguläre Ausdrücke ganz praktisch. Also das `re`-Modul in der Standardbibliothek.

Deine Aufteilung des Lückentextes ist auch falsch: Du hast das letzte Wort zerteilt! Hast Du das manuell gemacht, oder ist das ein Fehler in den Eingangsdaten? Beziehungsweise hast Du das überhaupt falsch gemacht? Denn *mit* diesem Fehler dürft es keinen `IndexError` geben. Ohne den Fehler aber schon.

Um Lückenwort und Füllwort buchstabenweise zusammen durch zu gehen ist die `zip()`-Funktion nützlich. Und dann entweder eine Schleife, oder wenn man es kompakter möchte die `any()`-Funktion und ein Generatorausdruck.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
decoder
User
Beiträge: 12
Registriert: Dienstag 6. Oktober 2020, 11:18

__blackjack__ hat geschrieben: Samstag 10. Oktober 2020, 14:04 @decoder: Irgendwo auf dem Weg der Daten hat was mit der Kodierung nicht geklappt: "für" sollte wohl "für" heissen. Falls das beim Einlesen passiert: Bei Textdateien ist es wichtig, dass man beim öffnen die korrekte Kodierung angibt. Die Vermutung liegt nahe, dass hier eine UTF-8 kodierte Textdatei fälschlicherweise als CP1252 eingelesen wurde:

Code: Alles auswählen

In [56]: "für".encode("cp1252").decode("utf-8")                                
Out[56]: 'für'
Bei den Lückenworten sind ja noch Satzzeichen dran. Das geht natürlich nicht:

Code: Alles auswählen

In [58]: len("je")                                                             
Out[58]: 2

In [59]: len("__,")                                                            
Out[59]: 3

In [60]: does_match("__,", "je")                                              
Out[60]: False
Ich habe in meinem kleinen Testcode eine `fill()`-Funktion die als erstes Argument den kompletten Lückentext als Zeichenkette bekommt und (mit Hilfe einer weiteren Funktion) da nur die Lückenworte ohne Satzzeichen draus ermittelt. Für das ermitteln der Füllworte aus dem Lückentext sind reguläre Ausdrücke ganz praktisch. Also das `re`-Modul in der Standardbibliothek.

Deine Aufteilung des Lückentextes ist auch falsch: Du hast das letzte Wort zerteilt! Hast Du das manuell gemacht, oder ist das ein Fehler in den Eingangsdaten? Beziehungsweise hast Du das überhaupt falsch gemacht? Denn *mit* diesem Fehler dürft es keinen `IndexError` geben. Ohne den Fehler aber schon.

Um Lückenwort und Füllwort buchstabenweise zusammen durch zu gehen ist die `zip()`-Funktion nützlich. Und dann entweder eine Schleife, oder wenn man es kompakter möchte die `any()`-Funktion und ein Generatorausdruck.
Ok, danke! Ja das letztere Problem habe ich behoben!
Antworten