5.1
 NLP-Pipeline

5.1.1
 urllib

Download und Verarbeitung von Web-Texten 

Zuerst Download, dann lokale Verarbeitung

Download auf der Kommandozeile: wget

$ wget http://www.gutenberg.org/files/2554/2554.txt  
$ head 2554.txt

5.1.2
 HTML-Pipeline

Download und Verarbeitung von Web-Texten 

Download und Verarbeitung in Python

Die Funktion urlopen() vom Modul urllib erlaubt entfernte Dateien (remote files) wie lokale Dateien zu öffnen. Einlesen einer entfernten Textdatei mit urlopen()  42

 
import nltk 
from urllib import urlopen 
 
url = "http://www.gutenberg.org/files/2554/2554.txt" 
 
# Lese URL-Inhalt in String ein 
raw = urlopen(url).read() 
# Textverarbeitung 
tokens = nltk.word_tokenize(raw) 
text = nltk.Text(tokens) 
text.collocations(num=40)

Typische Pipeline der Vorverarbeitung von HTML-Dateien 
pict

Schritt 1: Download von HTML als Python-String 
 43

 
import nltk, re 
from urllib import urlopen 
 
### (1) Download Html-Datei 
url = "http://news.bbc.co.uk/2/hi/health/2284783.stm" 
html = urlopen(url).read() 
 
 
# Was ist da drin? 
html[:60] 
# print html

HTML-Markup entfernen 

Hilfsfunktion nltk.clean_html()  44

Robustes Entfernen von allem, was nach HTML-Struktur und Kommentaren aussieht mit Hilfe von re.sub().

Typische Regex-Techniken beim Quick-And-Dirty-Säubern von HTML

re.sub(r"(?is)<(script|style).*?>.*?(</\1>)", "", string) re.sub(r"(?s)<!--.*?-->", "", string) re.sub(r"(?s)<.*?>", "", string)

Textzoning: Artikeltext extrahieren 

Satz- und Wortsegmentierung für Englisch 

Ziel: Saubere Satz- und Wortsegmentierung nach Penn-Treebank

1.
Sätze segmentieren: Liste von Satzstrings
2.
Wörter segmentieren: Liste von Wortstrings
Listenkomprehension mit 2 Schlaufen

 
art_sents = nltk.sent_tokenize(art_raw) 
art_tokens = [w 
         for s in art_sents 
         for w in nltk.word_tokenize(s)]
Achtung: nltk.word_tokenize() ist für die Verarbeitung eines einzelnen Satzes gedacht! Achtung: nltk.wordpunct_tokenize() trennt stärker auf bei Symbolzeichen als die Penn-Treebank-Tokenisierung!

Vocabular-Differenzen berechnen 
Um die Tokenisierungsqualität zu beurteilen, ist die Mengen-Differenz geeignet. In Python Diff = set(M).difference(N)

pict

D  = M  - N

 
# Welche Tokens aus t_word_tokenize sind nicht in art_tokens? 
t_word_tokenize = nltk.word_tokenize(art_raw) 
set(t_word_tokenize).difference(art_tokens) 
 
# Welche Tokens aus r_wordpunct_tokenize sind nicht in art_tokens? 
r_wordpunct_tokenize = nltk.wordpunct_tokenize(art_raw) 
set(r_wordpunct_tokenize).difference(art_tokens)

Tokenisat als nltk.Text benutzen 
Tokenliste zu nltk.Text machen

 
art_text = nltk.Text(art_tokens)

Reguläre Wortsuche mit nltk.Text.findall()

NLTK-Spezialsyntax für Wortsuche in tokenisierten Texten:

 
art_text.findall(r<blond.*><.*>)

Nachtrag: Regex-basierte Tokenisierer 
Tokenisierer für nicht-englische Texte können am schnellsten mit regulären Ausdrücken gemacht werden.

Unterschiedlicher Matches  46

 
import nltk 
text = u"Häßlicher Fernseh-Mörder tötete für 20.000." 
pattern = ur(?xu) # Dank (?u) matcht \w alle Unicode-Buchstaben 
   ([A-Z]\.)+     # Abkuerzungen 
  | [$]?\d+[\.\d]*[%]? # Zahlausdrücke mit % oder Währung 
  | \w+(-\w+)*     # Wörter mit Bindestrich 
  | \.\.\.        # Mehrteilige Interpunktion 
  | [.,;?"]       # Einzelne interpunctuation 
  | \S+           # catch-all für Nicht-Leerzeichen 
  ’’’ 
m = nltk.regexp_tokenize(text,pattern)

Regex-Alternative ist nicht kommutativ 
Die Reihenfolge in einer Regex-Alternative ist nicht beliebig!

re.findall() liefert eine Liste der Matches

 
import re 
re.findall(r(a|aa),"Saal") 
re.findall(r(aa|a),"Saal")