title | description | prev | next | type | id |
---|---|---|---|---|---|
Kapitel 3: Pipelines für Textverarbeitung |
In diesem Kapitel geht es um alles, was du über spaCys Pipelines für Textverarbeitung wissen musst. Du lernst, was hinter den Kulissen passiert, wenn du einen Text verarbeitest, wie du deine eigenen Komponenten erstellen und sie zur Pipeline hinzufügen kannst, und wie du benutzerdefinierte Attribute nutzen kannst, um deine eigenen Metainformationen zu Dokumenten, Spans und Tokens hinzuzufügen. |
/chapter2 |
/chapter4 |
chapter |
3 |
Was tut spaCy, wenn du nlp
mit einem Text-String als Argument ausführst?
doc = nlp("Dies ist ein Satz.")
Der Tokenizer wird immer vor allen anderen Pipeline-Komponenten ausgeführt, da
er den Text-String in ein Doc
-Objekt umwandelt. Die Pipeline muss außerdem
nicht zwangsläufig aus einem Tagger, Parser und Entity Recognizer bestehen.
Der Tokenizer wandelt einen Text-String in ein Doc
-Objekt um. spaCy führt dann
alle Pipeline-Komponenten der Reihe nach aus und wendet sie auf das Dokument an.
spaCy berechnet alles auf deinem Computer und muss sich nicht mit einem Server verbinden.
Wenn du spacy.load()
aufrufst, um eine Pipeline zu laden, initialisiert spaCy die
Sprache, fügt die Pipeline hinzu und lädt die binären Gewichte des Modells. Wenn
du das nlp
-Objekt mit einem Text ausführst, ist die Pipeline allerdings
bereits geladen.
Lass uns die kleine deutsche Pipeline genauer anschauen!
- Lade die Pipeline
de_core_news_sm
und erstelle dasnlp
-Objekt. - Drucke die Namen der Pipeline-Komponenten mithilfe von
nlp.pipe_names
. - Drucke die
(name, component)
-Tupel der gesamten Pipeline mitnlp.pipeline
.
Die Liste der Namen der Komponenten ist verfügbar als Attribut
nlp.pipe_names
. Die gesamte Pipeline, bestehend aus (name, component)
-Tupeln,
ist verfügbar unter nlp.pipeline
.
Welche dieser Probleme können mit benutzerdefinierten Pipeline-Komponenten gelöst werden? Wähle alle Optionen aus, die zutreffen.
- Trainierte Pipelines aktualisieren und ihre Vorhersagen verbessern
- Eigene Werte auf der Basis von Tokens und ihren Attributen berechnen
- Entitäten hinzufügen, zum Beispiel basierend auf einem Lexikon
- Unterstützung für eine zusätzliche Sprache implementieren
Benutzerdefinierte Komponenten können lediglich das Doc
bearbeiten und daher
nicht dazu genutzt werden, die Gewichte anderer Komponenten direkt
zu verändern.
Benutzerdefinierte Komponenten können lediglich das Doc
bearbeiten und daher
nicht dazu genutzt werden, die Gewichte anderer Komponenten direkt
zu verändern.
Benutzerdefinierte Komponenten können lediglich das Doc
bearbeiten und daher
nicht dazu genutzt werden, die Gewichte anderer Komponenten direkt
zu verändern. Sie werden außerdem zur Pipeline hinzugefügt, nachdem die
Sprachklasse bereits initialisiert und der Text tokenisiert ist. Sie sind daher
nicht geeignet, um neue Sprachen hinzuzufügen.
Benutzerdefinierte Komponenten eignen sich sehr gut dazu, eigene berechnete
Werte zu Dokumenten, Tokens und Spans hinzuzufügen, und die doc.ents
zu
bearbeiten.
Benutzerdefinierte Komponenten werden zur Pipeline hinzugefügt, nachdem die Sprachklasse bereits initialisiert und der Text tokenisiert ist. Sie sind daher nicht geeignet, um neue Sprachen hinzuzufügen.
Benutzerdefinierte Komponenten werden zur Pipeline hinzugefügt, nachdem die Sprachklasse bereits initialisiert und der Text tokenisiert ist. Sie sind daher nicht geeignet, um neue Sprachen hinzuzufügen.
Dieses Beispiel zeigt eine benutzerdefinierte Komponente, die die Anzahl der Tokens eines Dokuments druckt. Kannst du den Code vervollständigen?
- Ergänze die Funktion der Komponente mit der Länge des
doc
s. - Füge
length_component
als erste Komponente zur existierenden Pipeline hinzu. - Teste die neue Pipeline und verarbeite irgendeinen Text mit dem
nlp
-Objekt – zum Beispiel "Dies ist ein Satz."
- Um die Länge eines
Doc
-Objekts zu berechnen, kannst du Pythons eingebaute Methodelen()
verwenden und sie mit demDoc
aufrufen. - Verwende die Methode
nlp.add_pipe
, um eine Komponente zur Pipeline hinzuzufügen. Denke daran, das Keyword-Argumentfirst
aufTrue
zu setzen, damit die Komponente vor allen anderen hinzugefügt wird, und dass der Stringname der Komponente genutzt werden muss. - Um einen Text zu verarbeiten, rufe das
nlp
-Objekt mit dem Text als Argument auf.
In dieser Übung wirst du eine benutzerdefinierte Komponente definieren, die den
PhraseMatcher
verwendet, um Tiernamen im Dokument zu finden und die gefundenen
Spans zu den doc.ents
hinzuzufügen. Ein PhraseMatcher
mit den Tier-Patterns
wurde bereits für dich als Variable matcher
erstellt.
- Definiere die benutzerdefinierte Komponente und wende den
matcher
auf dasdoc
an. - Erstelle eine
Span
für jedes Resultat, weise ihr das label"ANIMAL"
zu und überschreibe diedoc.ents
mit den neuen Spans. - Füge die neue Komponente nach der Komponente
"ner"
zur Pipeline hinzu. - Verarbeite den Text und drucke Text und Label der Entitäten in
doc.ents
.
- Denke daran, dass die Resultate des Matchers als Liste mit
(match_id, start, end)
Tuples zurückgegeben werden. - Die Klasse
Span
akzeptiert vier Argumente: dasdoc
-Objekt, auf das sich die Span bezieht, den Start-Index, den End-Index und das Label. - Um eine Komponente nach einer anderen hinzuzufügen, kannst du das
Keyword-Argument
after
verwenden, wenn dunlp.add_pipe
aufrufst. Beachte hierbei, dass du den Namen der anderen Komponente als String angeben musst.
Lass uns üben, ein paar benutzerdefinierte Attribute festzulegen.
- Verwende
Token.set_extension
, um die Erweiterung"is_country"
(default
-WertFalse
) zu registrieren. - Aktualisiere die Erweiterung für den Token
"Spanien"
und drucke ihren Wert für alle Tokens.
Denke daran, dass Erweiterungen über die Property ._
abrufbar sind, zum
Beispiel doc._.has_color
.
- Verwende
Token.set_extension
, um die Erweiterung"reversed"
(mit Getter-Funktionget_reversed
) zu registrieren. - Drucke für alle Tokens den Wert der Erweiterung.
Denke daran, dass Erweiterungen über die Property ._
abrufbar sind, zum
Beispiel doc._.has_color
.
Lass uns nun ein paar komplexere Attribute mit Getter-Funktionen und Methoden definieren.
- Vervollständige die Funktion
get_has_number
. - Verwende
Doc.set_extension
, um die Erweiterunghas_number
(mit der Getter-Funktionget_has_number
) zu registrieren und drucke ihren Wert.
- Denke daran, dass Erweiterungen über die Property
._
abrufbar sind, zum Beispieldoc._.has_color
. - Die
get_has_number
-Funktion sollte zurückgeben, ob einer der Tokens imdoc
fürtoken.like_num
den WertTrue
zurückgibt (ob der Token einer Zahl ähnelt).
- Verwende
Span.set_extension
, um die Erweiterung"to_html"
(mit der Methodeto_html
) zu registrieren. - Rufe die Methode auf der Span
doc[0:2]
mit dem Tag"strong"
auf.
- Methoden-Erweiterungen können ein oder mehrere Argumente akzeptieren. Zum
Beispiel:
doc._.eine_methode("argument")
. - Das erste Argument, das die Methode erhält, ist immer das
Doc
-,Token
- oderSpan
-Objekt, auf dem die Methode ausgeführt wurde.
In dieser Übung wirst du benutzerdefinierte Erweiterungen mit statistischen Vorhersagen kombinieren und einen Attribut-Getter erstellen, der eine Wikipedia-Such-URL zurückgibt, wenn die Span eine Person, Organisation oder ein Ort ist.
- Vervollständige die
get_wikipedia_url
Getter-Funktion, sodass sie nur eine URL zurückgibt, wenn das Label der Span sich in der Liste von Labels befindet. - Registriere die
Span
-Erweiterung"wikipedia_url"
mit der Getter-Funktionget_wikipedia_url
. - Iteriere über die Entitäten im
doc
und drucke ihre Wikipedia-URLs aus.
- Um das String-Label einer Span zu erhalten, kannst du das Attribut
span.label_
verwenden. Dies ist das Label, das vom Entity Recognizer vorhergesagt wurde, wenn die Span eine Entität ist. - Denke daran, dass Erweiterungen über die Property
._
abrufbar sind, zum Beispieldoc._.has_color
.
Erweiterungen und benutzerdefinierte Attribute sind besonders nützlich in Kombination mit benutzerdefinierten Pipeline-Komponenten. In dieser Übung wirst du eine Pipeline-Komponente definieren, die Namen von Ländern findet, sowie ein benutzerdefiniertes Attribut, das die Hauptstadt des Landes zurückgibt, wenn sie verfügbar ist.
Ein PhraseMatcher
mit allen Ländern wurde bereits als Variable matcher
erstellt. Ein Dictionary aller Ländernamen mit ihren zugeordneten Hauptstädten
ist als Variable CAPITALS
verfügbar.
- Vervollständige die Komponente
countries_component
und erstelle eine Span mit dem label"LOC"
(Location) für alle Resultate des Matchers. - Füge die Komponente zur Pipeline hinzu.
- Registriere die
Span
-Erweiterung"capital"
mit der Getter-Funktionget_capital
. - Verarbeite den Text und drucke Text, Label und Hauptstadt für alle
Entitäten-Spans in den
doc.ents
.
- Die Klasse
Span
akzeptiert vier Argumente: dasdoc
, denstart
- undend
-Token-Index der Span, und das Label. - Wird der
PhraseMatcher
mit einemdoc
aufgerufen, gibt er eine Liste von(match_id, start, end)
Tuples zurück. - Um eine neue Erweiterung zu registrieren, kannst du die Methode
set_extension
der globalen Klasse verwenden, z.B.Doc
,Token
oderSpan
. Um eine Getter-Funktion festzulegen, verwende das Keyword-Argumentgetter
. - Denke daran, dass Erweiterungen über die Property
._
abrufbar sind, zum Beispieldoc._.has_color
.
In dieser Übung wirst du nlp.pipe
verwenden, um Text effizienter zu
verarbeiten. Das nlp
-Objekt wurde bereits für dich erstellt. Eine Liste mit
Tweets über eine bekannte amerikanische Fast-Food-Kette sind verfügbar als
Variable TEXTS
.
- Schreibe den Code um, sodass er
nlp.pipe
verwendet. Statt über die Texte zu iterieren und sie einzeln zu verarbeiten, iteriere über diedoc
-Objekte, die vonnlp.pipe
zurückgegeben werden.
- Mit
nlp.pipe
kannst du die ersten beiden Zeilen des Codes in eine zusammenfügen. nlp.pipe
erhältTEXTS
als Argument und gibtdoc
-Objekte peryield
zurück, über die du iterieren kannst.
- Schreibe den Code um, sodass er
nlp.pipe
verwendet. Vergisst nicht, die Methodelist()
um das Ergebnis herum auszuführen, um es in eine Liste umzuwandeln.
- Schreibe den Code um, sodass er
nlp.pipe
verwendet. Vergisst nicht, die Methodelist()
um das Ergebnis herum auszuführen, um es in eine Liste umzuwandeln.
In dieser Übung wirst du benutzerdefinierte Attribute verwenden, um Meta-Informationen über Autor und Buch zu Zitaten hinzuzufügen.
Eine Liste mit [text, context]
Beispielen ist verfügbar als Variable DATA
.
Die Texte sind Zitate aus berühmten Büchern, und der Kontext ist jeweils ein
Dictionary mit den Schlüsseln "autor"
und "buch"
.
- Verwende die Methode
set_extension
, um die Doc-Erweiterungen"autor"
und"buch"
mitdefault
-WertNone
zu registrieren. - Verarbeite die
[text, context]
Paare inDATA
und verwende hierzunlp.pipe
mitas_tuples=True
. - Überschreibe die Attribute
doc._.buch
unddoc._.autor
mit den entsprechenden Informationen, die als Kontext durchgereicht werden.
- Die Methode
Doc.set_extension
erwartet zwei Argumente: der String-Name des Attributs und ein Keyword-Argument, das entweder den default-Wert, Getter- und Setter-Funktion, oder die Methode angibt, zum Beispieldefault=True
. - Wenn
as_tuples
aufTrue
gesetzt ist, erwartet die Methodenlp.pipe
eine Liste von(text, context)
Tuples und gibt(doc, context)
Tuples peryield
zurück.
In dieser Übung wirst du die Methoden nlp.make_doc
und nlp.select_pipes
verwenden, um bei der Verarbeitung des Texts nur ausgewählte Komponenten
auszuführen.
- Schreibe den Code um, sodass er
nlp.make_doc
verwendet und nur den Tokenizer ausführt.
- Die Methode
nlp.make_doc
wird mit einem Text aufgerufen und gibt einDoc
-Objekt zurück, genauso wie dasnlp
-Objekt.
- Deaktiviere den Tagger und Lemmatizer mithilfe der Methode
nlp.select_pipes
. - Verarbeite den Text und drucke alle Entitäten im
doc
.
Die Methode nlp.select_pipes
akzeptiert die Argumente enable
oder
disable
, die beide eine Liste von Komponentennamen akzeptieren, die daraufhin
aktiviert oder deaktiviert werden. nlp.select_pipes(disable="ner")
deaktiviert zum
Beispiel den Entity Recognizer.