Python CSV

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
awacker
User
Beiträge: 13
Registriert: Sonntag 27. November 2011, 22:52

Hallo liebe Gemeinde, ich versuche zur Zeit die Ausgaben in CSV zu speichern und habe zwei Probleme dabei.

speichert alle Spalten in eine

writer.writerow(['Sentence', 'Causal Mining'])

und mein zweites Problem er speichert nur die letzte Ausgabe und nicht ganze Schleife

hier ist mein Quellcode:

Code: Alles auswählen

def causal_mining (causal_relationship, encoding='utf-8'):
    main_filename = causal_relationship + '.txt'
    with codecs.open(main_filename, 'r') as main_file:
        sentences = sent_tokenize(main_file.read())

    print len(sentences)
    grammar_hypothesis = r'''Causal Relationship:{<RB><VBG><.*>+<MD><.*>+}
                                                 {<VBG|DT|IN|JJ|NN.*>+<.*>+<MD><.*>+}
                                                 {<NN.*><MD><.*>+}'''
                             #Sentence: {<.*>+}'''
    
    hp = nltk.RegexpParser(grammar_hypothesis) 

    cause = r'''Cause:{<VBG|DT|RB|JJ|NN.*>+<.*>+<MD>}
                      {<NN.*><MD>}
                      }<MD>{'''
    
    cp = nltk.RegexpParser(cause)
    
    impact = r'''Impact:{<MD><.*>+}
                        }<MD>{'''
    
    ip = nltk.RegexpParser(impact)
    
    writer = csv.writer(open("lern.csv", "wb"))
    
    for sentence in sentences:        
        sent = nltk.pos_tag(word_tokenize(sentence))
        tree = hp.parse(sent)
        string = ''.join(str(i) for i in tree)

        causal = re.compile('Causal Relationship')
        sign = re.compile('cause|affect|affected|enhance|higher|better|more|negatively|sooner|increase|perceived|Perceived|will|may')
        c = causal.match(string, 1, 20)
        s = sign.search(sentence)
        if c and s:
            y = ' Yes'
            print sentence + y
            for chunk in tree.subtrees():
                if chunk.node== 'Causal Relationship':
                    cau = cp.parse(sent)
                    for cause in cau.subtrees():
                        if cause.node== 'Cause': print cause
                        imp = ip.parse(sent)
                    for impact in imp.subtrees():
                        if impact.node== 'Impact': print impact

            positive = re.compile('cause|positively|affect|affected|enhance|higher|better|more|increase')
            negative = re.compile ('negatively|sooner')
            unclear = re.compile ('perceived|Perceived')
            p = positive.search(sentence)
            n = negative.search(sentence)
            u = unclear.search(sentence)
            
            if p:
                print 'positive'
            if n:
                print 'negative'
            if u:
                print 'unclear'

            a = [sentence, y]
            print a
            print '\n'

            #writer = csv.DictWriter(open("lernset.csv", "wb"),["Sentence", "Causal Mining"])
            #writer.writerow({"Sentence" : "Sentence", "Causal Mining" : "Causal Mining"})
            #daten = ({ 'Sentence' : sentence, 'Causal Mining' : y})
            
        else:
            n = ' No'
            print sentence + n
            print '\n'
        
    writer.writerow(['Sentence', 'Causal Mining'])
    daten = (a)
    writer.writerows(daten)

    #reader = csv.reader(open("lernset.csv", "rb"))
    #for row in reader:
        #print row
Dazu will ich noch Umsetzen, dass die Ausgaben von else auch zu den Ausgaben von if gespeichert werden, aber wie ich das mache habe ich keine Ahnung.

Wünsche euch noch schöne Weihnachten
Zuletzt geändert von Anonymous am Mittwoch 21. Dezember 2011, 13:05, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

awacker hat geschrieben:und mein zweites Problem er speichert nur die letzte Ausgabe und nicht ganze Schleife
Dann schau mal woher der Wert kommt, den du mit writerows wegschreibst. Woher sollen denn die Daten der ersten Durchläufe kommen?
awacker
User
Beiträge: 13
Registriert: Sonntag 27. November 2011, 22:52

Die Werte kommen aus boolean, nur will er diese nicht alle übernehmen sondern nur das letzte Ergebniess von der Schleife, dass hab ich so gemacht damit das Programm die Sätze und dazu gehörige Werte speichert, irgend eine andere Vorschlag für Umsetzung???
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

awacker hat geschrieben:Die Werte kommen aus boolean, nur will er diese nicht alle übernehmen sondern nur das letzte Ergebniess von der Schleife, dass hab ich so gemacht damit das Programm die Sätze und dazu gehörige Werte speichert, irgend eine andere Vorschlag für Umsetzung???
Was soll denn "Die Werte kommen aus boolean" heißen?

Du schreibst bei writerows die Daten von data. data hast du vorher so gesetzt, dass es mit a identisch ist. a wiederum setzt du in der Schleife als Liste aus sentence und y zusammen. Da das Schreiben erst nach der Schleife erfolgt kann ja nur der letzte zugeordnete Wert in die Datei geschrieben werden. Die vorherigen Werte hast du ja durch die Neuzuordnung in der Schleife bei jedem Durchlauf selber weggeworfen. Wenn du alle Daten haben möchtest, dann musst du sie natürlich auch in der Schleife schreiben.

Zudem solltest du das Kompilieren der regulären Ausdrücke aus der Schleife herausziehen. Das Kompilieren bei jedem Durchlauf durchzuführen ist unsinnig.
BlackJack

@awacker: Dateien sollte man immer schliessen wenn man damit fertig ist. Entweder mittels ``with``-Anweisung oder explizit mit einem `close()`-Aufruf. Das betrifft die ``lern.csv``.

Für `causal` ist ein regulärer Ausdruck mit Kanonen auf Spatzen geschossen. Das könnte man auch durch einen einfachen Vergleich ``c = string[1:20] == 'Causal Relationship'`` lösen. Wobei da immer noch das `c` als Name und die redundante, da von der Länge und Position der Vergleichszeichenkette abhängige 20 unschön ist.

Der `sign`-Ausdruck liesse sich ein wenig kompakter schreiben.

Die ganzen regulären Ausdrücke hätte man auch vor die Schleife verschieben können, denn die ändern sich ja innerhalb der Schleife nicht. Und da `cause` aus den drei Ausdrücken `positiv`, `negative` und `unclear` zusammen gesetzt sind, könnte man da auch gleich ein wenig Redundanz vermeiden. `y` und `n` erscheinen mir etwas sinnfrei. Der Name `a` ist auch nicht so toll.

Bei der Verarbeitung in den drei ``for``-Schleifen bin ich mir nicht ganz sicher ob die innerste nicht vielleicht eingerückt sein sollte!? So verarbeitet sie nur das letzte `imp` falls in der Schleife davor eines gefunden wurde. Falls nicht gibt es an der Stelle entweder einen `NameError` oder es werden Daten von einem vorherigen Durchlauf verwendet, was wahrscheinlich ein Fehler wäre!?
Antworten