Seite 1 von 2
Neuling :)
Verfasst: Donnerstag 11. März 2010, 17:05
von danbui
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.
Re: Neuling :)
Verfasst: Donnerstag 11. März 2010, 17:20
von numerix
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.
.
Verfasst: Donnerstag 11. März 2010, 20:21
von danbui
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

Verfasst: Donnerstag 11. März 2010, 20:57
von BlackJack
@danbui: Arbeite das Tutorial in der Python-Dokumentation durch und schau Dir `difflib.get_close_matches()` an.
Re: .
Verfasst: Donnerstag 11. März 2010, 20:58
von ms4py
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.
Du hast die Antwort von "numerix" offensichtlich völlig falsch verstanden.
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.
ok
Verfasst: Donnerstag 11. März 2010, 21:20
von danbui
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?
Verfasst: Donnerstag 11. März 2010, 21:28
von Hyperion
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.
Re: ok
Verfasst: Donnerstag 11. März 2010, 21:30
von ms4py
danbui hat geschrieben:
Mit Zahlen funktiniert die Iteration, doch wieso funktioniert es nicht mit Strings?
Weil es bisher noch keine Strings sind, sondern nur ein String!
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.
Verfasst: Donnerstag 11. März 2010, 21:33
von INFACT
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
Verfasst: Donnerstag 11. März 2010, 21:39
von ms4py
INFACT hat geschrieben:
Du hast warscheinlich vergessen Lesen zu "splitten" also
das erstellt dann eine liste der wörter.
@INFACT
Aber bitte doch ohne das Argument, damit an allen Whitespace-Zeichen getrennt wird (also z.B. auch Zeilenumbrüche).
@danbui
Und schau dir auch mal PEP8 an, Variablennamen sollte man nie groß schreiben.
Verfasst: Donnerstag 11. März 2010, 21:41
von INFACT
Sogar ich mache Fehler

Verfasst: Donnerstag 11. März 2010, 22:51
von danbui
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?

Verfasst: Donnerstag 11. März 2010, 22:57
von cofi
danbui hat geschrieben:???????????? was mach ich jetzt falsch?
Du hast nicht den Post von ice2k3 gelesen:
ice2k3 hat geschrieben:Benutze in Zukunft den Code-Tag für Python!
[code = py]...[/ code] (ohne Leerzeichen)
Verfasst: Donnerstag 11. März 2010, 23:06
von danbui
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
Verfasst: Donnerstag 11. März 2010, 23:22
von gkuhl
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.
Verfasst: Donnerstag 11. März 2010, 23:29
von BlackJack
@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.
Verfasst: Freitag 12. März 2010, 00:27
von danbui
........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.--------

Verfasst: Freitag 12. März 2010, 15:32
von Hyperion
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.--------

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.
http://paste.pocoo.org/show/188820/
Verfasst: Freitag 12. März 2010, 17:05
von derdon
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?
Verfasst: Freitag 12. März 2010, 17:14
von Hyperion
Ja, hast recht... könnte man auch direkt auf zwei beschränken; da man ja eh immer zwei Wörter miteinander vergleichen will.