4.1
 Lexika

4.1.1
 Wortlisten

Wortlisten als Lexika 

Definition 4.1.1 (Wortlisten). Die einfachste Form von Lexika sind Wortlisten . Als Datei typischerweise 1 Wort pro Zeile und sortiert.

Stoppwortlisten (stopwords) in NLTK  30

 
stopwords_en = nltk.corpus.stopwords.words(english) 
 
print len(stopwords_en), stopwords_en[::20] 
# >>> 127 [i, herself, was, because, from, any, t]

Rechnen mit Stoppwortlisten 
Was berechnet foo()? Was wäre ein guter Funktionsname?  31

 
import nltk 
def foo(text): 
   stopwords = nltk.corpus.stopwords.words(english) 
   filtered = [w for w in text if w.lower() not in stopwords] 
   return float(len(filtered))/len(text) 
 
print foo(nltk.corpus.brown.words())

4.1.2
 Normalisierung

Anteil normalisierter Inhaltswörter eines Texts 

Effizientes Buchstabenmodifizieren mit Stringmethode translate()

>>> help(str.translate)  
    S.translate(table [,deletechars]) -> string  
 
    Return a copy of the string S, where all characters occurring  
    in the optional argument deletechars are removed, and the  
    remaining characters have been mapped through the given  
    translation table, which must be a string of length 256.

Berechnen eines Kleinschreibungstabelle

 
tolower_table = .join([chr(i) for i in range(256)]).lower()
Achtung: Die Translate-Funktion macht dasselbe auf Strings wie der UNIX-Befehl tr auf Dateien.

Anteil normalisierter Inhaltswörter eines Texts 
Normalisierungsfunktion definieren mit einem Doc-String  32

 
def normalize_str(s): 
   """ 
   Return a copy of string s with all punctuation characters 
   removed and converted to lowercase. 
   """ 
   punct = !"#%&\x27`()*,-./:;?@[\\]_{}\xa1\xab\xb7\xbb\xbf 
   return s.translate(tolower_table,punct)

Doc-Strings

Die Python-Funktion help(normalize_str) zeigt den Doc-String an. Das 1. Stringliteral in einer Funktionsdefinition wird als Dokumentation verwendet.

Anteil normalisierter Inhaltswörter eines Texts 
Berechne den Anteil der Inhaltswörter (ohne Interpunktion!), welche nicht in einer Stoppwortliste sind.

Anteilsfunktion

 
def content_fraction_en(text): 
   stopwords_en = nltk.corpus.stopwords.words(english) + [] 
   filtered = [w for w in text 
            if normalize_str(w) not in stopwords_en] 
   return float(len(filtered))/len(text)

Anteilsfunktion auf Brown-Kategorien anwenden

 
for cat in nltk.corpus.brown.categories(): 
   print cat, content_fraction_en( 
               nltk.corpus.brown.words(categories=cat))

4.1.3
 UTF-8

Einlesen von Non-ASCII-Wortlisten 
Enkodierungsprobleme mit Standardeinlesefunktion von NLTK

$ pwd  
/usr/share/nltk_data/corpora/stopwords  
$ file english  
english: ASCII English text  
$ file german  
german: UTF-8 Unicode text  
$ python  
>>> import nltk  
>>> print nltk.corpus.stopwords.words(’german’)[-7:-4]  
[’w\xc3\xbcrde’, ’w\xc3\xbcrden’, ’zu’]

Achtung: Bug in aktuellem NLTK

Einlesen von UTF-8-kodierten Stoppwortlisten 
Einlesen von deutschen Stoppwörtern als unicode Strings  33

 
from nltk.corpus import stopwords, WordListCorpusReader 
 
corpusdir = stopwords.root 
 
# Construct corpus object sde with proper encoding initialization 
sde = WordListCorpusReader(corpusdir,german,encoding=utf-8) 
 
print sde.words()[-7:-4] # >>> [uw\xfcrde, uw\xfcrden, uzu]

Wichtigste Argumente des Konstruktors für Wortlistenkorpora  34

1.
Verzeichnis von Korpus (1. Argument)
2.
Dateiname (2. Argument)
3.
Enkodierungsstring (als benanntes Funktionsargument)

Rohtext-Korpora im UTF-8-Format einlesen 
Einlesen Rohtext-Korpora als unicode Strings  35

 
import nltk 
from nltk.corpus import PlaintextCorpusReader, WordListCorpusReader 
 
corp_dir =  
filename = edited_tom_sawyer.txt 
crp = PlaintextCorpusReader(corp_dir,filename,encoding=utf-8) 
words = crp.words()
 
scrp = WordListCorpusReader( 
   nltk.corpus.stopwords.root,german,encoding=utf-8) 
stopwords = scrp.words()
 
print float(len(filtered))/len(words)

4.1.4
 Aussprachelexika

CMU Pronouncing Dictionary 

Strukturierte Lexikoneinträge

CMU besteht aus Paaren von Lemma und Listen von phonetischen Kodes. Filtern von Lexikoneinträgen  36

 
import nltk 
 
entries = nltk.corpus.cmudict.entries() 
 
# Finde alle Wörter auf -n, welche als -M ausgeprochen werden. 
print [ word for (word,pron) in entries 
         if pron[-1] == M 
         and word[-1] == n ]