Blog

Twitter Daten Spaß

Friso van Vollenhoven

Aktualisiert Oktober 22, 2025
9 Minuten

Ich habe eine Karte meiner Follower auf Twitter erstellt. Das ist nicht ganz einfach, denn die meisten Twitter-Nutzer fügen ihren Tweets oder Profilen keine Geokoordinaten hinzu. Glücklicherweise hinterlassen viele Menschen etwas Vernünftiges im Ortsfeld ihres Profils (z.B. 'Amsterdam' oder 'London, UK'). Sie können dieses Feld mit einem Lucene-Index aller Städte der Welt abgleichen, den ich zufällig besitze. Ich konnte 15 meiner insgesamt 19 Follower auf der Karte platzieren.

Follower von @fzk:

 

Warum ist das wichtig? Lesen Sie weiter! Außerdem werde ich Ihnen irgendwann erklären, wie Sie eine solche Karte für Ihr eigenes Konto erstellen können.

Hinweis: Dies ist ein Querverweis. Sie können das Original hier sehen: Waredingen.nl - twitter-data-fun.

Vor einiger Zeit bat mich jemand, herauszufinden, wie man an große Mengen relevanter Daten aus sozialen Netzwerken herankommt (aus legalen Quellen, gegen Geld). Das hörte sich nach Spaß an, also habe ich gegoogelt. Twitter ist eine globale Datenquelle. Normalerweise verwenden Sie es jedoch, um ein lokales Problem anzugehen, z.B. wenn Sie allen auf der gleichen Konferenz zurufen, wo das Bier steht oder dass Ihre Folien online sind. Das funktioniert gut, solange Sie genau wissen, wen Sie erreichen oder verfolgen wollen, indem Sie einen Hashtag oder den Bildschirmnamen eines Nutzers verwenden. Als Unternehmen versuchen Sie oft, schwierigere Probleme in Angriff zu nehmen, wie z.B. einer Gruppe von Menschen zuzuhören, die potenziell an Ihren Produkten interessiert sind. Da Sie wahrscheinlich nicht Google oder Facebook sind, besteht diese Gruppe in der Regel nicht aus allen Menschen auf der Welt, die einen Internetanschluss haben. Und Ihr spezielles Publikum hat in der Regel auch keinen eigenen Hashtag. Was nun?

Zunächst einmal müssen Sie Twitter-Daten erhalten. Eine Möglichkeit ist die Nutzung der Twitter-API, die jedoch begrenzt ist. Sie ist vor allem für die Verwendung durch Client-Anwendungen für einen bestimmten Benutzer gedacht oder bestenfalls für das Sammeln von Suchergebnissen über die Streaming-API. Es gibt den Twitter Sample Stream, aber der liefert Ihnen nur ein zufälliges 1% aller Tweets. Insgesamt ist die Twitter-eigene API nicht für das Sammeln großer Datenmengen geeignet. Sie hat eine Ratenbegrenzung und begrenzt die Anzahl der gleichzeitigen Aktionen, die Sie von einem einzigen Host aus durchführen können. Wenn Sie echte Daten benötigen, gibt es anscheinend nur zwei Anlaufstellen für Sie: Gnip und DataSift. Gnip wirbt damit, dass es Datenströme aus vielen verschiedenen sozialen Medien anbietet, während DataSift nur Twitter und ein weiteres Angebot hat, doch beide Unternehmen scheinen sich auf Twitter zu konzentrieren. Ein schneller Vergleich auf ihren Websites zeigt, dass DataSift viel transparenter ist, sowohl bei der Preisgestaltung als auch bei der API, während Gnip wirklich möchte, dass Sie sich mit ihnen in Verbindung setzen, um über die Sache zu sprechen, die Sie bereits online stellen wollten. Davon abgesehen liefern beide einen gefilterten Twitter-Stream auf der Grundlage eines Filters, den Sie selbst definieren können. DataSift hat seine eigene Sprache für die Filterung. Mit dieser Sprache können Sie Filter erstellen und sie über die REST-API "kompilieren". Sobald sie kompiliert sind, können Sie Streaming-Ergebnisse mit diesem Filter erhalten. Ich vermute, dass Gnip auf ähnliche Weise funktioniert.

Nun, hier ist das Problem. Ich möchte alle Twitter-Nachrichten von Leuten haben, die mir wichtig sind. Aber "Personen, die mir wichtig sind" ist kein Prädikat in der Filtersprache. Die Dinge, nach denen Sie filtern können, lassen sich grob in drei Kategorien einteilen: Inhaltseigenschaften, Eigenschaften von Benutzer-Metadaten, Reichweiten-Eigenschaften.

Diese Filteroptionen ermöglichen es Ihnen hauptsächlich, nach Eigenschaften von Nutzern oder Tweets (Inhalt, Sprache usw.) zu filtern. Das ist eine offensichtliche Monetarisierungsstrategie, aber ich denke, dass der Inhalt allein nicht genug Wert hat, solange Sie nicht die Möglichkeit haben, auch Eigenschaften des Netzwerkgraphen als Mittel zur Filterung zu verwenden. Die Leseeigenschaft, die Sie verwenden können, kommt dem hier am nächsten. Sie basiert auf dem so genannten Klout Score eines Benutzers. Der Klout Score eines Benutzers basiert darauf, wie viele Personen dieser Benutzer erreicht, wenn er sich im Internet äußert, und wie wahrscheinlich es ist, dass diese Personen die Nachricht weiterverbreiten werden. Das ist schön, denn so können Sie nach einflussreichen Personen filtern, aber das Problem bleibt, dass dies global und nicht lokal ist.

Wenn Sie sich die Karte meiner Follower ansehen, können Sie ein Muster erkennen: die Geographie meiner Reichweite. Unten habe ich die gleiche Karte für meinen Freund Age(@agemooij). Seine Reichweite ist weitaus größer als meine (mit 200+ Followern), aber auch das geografische Muster für seine Reichweite ist deutlich anders.

Follower von @agemooij:

Natürlich ist die Karte nur da, weil Menschen Karten mögen. Die eigentliche Information befindet sich im Tortendiagramm, das im Grunde ein Merkmalsvektor der geografischen Reichweite ist. Meine Methode zum Extrahieren von Koordinaten aus Ortsfeldern ist alles andere als ausgefeilt und wird hin und wieder zu unregelmäßigen Ergebnissen führen. Daher ist es wahrscheinlich sicherer, alle Länder mit einem Anteil von weniger als 1 % in der Verteilung zu ignorieren. Abgesehen davon hat Age einen Teil seiner Follower in den USA, Indien und Großbritannien. Dies könnte ein Muster sein, nach dem Sie suchen. Es wäre schön, wenn Sie nach Nutzern filtern könnten, die eine ähnliche geografische Reichweite wie Age haben. Außerdem sollte dies technisch machbar sein.

Als Referenz habe ich die Karte auch für das offizielle, verifizierte Konto des niederländischen Premierministers erstellt. Sein Name ist Mark. Mark hat Zehntausende von Followern, so dass ich wegen der Ratenbegrenzung eine Stichprobe machen musste, aber ich habe mehr als 2000 Orte erhalten, so dass die Karte wahrscheinlich repräsentativ ist. Sie sehen, dass Marks geografische Reichweite nur aus NL besteht, nachdem ich jede Kategorie mit 1% oder weniger verworfen habe. Marks Klout Score wird wahrscheinlich hoch sein, aber wenn Sie sich Inhalte ansehen wollen, die den Atlantik überqueren, sind Sie mit Age besser dran.

Follower von @MinPres:

Mit den inhaltsbasierten Filteroptionen können Sie zwar einfache Dinge tun, wie z.B. alle Tweets anzeigen, in denen Ihr Firmen- oder Produktname erwähnt wird, aber sie sind nicht sehr hilfreich, wenn Sie sich die Stimmung in bestimmten Gruppen ansehen möchten. Es wäre schön, wenn Sie einen Filter hätten, mit dem Sie Prädikate wie 'Menschen mit einem überwiegend westeuropäischen Netzwerk und einem Klout Score > 30 und einem ausgeprägten politischen Interesse' definieren könnten. Die ersten beiden Prädikate sollten machbar sein. Der letzte Teil dieser Abfrage ist jedoch schwierig. Vielleicht kann uns die Betrachtung der Links, die die Leute teilen, einen Einblick in die Interessen geben. Ich werde das demnächst ausprobieren, und wenn dabei etwas Sichtbares herauskommt, wird das ein weiterer Beitrag sein.

 

Erstellung der Karte

Nun zur Erstellung der Karte. Den gesamten Code, den Sie benötigen, finden Sie hier: github.com/friso/twitterfun. Klonen Sie ihn also. Die Erstellung der Karte besteht aus drei Schritten, von denen einer manuell ist (ich habe es nur dreimal gemacht, wenn ich also eine weitere Karte erstellen muss, werde ich den gesamten Prozess automatisieren).

  1. Standortfelder aus den Followern eines Benutzers extrahieren
  2. Standorte in Geokoordinaten umwandeln
  3. Erstellen Sie die HTML-Datei mit der Karte und dem Kreisdiagramm

Für Schritt 1 verwende ich ein Stück Python, das sich hier befindet (github.com/friso/twitterfun/blob/master/src/main/python/locationlist.py). Es nimmt zwei Argumente entgegen: einen Bildschirmnamen und einen Dateinamen. Das erste ist der Bildschirmname des Benutzers, der Sie interessiert. Das zweite ist eine Datei, in die das Skript die Liste der Orte schreibt, die es in der Follower-Liste gefunden hat. Das Skript kommuniziert mit der Twitter REST API, um die erforderlichen Daten zu sammeln. Es sucht zunächst nach den Follower-IDs des Benutzers und fordert dann die Benutzerprofile für jede dieser IDs an. Es sucht jeweils 30 Benutzer auf einmal ab, da die API-Methode auf eine bestimmte Anzahl von Benutzern ( >= 30) pro Anfrage beschränkt ist. Bei Nutzern mit vielen Followern stoßen Sie auf eine Ratenbegrenzung, bevor die Abfrage beendet ist. In diesem Fall wird ein Fehler ausgegeben, da die Antwort unerwartete Inhalte enthält.

Schritt 2 ist ein Java-Programm. Es verfügt über mehrere Befehlszeilenoptionen, wie Sie sehen können, wenn Sie die Hauptmethode aufrufen. Sie sollten es wie folgt ausführen:

java <java> opts com.xebia.locations.finder.LocationFinder -i <Index-Standort> -f <Eingabedatei> -v

Die Java-Optionen müssen alle erforderlichen Jars enthalten. Dazu gehören mindestens Lucene und Commons CLI, aber wahrscheinlich noch mehr. Am besten erstellen Sie ein Projekt in Ihrer IDE und führen es von dort aus aus oder fügen ein Run-Dingens in die Maven pom.xml ein. Der Indexstandort ist der Standort eines Lucene-Index, der alle Städte der Welt und ihre Einwohnerzahl enthält. Ich werde Ihnen in einer Minute zeigen, wie Sie diesen erhalten. Die Eingabedatei ist die Datei, die aus dem Python-Skript stammt. Die Option -v weist das Programm an, die Datensätze im JSON-Format auszugeben, was später sehr nützlich sein wird.

Neben der LocationFinder-Klasse gibt es eine IndexBuilder-Klasse. Die netten Leute bei MaxMind veröffentlichen eine Datenbank mit allen Städten der Welt und ihrer Bevölkerung als Textdatei. Die Klasse IndexBuilder kann diese Datei lesen und sie in einen Lucene-Index an einem bestimmten Ort umwandeln. Führen Sie das so aus:

java <java opts> com.xebia.locations.locationfinder.IndexBuilder -i <index output dir> -d <maxmind db file>

Es erstellt den Index in dem durch <index output dir> angegebenen Verzeichnis und verwendet die MaxMind-Datenbankdatei <maxmind db file>. Es erwartet Text, also entpacken Sie die gzipped Version.

Das Standortfinder-Tool tokenisiert den vom Benutzer eingegebenen Ort und durchsucht den gesamten Index nach allem, was Ähnlichkeit mit diesem Ort hat. Es holt maximal 350 Ergebnisse und ordnet diese dann nach exakten Übereinstimmungen für Stadt, Land und im Falle der USA auch für den Bundesstaat. Darüber hinaus wird die Stadt mit der größten Einwohnerzahl auch etwas höher eingestuft. So wird sichergestellt, dass 'Amsterdam' eher zu Amsterdam in den Niederlanden passt als zu einem der vier Orte mit dem Namen Amsterdam, die es in den USA gibt. Die Suche wählt das am höchsten eingestufte Ergebnis aus, wenn es über einem bestimmten Schwellenwert rangiert.

Schritt 3 ist ein manueller Schritt. Die Standortsuche gibt eine Reihe von JSON-Objekten aus (eines pro Zeile). Wenn Sie diese Liste von Objekten in ein Array von Objekten umwandeln, indem Sie am Ende jeder Zeile ein Komma hinzufügen und eckige Klammern darum setzen, fügen Sie dieses Ergebnis in die HTML-Vorlage hier drüben anstelle des Arrays ein, das bereits in "var locations" enthalten ist. So erhalten Sie den gewünschten HTML-Code mit einer Karte und einem Kreisdiagramm. Außerdem benötigt Google Maps heutzutage einen API-Schlüssel, den Sie also in Zeile 11 der HTML-Datei angeben müssen.

Ich werde den Code in diesem Text nicht Zeile für Zeile durchgehen, denn das ist langweilig. Sie können sich den Code selbst ansehen und lesen. Viel Spaß!

Verfasst von

Friso van Vollenhoven

Contact

Let’s discuss how we can support your journey.