Hilfe zu einer Aufgabenstelllung

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

Hallo zusammen, ich habe ein Problem mit einer Aufgabe die ich zu lösen habe.Ich kenn mich da nicht gut aus und hoffe, dass mir hier weitergeholfern werden kann.

Die Aufgabe:
1. Die Funktion gemeinsame_token() vervollständigen

Die Funktion soll als Argument eine Liste von Pfaden zu Dateien (Strings) nehmen.Sie soll die alphabetisch sortierte Menge (set) der Token zurückgeben, die inallen in der Liste genannten Dateien enthalten sind.Dabei soll die Funktion mit beliebigen langen Listen von Dateipfaden umgehen können.

2. Die Funktion register(dateiliste) soll vervollständigt werden. Die Funktion soll ein Register erzeugen und zurückgeben.
• Register: Auflistung der Texte (Dateinamen), die ein bestimmtes Schlagwort enthalten.Einziges Argument soll erneut eine Liste von Pfaden zu Dateien (Strings) sein.

Code: Alles auswählen

#################### TEILAUFGABE 1 ######################

def gemeinsame_token(dateiliste):   
    
    pass # Ersetzen Sie pass durch ihren Code (in 8-10 Zeilen plus Kommentaren möglich)

# Verwendungsbeispiel zu Teilaufgabe 1
dateiliste = ["t1.txt", "t2.txt", "t3.txt"]
tokenliste = gemeinsame_token(dateiliste)

print ("### Ausgabe zu Teilaufgabe 1 ###")

for element in tokenliste:
    print (element, end=", ")    # token1, token2, token3, token 4, ...,

################### TEILAUFGABE 2 ######################
Anführungszeichen des Docstrings zum Bearbeiten 
# der zweiten Teilaufgabe entfernen  
"""    
def register(dateiliste):   
    
    pass # Ersetzen Sie pass durch ihren Code (in ca. 10 Zeilen plus Kommentaren möglich)

# Verwendungsbeispiel zu Teilaufgabe 2
dateiliste = ["t1.txt", "t2.txt", "t3.txt"]
       
register = register(dateiliste)

print ("\n\n### Ausgabe zu Teilaufgabe 2 ###")
   
for schlagwort in sorted(register, key=str.lower):
    print (schlagwort + ": ", end="")
    
    for dateiname in sorted(register[schlagwort]):
        print (dateiname, end=" ")
    
    print()
"""                    
Die Ausgabe die erwartet wird:
### Ausgabe zu Teilaufgabe 1 ###
als, dem, der, die, ist, mit, und, von, Wissenschaft,

### Ausgabe zu Teilaufgabe 2 ###
abstrakte: t2.txt
allgemein: t2.txt
als: t1.txt t2.txt t3.txt
andererseits: t3.txt
anerkannte: t2.txt
Anwendung: t1.txt
[...]
zum: t2.txt
Zunge: t1.txt
üblicherweise: t2.txt
μαθηματική: t2.txt
τέχνη: t2.txt



Die Textdateien dazu kann ich leider hier nicht hochladen. Schreibe die hier einfach nochmal gleich rein.

Wäre supi wenn mir da jemand helfen könnte und mir das erklären könnte, wie das geht.

Dankeschön

Grüße
Mary
Zuletzt geändert von Mary21 am Freitag 12. Juli 2013, 11:11, insgesamt 1-mal geändert.
Mary21
User
Beiträge: 6
Registriert: Freitag 12. Juli 2013, 08:52

Sprachwissenschaft
auch
Linguistik
lateinisch
lingua
Sprache
Zunge
ist
eine
Wissenschaft
die
in
verschiedenen
Herangehensweisen
die
menschliche
Sprache
untersucht
Inhalt
sprachwissenschaftlicher
Forschung
ist
generell
die
Sprache
als
System
ihre
Bestandteile
und
Einheiten
sowie
deren
Bedeutungen
Des
Weiteren
beschäftigt
sich
die
Sprachwissenschaft
mit
Entstehung
Herkunft
und
geschichtlicher
Entwicklung
von
Sprache
mit
ihrer
vielseitigen
Anwendung
in
der
schriftlichen
und
mündlichen
Kommunikation
mit
dem
Wahrnehmen
Erlernen
und
Artikulieren
von
Sprache
sowie
mit
den
möglicherweise
damit
einhergehenden
Störungen
Mary21
User
Beiträge: 6
Registriert: Freitag 12. Juli 2013, 08:52

Die
Mathematik
griechisch
μαθηματική
τέχνη
mathēmatikē
téchnē
die
Kunst
des
Lernens
zum
Lernen
gehörig
ist
eine
Wissenschaft
welche
aus
der
Untersuchung
von
geometrischen
Figuren
und
dem
Rechnen
mit
Zahlen
entstand
Für
Mathematik
gibt
es
keine
allgemein
anerkannte
Definition
heute
wird
sie
üblicherweise
als
eine
Wissenschaft
beschrieben
die
durch
logische
Definitionen
selbstgeschaffene
abstrakte
Strukturen
mittels
der
Logik
auf
ihre
Eigenschaften
und
Muster
untersucht
Mary21
User
Beiträge: 6
Registriert: Freitag 12. Juli 2013, 08:52

Informatik
englisch
computer
science
oder
computing
science
ist
die
Wissenschaft
von
der
systematischen
Verarbeitung
von
Informationen
besonders
der
automatischen
Verarbeitung
mit
Hilfe
von
Digitalrechnern
Historisch
hat
sich
die
Informatik
einerseits
als
Formalwissenschaft
aus
der
Mathematik
entwickelt
andererseits
als
Ingenieursdisziplin
aus
dem
praktischen
Bedarf
nach
einer
schnellen
und
insbesondere
automatischen
Ausführung
von
Berechnungen
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Willkommen im Forum!

Wir loesen hier aber nicht deine Hausaufgaben. Womit hast du denn Probleme und was hast du bisher versucht?
BlackJack

Ausgabe 1 in C (mit der `glib` wegen Datenstrukturen und so): http://pastebin.com/zuvH7Snb

Mit der Hälfte der Zeilen löst man in Python locker beide Aufgaben, und natürlich auch hübscher und übersichtlicher. :-)
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Vielleicht doch eine kleine Hilfestellung in Stichworten:
  • - lesen von Dateien (bevorzugt mit 'with')
    - Operationen auf Sets
    - verwenden von defaultdict
Didaktisch finde ich die Aufgabe ganz gut gelungen.
BlackJack

Aufgabe 2 in D. Damit lässt es sich schon wesentlich angenehmer arbeiten als mit C. :-)

Code: Alles auswählen

module main;

import std.algorithm;
import std.stdio;
import std.string;

auto readTokens(ref string filename)
{
    bool[string] result;
    foreach(line; File(filename).byLine()) {
        result[line.strip().idup] = true;
    }
    return result.keys();
}

void main(string args[])
{
    alias string[] StringArray;
    StringArray[string] token2filenames;
    foreach(ref filename; args[1..$]) {
        foreach(ref token; readTokens(filename)) {
            auto filenames = token2filenames.get(token, []);
            filenames ~= filename;
            token2filenames[token] = filenames;
        }
    }
    foreach(ref token; sort(token2filenames.keys())) {
        writefln("%s: %(%s %)", token, token2filenames[token]);
    }
}
Mary21
User
Beiträge: 6
Registriert: Freitag 12. Juli 2013, 08:52

Hallo! Ein paar Hilfestellungen wären da wirklich gut, da ich nicht weiß wie ich das angehen soll.
Ich soll das schon in Python machen.
Kenne noch nichtmals D.....

Ich werde mit den Hilfestellungen dann was versuchen und schauen was ich schaffe und wie.....

Danke

Gruß
Mary
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@Mary21: die Hilfestellung von kbr war doch schon eindeutig:
Lies in Deinen Kursunterlagen nach wie man:
- Dateien liest
- mit Sets umgeht
- und was dicts oder besser defaultsdict macht.
BlackJack

Vielleicht noch ein Tipp: Wenn man zuerst die zweite Aufgabe löst, hat man eigentlich schon alle Daten im Speicher um die erste zu lösen. Man kann also ein Register aufbauen und dann eine Funktion schreiben, die aus diesem Register die gemeinsamen Token ermittelt. So braucht man die Dateien nur einmal einlesen.
BlackJack

Die letzte Idee in Code umgesetzt:

Code: Alles auswählen

import io
from collections import defaultdict
from functools import partial
from operator import methodcaller


sorted_caseless = partial(sorted, key=methodcaller('lower'))


class Register(object):
    def __init__(self):
        self.token2filenames = defaultdict(set)

    def __iter__(self):
        return iter(self.token2filenames)

    def __getitem__(self, token):
        return self.token2filenames[token]

    def add_tokens(self, filename, tokens):
        for token in tokens:
            self[token].add(filename)

    def add_file(self, filename, encoding='utf8'):
        with io.open(filename, encoding=encoding) as lines:
            self.add_tokens(filename, (line.strip() for line in lines))

    def add_files(self, filenames, encoding='utf8'):
        for filename in filenames:
            self.add_file(filename, encoding)

    def iter_common_tokens(self, filenames):
        filenames = set(filenames)
        return (
            t for t, fs in self.token2filenames.iteritems() if filenames <= fs
        )

    @classmethod
    def from_files(cls, filenames):
        result = cls()
        result.add_files(filenames)
        return result
            

def main():
    filenames = ['t1.txt', 't2.txt', 't3.txt']
    register = Register.from_files(filenames)
    print '### Ausgabe zu Teilaufgabe 1 ###'
    print ', '.join(sorted_caseless(register.iter_common_tokens(filenames)))

    print '\n\n### Ausgabe zu Teilaufgabe 2 ###'
    for token in sorted_caseless(register):
        print u'{0}: {1}'.format(
            token, ' '.join(sorted_caseless(register[token]))
        )


if __name__ == '__main__':
    main()
BlackJack

Da der Abgabetermin mittlerweile wahrscheinlich verstrichen ist, hier etwas was vielleicht einer Musterlösung näher kommt:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf8
import io
from collections import defaultdict
from functools import partial
from itertools import izip
from operator import and_, methodcaller


sorted_caseless = partial(sorted, key=methodcaller('lower'))


def read_tokens(filenames):
    for filename in filenames:
        with io.open(filename, encoding='utf8') as lines:
            yield set(line.strip() for line in lines)


def get_common_tokens(filenames):
    return reduce(and_, read_tokens(filenames))


def create_register(filenames):
    token2filenames = defaultdict(set)
    for filename, tokens in izip(filenames, read_tokens(filenames)):
        for token in tokens:
            token2filenames[token].add(filename)
    return token2filenames


def main():
    filenames = ['t1.txt', 't2.txt', 't3.txt']
    print '### Ausgabe zu Teilaufgabe 1 ###'
    print ', '.join(sorted_caseless(get_common_tokens(filenames)))

    print '\n\n### Ausgabe zu Teilaufgabe 2 ###'
    register = create_register(filenames)
    for token in sorted_caseless(register):
        print u'{0}: {1}'.format(
            token, ' '.join(sorted_caseless(register[token]))
        )


if __name__ == '__main__':
    main()
mariposa
User
Beiträge: 4
Registriert: Dienstag 30. Juli 2013, 11:58

Hallo zsm!

Gäbe es dazu vielleicht noch eine etwas simplere Lösung? Wenn man noch nicht allzu fortgeschritten ist, sagt einem das alles i wie nichts :|

Lg
BlackJack

@mariposa: Ich würde meine letzte Lösung als ziemlich simpel bezeichnen. Die verwendet die Grundatentypen (+ `collections.defaultdict`) und ein paar Funktionen aus der Standardbibliothek die recht allgemeine Probleme lösen. Was die Funktionen machen kann man in der Dokumentation nachlesen. Und vielleicht auch ein wenig in einer Python-Shell ausprobieren.

Man könnte jetzt das was in den importierten Funktionen passiert selber programmieren, aber damit wird das IMHO nicht simpler. Ist ja letztendlich immer noch das gleiche. Es wird nur mehr Code den man schreiben muss, weil man die fertigen Funktionen nicht verwendet.
mariposa
User
Beiträge: 4
Registriert: Dienstag 30. Juli 2013, 11:58

@BlackJack
Danke erst einmal..
Kann es sein, dass dein Code für Python 2 geschrieben wurde? Ich benutze nämlich die aktuelle Version und das würde vielleicht (hoffentlich :roll: ) erklären, weshalb ich da mit einigen Sachen im Code leider nicht viel anfangen kann.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

mariposa hat geschrieben:Ich benutze nämlich die aktuelle Version ...
Auch Python2.7 ist aktuell. Wahrscheinlich sind die `print`-Statements das einzige das du aendern muesstest.
BlackJack

@mariposa: Ich benutze ein aktuelles Python 2.7. Die Änderungen für Python 3 sind aber nicht schwer. Statt `itertools.izip()` ist es in 3 die eingebaute `zip()`-Funktion. Dafür muss man `reduce()` aus `functools` importieren. Und `print()` ist zur Funktion geworden. Das war's aber auch schon.

Edit: So sollte es unter Python 2.7 und 3 laufen:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf8
from __future__ import print_function, unicode_literals
import io
from collections import defaultdict
from functools import partial, reduce
try:
    from itertools import izip
except ImportError:
    izip = zip
from operator import and_, methodcaller


sorted_caseless = partial(sorted, key=methodcaller('lower'))


def read_tokens(filenames):
    for filename in filenames:
        with io.open(filename, encoding='utf8') as lines:
            yield set(line.strip() for line in lines)


def get_common_tokens(filenames):
    return reduce(and_, read_tokens(filenames))


def create_register(filenames):
    token2filenames = defaultdict(set)
    for filename, tokens in izip(filenames, read_tokens(filenames)):
        for token in tokens:
            token2filenames[token].add(filename)
    return token2filenames


def main():
    filenames = ['t1.txt', 't2.txt', 't3.txt']
    print('### Ausgabe zu Teilaufgabe 1 ###')
    print(', '.join(sorted_caseless(get_common_tokens(filenames))))

    print('\n\n### Ausgabe zu Teilaufgabe 2 ###')
    register = create_register(filenames)
    for token in sorted_caseless(register):
        print (
            '{0}: {1}'.format(
                token, ' '.join(sorted_caseless(register[token]))
            )
        )


if __name__ == '__main__':
    main()
mariposa
User
Beiträge: 4
Registriert: Dienstag 30. Juli 2013, 11:58

Ja super.. läuft, danke!
Aber in der Aufgabenstellung steht, dass die Stellen, an denen "pass" steht, durch den Code ersetzen werden sollen, der ca 10 Zeilen betragen kann.. Mich würde interessieren, ob ihr in dieser Richtung noch Vorschläge hättet
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

BlackJack hat geschrieben:Da der Abgabetermin mittlerweile wahrscheinlich verstrichen ist, ...
Mir kommt es so vor, dass dem nicht so ist ...

@mariposa: Was ist denn dein Ansatz in der Richtung?
Antworten