String - alle Wörter weniger als X Zeichen löschen

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
Crusha
User
Beiträge: 4
Registriert: Donnerstag 13. Juni 2019, 23:26

Hey,

ich bräuchte eine Hilfestellung.

Ich lese einen größeren Text aus einer Textdatei ein. Nach dem auslesen filtere ich den Text, indem ich alle Sonderzeichen ersetze. Zum Schluss zähle ich alle Wörter die in der Textdatei enthalten sind.

Ich würde gerne nach der Filterung alle Füllwörter, Artikel usw auch filtern / löschen. Meine Idee wäre es alle Wörter mit maximal 5 Buchstaben ersetzt oder gelöscht werden, aber leider habe ich keine Idee wie ich das umsetzen könnte.

Eines was mir einfiel wäre es mit einer if Schleife dies zu prüfen und zu ersetzen, aber leider hapert es mit der Umsetzung.

Vielleicht könntet ihr mir dabei weiterhelfen.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

if-Schleifen gibt es nicht.
Wo ist das Problem, wenn Du die Wörter zählst, nur die zu zählen, deren Länge größer als 5 ist?

Was hast Du denn schon versucht? Zeige Code!
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Crusha: Nur so am Rande: Das was Du als filtern/Filterung bezeichnest ist etwas anderes. Beim Filtern werden Elemente entfernt, nicht ersetzt. Wenn Du filtern/Filterung sagst, dann denken Leser an das was die `filter()`-Funktion macht.

Du kannst entweder eine Schleife schreiben in der eine neue, gefilterte Liste aufgebaut wird, in dem Du über die alte Liste iterierst und nur die Elemente zu der neuen Liste hinzufügst, die mehr als X Zeichen lang sind. Das lässt sich auch als „list comprehension“ ausdrücken. Oder Du könntest eine Funktion schreiben die ein Element bekommt und prüft ob das mehr als X Zeichen lang ist, und die `filter()`-Funktion damit verwenden.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Hey,

ich würde das folgendermaßen lösen:

mit regex.findall alle Wörter trennen, in eine Liste packen und dabei die Sonderzeichen nicht mitnehmen. Dann hast du alle Wörter in einer Liste. Dann würde ich durch die Liste iterieren und die Anzahl der Buchstaben pro Wort zählen. Wenn die Länge kleiner als x ist, fliegen Sie raus. Allerdings kann man in Python nicht während dem iterieren über eine Liste gleichzeitig Elemente entfernen, dafür brauchst du eine Kopie der Liste.

Vorschlag:

Du zeigst uns was du bisher hast und ich zeige dir wie ich es umsetzen würde.
Zuletzt geändert von Jankie am Freitag 14. Juni 2019, 09:56, insgesamt 1-mal geändert.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

"Sonderzeichen ersetzen" könnte auch bedeuten "ich habe die falsche Kodierung gewählt".
Crusha
User
Beiträge: 4
Registriert: Donnerstag 13. Juni 2019, 23:26

Sirius3 hat geschrieben: Freitag 14. Juni 2019, 07:29 if-Schleifen gibt es nicht.
Wo ist das Problem, wenn Du die Wörter zählst, nur die zu zählen, deren Länge größer als 5 ist?

Was hast Du denn schon versucht? Zeige Code!
Das wäre auch eine Idee :D

Ich poste mal den Code. Sry für die Verwirrung, bin andere Sprachen, außer Python gewohnt ^^

Code: Alles auswählen

from collections import Counter

with open('test_test.txt') as file:
   data = file.read()
   ersetzen = data.replace(".", "").replace(",", "").replace("-", "").replace("  ", " ") \
        .replace("\n", "").replace("\d", "") \
        .replace('"', "") \
        .replace("A", "a").replace("B", "b").replace("C", "c").replace("D", "d").replace("E", "e").replace("F", "f") \
        .replace("G", "g").replace("H", "h").replace("I", "i").replace("J", "j").replace("K", "k").replace("L", "l") \
        .replace("M", "m").replace("N", "n").replace("O", "o").replace("P", "p").replace("Q", "q").replace("R", "r") \
        .replace("S", "s").replace("T", "t").replace("U", "u").replace("V", "v").replace("W", "w").replace("X", "x") \
        .replace("Y", "y").replace("Z", "z") \
        .lstrip().rstrip().strip()  ##löschen Leading, Trailing, Trimming
   liste = ersetzen.split()
   counts = Counter(liste)
   print(counts)
file.close()
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Crusha: da ist ja ganz schön viel Raten dabei. Für Kleinbuchstaben gibt es lower. "\d" ist kein Sonderzeichen. Bei lstrip, rstrip, strip sind mindestens 2 überflüssig, in Deinem Fall 3. Eingerückt wird immer mit 4 Leerzeichen pro Ebene. Bei with braucht man kein close.

Code: Alles auswählen

with open('test_test.txt') as file:
    data = file.read().translate(dict.fromkeys(map(ord, '.,-"'))).lower()
words = data.split()
counts = Counter(words)
print(counts)
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Das Entfernen würde ich so machen:

Code: Alles auswählen

import re

TESTSTRING = "Das ist ein Beispieltext. Um zu schauen ob das Entfernen der Wörter & Sonderzeichen mit einer Länge weniger als x aus einem String klappt"

def remove_all_words_with_length_less_x(text_input, max_word_lenght):
    seperated_input = re.findall(r"[\w']+", text_input)
    return " ".join([word for word in seperated_input if len(word) > max_word_lenght])

    
print(remove_all_words_with_length_less_x(TESTSTRING, 3))   
Zuletzt geändert von Jankie am Freitag 14. Juni 2019, 13:49, insgesamt 1-mal geändert.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Ergänzend:

String kennt lower() was den String komplett mit Kleinbuchstaben zurück gibt. Dann brauch man die nicht einzeln ersetzen (und selbst dafür würden sich bessere Lösungen finden).
strip() macht das selbe wie rstrip() + lstrip(). Das alles aufzurufen macht keinen Sinn. Und split() ist so schlau, dass man nicht davon braucht.
Wenn du etwas mit with öffnest, musst du es nicht explizit schließen. Dafür ist with nämlich da.
Irgendetwas durch nichts zu ersetzen halte ich für Schwierig. So rutschen unter Umständen. In "Dies ist die erste Zeile\nhier geht es weiter" exisitert dann nämlich das neue Wort "Zeilehier".
split trennt auch bei aufeinanderfolgenden Leerzeichen korrekt. Man muss die also nicht reduzieren.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

@Jankie: In deiner Funktion wird das Schlüsselwort "input" überschrieben, was beim Lesen zu Verwirrung führen kann, und hinter "line" verbirgt sich keine "line".
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

@sparrow:

Danke, habe es oben angepasst.
Crusha
User
Beiträge: 4
Registriert: Donnerstag 13. Juni 2019, 23:26

Ohh, wow. Vielen Dank für die Hilfe und auch gleich den Code dazu!

Ich hatte nur nach alternativen geschaut wie die herangehensweise ist und habe hierzu replace gefunden und ausgebaut, aber hätte nicht gedacht das man das so extrem einfach kürzen kann...

Werde mir mal die von euch verwendeten regulären Ausdrücke genauer in einen Tutorial anschauen!
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Crusha: Selbst wenn es nur `replace()` geben würde, hätte man das nicht zig mal hingeschrieben, sondern eine Schleife über (alt, neu)-Paare geschrieben.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Crusha
User
Beiträge: 4
Registriert: Donnerstag 13. Juni 2019, 23:26

__blackjack__ hat geschrieben: Freitag 14. Juni 2019, 16:20 @Crusha: Selbst wenn es nur `replace()` geben würde, hätte man das nicht zig mal hingeschrieben, sondern eine Schleife über (alt, neu)-Paare geschrieben.
Das war mir klar ^^, aber ich hatte bis dato noch nicht diese kurze Möglichkeit gefunden :)
Antworten