Neuling :)

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.
danbui
User
Beiträge: 9
Registriert: Donnerstag 11. März 2010, 16:52

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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
danbui
User
Beiträge: 9
Registriert: Donnerstag 11. März 2010, 16:52

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 :P :P :P :P :P
BlackJack

@danbui: Arbeite das Tutorial in der Python-Dokumentation durch und schau Dir `difflib.get_close_matches()` an.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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.
danbui
User
Beiträge: 9
Registriert: Donnerstag 11. März 2010, 16:52

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?
Benutzeravatar
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... :roll:

Denn das simple durchlaufen von Listen, um die passenden Elemente in die "Hand" zu bekommen ist eben nicht dein Hauptproblem.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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.
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

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

Code: Alles auswählen

Lesen = Lesen.split(" ")
das erstellt dann eine liste der wörter.

Deine letzte zeile soll warscheinlich

Code: Alles auswählen

if len(Lesen[word]) == len(Lesen[word]):
heißen. Dann vergleichst du die länge des einen wortes mit der des nächsten
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

INFACT hat geschrieben: Du hast warscheinlich vergessen Lesen zu "splitten" also

Code: Alles auswählen

Lesen = Lesen.split(" ")
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).

Code: Alles auswählen

Lesen = Lesen.split()
@danbui
Und schau dir auch mal PEP8 an, Variablennamen sollte man nie groß schreiben.
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

Sogar ich mache Fehler :roll: :wink:
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
danbui
User
Beiträge: 9
Registriert: Donnerstag 11. März 2010, 16:52

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? :roll: :roll: :roll:
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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)
danbui
User
Beiträge: 9
Registriert: Donnerstag 11. März 2010, 16:52

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 
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

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.
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.
danbui
User
Beiträge: 9
Registriert: Donnerstag 11. März 2010, 16:52

........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.--------

:wink: :roll: :roll: :roll:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.--------

:wink: :roll: :roll: :roll:
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/
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ja, hast recht... könnte man auch direkt auf zwei beschränken; da man ja eh immer zwei Wörter miteinander vergleichen will.
Antworten