Wörter zählen

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
kl.as
User
Beiträge: 8
Registriert: Mittwoch 14. März 2018, 12:24

Hallo, ich habe eine Textdatei "Hallo Hallo wie geht es dir", bei welcher gezählt werden soll wie oft die Wörter vorkommen. Als Ergebnis möchte ich ein Dictionary in folgender Form:
{'Hallo': 2,
'wie': 1,
'geht': 1,
'es': 1,
'dir': 1}

Mein Code sieht folgender Maßen aus:

Code: Alles auswählen

result = {}
   for f in files:
      for line in read(f):
        for word in line:
            word = normalize(word)
counts = dict()
   for word in normalize(word):
   if word in counts:
      counts[word]+=1
   else:
      counts[word]=1

return counts
return result

Ich bekomme als Ergebnis ein Dictionary das die einzelnen Buchstaben von nur einem Wort zählt, und finde den Fehler nicht.
Alle Variablen und Definitionen sind bereits definiert.

Danke für Hilfe!
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dein Problem ist, dass "for ding in string" nicht die Woerter iteriert, sondern - wie du schon festgestellt hast - die einzelnen Zeichen.

Was du brauchst ist "for wort in string.split()".
kl.as
User
Beiträge: 8
Registriert: Mittwoch 14. März 2018, 12:24

was meinst du mit "for ding in string" ? Ich werde nicht ganz schlau daraus :K
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist doch das was du tust. "for word in line" ist das gleiche.... :K Und das funktioniert ja nun offensichtlich nicht. Was du brauchst ist ein Weg, die Zeile aufzutrennen. Was mit "string.split()" geht. Was das genau tut kannst du ja mal in der Dokumentation nachsehen, dann wird dir auch klar, warum das funktioniert.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@kl.as: Deine Funktion sieht noch etwas seltsam aus. `result` wird nicht verwendet, und bei zwei `return` wird auch nur das erste ausgeführt, weil dann die Funktion ja auch schon zum Aufrufer zurückkehrt. Du mußt Dein Problem in mehrere Teilstücke zerteilen und am besten das Ergebnis jedes Teilstücks in Listen speichern (später macht man das mit Generatoren):
1. Lesen der Dateien und aufspalten in Wörter (__deets__ hat ja schon erklärt, dass man das mit split macht)
2. Normalisieren der Wörter
3. Zählen der Wörter (dafür gibt es collections.Counter)
kl.as
User
Beiträge: 8
Registriert: Mittwoch 14. März 2018, 12:24

zu 1. das Lesen der der Datei und aufspalten des Textes (die Wörter sind alles einzelne Strings in einer Liste) habe ich mit read() bereits definiert und in einem anderen Teilstück des Codes gemacht.
zu 2. ebenso steht normalize() für die Funktion die die Wörter normalisiert (auch bereits definiert)
zu 3. das ist eben noch mein Problem bei welchem ich nicht weiterkomme :cry:
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@kl.as: dass die Funktionen bereits existieren, davon bin ich ausgegangen. Aber read liefert lines und nicht Wörter und die Weiterverarbeitung der Schritte 1 und 2 stimmt auch noch nicht.
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

kl.as hat geschrieben:Ich bekomme als Ergebnis ein Dictionary das die einzelnen Buchstaben von nur einem Wort zählt, und finde den Fehler nicht.
Du hast ja auch zu Beginn eine Schleifensammlung aus der im Endeffekt nur die letzte Zuweisung an word übrigbleibt. Ich gehe mal davon aus, dass das ein String ist. Mit "for word in normalize(word)" läufst du dann über jeden Buchstaben im Rückgabewert von normalize(word) und zählst den.

Warum würdest du denn ein anderes Ergebnis erwarten?
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Sirius3 hat geschrieben:@kl.as: dass die Funktionen bereits existieren, davon bin ich ausgegangen. Aber read liefert lines und nicht Wörter und die Weiterverarbeitung der Schritte 1 und 2 stimmt auch noch nicht.
read ist vermutlich das da: viewtopic.php?f=1&t=42417&p=323025#p323032

Ich habe so ein wenig den Eindruck, hier kopiert sich jemand ohne Python-Grundlagenwissen sein Programm aus Fragmenten zusammen. Dass das fehlschlägt ist kein Wunder.
Antworten