Hi Leute,
Ich bin auf ein Problem gestoßen und finde keine Lösung. Ich schreibe Raptexte und möchte meine Texte auf ähnliche Worte überprüfen.
Nehmen wir an ich öffne eine Textdatei.
x = open(Datei, r).read()
nun möchte ich die Wörter aus meiner Datei überprüfen ob ein Teil eines Wortes mit einem anderem Wort sich ähnelt.
BsP:
Hallo ich bin du er ist wir wollen dich
1. ich, dich
Mein Hauptproblem besteht darin, dass ich nicht weiß wie ich in einer Datei X, das Wort mit dem nächsten Wort vergleiche.
Neuling :)
Das Hauptproblem ist gewiss nicht das, was du beschreibst (es sei denn, es werden peinlich-platte Rap-Texte). Das eigentliche Problem ist die "Ähnlichkeit":
Die schärfste Braut in meiner Clique
ist die gertenschlanke Ulrike.
In ihrem knappen Bikini
sieht sie aus wie ein Teenie.
Die schärfste Braut in meiner Clique
ist die gertenschlanke Ulrike.
In ihrem knappen Bikini
sieht sie aus wie ein Teenie.
Die Fragestellung ist genau richtig. Genauso wie ich es gechildert habe.
Es geht nicht um die Texte. Also wirklich!!!! Ich habe mich bewusst in einem Python Forum angemeldet und nicht in einem Rap Forum.
Ich schreibe es nochmal :
Ich möchte nur wissen, wie ich mit Python eine Datei öffne, den vorhanden Text einlese und dann diesen Text nach ähnlichkeit sortiere.
Wenn im Text Worte vorkommen wie: lachen, machen.
dann soll er dies erkennen !
Fertig

Es geht nicht um die Texte. Also wirklich!!!! Ich habe mich bewusst in einem Python Forum angemeldet und nicht in einem Rap Forum.
Ich schreibe es nochmal :
Ich möchte nur wissen, wie ich mit Python eine Datei öffne, den vorhanden Text einlese und dann diesen Text nach ähnlichkeit sortiere.
Wenn im Text Worte vorkommen wie: lachen, machen.
dann soll er dies erkennen !
Fertig





@danbui: Arbeite das Tutorial in der Python-Dokumentation durch und schau Dir `difflib.get_close_matches()` an.
Du hast die Antwort von "numerix" offensichtlich völlig falsch verstanden.danbui hat geschrieben:Die Fragestellung ist genau richtig. Genauso wie ich es gechildert habe.
Es geht nicht um die Texte. Also wirklich!!!! Ich habe mich bewusst in einem Python Forum angemeldet und nicht in einem Rap Forum.
Wie man eine Datei öffnet, aus dieser die einzelnen Wörter extrahiert und ein Vergleich zwischen diesen durchführt ist in Python kein Problem (und mit dem Tutorial leicht zu lösen, wir liefern hier keine fertige Antworten, wir wollen auch ein bisschen Engagement sehen!). Das ist das, was du als Hauptproblem schilderst, aber im Grunde ziemlich leicht.
Nur der Vergleich selber nach der Ähnlichkeit ist eine relativ komplexe Angelegenheit. Ein Ansatz wäre hier vielleicht http://de.wikipedia.org/wiki/K%C3%B6lner_Phonetik Davon gibt es bestimmt auch schon eine Python-Implementierung.
Machen wir es ganz einfach
wie funktioniert folgendes:
wenn ich mit Zahlen rechne, dann kann ich einfach z.b n= n+1
eingeben, doch wenn es Strings sind welche aus einer Datei stammen.
dann habe ich eine Liste an Wörtern. Nehmen wir an diese Liste heißt
x, und ich lese es aus, dann habe ich Liste= x
wenn ich jetzt in dieser Liste iteriere kann ich wort1 mit wort2 nicht vergleichen.
def textLesen():
wortliste= open("Datei", "r")
Lesen = wortliste.read()
Ausgabe= []
for word in range(len(Lesen)-1):
if len(Lesen[word]) and len(Lesen[word+1])== True:
usw... funktionierts nicht-
Mit Zahlen funktiniert die Iteration, doch wieso funktioniert es nicht mit Strings?
wie funktioniert folgendes:
wenn ich mit Zahlen rechne, dann kann ich einfach z.b n= n+1
eingeben, doch wenn es Strings sind welche aus einer Datei stammen.
dann habe ich eine Liste an Wörtern. Nehmen wir an diese Liste heißt
x, und ich lese es aus, dann habe ich Liste= x
wenn ich jetzt in dieser Liste iteriere kann ich wort1 mit wort2 nicht vergleichen.
def textLesen():
wortliste= open("Datei", "r")
Lesen = wortliste.read()
Ausgabe= []
for word in range(len(Lesen)-1):
if len(Lesen[word]) and len(Lesen[word+1])== True:
usw... funktionierts nicht-
Mit Zahlen funktiniert die Iteration, doch wieso funktioniert es nicht mit Strings?
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Wenn Du eine Liste von Wörtern hast, dann musst Du eben jedes mit jedem vergleichen. Das ist algorithmisch erst mal trivial - wenn man das Tutorial durchgearbeitet hat und mit den Datenstrukturen und Kontrollstrukturen ein wenig vertraut ist.
Als Tipp: Vergleiche das erste Element mit dem Rest der Liste. Im Anschluss dann das 2. mit dem Rest (das 1. und das 2. wurden ja bereits beim ersten Vergleich verglichen!). Das kann man iterativ oder auch rekursiv lösen.
Du hast aber immer noch nicht Dein Kernproblem verstanden...
Denn das simple durchlaufen von Listen, um die passenden Elemente in die "Hand" zu bekommen ist eben nicht dein Hauptproblem.
Als Tipp: Vergleiche das erste Element mit dem Rest der Liste. Im Anschluss dann das 2. mit dem Rest (das 1. und das 2. wurden ja bereits beim ersten Vergleich verglichen!). Das kann man iterativ oder auch rekursiv lösen.
Du hast aber immer noch nicht Dein Kernproblem verstanden...

Denn das simple durchlaufen von Listen, um die passenden Elemente in die "Hand" zu bekommen ist eben nicht dein Hauptproblem.
Weil es bisher noch keine Strings sind, sondern nur ein String!danbui hat geschrieben: Mit Zahlen funktiniert die Iteration, doch wieso funktioniert es nicht mit Strings?
Benutze in Zukunft den Code-Tag für Python!
[code = py]...[/ code] (ohne Leerzeichen)
Schau dir mal die Funktion str.split an, damit kannst du aus einem String die einzelnen Wörter als Liste extrahieren.
Bitte benutze Code tags.
Ausserdem macht man keine vergleiche mit True. ( hab ich auch am anfang gemacht, bis mir aufgefallen ist dass das nichts bringt )
Du hast warscheinlich vergessen Lesen zu "splitten" also
das erstellt dann eine liste der wörter.
Deine letzte zeile soll warscheinlich
heißen. Dann vergleichst du die länge des einen wortes mit der des nächsten
Ausserdem macht man keine vergleiche mit True. ( hab ich auch am anfang gemacht, bis mir aufgefallen ist dass das nichts bringt )
Du hast warscheinlich vergessen Lesen zu "splitten" also
Code: Alles auswählen
Lesen = Lesen.split(" ")
Deine letzte zeile soll warscheinlich
Code: Alles auswählen
if len(Lesen[word]) == len(Lesen[word]):
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
;-)
@INFACTINFACT hat geschrieben: Du hast warscheinlich vergessen Lesen zu "splitten" alsodas erstellt dann eine liste der wörter.Code: Alles auswählen
Lesen = Lesen.split(" ")
Aber bitte doch ohne das Argument, damit an allen Whitespace-Zeichen getrennt wird (also z.B. auch Zeilenumbrüche).
Code: Alles auswählen
Lesen = Lesen.split()
Und schau dir auch mal PEP8 an, Variablennamen sollte man nie groß schreiben.
def myLesen():
wortliste= open("Datei", "r")
Lesen = wortliste.read().strip().replace(".", "").replace(",", "").replace("!", "").replace("?", "").replace(":", "").replace(".", "").replace("\"", "").replace("\'", "").replace(";", "").replace("\n", " ").lower().split()
count= []
for word in range(len(Lesen)-1):
if len(Lesen[word]) == len(Lesen[word]):
count.append(word)
print count
Ausgaben:
[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6, 7]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
???????????? was mach ich jetzt falsch?

wortliste= open("Datei", "r")
Lesen = wortliste.read().strip().replace(".", "").replace(",", "").replace("!", "").replace("?", "").replace(":", "").replace(".", "").replace("\"", "").replace("\'", "").replace(";", "").replace("\n", " ").lower().split()
count= []
for word in range(len(Lesen)-1):
if len(Lesen[word]) == len(Lesen[word]):
count.append(word)
print count
Ausgaben:
[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6, 7]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
???????????? was mach ich jetzt falsch?



- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Du hast nicht den Post von ice2k3 gelesen:danbui hat geschrieben:???????????? was mach ich jetzt falsch?
ice2k3 hat geschrieben:Benutze in Zukunft den Code-Tag für Python!
[code = py]...[/ code] (ohne Leerzeichen)
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
Code: Alles auswählen
def myLesen():
wortliste= open("Datei", "r")
Lesen = wortliste.read().strip().replace(".", "").replace(",", "").replace("!", "").replace("?", "").replace(":", "").replace(".", "").replace("\"", "").replace("\'", "").replace(";", "").replace("\n", " ").lower().split()
count= []
for word in range(len(Lesen)-1):
if len(Lesen[word]) == len(Lesen[word]):
count.append(word)
print count
Trotz Codetags ist dein Code so nicht lauffähig. Falsches einrücken. Zeile 4 ist außerdem zu lang. Sowohl nach PEP8, als auch für das Forum. Die Bedingung (Zeile 9) ist immer wahr und man kann direkt über die Elemente einer Liste iterieren. Siehe dazu die Python Dokumentation und das Tutorial.
@danbui: Das lässt sich nicht übersetzen -- da fehlt die Einrückung.
Dateien die man öffnet sollte man auch wieder schliessen.
Zeilen bitte nicht so lang werden lassen. Insbesondere könnte man die Anzahl der `replace()`\es entweder durch eine Schleife verringern oder mal die `translate()`-Methode auf Zeichenketten anschauen. Den Punkt braucht man auch nur einmal ersetzen.
Eventuell wäre auch ein regulärer Ausruck, der auf "Worte" passt, nützlich. Dann braucht man keine Negativliste von allen "Sonderzeichen". '%' hast Du zum Beispiel nicht, es gibt aber 100%ig Texte in denen das Zeichen vorkommt. 
`Lesen` ist kein guter Name für eine Liste. `word` ist kein guter Name für eine Zahl. `myLesen` ist kein guter Funktionsname. Und ob `count` ein guter Name für eine Liste ist…
Erklär doch mal in Worten was die Bedingung bei dem ``if`` beschreibt, und wann die wohl mal `False` ergibt.
Was Du "falsch" machst, hängt ganz davon ab was Du machen willst. Wenn das was da ausgegeben wird, dass ist was Du haben willst, dann machst Du alles richtig. Wenn nicht, dann solltest Du mal formulieren was Du von dem Quelltext erwartet hättest und wie das vom beobachteten Ergebnis abweicht.
Dateien die man öffnet sollte man auch wieder schliessen.
Zeilen bitte nicht so lang werden lassen. Insbesondere könnte man die Anzahl der `replace()`\es entweder durch eine Schleife verringern oder mal die `translate()`-Methode auf Zeichenketten anschauen. Den Punkt braucht man auch nur einmal ersetzen.


`Lesen` ist kein guter Name für eine Liste. `word` ist kein guter Name für eine Zahl. `myLesen` ist kein guter Funktionsname. Und ob `count` ein guter Name für eine Liste ist…
Erklär doch mal in Worten was die Bedingung bei dem ``if`` beschreibt, und wann die wohl mal `False` ergibt.
Was Du "falsch" machst, hängt ganz davon ab was Du machen willst. Wenn das was da ausgegeben wird, dass ist was Du haben willst, dann machst Du alles richtig. Wenn nicht, dann solltest Du mal formulieren was Du von dem Quelltext erwartet hättest und wie das vom beobachteten Ergebnis abweicht.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Und wie schon zig mal erwähnt ist genau dieser Vergleich Dein algorithmisches Hauptproblem! Das Vergleichen über alle Wörter hinweg ist dann eher trivial.danbui hat geschrieben:........wenn das Programm mal laufen sollte, dass folgendes steht :
1. kein, mein
2. taler, maler
usw.
-------Ich möchte alle Wörter aus dem Text extrahieren, und zwar
mit der besten Übereinstimmung.--------
![]()
![]()
![]()
http://paste.pocoo.org/show/188820/
Hyperion: Die Funktion rhymes_with nimmt eine beliebige Anzahl an Parametern, es werden aber exakt 2 davon genutzt. Werden also weniger als 2 übergeben, gibt es einen IndexError; bei mehr als 2 übergebenen Argumenten gibt es gar keine Exception. Nicht das Verhalten, das ich von dieser Funktion erwarte. Warum nimmt sie nicht einfach zwei Argumente entegegen?