Seite 1 von 1

Liste von Nomen extrahieren

Verfasst: Mittwoch 1. Juni 2011, 09:38
von magi
Hallo,
wie der Titel sagt, möchte ich aus einem Text eine Liste aller groß geschriebenen Wörter ausgeben. Wenn ich das mit folgendem Code probiere, dann stehen in der Ausgabe-Datei nur Chinesische Schriftzeichen. Woran kann das liegen?

Code: Alles auswählen

# coding=utf-8
from __future__ import division

import re 
import codecs

text = unicode(open("beispiel.txt","rU").read(),"utf-8")
tokens = text.split()

# Suchen aller Wörter, die mit einem Großbuchstaben beginnen
gross = re.compile(u"^[A-ZÖÄÜ]")

nomina = []

for i in range(0, len(text)):
    wort = text[i]
    if gross.search(wort):
        nomina.append(wort)

# Ausgabedatei öffnen
out = codecs.open('ausgabe.txt','w','utf-8')

# Alphabetisch sortierte Ausgabe
for nomen in nomina:
    print >> out, nomen
out.close()

Vielen Dank für eure Hilfe

Re: Liste von Nomen extrahieren

Verfasst: Mittwoch 1. Juni 2011, 10:50
von BlackJack
@magi: Wie siehst Du Dir die Ausgabe denn an? Welche Kodierung wird dabei von der Software angenommen, mit der Du das anschaust? Kann es sein dass die einfach falsch rät weil da ungewöhnlicher Text in der Datei steht? Dein Programm schreibt da nämlich nur Grossbuchstaben in die Datei und keine Worte. Schau Dir mal im Programm an was Du da in der Schleife an `wort` bindest. Das ist sicher nicht das was Du wolltest. ;-)

Die Schleife geht nicht nur über die falschen Werte, sondern auch sehr ”unpythonisch” einen Umweg über einen Index. Wenn man ``for i in xrange(len(obj)):`` hat und das `i` dann nur für Indexzugriffe auf `obj` benutzt, will man 99,9% der Fälle eigentlich *direkt* über die Elemente von `obj` iterieren; ohne das unnötige `i`.

Die Schleife könnte man auch kompakter als ”list comprehension” schreiben.

Der Kommentar vor der Ausgabe ist wahrscheinlich: da wird nichts alphabetisch sortiert, die Ausgabe ist das also nur dann, wenn die Eingabe es schon war.

Statt der ``>>``-Syntax bei ``print`` würde ich an der Stelle eher die Methoden auf Dateiobjekten zum Schreiben der Daten empfehlen.

Dateien sollte man auch wieder schliessen. Das sicher zu stellen geht am einfachsten mit der ``with``-Anweisung.