Hallo zusammen,
ich hab hier ein kleines Problem und bräuchte ein wenig Hilfe.
Die SuFu hat mir leider nicht wirklich geholfen
Also folgendes, ich soll einen Chatbot entwickeln der als Studienberater dienen soll und ähnlich wie "ELIZA" agiert.
Er soll die Benutzereingaben auf Substantive prüfen, diese auf der Konsole ausgeben und dann eine geeignete Antwort geben, indem er die gefundenen Substantive mit den vorgegebenen Schlüsselwörtern abgleicht.
Grundidee: Alle großgeschriebenen Wörter aus der Eingabe filtern und Satzanfänge ignorieren.
Mein Problem ist es, dass ich keine Ahnung habe welchen Befehl ich dazu brauche. Genauer gesagt wie sähe ein Codeschnipsel aus, der bewirkt, dass von dem Satz "Hallo ich habe Probleme den richtigen Studiengang zu finden" nur "Probleme" und "Studiengang" übrig bleibt?
Danke schon mal
Lg Liskaya
Text auf Substantive prüfen
@Liskaya: Welches Tutorial hast Du denn für die Python-Grundlagen durchgearbeitet?
Das `re`-Modul könnte hier hilfreich sein. Dazu gibt es ein Howto in der Python-Dokumentation.
Das was Du beschreibst hat übrigens nicht viel mit ELIZA zu tun. ELIZA ist ”nutzlos”.
Das `re`-Modul könnte hier hilfreich sein. Dazu gibt es ein Howto in der Python-Dokumentation.
Das was Du beschreibst hat übrigens nicht viel mit ELIZA zu tun. ELIZA ist ”nutzlos”.
- pillmuncher
- User
- Beiträge: 1484
- Registriert: Samstag 21. März 2009, 22:59
- Wohnort: Pfaffenwinkel
@Liskaya: Was machst du mit Sätzen wie: "Grundidee: Alle großgeschriebenen Wörter aus der Eingabe filtern und Satzanfänge ignorieren."? Nach meiner Einschätzung ist das Wort Grundidee durchaus ein Substantiv, weil es aber am Satzanfang steht, würdest du es ignorieren.
Wie BlackJack bin ich der Überzeugung, dass man einen Studienberater nach dem ELIZA-Prinzip nicht programmieren kann. Wenn es aber tatsächlich so etwas dummes wie ELIZA werden soll, dann denke ich, dass du das ganze viel zu kompliziert angehst. Der Witz bei ELIZA war ja, dass es absolut gar nichts über irgendetwas wusste, auch nichts über Satzbau oder Substantive. Um ein funktionierendes ELIZA zu schreiben, braucht man nur die Antwort in Kleinbuchstaben verwandeln und nachsehen, ob ein Wort aus einer Schlagwortliste darin vorkommt. Findet man keines, gibt man aus "Erzählen sie mehr.", "Aha." oder "Hm." und falls man eines findet, sagen wir "mutter", "familie", "studium" oder "professor", dann gibt man aus "Erzählen sie mir mehr über ihr/e/n Mutter/Familie/Studium/Professor". Das könnte dann so aussehen:Daraus lässt sich dann leicht eine neue Frage zimmern:
Wie BlackJack bin ich der Überzeugung, dass man einen Studienberater nach dem ELIZA-Prinzip nicht programmieren kann. Wenn es aber tatsächlich so etwas dummes wie ELIZA werden soll, dann denke ich, dass du das ganze viel zu kompliziert angehst. Der Witz bei ELIZA war ja, dass es absolut gar nichts über irgendetwas wusste, auch nichts über Satzbau oder Substantive. Um ein funktionierendes ELIZA zu schreiben, braucht man nur die Antwort in Kleinbuchstaben verwandeln und nachsehen, ob ein Wort aus einer Schlagwortliste darin vorkommt. Findet man keines, gibt man aus "Erzählen sie mehr.", "Aha." oder "Hm." und falls man eines findet, sagen wir "mutter", "familie", "studium" oder "professor", dann gibt man aus "Erzählen sie mir mehr über ihr/e/n Mutter/Familie/Studium/Professor". Das könnte dann so aussehen:
Code: Alles auswählen
keywords = {
'mutter': 'Ihre Mutter',
'professor': 'Ihren Professor',
'familie': 'Ihre Familie',
'studium': 'Ihr Studium',
...
}
Code: Alles auswählen
for word, phrase in keywords.items():
...
question = 'Erzählen Sie mir mehr über {}.'.format(phrase)
....
In specifications, Murphy's Law supersedes Ohm's.
Hallo zusammen danke für die antworten
Die erste Vorlesung zum Thema hatte ich am Freitag, diese war allerdings so gar nicht hilfreich, da der Professor die Zeit eher damit verschwendet hat, über den Erfinder von Python zu erzählen und ein kleines Zahlen-Ratespiel zu programmieren.
Ich habe es jetzt auf zwei Arten probiert aber das gewünschte Ergebnis habe ich noch immer nicht
hierbei wird halt nur der Anfangsbuchstabe ausgegeben
Dieser Code hat als Ausgabe lediglich <filter object at 0x02C19B30>
Ich bin gerade dabei das Buch "einstieg in python" durch zu arbeiten. Da ich das Buch allerdings erst seit Samstag habe bin ich natürlich noch nicht allzu weit.BlackJack hat geschrieben:@Liskaya: Welches Tutorial hast Du denn für die Python-Grundlagen durchgearbeitet?
Die erste Vorlesung zum Thema hatte ich am Freitag, diese war allerdings so gar nicht hilfreich, da der Professor die Zeit eher damit verschwendet hat, über den Erfinder von Python zu erzählen und ein kleines Zahlen-Ratespiel zu programmieren.
Theoretisch ist das dumm, klar. Wird aber in der Aufgabenstellung so verlangtpillmuncher hat geschrieben:@Liskaya: Was machst du mit Sätzen wie: "Grundidee: Alle großgeschriebenen Wörter aus der Eingabe filtern und Satzanfänge ignorieren."? Nach meiner Einschätzung ist das Wort Grundidee durchaus ein Substantiv, weil es aber am Satzanfang steht, würdest du es ignorieren.
Ich habe es jetzt auf zwei Arten probiert aber das gewünschte Ergebnis habe ich noch immer nicht
Code: Alles auswählen
f = input("Studierender:")
liste = f
gross = re.findall("[A-ZÖÄÜ]", liste)
print(gross)
Code: Alles auswählen
f = input("Studierender:")
list = f
gross = filter(lambda x: x[0].isupper(), liste)
print(gross)
Da ich oben was von Chatbot gelesen habe, werfe ich mal noch das Problem in den Raum, das in Chats häufig ein anderer Schreibstil genutzt wird (häufig alles klein geschrieben, Nutzung von sonst nicht üblichen Kurzschreibweisen etc., sprich die Syntax weicht von der Hochsprache ab)
Damit verlagert sich das Problem wieder Richtung Inhaltsanalyse, und nunja darüber müssen noch viele Leute habilitieren, bis das wirklich was taugt
@Liskaya:
Imho ist es für Dich wichtig, genau zu klären, was die Automatismen können sollen. Ansonsten wird das schnell zum Fass ohne Boden.
Damit verlagert sich das Problem wieder Richtung Inhaltsanalyse, und nunja darüber müssen noch viele Leute habilitieren, bis das wirklich was taugt
@Liskaya:
Imho ist es für Dich wichtig, genau zu klären, was die Automatismen können sollen. Ansonsten wird das schnell zum Fass ohne Boden.
Der Ansatz ist da. Allerdings ist f ein völlig nichtssagender Name und warum der Inhalt noch mal an den Namen liste gebunden wird ist auch äußerst schleierhaft. Man sollte ohnehin keine Datentypen in den Namen des Bezeichner aufnehmen, vor allem, wenn der Datentyp dann nicht mal stimmt.Liskaya hat geschrieben:Code: Alles auswählen
f = input("Studierender:") liste = f gross = re.findall("[A-ZÖÄÜ]", liste) print(gross)
Aktuell suchst du nur nach genau einem Großbuchstaben. Du willst aber eigentlich einene Großbuchstaben der nach einer Wortgrenze beginnt und dann weitere Zeichen bis zur nächsten Wortgrenze. Die Wortgrenze bekommst du mit \b, die weiteren Zeichen mit \w (ergänzt um ein +, da es ja mehrere Zeichen sein dürfen). Um den Backslash jetzt nicht noch einmal explizit mit einem Backslash escapen zu müssen bietet sich die Verwendung eines Raw-Strings an.
Code: Alles auswählen
def find_words(text):
return re.findall(r'\b([A-ZÄÖÜ]\w+)\b', text)
Vielen Dank euch allen
Das Problem ist nun gelöst aber aus Interesse frage ich nun noch warum dieser Schnipsel nur "<filter object at 0x02C19B30>" ausgibt. Habe ich etwas übersehen oder ist es gar nicht möglich das Problem damit zu lösen?
Das Problem ist nun gelöst aber aus Interesse frage ich nun noch warum dieser Schnipsel nur "<filter object at 0x02C19B30>" ausgibt. Habe ich etwas übersehen oder ist es gar nicht möglich das Problem damit zu lösen?
Code: Alles auswählen
f = input("Studierender:")
liste = f
gross = filter(lambda x: x[0].isupper(), liste)
print(gross)
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
``filter`` gibt Dir ein Iterator-Objekt zurück, also vereinfacht ausgedrückt ein Objekt, über welches Du z.B. in einer ``for``-Schleife iterieren kannst.Liskaya hat geschrieben:...aber aus Interesse frage ich nun noch warum dieser Schnipsel nur "<filter object at 0x02C19B30>" ausgibt. Habe ich etwas übersehen oder ist es gar nicht möglich das Problem damit zu lösen?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Laut Dokumentation liefert filter dir einen Iterator.
Du kannst also einfach die Elemente durchlaufen.
Wenn du die Elemente in einer Liste haben möchtest, dann mach einfach eine daraus.
Falls du das irgendwo anders gesehen hast, dann war das Code für Python 2.x. Unter Python 2 hat filter direkt eine Liste zurückgeliefert.
Du kannst also einfach die Elemente durchlaufen.
Code: Alles auswählen
content = "Hallo ich habe Probleme den richtigen Studiengang zu finden"
for element in filter(lambda x: x[0].isupper(), content):
print(element)
Code: Alles auswählen
content = "Hallo ich habe Probleme den richtigen Studiengang zu finden"
print(list(filter(lambda x: x[0].isupper(), content)))
Ja hatte ich auf der anderen Seite gefunden, wo jemand ein ähnliches Problem hatte. Ich hab allerdings nicht draufgeachtet obs für 2 oder 3 war. Aber wenns für 2 ist ergibt es natürlich Sinn, dass es nicht problemlos funktioniert hat./me hat geschrieben:
Falls du das irgendwo anders gesehen hast, dann war das Code für Python 2.x. Unter Python 2 hat filter direkt eine Liste zurückgeliefert.
Danke an euch alle für die schnelle Hilfe und die super Erklärungen!
Für Operationen, die über ein "Funktion(x) für alle x" hinausgehen, würde ich sowieso eher List Comprehensions (LCs) empfehlen. Die sind dann meistens einfacher zu schreiben und einfacher zu lesen. Ausgenommen sind Fälle, bei denen die Operation wirklich so komplex ist, dass eine LC zu umständlich wird und man die Operation tatsächlich in einer Funktion kapseln möchte. Im hier vorliegenden Anwendungsfall würde ich jedenfalls eine LC nehmen.