aufeinanderfolgende Worte aus Text filtern

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.
Antworten
Noranora
User
Beiträge: 62
Registriert: Donnerstag 21. Januar 2016, 12:51

Hallo! Ich möchte einen Text einlesen und jeweils die Wörter, die aufeinanderfolgen ausgeben lassen.

Code: Alles auswählen


worte=''Max und Moritz – Eine Bubengeschichte in sieben Streichen ist eine Bildergeschichte des deutschen humoristischen Dichters und Zeichners Wilhelm Busch. Sie wurde Ende Oktober 1865[1] erstveröffentlicht und zählt damit zum Frühwerk von Wilhelm Busch. Im Handlungsgefüge weist sie auffällige Gesetzmäßigkeiten und Grundmuster inhaltlicher, stilistischer und wirkungsästhetischer Art auf, die sich auch in den späteren Arbeiten von Wilhelm Busch wiederholen.[2] Viele Reime dieser Bildergeschichte wie „Aber wehe, wehe, wehe!"


erstmal=[]
zwei_worte=[]  # Wortfolgen aus 2 wörtern
drei_worte=[] # wortfolgen aus 3 
vier_worte=[]

index=0
einzeln=worte.split()        # also gibt es jetzt eine Liste, die die einzelnen Wörter als Elementa beinhaltet.
for i in einzeln

    while zaehler<3:                      # <3, da ich nur Wortfolgen prüfen möchte, die aus maximal 4 wörtern bestehen

        index=index+1
        index2=index+1  # hier wird jeweils der Index verändert, um nachher die Liste entsprechend zu füllen.
        index3=index+2   # jeweils für  drei-aufeinander folgende Worte
        zwei_worte.append(i+' '+einzeln[index])
        drei_worte.append(i+' '+einzeln[index]+' '+einzeln[index2])
        vier_worte.append(i+' '+einzeln[index]+' '+einzelnt[index2]+' '+einzeln[index3])


        wortfolge2=(zwei_worte[0])
        wortfolge3=(drei_worte[0])      # hier werden jeweils die Wortketten, die in dem Text present sind ausgegeben.
	wortfolge4=(vier_worte[0])
print(wortfolge2,wortfolge3,wortfolge4)


So, die Idee funktioniert für das erste Wort.
Also wortfolge2 ist: 'Max und
wortfolge3: 'Max und Moritz
wortfolge4: 'Max und Moritz –


Jedoch macht die Schleife dann nicht weiter. Die Ausgaben für die anderen Worte erfolgen nicht. Und ich möchte dass für jedes einzelne Wort die folgenden Wörter in dieser Form ausgegeben werden.
Aber wo hakt die Schleife?

Würde mich sehr über eure Tipps freuen! LG
chpo7234
User
Beiträge: 35
Registriert: Dienstag 29. September 2015, 10:19

Hallo Noranora,

bei mir funktioniert dein ganzer Code nicht. Es wäre schön, wenn du den angepasst noch mal posten könntest, denn:
- Der string worte wird bei dir mit zwei Apostrophen ' ' eingeleitet und endet mit einem Anführungszeichen ".
- Beim Einleiten der for-Schleife fehlt ein Doppeltpunkt.
- Die Variable zaehler , die in der while-Schleife abgefragt wird, hat keinen Wert. Sie wird auch im folgenden Code nicht verändert.
- Die Zeile wortfolge4=(vier_worte[0]) hat den falschen Seitenabstand: 3 statt 4 Leerzeichen.
- ...



Ansonsten hast du hier meinen Code-Vorschlag:

Code: Alles auswählen

zwei_woerter = list()
drei_woerter = list()
vier_woerter = list()
 
def zersetze_text(text):
    einzelne_woerter = text.split(" ")
    anzahl_der_woerter = len(einzelne_woerter)
 
    for i in range(0, anzahl_der_woerter-1):
 
        zwei_woerter.append(
            einzelne_woerter[i] + " " + einzelne_woerter[i+1]
        )
 
        if i < anzahl_der_woerter-2:
            drei_woerter.append(
                einzelne_woerter[i] + " " + einzelne_woerter[i+1] + " " + einzelne_woerter[i+2]
            )
 
        if i < anzahl_der_woerter-3:
            vier_woerter.append(
                einzelne_woerter[i] + " " + einzelne_woerter[i+1] + " " + einzelne_woerter[i+2] + " " + einzelne_woerter[i+3]
            )
 
def main():
    worte="Max und Moritz - "
    worte+="Eine Bubengeschichte in sieben Streichen ist eine Bildergeschichte des deutschen humoristischen "
    worte+="Dichters und Zeichners Wilhelm Busch. Sie wurde Ende Oktober 1865[1] erstveroeffentlicht und zaehlt "
    worte+="damit zum Fruehwerk von Wilhelm Busch. Im Handlungsgefuege weist sie auffaellige Gesetzmoegkeiten und "
    worte+="Grundmuster inhaltlicher, stilistischer und wirkungsaesthetischer Art auf, die sich auch in den spaeteren "
    worte+="Arbeiten von Wilhelm Busch wiederholen.[2] Viele Reime dieser Bildergeschichte wie - Aber wehe, wehe, wehe!"
   
    zersetze_text(worte)
   
    print "Ausgabe der Zweier-Kombinationen:"
    for kombination in zwei_woerter:
        print kombination 
       
    print "Ausgabe der Dreier-Kombinationen:"
    for kombination in drei_woerter:
        print kombination 

    print "Ausgabe der Vierer-Kombinationen:"
    for kombination in vier_woerter:
        print kombination 
       
if __name__ == main():
    main()
Noranora
User
Beiträge: 62
Registriert: Donnerstag 21. Januar 2016, 12:51

Super, Danke! Aber darf ich noch fragen, wofür du "def main" machst? Also das mit worte= und worte+= ist mir nicht so ganz verständich ...:/
chpo7234
User
Beiträge: 35
Registriert: Dienstag 29. September 2015, 10:19

Klar, kein Problem.

Mit

Code: Alles auswählen

worte="Hallo"
legst du den string erst mal fest (initialisieren).

Mit

Code: Alles auswählen

worte+=" du da"
erweiterst du den string. "du da" wird an das "Hallo" ran gehangen.

Ich habe das nur gemacht, damit ich eine bessere Übersicht auf den Text habe und der Rest vom Text nicht irgendwo rechts außerhalb des Bildschirm hängt. Du brauchst das nicht machen und kannst auch direkt alles in einem machen:

Code: Alles auswählen

worte="Hallo du da"
Mit "def" werden Methodennamen bezeichnet. Die erste Methode heißt bei mir "zersetze_text". Die zweite Methode "main" ist die Einstiegsmethode. Hier heraus wird der Programm-Ablauf gesteuert. Die letzte Abfrage "if __name__ == main()" startet die Einstiegsmethode lediglich.

MfG
Noranora
User
Beiträge: 62
Registriert: Donnerstag 21. Januar 2016, 12:51

Ich bin Dir sehr dankbar, du hast mir echt weitergeholfen! DANKE!!!!
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@chpo7234: globale Variablen machen Code schwer wartbar, fehleranfällig und nicht wiederverwendbar. Daten betreten Funktionen über Parameter und verlassen sie wieder als Rückgabewerte. Über den Index einer Liste zu iterieren, ist ein Python-Anti-Pattern, Codewiederholungen möchte man als Programmierer möglichst vermeiden und man möchte möglichst allgemeine Funktionen schreiben, also welche, die n Wörter zurückgeben können. Statt Strings zusammenzustückeln sollte man format benutzen, oder wie hier ' '.join:

Code: Alles auswählen

from itertools import izip, islice

def zersetze_text(text, anzahl_worte):
    einzelne_woerter = text.split()
    return [" ".join(w) for w in izip(*(islice(einzelne_woerter,i,None) for i in range(anzahl_worte)))]
 
def main():
    worte=(
        "Max und Moritz - "
        "Eine Bubengeschichte in sieben Streichen ist eine Bildergeschichte des deutschen humoristischen "
        "Dichters und Zeichners Wilhelm Busch. Sie wurde Ende Oktober 1865[1] erstveroeffentlicht und zaehlt "
        "damit zum Fruehwerk von Wilhelm Busch. Im Handlungsgefuege weist sie auffaellige Gesetzmoegkeiten und "
        "Grundmuster inhaltlicher, stilistischer und wirkungsaesthetischer Art auf, die sich auch in den spaeteren "
        "Arbeiten von Wilhelm Busch wiederholen.[2] Viele Reime dieser Bildergeschichte wie - Aber wehe, wehe, wehe!")
   
    for anzahl, ausgabe in enumerate(["Zweier", "Dreier", "Vierer"], 2):
        woerter = zersetze_text(worte, anzahl)
        print "Ausgabe der {0}-Kombinationen:".format(ausgabe)
        for kombination in woerter:
            print kombination 
       
if __name__ == main():
    main()
Antworten