6.2
 Klassen

6.2.1
 Ober-/Unterklassen

Motivation 

Ziel

Eine Klasse programmieren, welche eine Konkordanz über einem gestemmten Index anzeigt. Beispiel-Output

>>> text.concordance(die,width=30)
 BLACK KNIGHT : Then you shall die . ARTHUR : I command you  
Camelot . He was not afraid to die , O brave Sir Robin .  
 Concorde , you shall not have died in vain ! CONCORDE : Uh  
               2 : Oh , he ’ s died ! FATHER : And I want  
 that ? MAYNARD : He must have died while carving it . LAUNCE  
     ARTHUR : Look , if he was dying , he wouldn ’ t bother

Beispiel: Konkordanzprogramm über gestemmten Wörtern 

Ziel

Eine Klasse programmieren, welche eine Konkordanz über einem gestemmten Index anzeigt.

Benötigte Kompetenzen

Klassen 

Gemeinsame Eigenschaften und Fähigkeiten von Objekten

Was verbindet oder unterscheidet die Objekte der verschiedenen Klassen?

Essbare Objekte

pict

Geometrische Objekte

pict

Klassen 

Typen von Klassenhierarchien 

ISA-Relation: Beziehung zwischen einer Klasse und ihrer Oberklasse

Ein Apfel ist eine Frucht. Jedes Quadrat ist ein Rechteck.

Flache Hierarchie  49

pict

Verschachtelte Hierarchie

pict

Klassenhierachie in NLTK

Ist die NLTK-Klasse nltk.FreqDist ist eine Unterklasse von dict?

>>> issubclass(nltk.FreqDist,dict) 
True

Die Eigentümlichkeiten der Oberklasse object

Die Klasse object ist trotz ihres Namens eine Klasse!

>>> help(object) 
Help on class object in module __builtin__: 
class object 
| The most base type
Objekte (Instanzen) der Klasse object

>>> o = object() 
>>> type(o) 
<type object>
Gibt es eine Oberklasse der Klasse object?

>>> issubclass(object,object) 
True

Klassenhierarchie in NLTK 
Klassenhierarchien sind normalerweise eher flach. Eine Ausnahme in NLTK sind die Einleseklassen für Korpora.

Klassenhierarchie für Treebanks im Klammerformat  50

pict

( (S  
    (NP-SBJ  
      (NP (NNP Pierre) (NNP Vinken) )  
      (, ,)  
      (ADJP  
        (NP (CD 61) (NNS years) )  
        (JJ old) )  
      (, ,) )  
    (VP (MD will)  
      (VP (VB join)  
        (NP (DT the) (NN board) )  
        (PP-CLR (IN as)  
          (NP (DT a) (JJ nonexecutive) (NN director) ))  
        (NP-TMP (NNP Nov.) (CD 29) )))  
    (. .) ))

6.2.2
 Klassendefinition

Klassen definieren: Case-insensitive Strings 
Definition der Klasse, der Konstruktorfunktion und einer Methode  51

 
class Istr(object):                # Unterklasse von object 
   """Case-insensitive string class"""
 
   def __init__(self,s):           # Konstruktor-Funktion 
      self._is = s.lower()         # self ist Instanzparameter 
                               # self._is ist Objektattribut
 
 
   def endswith(self,s):           # Methode endswith(s) 
      return self._is.endswith(s.lower())
Instantiierung eines Objekts und Methodenaufruf

 
s = Istr(ABC) # Konstruktion eines Objekt der Klasse Istr 
s.endswith(c) # Methoden-Aufruf

Zusammenhang von Definition und Verwendung 
PIC

Mehrfachvererbung (multiple inheritance
Eine Klasse kann Unterklasse von mehr als einer Oberklasse sein. Im Sinne von class EdibleFruit(Produce,Fruit):

Mehrfachvererbung in der Oberbegriffshierarchie bei WordNet

PIC

Quelle: http://wordnetweb.princeton.edu/perl/webwn

Regex-Stemmer-Klasse definieren 
Klasse mit Default-Argument  52

 
class RegexStemmer(object): 
   def __init__(self, 
            r=r^(.*?)(ing|ly|ed|ious|ies|ive|es|s|ment)?$): 
      self._r = r 
 
   def stem(self,word): 
      m = re.match(self._r, word) 
      return m.group(1)
Initialisierung und Verwendung

 
mystemmer = RegexStemmer() 
mystemmer.stem(dying)

Textindexer definieren 

 
class IndexedText(object): 
   def __init__(self, stemmer, text): 
      self._text = text 
      self._stemmer = stemmer 
      self._index = nltk.Index((self._stem(word), i) 
                        for (i, word) in enumerate(text))
enumerate(s) generiert Paare (Position,Item) aus Sequenz

l = [wenn, fliegen, hinter, fliegen, fliegen] 
>>> list(enumerate(l)) 
[(0, wenn), (1, fliegen), (2, hinter), (3, fliegen), (4, fliegen)]
nltk.Index(Pairs) erzeugt invertierten Index aus (Item,Position)

>>> index = nltk.Index((w,i) for (i,w) in enumerate(l)) 
>>> index[fliegen] 
[1, 3, 4]

Private und öffentliche Methode definieren 
Unterstrich drückt Privatheit der Stemm-Methode aus

 
   def _stem(self, word): 
      return self._stemmer.stem(word).lower()
Öffentliche Methode für Formatierung

 
   def concordance(self, word, width=40): 
      key = self._stem(word) 
      wc = width/4           # words of context 
      for i in self._index[key]: 
         lcontext =  .join(self._text[i-wc:i]) 
         rcontext =  .join(self._text[i:i+wc]) 
         ldisplay = %*s % (width, lcontext[-width:]) 
         rdisplay = %-*s % (width, rcontext[:width]) 
         print ldisplay, rdisplay