Hallo zusammen,
Ich habe folgenden Programmcode geschrieben:
import nltk
nltk.download()
from nltk.corpus import stopwords
stopwords = stopwords.words('english')
newstopwords = set(stopwords)
porter = nltk.PorterStemmer()
eingabe = 'all the books are lying on the tables each and every single day'
listeingabe = eingabe.split(" ")
seteingabe = set(listeingabe)
print seteingabe
newgesamtliste = seteingabe - newstopwords
print newgesamtliste
listgesamtliste = list(newgesamtliste)
print listgesamtliste
porterstem = [porter.stem(t) for t in listgesamtliste]
print porterstem
Ich nutze hier das ntlk und importiere zunächst das nltk und dann importiere ich eine Liste Englischer Stoppworte. Das Ziel war, dass die Stoppworte aus eingabe abgezogen werden. Wie sich aber zeigte lässt sich das nicht mit Hilfe von Listen realisieren sondern ich muss die Listen in Sets umwandeln. Wenn ich aber die Liste von Eingabe in ein Set umwandel, damit ich dann das Set von Stoppworte davon abziehen kann, dann geht die Reihenfolge von listeingabe verloren und die Worte aus Eingabe erscheinen in seteingabe in einer seltsam zufälligen Reihenfolge.
Es ist aber sehr wichtig, dass die Worte in listgesamtliste auf die dann der Porter-Stemmer angewandt wird in der gleichen Reihenfolge ist, wie in Eingabe nur eben um die Stoppworte bereinigt.
Kann mir einer von euch vielleicht einen Tipp geben, wie ich das schaffen kann?
Herzlichen Dank für eure Hilfe. Ich bin mir auch sicher, dass der Code noch verbessert werden kann, das werde ich auch noch tun.
Viele Grüße,
DetRRG
Anwendung von Sets bringt Reihenfolge durcheinander
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Willkommen im Forum!
Nun ein Set ist nunmal eine mathematische Menge und damit inhaerent ungeordnet.
Du kannst aber folgendes machen:
Und benutze in Zukunft bitte `python`-Tags.
Edit: Noch ein wenig Code-Kritik: Du solltest nicht den Typ eines Objekts in den Namen kodieren, an den du das Objekt bindest. Ein Namen hat keinen Typ sondern nur das Objekt und damit kann dann eine `listeingabe` zum Beispiel eine Zahl werden.
Nun ein Set ist nunmal eine mathematische Menge und damit inhaerent ungeordnet.
Du kannst aber folgendes machen:
Code: Alles auswählen
eingabe = 'all the books are lying on the tables each and every single day'
listeingabe = eingabe.split(" ")
unique = []
seen = set()
for x in listeingabe:
if x not in seen:
unique.append(x)
seen.add(x)Edit: Noch ein wenig Code-Kritik: Du solltest nicht den Typ eines Objekts in den Namen kodieren, an den du das Objekt bindest. Ein Namen hat keinen Typ sondern nur das Objekt und damit kann dann eine `listeingabe` zum Beispiel eine Zahl werden.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
Hallo cofi,
vielen Dank, dass du mich so nett willkommen geheißen hast und mir geholfen hast. Ich habe den Code, so wie du ihn beschrieben hast in meinen Code eingebaut aber leider ist das set immernoch ungeordnet.
Ich nehme mal an, ich mache etwas falsch und stehe einfach nur auch dem Schlauch. Ich habe dort, wo die Sets voneinander abgezogen werden sollen seen eingesetzt, weil das ja in dem Code auch als neues set definiert worden ist, aber wenn ich es nun von dem Stoppwort-Set abziehe, dann passiert das gleiche wie zuvor.
Weißt du vielleicht was ich falsch mache? Hier ist mein Code:
[/code]
Irgendwie klappt es mit der Verwendung der Python-Tags auch nicht. Ich bin ratlos und es tut mir sehr leid.
Herzlichen Dank für die Mühe und noch einen schönen Abend!
DetRRG
vielen Dank, dass du mich so nett willkommen geheißen hast und mir geholfen hast. Ich habe den Code, so wie du ihn beschrieben hast in meinen Code eingebaut aber leider ist das set immernoch ungeordnet.
Ich nehme mal an, ich mache etwas falsch und stehe einfach nur auch dem Schlauch. Ich habe dort, wo die Sets voneinander abgezogen werden sollen seen eingesetzt, weil das ja in dem Code auch als neues set definiert worden ist, aber wenn ich es nun von dem Stoppwort-Set abziehe, dann passiert das gleiche wie zuvor.
Weißt du vielleicht was ich falsch mache? Hier ist mein Code:
Code: Alles auswählen
[code=python] eingabe = 'all the books are lying on the tables each and every single day'
leingabe = eingabe.split(" ")
unique = []
print unique
seen = set()
for x in leingabe:
if x not in seen:
unique.append(x)
seen.add(x)
newgesamt = seen - newstopwords Irgendwie klappt es mit der Verwendung der Python-Tags auch nicht. Ich bin ratlos und es tut mir sehr leid.
Herzlichen Dank für die Mühe und noch einen schönen Abend!
DetRRG
-
BlackJack
@DetRRG: `set`\s sind immer ungeordnet. Du kannst das Problem also nicht durch das Abziehen von `set`\s voneinander lösen. Eine Alternative Lösung hast Du ja bekommen. Die musst Du jetzt nur noch nachvollziehen und verstehen.
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
KeinDetRRG hat geschrieben:Irgendwie klappt es mit der Verwendung der Python-Tags auch nicht. Ich bin ratlos und es tut mir sehr leid.
Code: Alles auswählen
[code=python ].. sondern nur das 2. Innerhalb eines [code ][/code ] Paares wird jeglicher Text[1] nicht interpretiert.
Den Rest hat dir ja schon BlackJack erklaert.
[1] Bis auf `&' .. warum auch immer.Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
- mkesper
- User
- Beiträge: 919
- Registriert: Montag 20. November 2006, 15:48
- Wohnort: formerly known as mkallas
- Kontaktdaten:
wie wäre es mit ?
Code: Alles auswählen
meine_liste = sorted(seen)@mkesper: Es geht hier um das Einhalten einer Reihenfolge in der Form, wie sie bei der Eingabe der Daten genutzt wurde. Das muss nicht zwangsläufig alphabetisch sein (bzw den Kriterien unterliegen, die von `sorted()` angewendet werden).
