spaCy und UDFs
TED-Talks mit spaCy analysieren
Datensatz laden
In diesem Abschnitt verwenden den TED Talk Datensatz als Beispiel. Falls noch nicht geschehen, importiert euch das Notebook und ladet den Datensatz, sodass ihr auf die Tabelle ted_text
zugreifen könnt.
spaCy installieren und Sprachmodell laden
Zudem müssen wir bevor wir loslegen spaCy in unserem Notebook installieren und ein geeignetes Sprachmodell laden. Wir verwenden hier das kleine englische Modell (en_core_web_sm
).
Erstellen einer eigenen SQL-Funktion (UDF)
Wir wollen in diesem Beispiel eine eigene Funktion erstellen, die alle Verben aus einem TED-Talk extrahiert und gleichzeitig in seine Grundform überführt. Wie das geht, haben wir im Abschnitt zum Part-of-Speech (POS) sowie Lemmatizer bereits gelernt. Wir verpacken den Code nun in einer Python-Funktion, die wir anschließend als SQL-Funktion mit dem Namen getVerbs
registrieren:
from pyspark.sql.types import ArrayType, StringType
import spacy
nlp = spacy.load("en_core_web_sm")
nlp.disable_pipe("ner")
nlp.disable_pipe("parser")
def getVerbs(text):
doc = nlp(text)
print(doc)
verbs = [token.lemma_ for token in doc if token.pos_ == "VERB"]
return verbs
spark.udf.register("getVerbs", getVerbs, ArrayType(StringType()))
Um möglichst effizient zu sein, deaktivieren wir alle nicht benötigten Pipeline-Komponenten mittels der disable_pipe
Funktion. In diesem Fall benötigen wir keine Named Entity Recognition (ner) oder syntaktische Merkmale (parser).
Anwenden der neuen Funktion auf die Textspalte
Wir können jetzt die neue SQL-Funktion getVerbs
wie gewohnt verwenden und als Parameter eine Textspalte übergeben. Für die TED-Talks ist das die Spalte text
aus der Tabelle ted_text
:
select
getVerbs(text) as list_of_verbs,
text
from
ted_text
where
youtube_id = "YDvbDiJZpy0"
Im obigen Beispiel wenden wir die neue Funktion vorsichtshalber nur auf einen einzigen Text an, um schnell ein Ergebnis zu bekommen. Bei Anwendung auf alle > 2000 Texte kann es eine Weile dauern, bis ein Ergebnis vorliegt.

Um die Anwendung auf mehrere Texte zu erweitern, könnt ihr folgende Abfrage verwenden und den Filter entsprechend verändern:
select
getVerbs(text) as list_of_verbs,
text
from
(
select
rank() over (
order by
youtube_id
) as rank,
text
from
ted_text
)
where
rank <= 100
Für die Verarbeitung größerer Mengen an Texten empfiehlt es sich, die Analyse direkt in Python durchzuführen, die Daten mit nlp.pipe()
zu streamen sowie das Ergebnis in einer neuen Tabelle zu persistieren, um damit effizient weiterarbeiten zu können. Auf diese Punkte gehen wir in den folgenden Abschnitten genauer ein.
Last updated
Was this helpful?