Kapitel 1. Sprache und Berechnung
Diese Arbeit wurde mithilfe von KI übersetzt. Wir freuen uns über dein Feedback und deine Kommentare: translation-feedback@oreilly.com
Anwendungen, die natürliche Sprachverarbeitung nutzen, um Text- und Audiodaten zu verstehen, werden zu einem festen Bestandteil unseres Lebens. In unserem Namen kuratieren sie die unzähligen von Menschen erstellten Informationen im Internet und bieten neue und personalisierte Mechanismen der Interaktion zwischen Mensch und Computer. Diese Anwendungen sind so weit verbreitet, dass wir uns an eine Vielzahl von Anwendungen im Hintergrund gewöhnt haben: von Spam-Filtern, die unseren E-Mail-Verkehr überwachen, über Suchmaschinen, die uns genau dorthin bringen, wo wir hinwollen, bis hin zu virtuellen Assistenten, die immer zuhören und bereit sind zu antworten.
Sprachbewusste Funktionen sind Datenprodukte, die an der Schnittstelle zwischen Experiment, Forschung und praktischer Softwareentwicklung entstehen. Die Anwendung von Text- und Sprachanalysen wird direkt von den Nutzern erlebt, deren Reaktion ein Feedback liefert, das sowohl die Anwendung als auch die Analyse verbessert. Dieser Kreislauf beginnt oft etwas naiv, kann sich aber mit der Zeit zu einem tiefgreifenden System mit lohnenden Ergebnissen entwickeln.
Ironischerweise werden die Möglichkeiten, sprachbasierte Funktionen in Anwendungen zu integrieren, von den "Großen" überproportional häufig genutzt. Warum tun das nicht mehr Leute? Vielleicht liegt es zum Teil daran, dass diese Funktionen immer häufiger eingesetzt werden, aber auch daran, dass sie immer unsichtbarer werden und die Komplexität, die für ihre Implementierung erforderlich ist, verschleiern. Es liegt aber auch daran, dass die steigende Flut der Datenwissenschaft die vorherrschende Kultur der Softwareentwicklung noch nicht durchdrungen hat.
Wir glauben, dass Anwendungen, die sich auf natürlichsprachliche Schnittstellen stützen, immer häufiger werden und vieles von dem, was heute mit Formularen und Klicks erledigt wird, ersetzen werden. Um diese zukünftigen Anwendungen zu entwickeln, muss die Softwareentwicklung hypothesengesteuerte Datenwissenschaftstechniken einbeziehen. Um sicherzustellen, dass sprachbasierte Datenprodukte robuster werden, müssen Datenwissenschaftler/innen Softwareentwicklungsverfahren anwenden, die einen produktionsgerechten Code erstellen. Diese Bemühungen werden durch ein sich neu entwickelndes Paradigma der Datenwissenschaft integriert, das zur Erstellung von sprachsensiblen Datenprodukten führt, auf die sich dieses Buch hauptsächlich konzentriert.
Das Paradigma der Datenwissenschaft
Dank der Innovationen im Bereich des maschinellen Lernens und der skalierbaren Datenverarbeitung sind die Begriffe "Datenwissenschaft" und "Datenprodukt" in den letzten zehn Jahren zu einem festen Begriff geworden. Das hat auch zu einem neuen Berufsbild geführt: Data Scientist - eineMischung aus Statistiker/in, Informatiker/in und Fachmann/frau. Data Scientists sind die zentralen Wertschöpfungstreibenden des Informationszeitalters, und so ist diese neue Rolle zu einem der wichtigsten, ja sogar sexy Jobs des21.
Datenwissenschaftler/innen schlagen eine Brücke zwischen der traditionellen Arbeit im akademischen Kontext, der Forschung und dem Experimentieren, und dem Workflow eines kommerziellen Produkts. Das liegt zum Teil daran, dass viele Datenwissenschaftler/innen zuvor ein Aufbaustudium absolviert haben (was ihnen die für die Datenwissenschaft erforderlichen Tausendsassa- und Kreativfähigkeiten verleiht), aber vor allem daran, dass der Prozess der Datenproduktentwicklung zwangsläufig experimentell ist.
Die Herausforderung, auf die prominente Stimmen in diesem Bereich hingewiesen haben, besteht darin, dass der Data Science-Workflow nicht immer mit den Praktiken der Softwareentwicklung vereinbar ist. Daten können unberechenbar sein, und Signale sind nicht immer garantiert. Wie Hilary Mason über die Entwicklung von Datenprodukten sagt, ist die Datenwissenschaft nicht immer besonders agil.1
Oder, anders gesagt:
Es gibt einen grundlegenden Unterschied zwischen der Bereitstellung von Produktionssoftware und verwertbaren Erkenntnissen als Artefakte eines agilen Prozesses. Die Notwendigkeit, dass Erkenntnisse verwertbar sein müssen, schafft ein Element der Unsicherheit in Bezug auf die Artefakte der Datenwissenschaft - sie könnten im Sinne der Software "vollständig" sein und dennoch keinen Wert haben, weil sie keine echten, verwertbaren Erkenntnisse liefern....agile Software-Methoden können mit dieser Unsicherheit nicht gut umgehen.
Russell Jurney, Agile Datenwissenschaft 2.0
Infolgedessen arbeiten Data Scientists und Data Science-Abteilungen oft unabhängig vom Entwicklungsteam nach dem in Abbildung 1-1 beschriebenen Arbeitsparadigma. In diesem Kontext erstellt die Data Science-Abteilung Geschäftsanalysen für die Geschäftsleitung, die Änderungen an die Technologie- oder Produktleitung weitergibt, die dann wiederum vom Entwicklungsteam umgesetzt werden.
Diese Struktur mag zwar für einige Unternehmen ausreichend sein, ist aber nicht besonders effizient. Wenn Data Scientists von Anfang an in das Entwicklungsteam integriert wären, wie in Abbildung 1-2 dargestellt, würden Verbesserungen am Produkt viel schneller eintreten und das Unternehmen wäre viel wettbewerbsfähiger. Es gibt nicht viele Unternehmen, die es sich leisten können, Dinge zweimal zu entwickeln! Noch wichtiger ist, dass die Bemühungen der Datenwissenschaftler/innen auf die Nutzer/innen ausgerichtet sind, was einen In-the-Loop-Ansatz neben der Frontend-Entwicklung erfordert.
Eines der Hindernisse für ein stärker integriertes Entwicklungsparadigma in der Datenwissenschaft ist der Mangel an anwendungsorientierten Inhalten für die Datenwissenschaft. Die meisten veröffentlichten Ressourcen zu maschinellem Lernen und natürlicher Sprachverarbeitung sind so geschrieben, dass sie die Forschung unterstützen, aber nicht für die Anwendungsentwicklung geeignet sind. So gibt es zwar eine Reihe hervorragender Tools für maschinelles Lernen auf Textbasis, aber die verfügbaren Ressourcen, Dokumentationen, Tutorials und Blogbeiträge stützen sich in der Regel stark auf Spielzeugdatensätze, Datenexplorations-Tools und Forschungscode. Es gibt nur wenige Ressourcen, die z. B. erklären, wie man einen ausreichend großen Korpus für eine Anwendung aufbaut, wie man seine Größe und Struktur verwaltet, wenn er mit der Zeit wächst, oder wie man Rohdokumente in brauchbare Daten umwandelt. In der Praxis ist dies zweifellos der größte Teil der Arbeit, die mit dem Aufbau skalierbarer sprachbasierter Datenprodukte verbunden ist.
Dieses Buch soll diese Lücke schließen, indem es einen entwicklungsorientierten Ansatz für Textanalysen ermöglicht. Wir zeigen, wie man die verfügbaren Open-Source-Technologien nutzen kann, um modulare, testbare, abstimmbare und skalierbare Datenprodukte zu erstellen. Zusammen mit diesen Tools hoffen wir, dass die in diesem Buch vorgestellten Techniken es Datenwissenschaftlern ermöglichen, die nächste Generation von Datenprodukten zu entwickeln.
Dieses Kapitel dient als Grundlage für die eher praktischen, programmierorientierten Kapitel im Rest des Buches. Zunächst wird erläutert, was wir unter sprachsensiblen Datenprodukten verstehen und wie man sie in der freien Wildbahn entdeckt. Als Nächstes werden wir architektonische Entwurfsmuster besprechen, die sich gut für Textanalyseanwendungen eignen. Zum Schluss betrachten wir die Eigenschaften der Sprache, die zur rechnerischen Modellierung genutzt werden können.
Sprachbewusste Datenprodukte
Datenwissenschaftler/innen erstellen Datenprodukte. Datenprodukte sind Anwendungen, die ihren Wert aus Daten ableiten und im Gegenzug neue Daten erzeugen.2 Unserer Meinung nach besteht das Ziel der angewandten Textanalyse darin, "sprachbewusste Datenprodukte" zu erstellen - nutzerorientierte Anwendungen, die nicht nur auf menschliche Eingaben reagieren und sich an Veränderungen anpassen können, sondern auch beeindruckend genau und relativ einfach zu gestalten sind. Im Kern nehmen diese Anwendungen Textdaten als Eingabe entgegen, zerlegen sie in zusammengesetzte Teile, verarbeiten diese und fügen sie so zusammen, dass ein sinnvolles und maßgeschneidertes Ergebnis entsteht.
Eines unserer Lieblingsbeispiele dafür ist "Yelpy Insights", eine Anwendung zur Filterung von Bewertungen, die eine Kombination aus Stimmungsanalyse, signifikanten Kollokationen (Wörter, die häufig zusammen vorkommen) und Suchtechniken nutzt, um festzustellen, ob ein Restaurant für deinen Geschmack und deine Ernährungsgewohnheiten geeignet ist. Die Anwendung nutzt einen umfangreichen, domänenspezifischen Korpus und präsentiert den Nutzern die Ergebnisse auf intuitive Weise, um ihnen bei der Entscheidung zu helfen, ob sie ein bestimmtes Restaurant aufsuchen sollten. Durch die automatische Erkennung von wichtigen Sätzen in den Bewertungen und die Hervorhebung von Begriffen können potenzielle Restaurantbesucher eine große Textmenge schnell verarbeiten und leichter eine Entscheidung treffen. Obwohl die Sprachanalyse nicht das Kerngeschäft von Yelp ist, ist der Einfluss, den diese Funktion auf die Erfahrung der Nutzer/innen hat, unbestreitbar. Seit der Einführung von "Yelpy Insights" im Jahr 2012 hat Yelp kontinuierlich neue sprachbasierte Funktionen eingeführt und konnte in diesem Zeitraum seinen Jahresumsatz um das 6,5-fache steigern.3
Ein weiteres einfaches Beispiel für eine nachträgliche Sprachanalyse mit überdimensionalen Auswirkungen ist die Funktion "vorgeschlagene Tags", die in die Datenprodukte von Unternehmen wie Stack Overflow, Netflix, Amazon, YouTube und anderen integriert ist. Tags sind Metainformationen über einen Inhalt, die für die Suche und Empfehlungen wichtig sind und eine wichtige Rolle dabei spielen, welche Inhalte von bestimmten Nutzern angesehen werden. Sie spielen eine wichtige Rolle dabei, welche Inhalte von bestimmten Nutzern angesehen werden. Tags identifizieren Eigenschaften des Inhalts, den sie beschreiben, und können verwendet werden, um ähnliche Artikel zu gruppieren und beschreibende Themennamen für eine Gruppe vorzuschlagen.
Es gibt noch viele, viele mehr. Reverb bietet einen personalisierten Nachrichtenleser, der auf dem Wordnik-Lexikon basiert. Der Slack-Chatbot bietet kontextbezogene automatische Interaktion. Google Smart Reply kann Antworten vorschlagen, die auf dem Text der E-Mail basieren, auf die du antwortest. Textra, iMessage und andere Instant-Messaging-Tools versuchen, anhand des gerade eingegebenen Textes vorherzusagen, was du als Nächstes tippen wirst, und die Autokorrektur versucht, unsere Rechtschreibfehler für uns zu korrigieren. Außerdem gibt es eine Vielzahl neuer sprachgesteuerter virtueller Assistenten - Alexa, Siri, Google Assistant und Cortana - die auf Audiodaten trainiert sind, Sprache analysieren und (normalerweise) passende Antworten geben können.
Hinweis
Und was ist mit Sprachdaten? In diesem Buch geht es zwar um Text und nicht um Audio- oder Sprachanalyse, aber Audiodaten werden in der Regel in Text transkribiert und dann für die in diesem Buch beschriebenen Analysen verwendet. Die Transkription selbst ist ein Prozess des maschinellen Lernens, der ebenfalls immer mehr Verbreitung findet!
Merkmale wie diese verdeutlichen die grundlegende Methodik sprachsensibler Anwendungen: das Clustern ähnlicher Texte in sinnvolle Gruppen oder das Klassifizieren von Texten mit bestimmten Bezeichnungen, oder anders ausgedrückt: unüberwachtes und überwachtes maschinelles Lernen.
Im nächsten Abschnitt werden wir einige architektonische Entwurfsmuster untersuchen, die den Lebenszyklus von Machine Learning-Modellen unterstützen.
Die Datenprodukt-Pipeline
Die standardmäßige Datenprodukt-Pipeline, die in Abbildung 1-3 dargestellt ist, ist ein iterativer Prozess, der aus zwei Phasen besteht - Aufbau und Einsatz -, die die Pipeline für maschinelles Lernen widerspiegeln.4 In der Aufbauphase werden die Daten aufgenommen und in eine Form gebracht, die es ermöglicht, Modelle anzupassen und mit ihnen zu experimentieren. In der Einsatzphase werden die Modelle ausgewählt und dann verwendet, um Schätzungen oder Vorhersagen zu treffen, die den Nutzer direkt betreffen.
Die Nutzerinnen und Nutzer reagieren auf die Ergebnisse der Modelle und geben Feedback, das wiederum zur Anpassung der Modelle genutzt wird. Die vier Phasen - Interaktion, Daten, Speicherung und Berechnung - beschreiben die Architekturkomponenten, die für jede Phase benötigt werden. In der Interaktionsphase wird zum Beispiel ein Scraper oder ein Dienstprogramm benötigt, um Daten zu erfassen, während der Nutzer ein Anwendungsfrontend benötigt. Die Datenphase bezieht sich in der Regel auf interne Komponenten, die als Bindeglied zur Speicherung dienen, bei der es sich meist um eine Datenbank handelt. Die Berechnung kann viele Formen annehmen, von einfachen SQL-Abfragen über Jupyter-Notebooks bis hin zu Cluster-Computing mit Spark.
Die Bereitstellungsphase unterscheidet sich, abgesehen von der Auswahl und Verwendung eines angepassten Modells, nicht wesentlich von der einfachen Softwareentwicklung. Oft enden Data Science-Arbeitsprodukte an der API, die von anderen APIs oder einem Benutzer-Frontend genutzt wird. Die Erstellungsphase eines Datenprodukts erfordert jedoch mehr Aufmerksamkeit - vor allem im Fall von Textanalysen. Wenn wir sprachbasierte Datenprodukte entwickeln, erstellen wir zusätzliche lexikalische Ressourcen und Artefakte (z. B. Wörterbücher, Übersetzer, reguläre Ausdrücke usw.), auf die unsere Anwendung angewiesen sein wird.
Eine detailliertere Ansicht der Erstellungsphase zeigt Abbildung 1-4, eine Pipeline, die robuste, sprachsensitive maschinelle Lernanwendungen unterstützt. Der Weg von den Rohdaten zum einsatzbereiten Modell ist im Wesentlichen eine Reihe von inkrementellen Datenumwandlungen. Zunächst wandeln wir die Daten aus ihrem ursprünglichen Zustand in einen Korpus um, der in einem persistenten Datenspeicher gespeichert und verwaltet wird. Als Nächstes werden die aufgenommenen Daten aggregiert, bereinigt, normalisiert und dann in Vektoren umgewandelt, damit wir sinnvolle Berechnungen durchführen können. Bei der abschließenden Umwandlung werden ein oder mehrere Modelle an den vektorisierten Datenbestand angepasst und ergeben eine verallgemeinerte Sicht auf die ursprünglichen Daten, die in der Anwendung genutzt werden kann.
Die dreifache Modellauswahl
Das Besondere an der Konstruktion von Machine-Learning-Produkten ist, dass die Architektur diese Datentransformationen unterstützen und optimieren muss, damit sie effizient getestet und angepasst werden können. Mit dem zunehmenden Erfolg von Datenprodukten hat das Interesse an der Definition eines allgemeinen Arbeitsablaufs für maschinelles Lernen zugenommen, der eine schnellere - oder sogar automatische - Modellbildung ermöglicht. Da der Suchraum sehr groß ist, reichen automatische Optimierungstechniken leider nicht aus.
Stattdessen ist der Prozess der Auswahl eines optimalen Modells komplex und iterativ und umfasst wiederholte Zyklen der Merkmalsentwicklung, der Modellauswahl und der Abstimmung der Hyperparameter. Die Ergebnisse werden nach jeder Iteration ausgewertet, um die beste Kombination aus Merkmalen, Modell und Parametern zu finden, die das jeweilige Problem löst. Wir bezeichnen dies als den dreifachen Modellauswahl5 Arbeitsablauf. Dieser Arbeitsablauf, der in Abbildung 1-5 dargestellt ist, zielt darauf ab, die Iteration als zentralen Bestandteil der Wissenschaft des maschinellen Lernens zu betrachten, der erleichtert und nicht eingeschränkt werden soll.
In einem Artikel aus dem Jahr 2015 beschreiben Wickham et al.6 den überladenen Begriff "Modell" klar und deutlich, indem sie seine drei Hauptverwendungen im statistischen maschinellen Lernen beschreiben: Modellfamilie, Modellform und angepasstes Modell. Die Modellfamilie beschreibt grob die Beziehungen zwischen den Variablen und dem Ziel von Interesse (z. B. ein "lineares Modell" oder ein "rekurrentes neuronales Tensornetz"). Die Modellform ist eine spezifische Ausprägung des Modellauswahltripels: eine Reihe von Merkmalen, ein Algorithmus und bestimmte Hyperparameter. Das angepasste Modell schließlich ist eine Modellform, die an einen bestimmten Satz von Trainingsdaten angepasst wurde und für Vorhersagen zur Verfügung steht. Datenprodukte setzen sich aus vielen angepassten Modellen zusammen, die durch den Modellauswahl-Workflow erstellt werden, der Modellformen erzeugt und bewertet.
Da wir nicht daran gewöhnt sind, Sprache als Daten zu betrachten, besteht die größte Herausforderung bei der Textanalyse darin, zu interpretieren, was bei jeder dieser Umwandlungen passiert. Mit jeder weiteren Umwandlung verliert der Text für uns an direkter Bedeutung, weil er immer weniger wie Sprache aussieht. Um bei der Erstellung sprachbewusster Datenprodukte effektiv zu sein, müssen wir unsere Denkweise über Sprache ändern.
Im weiteren Verlauf dieses Kapitels werden wir uns überlegen, wie wir Sprache als Daten betrachten, mit denen wir Berechnungen durchführen können. Auf dem Weg dorthin werden wir ein kleines Vokabular aufbauen, das es uns ermöglicht, die Arten von Transformationen zu formulieren, die wir in den folgenden Kapiteln an Textdaten vornehmen werden.
Sprache als Daten
Sprache ist unstrukturierte Daten, die von Menschen produziert wurden, um von anderen Menschen verstanden zu werden. Im Gegensatz dazu enthalten strukturierte oder semistrukturierte Daten Felder oder Markierungen, die es ermöglichen, dass sie von einem Computer leicht analysiert werden können. Unstrukturierte Daten weisen zwar keine maschinenlesbare Struktur auf, sind aber auch nicht zufällig. Im Gegenteil, sie werden von sprachlichen Eigenschaften bestimmt, die sie für andere Menschen sehr verständlich machen.
Techniken des maschinellen Lernens, insbesondere das überwachte Lernen, sind derzeit die am besten untersuchten und vielversprechendsten Methoden zur Berechnung von Sprachen. Mit maschinellem Lernen können wir statistische Modelle für Sprache trainieren (und wieder trainieren), während sie sich verändert. Durch die Erstellung von Sprachmodellen auf der Grundlage kontextspezifischer Korpora können Anwendungen enge Bedeutungsfenster ausnutzen, um ohne Interpretation genau zu sein. Die Entwicklung einer Anwendung für die automatische Verschreibung von Medikamenten, die Krankenblätter liest, erfordert beispielsweise ein ganz anderes Modell als eine Anwendung, die Nachrichten zusammenfasst und personalisiert.
Ein Computermodell der Sprache
Als Datenwissenschaftler, die sprachsensitive Datenprodukte entwickeln, besteht unsere Hauptaufgabe darin, ein Modell zu erstellen, das Sprache beschreibt und auf der Grundlage dieser Beschreibung Schlussfolgerungen ziehen kann.
Die formale Definition eines Sprachmodells versucht, aus einer unvollständigen Phrase die nachfolgenden Wörter abzuleiten, die die Äußerung am ehesten vervollständigen. Diese Art von Sprachmodellen ist für die Textanalyse von großer Bedeutung, da sie den grundlegenden Mechanismus einer Sprachanwendung verdeutlichen - die Nutzung des Kontexts, um die Bedeutung zu erraten. Sprachmodelle verdeutlichen auch die grundlegende Hypothese hinter der Anwendung von maschinellem Lernen auf Text: Text ist vorhersehbar. Der Mechanismus, der zur Bewertung von Sprachmodellen im akademischen Kontext verwendet wird, ist ein Maß dafür, wie vorhersehbar der Text ist, indem die Entropie (der Grad der Unsicherheit oder Überraschung) der Wahrscheinlichkeitsverteilung des Sprachmodells bewertet wird.
Betrachte die folgenden Teilsätze: "Der beste Freund des Menschen..." oder "Die Hexe flog auf einem...". Diese Phrasen mit niedriger Entropie bedeuten, dass Sprachmodelle mit hoher Wahrscheinlichkeit "Freund" bzw. "Besenstiel" erraten würden (und tatsächlich wären Englischsprachige überrascht, wenn die Phrase nicht auf diese Weise vervollständigt würde). Andererseits gibt es bei Sätzen mit hoher Entropie wie "Ich gehe heute Abend mit meinem..." viele Möglichkeiten ("Freund", "Mutter" und "Arbeitskollegen" könnten alle gleich wahrscheinlich sein). Menschliche Zuhörerinnen und Zuhörer können Erfahrung, Vorstellungskraft und Gedächtnis sowie den situativen Kontext nutzen, um die Lücke zu füllen. Computermodelle haben nicht notwendigerweise den gleichen Kontext und müssen daher stärker eingeschränkt werden.
Sprachmodelle zeigen die Fähigkeit, Beziehungen zwischen tokens abzuleiten oder zu definieren. Das sind UTF-8-kodierte Zeichenketten, die das Modell beobachtet und die von menschlichen Zuhörern und Lesern als Wörter mit Bedeutung identifiziert werden. In der formalen Definition macht sich das Modell den Kontext zunutze und definiert einen engen Entscheidungsraum, in dem nur wenige Möglichkeiten bestehen.
Diese Erkenntnis gibt uns die Möglichkeit, das formale Modell auf andere Sprachmodelle zu verallgemeinern, die in Anwendungen wie der maschinellen Übersetzung oder der Stimmungsanalyse eingesetzt werden. Um die Vorhersagbarkeit von Text zu nutzen, müssen wir einen begrenzten, numerischen Entscheidungsraum definieren, auf dem das Modell rechnen kann. Auf diese Weise können wir statistische Methoden des maschinellen Lernens (sowohl überwacht als auch unbeaufsichtigt) nutzen, um Sprachmodelle zu erstellen, die die Bedeutung von Daten aufdecken.
Der erste Schritt beim maschinellen Lernen besteht darin, die Merkmale der Daten zu identifizieren, die unser Ziel vorhersagen. Textdaten bieten viele Möglichkeiten, Merkmale zu extrahieren, entweder auf einer oberflächlichen Ebene durch einfaches Aufteilen von Zeichenketten oder auf einer tieferen Ebene durch Parsen von Text, um morphologische, syntaktische und sogar semantische Repräsentationen aus den Daten zu extrahieren.
In den folgenden Abschnitten werden wir einige einfache Möglichkeiten erkunden, wie Sprachdaten komplexe Merkmale für Modellierungszwecke aufdecken können. Zunächst werden wir untersuchen, wie die linguistischen Eigenschaften einer bestimmten Sprache (z. B. das Geschlecht im Englischen) uns die Möglichkeit geben, schnell statistische Berechnungen mit Texten durchzuführen. Dann schauen wir uns genauer an, wie der Kontext die Interpretation verändert und wie dies normalerweise genutzt wird, um das traditionelle "Bag-of-Words"-Modell zu erstellen. Schließlich werden wir uns mit umfangreicheren Merkmalen befassen, die mit Hilfe der morphologischen, syntaktischen und semantischen natürlichen Sprachverarbeitung analysiert werden.
Sprachliche Merkmale
Betrachte ein einfaches Modell, das sprachliche Merkmale nutzt, um das vorherrschende Geschlecht in einem Text zu identifizieren. 2013 schrieb Neal Caren, ein Assistenzprofessor für Soziologie an der University of North Carolina Chapel Hill, einen Blogbeitrag7 in dem er die Rolle des Geschlechts in Nachrichten untersuchte, um festzustellen, ob Männer und Frauen in unterschiedlichen Kontexten auftauchen. Er wendete eine geschlechtsspezifische Textanalyse auf Artikel der New York Times an und stellte fest, dass männliche und weibliche Wörter in ganz unterschiedlichen Kontexten auftauchten, was möglicherweise geschlechtsspezifische Vorurteile verstärkte.
Besonders interessant an dieser Analyse war die Verwendung von geschlechtsspezifischen Wörtern, um eine frequenzbasierte Bewertung der Männlichkeit oder Weiblichkeit zu erstellen. Um eine ähnliche Analyse in Python zu implementieren, können wir damit beginnen, Wortgruppen zu bilden, die Sätze über Männer und über Frauen unterscheiden. Der Einfachheit halber sagen wir, dass ein Satz einen von vier Zuständen haben kann - er kann über Männer, über Frauen, sowohl über Männer als auch über Frauen oder unbekannt sein (da Sätze weder über Männer noch über Frauen sein können und auch weil unsere MALE_WORDS
und FEMALE_WORDS
Sätze nicht vollständig sind):
MALE
=
'male'
FEMALE
=
'female'
UNKNOWN
=
'unknown'
BOTH
=
'both'
MALE_WORDS
=
set
([
'guy'
,
'spokesman'
,
'chairman'
,
"men's"
,
'men'
,
'him'
,
"he's"
,
'his'
,
'boy'
,
'boyfriend'
,
'boyfriends'
,
'boys'
,
'brother'
,
'brothers'
,
'dad'
,
'dads'
,
'dude'
,
'father'
,
'fathers'
,
'fiance'
,
'gentleman'
,
'gentlemen'
,
'god'
,
'grandfather'
,
'grandpa'
,
'grandson'
,
'groom'
,
'he'
,
'himself'
,
'husband'
,
'husbands'
,
'king'
,
'male'
,
'man'
,
'mr'
,
'nephew'
,
'nephews'
,
'priest'
,
'prince'
,
'son'
,
'sons'
,
'uncle'
,
'uncles'
,
'waiter'
,
'widower'
,
'widowers'
])
FEMALE_WORDS
=
set
([
'heroine'
,
'spokeswoman'
,
'chairwoman'
,
"women's"
,
'actress'
,
'women'
,
"she's"
,
'her'
,
'aunt'
,
'aunts'
,
'bride'
,
'daughter'
,
'daughters'
,
'female'
,
'fiancee'
,
'girl'
,
'girlfriend'
,
'girlfriends'
,
'girls'
,
'goddess'
,
'granddaughter'
,
'grandma'
,
'grandmother'
,
'herself'
,
'ladies'
,
'lady'
,
'lady'
,
'mom'
,
'moms'
,
'mother'
,
'mothers'
,
'mrs'
,
'ms'
,
'niece'
,
'nieces'
,
'priestess'
,
'princess'
,
'queens'
,
'she'
,
'sister'
,
'sisters'
,
'waitress'
,
'widow'
,
'widows'
,
'wife'
,
'wives'
,
'woman'
])
Da wir nun geschlechtsspezifische Wortgruppen haben, brauchen wir eine Methode, um einem Satz ein Geschlecht zuzuordnen. Wir erstellen eine genderize
Funktion, die die Anzahl der Wörter eines Satzes untersucht, die in unserer MALE_WORDS
Liste und in unserer FEMALE_WORDS
Liste vorkommen. Wenn ein Satz nur MALE_WORDS
enthält, nennen wir ihn einen männlichen Satz, und wenn er nur FEMALE_WORDS
enthält, nennen wir ihn einen weiblichen Satz. Wenn ein Satz sowohl männliche als auch weibliche Wörter enthält, die nicht null sind, nennen wir ihn beides; und wenn er null männliche und null weibliche Wörter enthält, nennen wir ihn unbekannt:
def
genderize
(
words
):
mwlen
=
len
(
MALE_WORDS
.
intersection
(
words
))
fwlen
=
len
(
FEMALE_WORDS
.
intersection
(
words
))
if
mwlen
>
0
and
fwlen
==
0
:
return
MALE
elif
mwlen
==
0
and
fwlen
>
0
:
return
FEMALE
elif
mwlen
>
0
and
fwlen
>
0
:
return
BOTH
else
:
return
UNKNOWN
Wir brauchen eine Methode, um die Häufigkeit von geschlechtsspezifischen Wörtern und Sätzen im gesamten Text eines Artikels zu zählen. Das können wir mit der Klasse collections.Counters
machen, einer eingebauten Python-Klasse. Die Funktion count_gender
nimmt eine Liste von Sätzen und wendet die Funktion genderize
an, um die Gesamtzahl der geschlechtsspezifischen Wörter und Sätze zu ermitteln. Das Geschlecht jedes Satzes wird gezählt und alle Wörter im Satz werden ebenfalls als zu diesem Geschlecht gehörig betrachtet:
from
collections
import
Counter
def
count_gender
(
sentences
):
sents
=
Counter
()
words
=
Counter
()
for
sentence
in
sentences
:
gender
=
genderize
(
sentence
)
sents
[
gender
]
+=
1
words
[
gender
]
+=
len
(
sentence
)
return
sents
,
words
Um unsere Geschlechterzähler einsetzen zu können, benötigen wir einen Mechanismus, mit dem wir den Rohtext der Artikel in einzelne Sätze und Wörter zerlegen können. Dazu verwenden wir die NLTK-Bibliothek (auf die wir später in diesem und im nächsten Kapitel näher eingehen werden), um unsere Absätze in Sätze zu zerlegen. Wenn die Sätze isoliert sind, können wir sie in Token umwandeln, um einzelne Wörter und Satzzeichen zu identifizieren, und den in Token umgewandelten Text an unseren Geschlechterzähler weitergeben, um den prozentualen Anteil von männlich, weiblich, beides oder unbekannt in einem Dokument auszugeben:
import
nltk
def
parse_gender
(
text
):
sentences
=
[
[
word
.
lower
()
for
word
in
nltk
.
word_tokenize
(
sentence
)]
for
sentence
in
nltk
.
sent_tokenize
(
text
)
]
sents
,
words
=
count_gender
(
sentences
)
total
=
sum
(
words
.
values
())
for
gender
,
count
in
words
.
items
():
pcent
=
(
count
/
total
)
*
100
nsents
=
sents
[
gender
]
(
"{0.3f}% {} ({} sentences)"
.
format
(
pcent
,
gender
,
nsents
)
)
Wenn du unsere parse_gender
Funktion auf einen Artikel aus der New York Times mit dem Titel "Rehearse, Ice Feet, Repeat: The Life of a New York City Ballet Corps Dancer" anwendest, erhältst du die folgenden, wenig überraschenden Ergebnisse:
50.288% female (37 sentences) 42.016% unknown (49 sentences) 4.403% both (2 sentences) 3.292% male (3 sentences)
Die Bewertungsfunktion berücksichtigt hier die Länge des Satzes in Bezug auf die Anzahl der Wörter, die er enthält. Obwohl es also insgesamt weniger weibliche Sätze gibt, sind über 50 % des Artikels weiblich. Mit Erweiterungen dieser Technik können Wörter in weiblichen Sätzen im Vergleich zu männlichen Sätzen analysiert werden, um zu sehen, ob es Hilfsbegriffe gibt, die standardmäßig mit männlichen und weiblichen Geschlechtern assoziiert werden. Wir sehen, dass diese Analyse relativ einfach in Python zu implementieren ist, und Caren fand seine Ergebnisse sehr beeindruckend:
Wenn du die Rollen von Männern und Frauen in der Gesellschaft nur durch die Lektüre der New York Times von letzter Woche kennen würdest, würdest du denken, dass Männer Sport treiben und die Regierung leiten. Frauen machen weibliche und häusliche Dinge. Um ehrlich zu sein, war ich ein wenig schockiert, wie stereotyp die Wörter waren, die in den Sätzen über die Frauen verwendet wurden.
Neal Caren
Was genau passiert hier also? Dieser Mechanismus ist zwar deterministisch, aber ein sehr gutes Beispiel dafür, wie Wörter zur Vorhersagbarkeit im Kontext beitragen (so stereotyp sie auch sein mögen). Dieser Mechanismus funktioniert jedoch nur, weil das Geschlecht ein Merkmal ist, das direkt in der Sprache kodiert ist. In anderen Sprachen (wie z. B. Französisch) ist das Geschlecht sogar noch ausgeprägter: Ideen, unbelebte Gegenstände und sogar Körperteile können ein Geschlecht haben (auch wenn das manchmal kontraintuitiv ist). Sprachmerkmale vermitteln nicht unbedingt eine definitorische Bedeutung, sondern oft auch andere Informationen. So sind Pluralität und Zeitform weitere Merkmale, die wir aus einer Sprache extrahieren können - wir könnten eine ähnliche Analyse anwenden, um vergangene, gegenwärtige oder zukünftige Sprache zu erkennen. Sprachmerkmale sind jedoch nur ein Teil der Gleichung, wenn es darum geht, die Bedeutung eines Textes vorherzusagen.
Kontextuelle Merkmale
Die Sentiment-Analyse( ), auf die wir in Kapitel 12 näher eingehen werden, ist eine äußerst beliebte Technik zur Textklassifizierung, denn der Tonfall eines Textes kann viele Informationen über die Perspektive des Subjekts vermitteln und zu aggregierten Analysen von Bewertungen, Nachrichtenpolarität oder Reaktionen führen. Man könnte annehmen, dass die Stimmungsanalyse mit einer ähnlichen Technik durchgeführt werden kann wie die Gender-Analyse im vorigen Abschnitt: Man sammelt Listen mit positiven Wörtern ("toll", "gut", "umwerfend") und negativen Wörtern ("schrecklich", "geschmacklos", "fade") und berechnet die relativen Häufigkeiten dieser Tokens in ihrem Kontext. Leider ist diese Technik naiv und liefert oft sehr ungenaue Ergebnisse.
Die Stimmungsanalyse unterscheidet sich grundlegend von der Geschlechterklassifizierung, weil die Stimmung kein Sprachmerkmal ist, sondern von Wortsinn abhängt. So ist zum Beispiel "der Kickflip war krank" positiv, während "der Chowder hat mich krank gemacht" negativ ist, und "ich habe einen kranken Leguan als Haustier" ist etwas zweideutig - die Definition des Wortes "krank" ändert sich in diesen Beispielen. Außerdem hängt die Stimmung vom Kontext ab, selbst wenn die Definitionen konstant bleiben; "fade" kann negativ sein, wenn es um scharfe Paprika geht, aber ein positiver Begriff, wenn es um Hustensirup geht. Anders als das Geschlecht oder die Zeitform kann das Sentiment auch negiert werden: "nicht gut" bedeutet schlecht. Die Verneinung kann die Bedeutung von großen Mengen an positivem Text umkehren: "Ich hatte große Hoffnungen und Erwartungen an den Film, der von den Kritikern als wunderbar und berauschend bezeichnet wurde, aber ich wurde schwer enttäuscht." Obwohl hier Wörter wie "große Hoffnungen", "großartig", "wunderbar und berauschend" und sogar "riesig", die normalerweise auf eine positive Stimmung hinweisen, in der Überzahl sind, wird die negative Stimmung durch die positiven Wörter nicht nur nicht gemindert, sondern sogar verstärkt.
Alle diese Beispiele sind jedoch vorhersehbar; eine positive oder negative Stimmung wird klar kommuniziert, und es scheint, dass ein maschinelles Lernmodell in der Lage sein sollte, die Stimmung zu erkennen und vielleicht sogar verrauschte oder zweideutige Äußerungen hervorzuheben. Bei einem a priori deterministischen oder strukturellen Ansatz geht die Flexibilität des Kontexts und des Sinns verloren - stattdessen berücksichtigen die meisten Sprachmodelle die Lokalisierung von Wörtern in ihrem Kontext und nutzen Methoden des maschinellen Lernens, um Vorhersagen zu treffen.
Abbildung 1-6 zeigt die wichtigste Methode zur Entwicklung einfacher Sprachmodelle, die oft als "Bag-of-Words"-Modell bezeichnet wird. Dieses Modell wertet die Häufigkeit aus, mit der Wörter mit sich selbst und anderen Wörtern in einem bestimmten, begrenzten Kontext vorkommen. Die Häufigkeit des gemeinsamen Auftretens zeigt, welche Wörter wahrscheinlich aufeinander folgen, und indem wir aus begrenzten Textstücken Rückschlüsse ziehen, können große Mengen an Bedeutung erfasst werden. Mit statistischen Methoden können wir dann Vorhersagen über die Reihenfolge der Wörter machen.
Erweiterungen des "Bag-of-Words"-Modells berücksichtigen nicht nur einzelne Wortkookkurrenzen, sondern auch Phrasen, die hoch korreliert sind, um die Bedeutung anzuzeigen. Wenn "Geld abheben bei der Bank" eine Menge Informationen zur Bedeutung von "Bank" beiträgt, gilt das auch für "Angeln am Flussufer". Dies wird als n-Gramm-Analyse bezeichnet, wobei n eine geordnete Folge von Zeichen oder Wörtern angibt, die durchsucht werden soll (z. B. ist ein 3-Gramm ('withdraw', 'money', 'at')
im Gegensatz zum 5-Gramm ('withdraw', 'money', 'at', 'the', 'bank')
). n-Gramme bieten eine interessante Möglichkeit, da die große Mehrheit der möglichen n-Gramme unsinnig ist (z. B. ('bucket', 'jumps', 'fireworks')
), obwohl die sich entwickelnde Natur der Sprache bedeutet, dass sogar dieses 3-Gramm irgendwann sinnvoll werden könnte! Sprachmodelle, die sich den Kontext auf diese Weise zunutze machen, müssen daher in der Lage sein, die Beziehung zwischen Text und Zielvariable zu lernen.
Sowohl sprachliche als auch kontextuelle Merkmale tragen zur allgemeinen Vorhersagbarkeit von Sprache für analytische Zwecke bei. Die Identifizierung dieser Merkmale erfordert jedoch die Fähigkeit, Sprache nach Einheiten zu analysieren und zu definieren. Im nächsten Abschnitt werden wir die Koordination von Sprachmerkmalen und Kontext zu einer Bedeutung aus linguistischer Sicht diskutieren.
Strukturelle Merkmale
Schließlich haben Sprachmodelle und Textanalyse von den Fortschritten in der Computerlinguistik profitiert. Unabhängig davon, ob wir Modelle mit kontextuellen oder linguistischen Merkmalen (oder beidem) erstellen, müssen wir die von Linguisten verwendeten hochsprachlichen Einheiten berücksichtigen, die uns ein Vokabular für die Operationen liefern, die wir in den folgenden Kapiteln an unserem Textkorpus durchführen werden. Verschiedene Spracheinheiten werden für Berechnungen auf verschiedenen Ebenen verwendet, und das Verständnis des sprachlichen Kontexts ist für das Verständnis der Sprachverarbeitungstechniken beim maschinellen Lernen unerlässlich.
Die Semantik bezieht sich auf die Bedeutung; sie ist tief in der Sprache verschlüsselt und schwer zu extrahieren. Wenn wir uns eine Äußerung (eine einfache Phrase anstelle eines ganzen Absatzes, wie z. B. "Sie hat sich ein Buch aus der Bibliothek ausgeliehen.") abstrakt vorstellen, sehen wir, dass es eine Vorlage gibt: ein Subjekt, das Hauptverb, ein Objekt und ein Instrument, das sich auf das Objekt bezieht (subject - predicate - object)
. Mithilfe solcher Templates können Ontologien erstellt werden, die die Beziehungen zwischen den Entitäten genau definieren, aber diese Arbeit erfordert ein umfangreiches Wissen über den Kontext und die Domäne und ist in der Regel nicht gut skalierbar. Es gibt jedoch vielversprechende neuere Arbeiten zur Extraktion von Ontologien aus Quellen wie Wikipedia oder DBPedia (z. B. beginnt der DBPedia-Eintrag über Bibliotheken mit den Worten: "Eine Bibliothek ist eine Sammlung von Informationsquellen und ähnlichen Ressourcen, die einer bestimmten Gemeinschaft zum Nachschlagen oder Ausleihen zur Verfügung gestellt wird").
Bei der semantischen Analyse geht es nicht nur darum, die Bedeutung von Texten zu verstehen, sondern auch darum, Datenstrukturen zu erzeugen, auf die logische Schlussfolgerungen angewendet werden können. Textbedeutungsrepräsentationen (oder thematische Bedeutungsrepräsentationen, TMRs) können verwendet werden, um Sätze als Prädikatsstrukturen zu kodieren, auf die Logik erster Ordnung oder Lambda-Kalküle angewendet werden können. Andere Strukturen wie Netzwerke können verwendet werden, um Prädikatsinteraktionen interessanter Merkmale im Text zu kodieren. Mit Hilfe von Traversal kann dann die Zentralität von Begriffen oder Subjekten analysiert und auf die Beziehungen zwischen den Elementen geschlossen werden. Obwohl die Graphenanalyse nicht unbedingt eine vollständige semantische Analyse ist, kann sie wichtige Erkenntnisse liefern.
Die Syntax bezieht sich auf die Regeln zur Satzbildung, die normalerweise durch die Grammatik definiert werden. Sätze sind das, was wir verwenden, um eine Bedeutung aufzubauen, und sie enthalten viel mehr Informationen als Wörter. Aus diesem Grund werden wir sie als kleinste logische Einheit der Sprache behandeln. Bei der syntaktischen Analyse geht es darum, die sinnvolle Beziehung zwischen den Wörtern aufzuzeigen, indem man den Satz in Teile zerlegt oder die Beziehung zwischen den Token in einer Baumstruktur darstellt (ähnlich wie beim Satzdiagramm, das du wahrscheinlich in der Grammatikschule gelernt hast). Die Syntax ist eine notwendige Voraussetzung, um über den Diskurs oder die Semantik nachzudenken, denn sie ist ein wichtiges Instrument, um zu verstehen, wie sich Wörter bei der Bildung von Sätzen gegenseitig verändern. Die syntaktische Analyse sollte zum Beispiel die Präpositionalphrase "aus der Bibliothek" und die Substantivphrase "ein Buch aus der Bibliothek" als Teilkomponenten der Verbphrase "ein Buch aus der Bibliothek ausgeliehen" identifizieren.
Die Morphologie bezieht sich auf die Form von Dingen und in der Textanalyse auf die Form einzelner Wörter oder Token. Die Struktur von Wörtern kann uns dabei helfen, die Pluralität(Frau vs. Frauen), das Geschlecht(Verlobter vs. Verlobte), die Zeitform(lief vs. laufen), die Konjugation(laufen vs. er läuft) usw. zu erkennen. Die Morphologie ist eine Herausforderung, denn die meisten Sprachen haben viele Ausnahmen und Sonderfälle. Die englische Zeichensetzung zum Beispiel hat sowohl orthografische Regeln, die lediglich die Endung eines Wortes anpassen(puppy - puppies), als auch morphologische Regeln, die vollständige Übersetzungen sind(goose - geese). Englisch ist eine affixale Sprache, was bedeutet, dass wir einfach Zeichen an den Anfang oder das Ende eines Wortes anfügen, um es zu verändern. Andere Sprachen haben andere morphologische Modi: Das Hebräische verwendet Templates aus Konsonanten, die mit Vokalen aufgefüllt werden, um eine Bedeutung zu erzeugen, während das Chinesische piktografische Symbole verwendet, die nicht unbedingt direkt verändert werden.
Das Hauptziel der Morphologie ist es, die Bestandteile von Wörtern zu verstehen, damit wir sie Klassen zuordnen können, die oft Part-of-Speech-Tags genannt werden. Wir wollen zum Beispiel wissen, ob ein Wort ein Singularnomen, ein Pluralnomen oder ein Eigenname ist. Vielleicht wollen wir auch wissen, ob ein Verb ein Infinitiv, eine Vergangenheitsform oder ein Gerundium ist. Diese Wortarten werden dann verwendet, um größere Strukturen wie Chunks oder Phrasen oder sogar ganze Bäume zu erstellen, die wiederum zum Aufbau von Datenstrukturen für semantische Schlussfolgerungen verwendet werden können.
Semantik, Syntax und Morphologie ermöglichen es uns, einfachen Textstrings Daten mit linguistischer Bedeutung hinzuzufügen. In Kapitel 3 werden wir untersuchen, wie wir Text in Sinneinheiten zerlegen können. Dazu verwenden wir Tokenisierung und Segmentierung, um Text in seine Logik- und Bedeutungseinheiten zu zerlegen und Part-of-Speech-Tags zu vergeben. In Kapitel 4 wenden wir die Vektorisierung auf diese Strukturen an, um numerische Merkmalsräume zu erstellen - zum Beispiel indem wir den Text mit Stemming und Lemmatisierung normalisieren, um die Anzahl der Merkmale zu reduzieren. In Kapitel 7 schließlich werden wir die Strukturen direkt nutzen, um Informationen in unsere maschinellen Lernprotokolle zu kodieren, um die Leistung zu verbessern und spezifischere Arten von Analysen zu ermöglichen.
Fazit
Natürliche Sprache ist eine der am meisten ungenutzten Formen von Daten, die heute verfügbar sind. Sie hat die Fähigkeit, Datenprodukte noch nützlicher und integraler für unser Leben zu machen, als sie es ohnehin schon sind. Durch die Kombination von Textdaten mit maschinellem Lernen haben sie das Potenzial, leistungsstarke Anwendungen in einer Welt zu entwickeln, in der Informationen oft gleichbedeutend mit Wert und Wettbewerbsvorteil sind. Von E-Mails über Karten bis hin zur Suche - unser modernes Leben wird von natürlichsprachlichen Datenquellen angetrieben, und sprachbasierte Datenprodukte machen ihren Wert zugänglich.
In den nächsten Kapiteln werden wir die notwendigen Vorstufen des maschinellen Lernens auf Text besprechen, nämlich Korpusmanagement (in Kapitel 2), Vorverarbeitung (in Kapitel 3) und Vektorisierung (in Kapitel 4). Anschließend experimentieren wir mit der Formulierung von Problemen des maschinellen Lernens zur Klassifizierung (in Kapitel 5) und zum Clustering(Kapitel 6). In Kapitel 7 werden wir die Merkmalsextraktion implementieren, um die Effektivität unserer Modelle zu maximieren, und in Kapitel 8 werden wir sehen, wie wir Textvisualisierung einsetzen können, um Ergebnisse zu visualisieren und Modellierungsfehler zu diagnostizieren. In Kapitel 9 erforschen wir einen anderen Ansatz zur Modellierung von Sprache, indem wir die Datenstruktur des Graphen nutzen, um Wörter und ihre Beziehungen darzustellen. In Kapitel 10 werden wir uns dann mit spezielleren Methoden zum Abrufen, Extrahieren und Generieren für Chatbots beschäftigen. In den Kapiteln 11 und 12 werden wir schließlich Techniken zur Skalierung der Rechenleistung mit Spark und zur Skalierung der Modellkomplexität mit künstlichen neuronalen Netzen untersuchen.
Wie wir im nächsten Kapitel sehen werden, benötigen wir für skalierbare Analysen und maschinelles Lernen von Texten zunächst sowohl Domänenwissen als auch einen domänenspezifischen Korpus. Wenn du zum Beispiel im Finanzbereich arbeitest, sollte deine Anwendung in der Lage sein, Börsensymbole, Finanzbegriffe und Firmennamen zu erkennen, was bedeutet, dass die Dokumente im Korpus, den du erstellst, diese Entitäten enthalten müssen. Mit anderen Worten: Die Entwicklung eines sprachsensiblen Datenprodukts beginnt mit der Beschaffung der richtigen Art von Textdaten und dem Aufbau eines benutzerdefinierten Korpus, der die strukturellen und kontextuellen Merkmale des Bereichs enthält, in dem du arbeitest.
1 Hillary Mason, The Next Generation of Data Products, (2017) http://bit.ly/2GOF894
2 Mike Loukides, Was ist Data Science?, (2010) https://oreil.ly/2GJBEoj
3 Market Watch, (2018) https://on.mktw.net/2suTk24
4 Benjamin Bengfort, The Age of the Data Product, (2015) http://bit.ly/2GJBEEP
5 Arun Kumar, Robert McCann, Jeffrey Naughton, und Jignesh M. Patel, Model Selection Management Systems: The Next Frontier of Advanced Analytics, (2015) http://bit.ly/2GOFa0G
6 Hadley Wickham, Dianne Cook und Heike Hofmann, Visualizing Statistical Models: Removing the Blindfold, (2015) http://bit.ly/2JHq92J
7 Neal Caren, Using Python to see how the Times writes about men and women, (2013) http://bit.ly/2GJBGfV
Get Angewandte Textanalyse mit Python now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.