International Essays |
Dieses Notebook ist die deutschsprachige Übersetzung des Beitrags “Democratic Presidential Debate Analysis Using the Wolfram Language” vom 6. Februar 2020, die mithilfe eines LLM-Tools erstellt und von einer professionellen Übersetzerin überprüft wurde.
Analyse der demokratischen Präsidentschaftsdebatte mit Wolfram Language
Analyse der demokratischen Präsidentschaftsdebatte mit Wolfram Language
6. Februar 2020
Brian Wood, Leitender technischer Redakteur, Document and Media Systems
Wenn 20 Präsidentschaftskandidatinnen und -kandidaten auf der Debattenbühne aufeinandertreffen – wer gewinnt? Das US-amerikanische Volk verfolgt eine turbulente und umkämpfte Vorwahlsaison für die demokratische Präsidentschaftsnominierung 2020. Nach den Debatten diskutieren alle darüber, wer die meiste Redezeit oder Aufmerksamkeit bekam, welche Wortgefechte am spannendsten waren oder nach welchem anderen Maßstab jemand den Abend „gewonnen” hat – und wer letztlich bei den Caucuses triumphieren könnte. Deshalb beschloss ich, die Debatten mithilfe des Entity Framework, Textanalytik und Graphenfähigkeiten der Wolfram Language zu untersuchen und zu sehen, ob ich meinen eigenen Maßstab für einen Debattensieg entwickeln kann – basierend darauf, welche Kandidatin bzw. welcher Kandidat am zentralsten in der Diskussion stand.
Textimport: Was wurde gesagt? In einer perfekten Welt wären die Debattenaudio- und -videodateien maschinenlesbar. Aber immerhin haben wir zumindest Zugang zu dem Text in Transkriptform. Bevor wir aber ins Thema einsteigen, ist es hilfreich, ein wenig Kontext zu geben.
Zuerst lassen Sie uns eine Liste der Namen der Kandidatinnen und Kandidaten abrufen. Da Kandidatinnen und Kandidaten ständig ins Präsidentschaftsrennen einsteigen und ausscheiden, habe ich diese Liste im Laufe der Zeit manuell erstellt:
In[]:=
candidateNames={"Amy Klobuchar","Andrew Yang","Bernie Sanders","Beto O'Rourke","Bill De Blasio","Cory Booker","Elizabeth Warren","Eric Swalwell","Jay Inslee","Joe Biden","John Delaney","John Hickenlooper","Julián Castro","Kamala Harris","Kirsten Gillibrand","Marianne Williamson","Michael Bennet","Pete Buttigieg","Steve Bullock","Tim Ryan","Tulsi Gabbard","Tom Steyer"};
Wir können verwenden, um zu sehen, welche Kandidatinnen und Kandidaten das Wolfram System erkennt: alle, wie sich herausstellt:
In[]:=
candidates=Interpreter["Person"]@candidateNames
Out[]=
,,,,,,,,,,,,,,,,,,,,,
Für das ordnungsgemäße Parsen von Fragen benötigen wir auch die Namen der Moderatorinnen und Moderatoren (in diesem Fall sind keine Entitäten erforderlich):
In[]:=
modNames={"Lester Holt","Savannah Guthrie","Chuck Todd","Rachel Maddow","Jake Tapper","Dana Bash","Don Lemon","George Stephanopoulos","Jorge Ramos","Linsey Davis","David Muir","Anderson Cooper","Erin Burnett","Marc Lacey","Andrea Mitchell","Ashley Parker","Kristen Welker","Judy Woodruff","Yamiche Alcindor","Amna Nawaz","Tim Alberta","Jose Diaz-Balart","Wolf Blitzer","Abby Phillip","Brianne Pfannenstiel","ANNOUNCER"};
Schließlich kombinieren wir diese zu einer Liste von allen, die entweder gesprochen haben oder angesprochen wurden:
In[]:=
debateNames=Join[candidateNames,modNames];debatePeople=Join[candidates,modNames];
Für die Arbeit mit dem Transkript hilft es auch, separate Listen für Vor- und Nachnamen zu erstellen:
In[]:=
{firstNames,lastNames}=Transpose[{First[#],StringRiffle@Rest@#}&/@StringSplit[debateNames]];
Transkripte können von verschiedenen Quellen stammen; glücklicherweise ist die Formatierung bei den meisten Quellen ziemlich standardisiert. Das Importieren des Transkripts ist so einfach wie ; wir beginnen mit dem Rohtext der aktuellsten Debatte vom 14. Januar, wie sie von Rev.com transkribiert wurde:
In[]:=
d7raw=Import["https://wolfr.am/K7dyQhOh"];
Auf der Website sieht man, dass jede gesprochene Zeile mit dem Namen des Sprechers beginnt – mit einigen Variationen wie „E. Warren” – gefolgt von einem Doppelpunkt und einem Zeitstempel, dann der Inhalt der Zeile. Mit können wir jedes dieser Elemente (einschließlich aller Namensvariationen, zur Übersicht ikonisiert) aus dem Transkript extrahieren:
In[]:=
d7Lines=StringTrim/@StringCasesStringReplaced7raw,,Shortest[name:(debateNames)~~": "~~("("~~time:__~~")")~~__~~line__~~"\n"~~debateNames]{name,time,line},IgnoreCaseFalse,OverlapsTrue;
Jeder Eintrag ist eine Liste, die diese drei Elemente enthält:
In[]:=
RandomChoice[d7Lines]
Out[]=
{Brianne Pfannenstiel,40:50,Mayor Buttigieg, your response?}
Dann konvertieren wir dies in eine chronologische Liste von SprecherZeile Regeln. Nicht jedes Transkript, das ich gefunden habe, hatte Zeitstempel, daher habe ich sie aus diesen Daten weggelassen:
In[]:=
d7Data=(#1/.Thread[debateNamesdebatePeople])#3&@@@d7Lines;
Hier ist ein Eintrag aus dieser Liste:
In[]:=
RandomChoice[d7Data]
Out[]=
Obwohl die Schritte variierten, konnte ich diese Datensätze für jedes Debattentranskript erstellen. Hier sind die vollständigen Daten von allen sieben Debatten bisher:
In[]:=
allDebateData=CloudGet["https://wolfr.am/K7wv2AEd"];
Analyse: Wer sprach worüber und wie viel? Die Cloud-Daten geben uns genügend Informationen, um mit der berechnungsbasierten Analyse zu beginnen. Zum Beispiel beurteilen Menschen oft die Debatte danach, wer die meiste Redezeit bekommen hat. Wir können dies grob schätzen, indem wir verwenden, um zu sehen, wie viele Wörter jede Person gesprochen hat:
In[]:=
wordsSpoken[data_,person_]:=StringRiffle@Values[Select[data,First@#person&]]//WordCount
Ein Tortendiagramm dieser Daten aus der neuesten Debatte zeigt eine ziemlich gleichmäßige Verteilung:
In[]:=
PieChart[wordsSpoken[d7Data,#]&/@candidates,ChartLabelscandidates]
Out[]=
Wir können auch etwas tiefer in den Inhalt der Worte der Kandidaten eintauchen. Mit können wir spezifische Personen, Orte und Konzepte erhalten, die in jeder Textzeile erwähnt werden:
In[]:=
entityMentions[data_,entType_String]:=Thread[data[[All,1]]Union/@TextCases[Values@data,entType"Interpretation",VerifyInterpretationTrue]]
Wir könnten dies verwenden, um beliebig viele Trends zu erkunden, wie zum Beispiel welche Unternehmen während einer bestimmten Debatte erwähnt wurden:
Counts[Flatten@Values@entityMentions[d7Data,"Company"]]
Out[]=
2,2,2,1,1,1,1,1
Während der Debatten wurden auch mehrere Länder erwähnt; die Betrachtung der Daten mit zeigt die jüngste Betonung auf Iran und Afghanistan:
Da das Publikum anscheinend gerne dabei zusieht, wie Politiker miteinander und übereinander sprechen, dachte ich, es wäre interessant, direkte Erwähnungen anderer Kandidaten zu betrachten. Wir können StringCases verwenden, um zu bestimmen, wann ein Kandidat mit Vor- oder Nachnamen erwähnt wird, einschließlich des ehemaligen Präsidenten Barack Obama und des aktuellen Präsidenten Donald Trump, die beide sehr oft angesprochen werden. Diese Funktion findet solche Erwähnungen und ordnet jede Texterwähnung einer bestimmten Person zu:
Diese Funktion könnte zwar theoretisch falsch-positive Treffer liefern (etwa „Warren Buffet” statt „Elizabeth Warren”), aber das kam so selten vor, dass ich darauf nicht weiter eingegangen bin. Bei umfangreicheren Konversationsdaten könnte das allerdings problematischer sein.
Wer diese Debatten moderiert, ist für diese Analyse nicht entscheidend. Hier ist eine Funktion, um eine Liste nur der Demokratischen Kandidaten zu erhalten, die sich gegenseitig (oder Trump/Obama) erwähnen:
Wenn wir die Funktion auf den gesamten Datensatz anwenden, sehen wir, dass die Namen der Kandidatinnen und Kandidaten fast tausend Mal erwähnt haben:
Aus Neugier wollte ich sehen, wer während der Debatten am meisten über die beiden Präsidenten gesprochen hat. Also habe ich eine schnelle Funktion erstellt, um zu zählen, wer eine bestimmte Person am häufigsten erwähnt hat:
Amy Klobuchar hat viel über Präsident Trump zu sagen, während Obama viele Erwähnungen von seinem ehemaligen Vizepräsidenten Joe Biden bekommt. Bemerkenswert ist, dass wir auf den beiden Listen alle fünf der aktuellen Spitzenreiter sehen (Harris und Castro ausgenommen).
Hier sind alle Selbsterwähnungen. Amüsanterweise spricht Biden am meisten über sich selbst:
Um den Fokus noch weiter einzugrenzen, ist hier eine Funktion, die eine Liste von Erwähnungen zwischen Teilnehmenden einer spezifischen Debatte nur gibt—wobei Trump und Obama sowie Selbstreferenzen entfernt werden:
Das Ergebnis ist eine reduzierte Liste von Regeln, die wir für die weitere Untersuchung der Interaktionen in jeder einzelnen Debatte verwenden können.
Graphen: Wer stand im Mittelpunkt der Aufmerksamkeit? Wir haben etwas Textanalyse und einfaches Zählen durchgeführt. Nun ist es Zeit, zur Graphentheorie zu wechseln. Wenn wir die Ausgabe unserer vorherigen Funktion als eine Liste von Einbahnverbindungen zwischen Kandidaten betrachten (d.h. gerichtete Kanten, die vom Sprecher zum Gegenstand zeigen), können wir den resultierenden Graphen für eine gegebene Debatte leicht anzeigen:
Wir können diese Ansicht vereinfachen, indem wir wiederholte Erwähnungen durch Kantengewichte darstellen und jede Kante entsprechend gestalten. Zuerst müssen wir wiederholte Kanten in gewichtete Kanten umwandeln:
Hier ist derselbe Graph, aber mit Kanten, die basierend auf Gewichtungen konsolidiert und in der Größe angepasst wurden:
Durch die Kombination dieser Schritte (und das Hinzufügen von etwas Farbe) können wir eine Funktion erstellen, um das Diagramm auf kompakte Weise anzuzeigen:
Diese Graphen geben eine schöne visuelle Zusammenfassung des jeweiligen Schlagabtausches einer Debatte. Beachten Sie, dass die Positionierung der Kandidatinnen und Kandidaten hier nicht wichtig ist, nur die Kanten und ihre Stile. In der neuesten Debatte können Sie eine ziemlich starke Betonung auf Sanders und Warren sehen, den beiden progressiven Kandidatinnen und Kandidaten:
Die meisten Kandidatinnen und Kandidaten haben integrierte Bilder, die mit ihren Entitäten verknüpft sind. Anstatt sie mit Namen zu kennzeichnen, könnten wir also auch Gesichter verwenden:
Die Anwendung auf die erste Debatte ergibt eine interessante, wenn auch überfüllte, Grafik:
Allein anhand dieser Zahlen könnten wir Bernie Sanders einen Sieg für Durchsetzungsvermögen oder Tom Steyer für Popularität zusprechen. Aber wir können einen weitere visuelle Veranschaulichung machen, indem wir die Daten auf unseren Graphen überlagern. Zuerst berechnen wir beide Maße für jeden Knoten:
Wenn wir dies mit unserer bestehenden Funktion kombinieren, können wir eine neue Funktion erstellen, um den Graph mit Scheitelpunktfarben anzuzeigen, die auf dieser Mischung basieren:
Lassen Sie uns die jüngste Debatte noch einmal betrachten:
Die Geschichte hier ist klar: Sanders und Warren (lila) standen im Mittelpunkt zahlreicher Auseinandersetzungen, mit zusätzlichen Kommentaren von Biden und Steyer (der tatsächlich jeden erwähnte). Klobuchar stellte andere bloß, wurde aber kaum genannt, während Buttegieg erwähnt wurde, aber nicht über andere sprach. Nach einem "ausgewogenen" Kriterium (hohe Durchsetzungsfähigkeit und Beliebtheitswerte) scheinen Sanders und Warren die Gewinner zu sein.
Schauen wir etwas weiter zurück auf die fünfte Debatte, die am 20. November 2019 ausgestrahlt wurde:
Eines ist offensichtlich: mehr Kandidatinnen und Kandidaten führen zu weniger Erwähnungen insgesamt. Das ergibt aus logistischer Sicht Sinn (jede Person hat weniger Zeit zu sprechen) aber ich denke, es zeigt auch die wachsende Betonung der Unterschiede zwischen den Kandidatinnen und Kandidaten, während die Debatten fortschreiten.
Wenn wir alle Daten kombinieren, erhalten wir einen Hinweis darauf, wie die Menschen während der Debatten tendenziell interagierten:
Wieder erzählen die Daten eine Geschichte. Biden, der langjährige mutmaßliche Spitzenreiter, erhält viel mehr Aufmerksamkeit, als er gibt. Viele der kleineren Kandidatinnen und Kandidaten (Bullock, Inslee, Delaney) neigen dazu (oder sind vielmehr dazu imstande), andere herauszufordern, ohne viel Gegenfeuer zu erhalten. Man gewinnt fast den Eindruck, dass Tom Steyer nur wegen seiner Durchsetzungsfähigkeit im Rennen ist!
Für diesen Abschnitt kehren wir zur Textanalyse zurück; ich habe einen Wikipedia-Artikel gefunden, der voller aktueller Informationen in organisierten Tabellen ist:
Die Seite enthält viele zusätzliche Informationen (und sie wächst weiter) aber wir sind hauptsächlich an Umfragen zwischen Juni 2019 und heute interessiert. Hier ist eine kombinierte Liste aller Einträge aus diesem Zeitraum:
Jetzt haben wir Einträge für jede Umfrage, aber alle Daten werden als aus dem Jahr 2020 stammend interpretiert:
Als abschließender Bereinigungsschritt werden wir die Daten korrigieren und die Schlüsselnamen standardisieren:
Diese Übersicht enthält jedoch mehr Informationen, als wir benötigen, und viele der Kandidatinnen und Kandidaten mit niedrigeren Umfragewerten sind verdeckt. Lassen Sie uns heranzoomen, um nur die Spitzenreiter zu betrachten, d.h. jeden, der seit Beginn der Debatten in den Umfragen über 10% gestiegen ist:
Durch das Hinzufügen vertikaler Linien für jedes Debattendatum können wir eine grobe Vorstellung davon bekommen, wie die Debatten die Umfragen beeinflusst haben:
Obwohl sich die Ranglisten nicht viel bewegt haben, können Sie einige Höhen und Tiefen erkennen, die wahrscheinlich aus Debatten resultierten. Für eine schnelle Schätzung darüber, wer gewonnen oder verloren haben könnte, können wir Daten aus der Woche vor einer Debatte aggregieren und dann mit den Umfragewerten der Woche nach derselben Debatte vergleichen:
Die Subtraktion der beiden Werte ergibt eine Schätzung der prozentualen Änderungen um ein gegebenes Datum:
Von dort aus können wir den durchschnittlichen Umfragewert pro Kandidatin bwz. Kandidat verwenden, um zu beurteilen, ob sich die öffentliche Meinung verschoben hat. Zum Beispiel stieg Kamala Harris's Durchschnittswert nach der ersten Debatte im Juni erheblich an:
Dies sollte ein grobes Maß dafür geben, wie die Debattenleistung die Umfrageergebnisse für jede Kandidatin bzw. jeden Kandidaten beeinflusst hat. Hier sind die Zahlen für die neueste Debatte – nur einschließlich derjenigen Kandidatinnen und Kandidaten, die tatsächlich teilgenommen haben:
Iowa Caucus und darüber hinaus Natürlich bedeuten all diese Zahlen wirklich nichts, bis die Abstimmung beginnt. Das erste Kandidatenauswahlverfahren des Zyklus, der Iowa Caucus, wurde Anfang dieser Woche abgehalten—wobei Pete Buttegieg offenbar als Sieger hervorging (ausstehende Endergebnisse).
Schauen wir uns an, wie sich dies mit unseren Debattenerwähnungen vergleichen lässt. Wir benötigen einen Datensatz von landesweiten Umfragen:
Mit den Funktionen aus dem vorherigen Abschnitt können wir die neuesten Iowa-Umfragen importieren:
Wie im vorherigen Abschnitt erfassen wir die Umfragehistorie für jede Kandidatin und jeden Kandidaten:
Die Umfragehistorie zeigt, dass sich die Ranglisten nach der Iowa-Debatte drastisch veränderten:
Sanders und Biden haben um den Spitzenplatz in Iowa gekämpft, aber Buttigieg und Warren brachten ebenfalls einiges Potenzial mit. Sanders hatte den größten Umfrageanstieg in den Wochen vor dem Caucus:
Nach der Standardanalyse hätten Sanders oder Biden offensichtlich als Spitzenreiter hervorgehen müssen. Aber mit Bezug auf das Zentralitätsdiagramm von vorhin war Buttigieg tatsächlich der "beliebteste", insofern, als andere ihn erwähnten, ohne dass er jemals jemand anderen erwähnte:
Vielleicht war es eine Gewinnerstrategie, Kritiker in diesem Fall zu ignorieren!
Die Graphentheorie ist eine nützliche Perspektive für die Visualisierung zwischenmenschlicher Austauschprozesse und bietet einige einzigartige berechnungsbasierte Einblicke darüber, wie die Kandidatinnen und Kandidaten miteinander interagieren. Die Kombination mit anderen Berechnungen könnte sogar noch interessantere Informationen liefern, wie beispielsweise die Verwendung von Sentimentanalyse zur Bestimmung der Einstellungen der Kandidatinnen und Kandidaten zueinander. In den kommenden Monaten wird es interessant sein herauszufinden, welcher Typ von Debattierenden am Ende die meisten Vorwahlen gewinnt: durchsetzungsstarke, beliebte oder gemischte. Probieren Sie es selbst aus – vielleicht können Sie Ihr eigenes berechnungsbasiertes Maß für einen Debattengewinner definieren!