Samstag ist nicht der unbeliebteste Tag der Woche.
Vor fast einem Jahr begann ich, Trendwortdaten von Twitter zu sammeln. Nicht mit einem wirklichen Ziel vor Augen, außer einem künstlerischen Video zu machen. Abgesehen von ein paar Stromausfällen sind die Daten ziemlich vollständig und erfassen alle fünf Minuten zehn Orte.
A Linux shell window logging the captures.Ein Linux-Shell-Fenster, das die Erfassungen protokolliert.
Ein typisches Ergebnis der Twitter-API sieht so aus:
["2022-10-06 21:20:00.366761",
"#SheHulk", "Matt Ryan", "Colts", "Colts", "Mario", "Hines",
"#TNFonPrime", "Bowser", "#ThursdayNightFootball",
"Russell Wilson", "#FanDuelisTheGREATEST", "#INDvsDEN",
"Judy Tenuta", "Quavo", "Graphic B", "Hunter Biden", "Saweetie",
"Matty Ice", "Luigi", "Phillip Lindsay", "Caden Sterns", "Jovic",
"Charles Martinet", "Marijuana", "Offset", "Kathy", "Dank Brandon",
"Carina", "Pittman", "Sasse", "Brooklyn", "Commanders vs Bears",
"Frank Reich", "Primetime", "Elvis", "Mushroom Kingdom", "Jamal Cain",
"Toad", "Sara Lee", "Sam Ehlinger", "Darren Bailey", "Norville",
"Deon Jackson", "Rodney Thomas", "Ryan Kelly",
"Mumbles McTouchdown", "Melvin Gordon", "Ranboo", "Illumination", ""]
Normalerweise gibt es für jeden Standort 50 Trendbegriffe. Die neun Standorte in den USA haben viele gemeinsame Wörter und Trends dauern mehrere Fünf-Minuten-Zeiträume. Selbst ein kleiner Trend wird viel Aufmerksamkeit erregen. Hier ist die JSL, die ich verwende, um die Dateien zu laden und eine Tabelle mit Wörtern und Häufigkeiten zu erstellen.
// for this quick test I copied the json files to my desktop.
// probably should put them in their own directory...
dir = "$desktop/";
names = Filter Each( {j}, Files In Directory( dir ), Ends With( j, ".json" ) );
// I'll need a list of open data tables
dtfiles = {};
For Each( {file}, names, Insert Into( dtfiles, Open( dir || file, JSON Settings( Col( "/root", Type( "JSON Lines" ) ) ) ) ) );
// I'll use an associative array to gather the frequency info
WordToFrequency = [=> 0];
For Each( {dt}, dtfiles,
For Each Row( dt,
// there are a lot of ways to do this; here it makes a list of col2..col51 from the current row
row = dt[Row(), 2 :: N Cols( dt )];
// then process the list
For Each( {word}, row, WordToFrequency[word] += 1 );
)
);
// then make a data table from the associative array
dtWF = New Table( "wordfreq",
addrows( N Items( WordToFrequency ) ),
New Column( "word", character, values( WordToFrequency << getkeys ) ),
New Column( "freq", numeric, values( WordToFrequency << getvalues ) )
);
Die Tabelle ist nach Wörtern sortiert:
There are currently 127K words. The blank one is a filler when there are <50 trends.Derzeit gibt es 127.000 Wörter. Das leere Feld dient als Füller, wenn <50 Trends vorhanden sind.
Die erste interessante Frage lautet: „Was ist das angesagteste Wort?“ Nach Häufigkeit sortieren:
Caturday seems to be about cats.Am Samstag scheint es um Katzen zu gehen.
Da ist es. Der Samstag ist der unbeliebteste Tag der Woche.
Wie erwähnt in WebSocket Ich habe vorhin eine langweilige Visualisierung dieser Daten erstellt. Die Daten sind nach Stadt (oder USA oder Welt) sortiert und mit einem Zeitstempel versehen. Ich habe ein separates Programm, das Nachrichten aus Wikipedia löscht, was hilfreich sein könnte. Vielleicht nicht; Twitter-Trendwörter scheinen (bestenfalls) lose mit tatsächlichen Nachrichten verbunden zu sein.
(Vorsicht bei der Verwendung dieses Skripts: Es missbraucht die Ähnlichkeit zwischen HTML und XML, um HTML in etwas umzuwandeln, das der XML-Reader von JMP verarbeiten kann. Sie müssen herausfinden, warum ein bestimmtes HTML nicht wie XML aussieht, und es reparieren, bevor Sie diese Idee anwenden. Sehen Sie sich den regulären Ausdruck in Zeile 10 an – er löscht die HTML-Bits, die den XML-Reader durcheinander bringen. Die Verwendung von Python und Beautiful Soup wäre vielleicht einfacher, aber das habe ich noch nicht gemacht.)
dtBig = New Table( "news",
New Column( "date", Numeric, "Continuous", Format( "yyyy-mm-dd", 12 ), Input Format( "yyyy-mm-dd" ) ),
New Column( "text", Character, "Unstructured Text" )
);
For( ddd = 1apr2023, ddd < Today(), ddd += In Days( 1 ),
url = "https://en.wikipedia.org/wiki/Portal:Current_events/" || Format( ddd, "Format Pattern", "<YYYY>_<MONTH>_<D>" );
txt = Load Text File( url );
Length( txt );
xml = Regex(
txt,
"|| |(<SCRIPT.>)|(<FORM.>)|(<OPTION.>)|crossorigin|data-mw-ve-target-container|<LINK.>|<meta.>|<INPUT.>|<IMG.>",
"",
GLOBALREPLACE
);
dt = Open(
Char To Blob( xml ),
XML Settings(
Stack( 0 ),
Row( "/html/body/div/div/div/main/div/div/div/div/div/div/ul" ),
Row( "/html/body/div/div/div/main/div/div/div/div/div/div/ul/li/ul" ),
Row( "/html/body/div/div/div/main/div/div/div/div/div/div/ul/li/ul/li/ul" ),
Row( "/html/body/div/div/div/main/div/div/div/div/div/div/ul/li/ul/li/ul/li/ul" ),
Row( "/html/body/div/div/div/main/div/div/div/div/div/div/ul/li/ul/li/ul/li/ul/li/ul" ),
Col(
"/html/body/div/div/div/main/div/div/div/div/div/div/ul/li",
Column Name( "text" ),
Fill( "Use Once" ),
Type( "Original Text" ),
Format( {"Best"} ),
Modeling Type( "Continuous" )
),
Col(
"/html/body/div/div/div/main/div/div/div/div/div/div/ul/li/ul/li",
Column Name( "text" ),
Fill( "Use Once" ),
Type( "Original Text" ),
Format( {"Best"} ),
Modeling Type( "Continuous" )
),
Col(
"/html/body/div/div/div/main/div/div/div/div/div/div/ul/li/ul/li/ul/li",
Column Name( "text" ),
Fill( "Use Once" ),
Type( "Original Text" ),
Format( {"Best"} ),
Modeling Type( "Continuous" )
),
Col(
"/html/body/div/div/div/main/div/div/div/div/div/div/ul/li/ul/li/ul/li/ul/li",
Column Name( "text" ),
Fill( "Use Once" ),
Type( "Original Text" ),
Format( {"Best"} ),
Modeling Type( "Continuous" )
),
Col(
"/html/body/div/div/div/main/div/div/div/div/div/div/ul/li/ul/li/ul/li/ul/li/ul/li",
Column Name( "text" ),
Fill( "Use Once" ),
Type( "Original Text" ),
Format( {"Best"} ),
Modeling Type( "Continuous" )
),
),
XML Wizard( 0 )
);
For Each Row( dt, dt:text = Regex( dt:text, "<[^>]+>", "", GLOBALREPLACE ) );
dt << New Column( "date", Numeric, "Continuous", Format( "yyyy-mm-dd", 12 ), Input Format( "yyyy-mm-dd" ), <<SETEACHVALUE></SETEACHVALUE></IMG.></INPUT.></LINK.></OPTION.></FORM.></SCRIPT.></D></MONTH></YYYY>Wow. Es gibt einen Haufen (1568). Es sieht so aus, als ob Samstag und Samstag eng miteinander verbunden sind. Vielleicht ist der Donnerstag am unbeliebtesten.
Das Übergreifen auf den Sonntag ist wahrscheinlich eine Zeitzonensache.
Ich freue mich über alle Ideen ... Danke fürs Lesen.