Hilfestellung bei Code-Änderung

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
Mary21
User
Beiträge: 6
Registriert: Freitag 12. Juli 2013, 08:52

Hallo zusammen,

ich habe eine Frage zu meinem Code hier:
Zum einen sollen die Ergebnisse auf der Konsole ausgegeben werden, aber leider weiß ich nicht wie ich das umändern kann. Hab das in einer Textdatei ausgeben lassen.
Zum anderen ist das Programm nur eingeschränkt lauffähig bzw. muss man da Python 2 verwenden und ein Encoding angeben. Wie kann ich das umgehen, sodass es überall lauffähig wird?
Und die Ausgabe soll in Spalten sein, was hier nicht der Fall ist.

Die Aufgabe war hierzu: Ein Programm schreibem, dass den Benutzer zur Aufgabe eines Suchworts auffordeert und dann eine KWIC-Analyse ausgibt.
Man soll auf die Stopwords zugreifen und das Korpus aus der Datei poe.txt. einlesen. Dabei soll auch beim Lesen von UTF-8 Dateien das Encoduing explizit angegeben werden

Nach der Suchwort-Eingabe, soll das Programm alle Stellen finden, an denen dieses Suchwort im Korpus steht. Diese Fundstellen sollen mit einem Kontext von jeweils 5 Token vor und 5 Token hinter dem Suchwort auf die Konsole ausgegeben werden.Eine Fundstelle pro Zeile

Und zum schluss soll folgendes ausgegeben werden:
- Gesamtzahl der Fundstellen des Suchwortes (d.h. wie viele Treffer gab es insgesamt?)
- Tabelle mit den fünf häufigsten Kollokaten (Worttypen im Kontext) absteigendsortiert nach der Häufigkeit, mit der sie im Kontext des Suchwortes aufgetreten sind.

Code: Alles auswählen

# Menge mit Stopwords
stopwords = set(["I", "i", "me", "my", "mine", "myself", "you",
                 "your", "yours", "yourself", "he", "him", "his",
                 "himself", "she", "her", "herself", "it", "its",
                 "itself", "we", "us", "our", "ours", "ourselves",
                 "yourselves", "they", "them", "their", "theirs",
                 "themselves", "that", "this", "those", "these",
                 "the", "a", "an", "is", "was", "are", "am", "will",
                 "would", "can", "could", "may", "might", "ought",
                 "to", "too", "and", "or", "either", "neither",
                 "also", "nor", "of", "no", "not", "none", "some",
                 "any", "few", "much", "less", "be", "as", "than",
                 "but", "'s", "has", "have", "had", "were", "been",
                 "in", "into", "for", "with", "to", "by", "on", "at",
                 "upon", "about", "around", "within", "without", "through",
                 "from", "out", "so", "there", "here", "where",
                 "who", "which", "that", "one", "two", "three",
                 "up", "down"])


# Text einlesen und unnötige Zeichen entfernen
text = unicode(open('poe.txt','Ur').read(),'utf-8')
text = text.replace("\t"," ").replace("\n"," ")
import re
text = re.sub("[ ]+", " ", text)

textListe = text.split()

# Suchwort-Eingabe
Suchwort = raw_input("Bitte Suchwort eingeben: ").lower() 

# Variablen deklarieren:
# Dictionary für die Wörter in der Umgebung des Suchwortes
kollokateDict = { }
# Umgebungsgröße festsetzen (Tokenanzahl)
umgebung = 5
# Anzahl des gesuchten Wortes im Text
Wortanzahl = 0
# Anzahl der Ausgabe von Wörter 
AusgabeGrenze = 5
# Ausgabedatei
outfile = open('ergebnis.txt', 'w')

i=0
# eine Iteration über jedes Wort des Textes
while (i < len(textListe)):
	wort = textListe[i].lower()
	# Wenn das gesuchte Wort gleich aktuellem Wort ist
	if (wort == Suchwort):
    	# dann wird die Wortanzahl um 1 erhöht
    	Wortanzahl += 1
    	# dann wird die Umgebung vor und nach 5 Wörter ins Dict geschrieben
    	for k in range(0,(2*umgebung)+1):
    		if (i-umgebung+k >= 0 and i-umgebung+k < len(textListe)):
	        	umgebungswort = textListe[i-umgebung+k].lower()
	        	if umgebungswort in kollokateDict:
	            	kollokateDict[umgebungswort] += 1  
	        	else:
	            	kollokateDict[umgebungswort] = 1
    	#Die ganze Umgebung, also 11 Wörter werden in der Ausgabedatei geschrieben
    	print >> outfile, " ".join(textListe[max(i-umgebung,0):min(i+umgebung+1,len(textListe))])
	i = i + 1

print >> outfile, "\nTabelle mit den 5 haeufigsten Kollokaten"

# Absteigende Sortierung der Liste nach der Häufigkeit
kollokateListe = sorted(kollokateDict, key=kollokateDict.get, reverse=True)

i=0
while (i < AusgabeGrenze):
	# Ausgabe der 5 häufigsten Kollokaten (ohne Stopwords)
	if ((kollokateListe[i] == Suchwort) or (kollokateListe[i] in stopwords)):
    	AusgabeGrenze += 1
	else:
    	print >> outfile, str(kollokateListe[i]) + "\t\t" + str(kollokateDict[kollokateListe[i]])
	i += 1

print >> outfile, "\nDas gesuchte Wort '" + Suchwort + "' kommt " + str(Wortanzahl) + " mal vor."
outfile.close()

print "Das Ergebnis befindet sich in der Datei 'ergebnis.txt'."

Ich hoffe ihr könnt mir hier weiterhelfen.

Danke
Gruß
Mary
BlackJack

@Mary21: Vielleicht solltest Du mal ein Python-Tutorial durcharbeiten. In der Dokumentation ist eines und für Anfänger wird oft Learn Python The Hard Way empfohlen. (Nicht vom Titel irritieren lassen.)

Denn wenn Du mit ``print`` in eine Datei aber nicht auf der Konsole ausgeben kannst, dann hast Du keine Grundlagenkenntnisse und ihn den Quelltext sehr wahrscheinlich nicht selbst geschrieben. Die Frage wie man mit ``print`` auf der Konsole ausgibt, stellt sich nämlich eigentlich gar nicht. Zusammen damit dass das Python 2 Quelltext ist und falsch eingerückt, kommt leicht der Verdacht auf, dass Du von uns eine geklaute und selbst nicht verstandene Lösung auf Python 3 portiert bekommen möchtest, statt die Aufgabe selber zu lösen.

Besonders gut ist der Quelltext auch nicht.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@Mary21: Weil ich an meinem letzten Urlaubstag irgend wie nett bin:

Code: Alles auswählen

print "Hallo aus Seeland!"
>>> Hallo aus Seeland
Das kannst Du einfach in einer Python-Shell ausprobieren - oder auch als Script ausführen. So einfach geht das (in Python 2.x) ;-)

Mir kommt die Aufgabe irgend wie bekannt vor... hatten wir das nicht letztes Jahr schon mal hier im Forum?
Mary21 hat geschrieben: Zum anderen ist das Programm nur eingeschränkt lauffähig bzw. muss man da Python 2 verwenden und ein Encoding angeben.
...
"Dabei soll auch beim Lesen von UTF-8 Dateien das Encoduing explizit angegeben werden"
Irgend wie beißt sich das - wieso willst Du das "explizite" entfernen, wenn es doch laut Aufgabe gefordert ist? Und welche Python-Version soll denn benutzt werden? 3.x oder 2.x? (aktuell wären das 3.3 und 2.7) Beides sind aktuelle Python-Versionen! Man kann in Python 2 einiges importieren, so dass das Portieren auf Python 3 einfacher geht, aber bei einer *Aufgabe* kann ich mir kaum vorstellen, dass solch ein Nebenkriegsschauplatz wichtig wäre. Da wird es doch eine Vorgabe geben und fertig - oder wenn nicht, dann kann man sich das eben aussuchen.

Für das Einlesen von Dateien mit einer expliziten Angabe des Encodings eignet sich die Funktion ``open`` aus dem codecs-Modul.

Generelll solltest Du Dateien immer mit dem folgenden Idiom öffnen:

Code: Alles auswählen

with open(...) as f:
    # f ist hier das File-Object
Damit sparst Du Dir das explizite Schließen von ``f`` und das dazu notwendige Exception-Handling, wenn es robust sein soll.

Ab Python 2.7 (iirc) gibt es für Mengen auch Literale. Damit sparst Du Dir das temporäre Listen-Objekt beim Initialisieren des sets:

Code: Alles auswählen

stopwords = {"I", "i", "me", ...}
Naja, wie BlackJack schon sagte - und es in dem anderen Thread ja auch schon betont worden ist - bringt Dir das alles nix, wenn Du nicht bereit bist, die Grundlagen von Python zu lernen.

So, und nun suche ich mal auf meiner Platte die Lösung dafür... mir kommt das so bekannt vor, als hätte ich das schon mal umgesetzt... :-D
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten