Hier hab ich mal alle geolocations von allen
tweets aus der Datenbank
als heatmap auf die google-map geworfen.
In den 50 Millionen tweets sind etwa 300 Tausend mit geolocations versehen.
Das sind etwa 7.5 Mb an Daten, die
hier
von github nachgeladen werden.
Die Karte wird bei 300000 Punkten in der heatmap ziemlich langsam.
Das war einfach mal ein Test ob's überhaupt funktioniert.
Die heatmap ist so konfiguriert, dass jeder Punkt gleich stark angezeigt wird,
egal wie viele tweets von der location kommen. Der Modus lässt sich
mit einem Klick hier ändern.
Dann haben die stärksten Punkte mindestens 300 tweets.
Hier werden die signifikanten Worte pro twitter-user miteinander verglichen. Das Verfahren
zum optischen clustern heißt
t-distributed stochastic neighbor embedding (t-SNE).
Jeder Punkt ist ein User mit mindestens 500 Tweets in der Datenbank. Die Farbe zeigt das
Alter des accounts (alt, mittel, jung).
Mit der Maus hovern zeigt den user-Namen.
Um eine Lister der user anzuzeigen, wählt das Box Select tool an der Seite
und markiert ein paar Punkte. In der Liste sind dann die top-15 Worte zu sehen,
jeweils mit dem Faktor wie viel mal häufiger das Wort gegenüber der Gesammtheit aller
Tweets ist.
Bemerkungen
Die gescannten Worte sind alles Substantive die in wiktionary bekannt sind.
Die Worte werden, wenn möglich, immer in die Grundform konvertiert, also z.b. der
Plural entfernt. Wiktionary kennt auch Substantive wie Ich, Es, Wenn usw.
Wenn jemand z.B. seine Sätze oft mit einem großgeschriebenen Ich beginnt,
dann kommt das Ich in die Wertung.
Das Clustering basiert also auf einer chaotischen Mischung aus
Thematik und Schreibstil. Deshalb ist hier signifikant auch immer kursiv
geschrieben. Es ist der Versuch, möglichst ohne Expertenwissen, Texte
gegenüberzustellen und deren signifikante Merkmale zu finden,
rein anhand der untersuchten Daten, ohne Hilfe von sinnstiftenden Korpora.
Das Datenset ist ein kleinerer Teil von
dem hier.
Der Algorithmus ist etwa wie folgt:
basis_count = word frequencies of all tweets
for each user:
user_count = word frequencies of user's tweets
user_hitlist = user_count - 2 * basis_count
sort(user_hitlist)
limit user_hitlist to 100
for each user:
features += vector from user_hitlist
PCA transform features with 50 components
t-SNE transform features to 2 dimensions
Das heißt, für jeden User werden die Worthäufigkeiten gezählt,
die Basishäufigkeit abgezogen und die 100 signifikantesten Worte gespeichert.
In diesem Beispiel sind 2870 user gescannt worden und deren jeweilige
100 Worte ergeben zusammen 19735 Worte, die dann verglichen werden.
Jeder user bekommt also einen Vektor der Länge 19735, in dem jeweils die Frequenzen
der 100 signifikantesten Worte eingetragen werden. Das folgende Bild zeigt
diese Vektoren pro User in Graustufen. Jede Zeile ist ein User.
Die Vektoren werden dann mittels der
Principal component analysis (PCA)
auf die Länge 30 reduziert. Das macht die spätere Verarbeitung mit tSNE sehr viel schneller.
Wir verlassen uns da auf die Fähigkeit der PCA, in einem Datensatz die
Punkte
zu finden, um die sich alles andere dreht. Oder anders gesagt, die PCA reduziert
die Dimensionalität eines Datensatzes und erhält dabei die Komponenten mit der größten
Varianz innerhalb des Datensatzes.
Das t-SNE (tatsächlich
sprich tiesnie)
sorgt dafür, dass Vektoren, die sich ähneln, auch in der Nähe voneinander
auf der Karte landen.
Die ganze Prozedur dauert etwa eine Stunde. Das erstellen der t-SNE-Karte aus den
vorberechneten Daten läuft allerdings in nur 3 Minuten durch.
Anmerkung zu der plot-library: Bokeh ist eine Python API die Javascript generiert
und ist erstmal ganz witzig. Der Output ist in diesem Fall etwa 1.5Mb groß,
was blogspot nicht so mochte. Deshalb
hab ich die plot-Daten extern
hier
auf github geladen. Dabei ging aber irgendwie das encoding kaputt..