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!
Lückentext ersetzen
- __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
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__.__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?
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
- __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.
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.
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
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
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.__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.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.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
- __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:
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.
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
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
- __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
@__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
- __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?
@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
Doch es ist so, wie du meinst__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?
Okay, danke sehr, ich werde es ausprobieren! ;D__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: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.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
Du musst Beiträge übrigens nicht in Gänze zitieren. Der steht ja direkt darüber schon im Original.
__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: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.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
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!
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.
Ok, danke! Ich werds mir überlegen!nezzcarth hat geschrieben: ↑Samstag 10. Oktober 2020, 11:46Wie 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?
- __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:
Bei den Lückenworten sind ja noch Satzzeichen dran. Das geht natürlich nicht:
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.
Code: Alles auswählen
In [56]: "für".encode("cp1252").decode("utf-8")
Out[56]: 'für'
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
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
Ok, danke! Ja das letztere Problem habe ich behoben!__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:Bei den Lückenworten sind ja noch Satzzeichen dran. Das geht natürlich nicht:Code: Alles auswählen
In [56]: "für".encode("cp1252").decode("utf-8") Out[56]: 'für'
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.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
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.