um meine Bemühungen im Bezug auf das Erlernen von Python zu konkretisieren, habe ich mir folgendes Nonsense-Projekt ersonnen:
Ziel ist, die folgende Frage zu beantworten:
Ist eine KI in der Lage, Witze zu machen. Genauer gesagt: Wortspiele und Kalauer.
(vermutlich haben das schlauere Menschen als ich schon längst herausgefunden, aber mir geht's ja eher um den Lernprozess hintendran. Und um die Witze. Natürlich!

So und nun habe ich mir folgendes überlegt:
Ich habe eine Liste von Sprichworten und Filmzitaten aus Wikipedia extrahiert und daraus soll nun jeweils eine Liste an Nomen extrahiert werden, die anschließend durch ein Reimwort ersetzt werden.
Diese werden dann in den Sprichworten substituiert und anschließend muss ich mir überlegen, wie man an die Daten zur Klassifikation kommt (Ist es ein guter Witz oder ist es eher ein ganz übler Kalauer)
So und nun zu meinem (technischen) Problem:
Ich habe folgende Daten in einer Datei "Sprueche.txt":
Code: Alles auswählen
W
"Will Gott die Ameis' verderben, lässt er sie Flügel erwrben." - Citatboken, BokförlagetNatur och Kultur, Stockholm, 1967, ISBN 91-27-01681-1
"Willst du was gelten, dann mach dich selten!"
"Wir sind das Volk." - Ostdeutsche Forderung nach Freiheit und Selbstbestimmung, 1989
"Wissen ist Macht." - nach Francis Bacon Meditationes sacrae, 11
"Wo Bacchus das Feuer schürt, sitzt Frau Venus am Ofen."
"Wo das Auge nicht sehen will, helfen weder Licht noch Brill'."
"Wo Du nicht bist, Herr Jesu Christ, da schweigen alle Flöten!"
"Wo Dünkel über den Augen liegt, da kann kein Licht hinein."
"Wo ein Adler nicht fort kann, findet eine Fliege noch zehn Wege."
"Wo ein Wille ist, ist auch ein Weg."
"Wo gehobelt wird, da fallen Späne." - Wander-DSL, Bd. 2, Sp. 688, commons
"Wo kein Kläger, da kein Richter."
"Wo man singet, laß dich ruhig nieder, […] Bösewichter haben keine Lieder." - Johann Gottfried Seume, Die Gesänge. Gedichte, dritte, neuvermehrte und verbesserte Auflage, Wien und Prag (Franz Hans) 1810. S. 272
"Wo nichts ist, hat der Kaiser das Recht verloren." - Wander-DSL, Bd. 2, Sp. 1097, commons
"Wo Rauch ist, da ist auch Feuer."
"Wo viel Licht ist, ist auch viel Schatten." - nach Johann Wolfgang von Goethe, Götz von Berlichingen, Erster Akt; dort "Wo viel Licht ist, ist starker Schatten"
"Worte können tödliche Waffen sein."
"Worten sollten Taten folgen."
"Wovon man nicht sprechen kann, darüber muss man schweigen" - nach Ludwig Wittgenstein, aus: Tractatus logico-philosophicus, Satz 7, Frankfurt am Main 2003, ISBN 3-518-12429-3, Seite 111
X
"Ein Satz mit x: Das war wohl nix."
Y
Z
"Zehn mal Versagen ist besser als einmal Lügen."
"Zuerst der Herr, dann das G'scherr."
"Zu Tode gefürchtet ist auch gestorben."
"Zu viele Köche verderben den Brei." - Wander-DSL, Bd. 5, Sp. 1510, commons. (Dort zitiert als: "Viel Köche versalzen den Brei, deshalb sind auch die Herren mehr für Köchinnen.")
"Zusammen ist man stark."
"Zwei Dumme, ein Gedanke." - Wander-DSL, Bd. 4, Sp. 495, commons. (Dort zitiert als: "Zwei Seelen und ein Gedanke.")
"Zwei Regeln für Erfolg im Leben: erzähle nicht alles."
"Zweimal abgeschnitten und immer noch zu kurz, sagte der Schneider."
"Zwei Tode kann niemand sterben." - Wander-DSL, Bd. 4, Sp. 1244, commons
Wobei es gibt kein Problem im klassischen Sinne, sondern ich kann das Problem durchaus lösen, aber ich möchte gern wissen, warum meine Lösung funktioniert.
Denn aus der Doku bin ich da nicht so recht schau geworden (https://pandas.pydata.org/pandas-docs/s ... d_csv.html)
Ziel ist es, die 1. Spalte zu extrahieren und die nutzlosen Zeilen mit den Einzelbuchstaben zu eleminieren.
(Ob Pandas hier der richtige Weg ist oder ob das vielleicht ein bisschen "over-engeneered ist, sei mal dahingestellt.
Aber ich freue mich selbstverständlich, wenn ihr mir auch dazu ein Feedback gebt.)
Es geht um folgenden Codeschnipsel
Code: Alles auswählen
import pandas as pd
filename = "C:/Users/Buchfink/Documents/Projkete/WortspielGenerator/Sprueche.txt"
df = pd.read_csv(filename, encoding="UTF-8", delimiter="-")
Code: Alles auswählen
C:\ProgramData\Anaconda3\pythonw.exe C:/Users/Carina/PycharmProjects/pyQT_3/beispielWortspielGenerator.py
Traceback (most recent call last):
File "C:/Users/Carina/PycharmProjects/pyQT_3/beispielWortspielGenerator.py", line 4, in <module>
df = pd.read_csv(filename, encoding="UTF-8", delimiter="-")
File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 686, in read_csv
return _read(filepath_or_buffer, kwds)
File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 458, in _read
data = parser.read(nrows)
File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 1196, in read
ret = self._engine.read(nrows)
File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 2155, in read
data = self._reader.read(nrows)
File "pandas\_libs\parsers.pyx", line 847, in pandas._libs.parsers.TextReader.read
File "pandas\_libs\parsers.pyx", line 862, in pandas._libs.parsers.TextReader._read_low_memory
File "pandas\_libs\parsers.pyx", line 918, in pandas._libs.parsers.TextReader._read_rows
File "pandas\_libs\parsers.pyx", line 905, in pandas._libs.parsers.TextReader._tokenize_rows
File "pandas\_libs\parsers.pyx", line 2042, in pandas._libs.parsers.raise_parser_error
pandas.errors.ParserError: Error tokenizing data. C error: Expected 5 fields in line 20, saw 6
Process finished with exit code 1
Es steht ja auch im Meldungstext.
Wenn man nun jedoch stattdessen folgendes schreibt
Code: Alles auswählen
df = pd.read_csv(filename, encoding="UTF-8", delimiter="\" - ", engine="python")
Die Frage ist aber: Wie genau funktioniert denn der interne Mechanismus zur Erkennung der Spalten?
Indem ich in die zweite Zeile ein weiteres Minus eingefügt habe, habe ich folgenden Verdacht hinsichtlich des Algorithmus:
Code: Alles auswählen
W
"Will Gott die Ameis' verderben, lässt er sie Flügel erwrben." - Citat-boken, BokförlagetNatur och Kultur, Stockholm, 1967, ISBN 91-27-01681-1
Delimiter die Spalten zu ermitteln.
Und wenn dann in Zeile 20 plötzlich eine andere Spaltenzahl aus dem Delimiter ermittelt wird, schlägt er auf.
Ich wollte nun meine Vermutung mittels Debugger prüfen. (Die Wahrheit liegt ja bekanntermaßen "auf dem Platz - äh Verzeihung im Code)
Leider finde ich nicht die Stelle, wo er anhand des Delimiters die Zeile zerlegt....
Der Parser kann noch erstellt werden. Aber die Exception fliegt, wenn der Parser die Zeilen liest.
In der Pandas-Datei parsers.py habe ich hier meinen Haltepunkt gesetzt (siehe Aufrufstack der Fehlermeldung):
Code: Alles auswählen
def _read(filepath_or_buffer: FilePathOrBuffer, kwds):
"""Generic reader of line files."""
[...]
# Create the parser.
parser = TextFileReader(fp_or_buf, **kwds)
if chunksize or iterator:
return parser
try:
data = parser.read(nrows)
finally:
parser.close()
Code: Alles auswählen
def read(self, nrows=None):
try:
data = self._reader.read(nrows)
except StopIteration:
if self._first_chunk:
self._first_chunk = False
names = self._maybe_dedup_names(self.orig_names)
index, columns, col_dict = _get_empty_meta(
names,
self.index_col,
self.index_names,
dtype=self.kwds.get("dtype"),
)
columns = self._maybe_make_multi_index_columns(columns, self.col_names)
[...]
ich nutze PyCharm zum Debuggen.
Wo zerlegt er anhand des Delimiters die Zeilen in Spalten?
In die Zeile "data = self._reader.read(nrows)" kann man mit F7 nicht hineinspringen (mir ist es an dieser Stelle jedenfalls nicht gelungen)
Was genau macht die Zeile "except StopIteration:"?
Wenn ich da mit F7 hineindebugge, sprint er direkt zur aufrufenden funktion "ret = self._engine.read(nrows)" zurück (und nicht in den Except-Block, was ich erwartet hätte).
Was mache ich falsch?
Ich bin sehr gespannt auf Eure Antworten und danke Euch schon mal im Voraus.
Bitte sagt mir Bescheid, ob mein Problem verständlich dargelegt ist.
LG