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.
String - alle Wörter weniger als X Zeichen löschen
- __blackjack__
- User
- Beiträge: 13110
- 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.
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
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.
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.
Das wäre auch eine Idee
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()
@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)
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.
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.
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.
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!
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!
- __blackjack__
- User
- Beiträge: 13110
- 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
Das war mir klar ^^, aber ich hatte bis dato noch nicht diese kurze Möglichkeit gefunden__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.