Ganze For Schleife in eine Text Datei übergeben

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 an alle, ich schreibe gerade ein Programm um Hypothesen aus Text auszufiltern. Meine Methode soll an Hand von Stichwörtern aus dem Text erkennen, ob der Satz eine Hypothese ist. Dafür habe ich erst mal Sätze erkennen lassen, welche dann nach den deferierten Stichwörtern abgesucht werden. Als Antwort bekomme ich zum Beispiel 14 Sätze, aber in den Text Dokument wird immer nur der letzte Satz gespeichert. Kann mir irgendjemand helfen alle Sätze in Text Dokument zu speichern???

Hier ist der Quellcode:

Code: Alles auswählen

def hyp_analysis(hypothesis):
    mainfile=hypothesis[0:(len(hypothesis)+4)] + ".txt"
    f=open(mainfile)
    b=f.read()
    
    
    sentences = sent_tokenize(b)
    print len(sentences)
    
    
    musterHyp = re.compile('H\d+|P\d+|H \d+|Hypothesis \d+|Proposition \d+')
    
    
    for sentence in sentences:
        reps = {'\n':' ', '\n\n':' ', '\xe2\x80\x93':' ','  ':' '}
        txt = replace_all(sentence, reps)
        n = musterHyp.match(sentence, 0, 12)
        if n:
            print txt
            hypfilename = "hyp_" + mainfile 
            hyps = open(hypfilename, 'w')
            hyps.write(txt)
deets

Fang mal damit an, deinen Quellcode in die Python-Code-Tags zu setzen - dann kann man den auch entziffern, und dir hoffentlich helfen.
BlackJack

@awacker: Du überschreibst die Datei jedes mal. Öffne sie vor der Schleife, schreibe in der Schleife die Daten, und vor allem *schliess* die Datei(en) auch wieder. Schau Dir dazu mal die ``with``-Anweisung an.
BlackJack

@awacker: Okay, jetzt noch einmal eine etwas ausführlichere Kritik. :-)

An einigen Stellen könnten mehr Leerzeichen zur Lesbarkeit beitragen. Üblicherweise setzt man um ``=`` bei Zuweisungen ausserhalb von Parameterlisten Leerzeichen und eines nach Kommata. Das Ende von dem Wörterbuch das an `reps` gebunden wird, ist zum Beispiel IMHO ziemlich unübersichtlich.

Namensgebung ist etwas was einen sehr grossen Einfluss darauf hat wie leicht ein Quelltext zu verstehen ist. Man sollte auf Abkürzungen verzichten die nicht allgemein oder zumindest im Fachgebiet des Programms geläufig sind. Sehr schlecht sind einzelne Buchstaben wenn es sich nicht gerade um numerische Werte handelt. `i`, `j`, `k` und `n` sind für ganze Zahlen nicht unüblich, vor allem „Laufvariablen“. Aber selbst da sollte man überlegen, ob man nicht einen passenderen Bezeichner finden kann. Unpassende Namen sollte man auch vermeiden, wie zum Beispiel `mainfile` — daran wird keine Datei gebunden, sondern ein Dateiname. Funktionsnamen sollten eine Tätigkeit beschreiben. Also zum Beispiel `analyse_hypothesis()` statt `hyp_analysis()`.

Das „slicing“ bei `hypothesis` am Anfang ist Unsinn und hat keinen Effekt. Was dort steht ist: Ich möchte einen Ausschnitt von `hypothesis` der vier Zeichen länger ist als `hypothesis` selbst. Was erwartest Du denn von diesem Ausdruck?

Code: Alles auswählen

In [120]: s = 'ham and eggs'

In [121]: s[0:len(s) + 4]
Out[121]: 'ham and eggs'

In [122]: s[0:len(s) + 4] == s
Out[122]: True
Den regulären Ausdruck kann man etwas kompakter formulieren. Da alle Alternativen mit Ziffern enden, kann man den Teil dort heraus ziehen. Und beim `match()` sind die beiden letzten Argumente überflüssig. Die Methode fängt von sich aus beim Index 0 an.

Beim `replace_all()` stellt sich mir die Frage ob das tatsächlich immer so funktioniert wie es soll. Einträge in einem Wörterbuch sind ungeordnet und die Ersetzungen sind nicht unabhängig von der Reihenfolge. Falls das wie gewünscht funktioniert, kann das also auch Zufall sein. Eine Liste mit Ersetzungspaaren wäre hier sicherer.

Der 'EN DASH' als UTF-8 kodierte Bytefolge ist unschön. Wofür diese Bytefolge steht ist nicht wirklich offensichtlich. Minimal sollte man das durch einen Kommentar oder eine verständlichere Darstellung klarmachen. Beispielsweise ``u'\n{EN DASH}'.encode('utf-8')``. Daraus wird ersichtlich was es für ein Zeichen ist, und in welcher Kodierung.

Noch besser wäre es allerdings, wenn man bei Text auch durchgehend tatsächlich mit Zeichen, also `unicode` arbeitet, statt mit Bytes. Das Umwandeln kann man beim einlesen und schreiben über `codecs.open()` erledigen.

Ungetestet:

Code: Alles auswählen

import codecs


def analyse_hypothesis(hypothesis, encoding='utf-8'):
    
    main_filename = hypothesis + '.txt'

    with codecs.open(main_filename, 'r', encoding) as main_file:
        sentences = tokenize_sentences(main_file.read())
    print len(sentences)
    
    is_hypothesis = re.compile('(H ?|P|Hypothesis |Proposition )\d+').match
    replacements = [
        ('\n', ' '),
        ('\n\n', ' '),
        (u'\n{EN DASH}', ' '),
        ('  ', ' ')
    ]
    with codecs.open('hyp_' + main_filename, 'w', encoding) as hypothesis_file:
        for sentence in sentences:
            sentence = replace_all(sentence, replacements)
            if is_hypothesis(sentence):
                print sentence
                hypothesis_file.write(sentence)
awacker
User
Beiträge: 13
Registriert: Sonntag 27. November 2011, 22:52

Danke hat alles geklappt, habe mir zwei Wochen lang, darüber Gedanken gemacht wie ich das umstellen kann, habe versucht die Schleife erst in Liste umzuwandeln, wäre nie auf deine Lösung gekommen.

Danke noch mal

P.S.
fertiger Quellcode

Code: Alles auswählen

import codecs
import nltk.data
import re
from nltk.tokenize import *
from nltk.tag import *
from nltk.chunk import *
from nltk.chunk.regexp import *

def replace_all(text, dic):
	    for i, j in dic.iteritems():
	        text = text.replace(i, j)
	    return text
	
def analyse_hypothesis(hypothesis):
   
    main_filename = hypothesis + '.txt'

    with codecs.open(main_filename, 'r') as main_file:
        sentences = sent_tokenize(main_file.read())
    print len(sentences)
   
    is_hypothesis = re.compile('H\d+|P\d+|H \d+|Hypothesis \d+|Proposition \d+')
    replacements = {'\n':' ', '\n\n':' ', '\xe2\x80\x93':' ','  ':' '}

    
    with codecs.open('hyp_' + main_filename, 'w') as hypothesis_file:
        for sentence in sentences:
            sentence = replace_all(sentence, replacements)
            hypothese=is_hypothesis.match(sentence, 0, 12)
            if hypothese:
                print sentence
                hypothesis_file.write(sentence)
                hypothesis_file.write('\n')
Zuletzt geändert von Anonymous am Montag 28. November 2011, 21:34, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wenn der jetzt noch in Python-Code-Tags stünde, wäre es schön ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten