{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Visualisierung als Netzwerk" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In der vorherigen Einheit wurden Topics für einzelne Dokumente ausgegeben. Das ist zwar durchaus aufschlussreich, ist bei großen Corpora aber ein zeitaufwändiger Prozess. Nicht nur zeitökonomisch, auch analytisch kann es Gründe geben, anders auf Topic Models zu gucken: Wenn es darum geht, größere Strukturen sichtbar zu machen, ist eine abstraktere Betrachtung der Ergebnisse interessant.\n", "\n", "Visualisierungen können helfen, Strukturen in großen Datenmengen sichtbar zu machen. Sie sind dabei nicht nur die Repräsentation eines Analyseergebnisses, sondern Teil des Analyseprozesses selbst. Hierfür gibt es den Begriff der *visual analytics*. Die Informationen, die ein Topic Model enthält, können mit Hilfe von Visualisierungen sichtbar gemacht werden. Eine Möglichkeit ist hierbei die Darstellung als Netzwerk.\n", "\n", "Für eine interessante Diskussion unterschiedlicher Visualisierungsmöglichkeiten siehe auch [diesen Blogpost](http://tedunderwood.com/2012/11/11/visualizing-topic-models/).\n", "\n", "Zunächst wird das zuvor erstellt Topic Model wieder geladen:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from pickle import load\n", "\n", "with open('../Daten/topicmodel20.pickle', 'rb') as picklefile:\n", " ldamodel = load(picklefile)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Die zentralen Informationen des Modells sind in zwei Matrizen gespeichert:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(20, 12470)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ldamodel.topic_word_.shape" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(793, 20)" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ldamodel.doc_topic_.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Die Matrizen beinhalten die Beziehungen zwischen Topics und Wörtern (welche Wörter gehören zu welchem Topic?) sowie Dokumenten und Topics (welche Topics gehören zu welchem Dokument?). Dabei gibt es keine Trennlinie, die eine klare Antwort auf diese Fragen gibt, die Werte in den Matrizen sind vielmehr graduell.\n", "\n", "Für die spätere Verwendung lässt sich aus den Dimensionen der Matrizen die Anzahl der Topics, Wörter und Dokumente ermitteln:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "n_topics, n_words = ldamodel.topic_word_.shape\n", "n_docs, n_topics = ldamodel.doc_topic_.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Es ist zu vermuten, dass der Zusammenhang von Dokumenten und Topics nicht ganz zufällig ist. Es könnte interessant sein, zu sehen, welche Topics sich etwa ähnlich auf die Dokumente verteilen. Wenn zwei Topics eine ähnliche Dokumentzuordnung aufweisen, ist zu vermuten, dass sie auch inhaltlich einen Zusammenhang haben.\n", "\n", "Ein relativ simples Verfahren wäre etwa, sich für jedes Dokument die drei (vier, fünf) wichtigsten Topics ausgeben zu lassen und diese als miteinander verbunden zu verstehen. Daraus ließe sich ein Netzwerk von Topics erstellen, dessen Kanten die Zuordnung zu gleichen Dokumenten wären.\n", "\n", "Eine andere Möglichkeit ist ein statistischer Ansatz. So lassen sich aus den Dokumentverteilungen Korrelationen berechnen: Die doc_topic-Tabelle enthält Dokumente als Zeilen und Topics als Spalten. Wenn man nun paarweise die Korrelationen zwischen Topics (Spalten) berechnet, lässt sich dies als Hinweis auf die Beziehungsstärke zweier Topics verstehen. Dieses Verfahren nutzt mehr Informationen als der erste Ansatz (nicht nur die ersten drei Topics), und kann Beziehungen gradueller darstellen (nämlich als Korrelationsstärke).\n", "\n", "Ein `pandas.DataFrame` stellt eine komfortable Möglichkeit bereit, Korrelationen zwischen Spalten zu berechnen. Hier wird standardmäßig Pearson’s R verwendet. Das Ergebnis ist eine quadratische Matrix von Topic zu Topic, die die Korrelationsstärke aller Paare beinhaltet." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
012345678910111213141516171819
01.000000-0.046037-0.092154-0.054809-0.074486-0.092227-0.0759000.081877-0.097106-0.0921810.145256-0.069027-0.096715-0.0156900.0381010.027816-0.093973-0.0203100.017073-0.007606
1-0.0460371.0000000.0159100.0130290.051465-0.221919-0.156615-0.071046-0.3064780.3528470.023583-0.1497600.149946-0.125236-0.0842880.2114480.040988-0.3872600.189204-0.082722
2-0.0921540.0159101.000000-0.084795-0.1698950.0650950.074355-0.267901-0.1024330.051146-0.1439050.003991-0.156059-0.115390-0.190055-0.1737800.1418790.077396-0.110363-0.108688
3-0.0548090.013029-0.0847951.0000000.176423-0.060649-0.136340-0.0798100.086960-0.099084-0.128556-0.122615-0.099861-0.0940660.002449-0.134176-0.1663210.0850620.0379380.142498
4-0.0744860.051465-0.1698950.1764231.000000-0.177401-0.2287780.122726-0.052339-0.149671-0.054109-0.2292780.369994-0.169986-0.0169720.094508-0.241540-0.0026890.0536440.128961
5-0.092227-0.2219190.065095-0.060649-0.1774011.0000000.174341-0.2770700.0731120.067616-0.2044960.020051-0.194757-0.0841900.108813-0.2353300.0684080.052090-0.133075-0.158225
6-0.075900-0.1566150.074355-0.136340-0.2287780.1743411.000000-0.388917-0.056819-0.055354-0.2065220.255388-0.214728-0.173994-0.131025-0.2600350.3471370.127709-0.150352-0.138332
70.081877-0.071046-0.267901-0.0798100.122726-0.277070-0.3889171.000000-0.331410-0.1605400.299851-0.4195940.3284260.4016120.2577650.394403-0.351516-0.3358080.1439920.019484
8-0.097106-0.306478-0.1024330.086960-0.0523390.073112-0.056819-0.3314101.000000-0.142047-0.2285790.368601-0.226814-0.144194-0.059629-0.284502-0.1007550.315410-0.146497-0.100164
9-0.0921810.3528470.051146-0.099084-0.1496710.067616-0.055354-0.160540-0.1420471.000000-0.096648-0.087590-0.134896-0.1058230.041108-0.1519210.091004-0.113039-0.100372-0.105938
100.1452560.023583-0.143905-0.128556-0.054109-0.204496-0.2065220.299851-0.228579-0.0966481.000000-0.2035760.052516-0.020949-0.1075460.266068-0.188390-0.221826-0.0449030.244375
11-0.069027-0.1497600.003991-0.122615-0.2292780.0200510.255388-0.4195940.368601-0.087590-0.2035761.000000-0.219200-0.160224-0.229033-0.2529580.1398410.065245-0.151338-0.162975
12-0.0967150.149946-0.156059-0.0998610.369994-0.194757-0.2147280.328426-0.226814-0.1348960.052516-0.2192001.000000-0.019043-0.0610390.488193-0.227845-0.295322-0.063644-0.005547
13-0.015690-0.125236-0.115390-0.094066-0.169986-0.084190-0.1739940.401612-0.144194-0.105823-0.020949-0.160224-0.0190431.0000000.191867-0.008642-0.094975-0.052916-0.067576-0.140832
140.038101-0.084288-0.1900550.002449-0.0169720.108813-0.1310250.257765-0.0596290.041108-0.107546-0.229033-0.0610390.1918671.000000-0.097123-0.134975-0.0264540.000497-0.190876
150.0278160.211448-0.173780-0.1341760.094508-0.235330-0.2600350.394403-0.284502-0.1519210.266068-0.2529580.488193-0.008642-0.0971231.000000-0.246870-0.3755890.2115800.022674
16-0.0939730.0409880.141879-0.166321-0.2415400.0684080.347137-0.351516-0.1007550.091004-0.1883900.139841-0.227845-0.094975-0.134975-0.2468701.000000-0.003519-0.154029-0.175658
17-0.020310-0.3872600.0773960.085062-0.0026890.0520900.127709-0.3358080.315410-0.113039-0.2218260.065245-0.295322-0.052916-0.026454-0.375589-0.0035191.000000-0.173605-0.060250
180.0170730.189204-0.1103630.0379380.053644-0.133075-0.1503520.143992-0.146497-0.100372-0.044903-0.151338-0.063644-0.0675760.0004970.211580-0.154029-0.1736051.0000000.021418
19-0.007606-0.082722-0.1086880.1424980.128961-0.158225-0.1383320.019484-0.100164-0.1059380.244375-0.162975-0.005547-0.140832-0.1908760.022674-0.175658-0.0602500.0214181.000000
\n", "
" ], "text/plain": [ " 0 1 2 3 4 5 6 \\\n", "0 1.000000 -0.046037 -0.092154 -0.054809 -0.074486 -0.092227 -0.075900 \n", "1 -0.046037 1.000000 0.015910 0.013029 0.051465 -0.221919 -0.156615 \n", "2 -0.092154 0.015910 1.000000 -0.084795 -0.169895 0.065095 0.074355 \n", "3 -0.054809 0.013029 -0.084795 1.000000 0.176423 -0.060649 -0.136340 \n", "4 -0.074486 0.051465 -0.169895 0.176423 1.000000 -0.177401 -0.228778 \n", "5 -0.092227 -0.221919 0.065095 -0.060649 -0.177401 1.000000 0.174341 \n", "6 -0.075900 -0.156615 0.074355 -0.136340 -0.228778 0.174341 1.000000 \n", "7 0.081877 -0.071046 -0.267901 -0.079810 0.122726 -0.277070 -0.388917 \n", "8 -0.097106 -0.306478 -0.102433 0.086960 -0.052339 0.073112 -0.056819 \n", "9 -0.092181 0.352847 0.051146 -0.099084 -0.149671 0.067616 -0.055354 \n", "10 0.145256 0.023583 -0.143905 -0.128556 -0.054109 -0.204496 -0.206522 \n", "11 -0.069027 -0.149760 0.003991 -0.122615 -0.229278 0.020051 0.255388 \n", "12 -0.096715 0.149946 -0.156059 -0.099861 0.369994 -0.194757 -0.214728 \n", "13 -0.015690 -0.125236 -0.115390 -0.094066 -0.169986 -0.084190 -0.173994 \n", "14 0.038101 -0.084288 -0.190055 0.002449 -0.016972 0.108813 -0.131025 \n", "15 0.027816 0.211448 -0.173780 -0.134176 0.094508 -0.235330 -0.260035 \n", "16 -0.093973 0.040988 0.141879 -0.166321 -0.241540 0.068408 0.347137 \n", "17 -0.020310 -0.387260 0.077396 0.085062 -0.002689 0.052090 0.127709 \n", "18 0.017073 0.189204 -0.110363 0.037938 0.053644 -0.133075 -0.150352 \n", "19 -0.007606 -0.082722 -0.108688 0.142498 0.128961 -0.158225 -0.138332 \n", "\n", " 7 8 9 10 11 12 13 \\\n", "0 0.081877 -0.097106 -0.092181 0.145256 -0.069027 -0.096715 -0.015690 \n", "1 -0.071046 -0.306478 0.352847 0.023583 -0.149760 0.149946 -0.125236 \n", "2 -0.267901 -0.102433 0.051146 -0.143905 0.003991 -0.156059 -0.115390 \n", "3 -0.079810 0.086960 -0.099084 -0.128556 -0.122615 -0.099861 -0.094066 \n", "4 0.122726 -0.052339 -0.149671 -0.054109 -0.229278 0.369994 -0.169986 \n", "5 -0.277070 0.073112 0.067616 -0.204496 0.020051 -0.194757 -0.084190 \n", "6 -0.388917 -0.056819 -0.055354 -0.206522 0.255388 -0.214728 -0.173994 \n", "7 1.000000 -0.331410 -0.160540 0.299851 -0.419594 0.328426 0.401612 \n", "8 -0.331410 1.000000 -0.142047 -0.228579 0.368601 -0.226814 -0.144194 \n", "9 -0.160540 -0.142047 1.000000 -0.096648 -0.087590 -0.134896 -0.105823 \n", "10 0.299851 -0.228579 -0.096648 1.000000 -0.203576 0.052516 -0.020949 \n", "11 -0.419594 0.368601 -0.087590 -0.203576 1.000000 -0.219200 -0.160224 \n", "12 0.328426 -0.226814 -0.134896 0.052516 -0.219200 1.000000 -0.019043 \n", "13 0.401612 -0.144194 -0.105823 -0.020949 -0.160224 -0.019043 1.000000 \n", "14 0.257765 -0.059629 0.041108 -0.107546 -0.229033 -0.061039 0.191867 \n", "15 0.394403 -0.284502 -0.151921 0.266068 -0.252958 0.488193 -0.008642 \n", "16 -0.351516 -0.100755 0.091004 -0.188390 0.139841 -0.227845 -0.094975 \n", "17 -0.335808 0.315410 -0.113039 -0.221826 0.065245 -0.295322 -0.052916 \n", "18 0.143992 -0.146497 -0.100372 -0.044903 -0.151338 -0.063644 -0.067576 \n", "19 0.019484 -0.100164 -0.105938 0.244375 -0.162975 -0.005547 -0.140832 \n", "\n", " 14 15 16 17 18 19 \n", "0 0.038101 0.027816 -0.093973 -0.020310 0.017073 -0.007606 \n", "1 -0.084288 0.211448 0.040988 -0.387260 0.189204 -0.082722 \n", "2 -0.190055 -0.173780 0.141879 0.077396 -0.110363 -0.108688 \n", "3 0.002449 -0.134176 -0.166321 0.085062 0.037938 0.142498 \n", "4 -0.016972 0.094508 -0.241540 -0.002689 0.053644 0.128961 \n", "5 0.108813 -0.235330 0.068408 0.052090 -0.133075 -0.158225 \n", "6 -0.131025 -0.260035 0.347137 0.127709 -0.150352 -0.138332 \n", "7 0.257765 0.394403 -0.351516 -0.335808 0.143992 0.019484 \n", "8 -0.059629 -0.284502 -0.100755 0.315410 -0.146497 -0.100164 \n", "9 0.041108 -0.151921 0.091004 -0.113039 -0.100372 -0.105938 \n", "10 -0.107546 0.266068 -0.188390 -0.221826 -0.044903 0.244375 \n", "11 -0.229033 -0.252958 0.139841 0.065245 -0.151338 -0.162975 \n", "12 -0.061039 0.488193 -0.227845 -0.295322 -0.063644 -0.005547 \n", "13 0.191867 -0.008642 -0.094975 -0.052916 -0.067576 -0.140832 \n", "14 1.000000 -0.097123 -0.134975 -0.026454 0.000497 -0.190876 \n", "15 -0.097123 1.000000 -0.246870 -0.375589 0.211580 0.022674 \n", "16 -0.134975 -0.246870 1.000000 -0.003519 -0.154029 -0.175658 \n", "17 -0.026454 -0.375589 -0.003519 1.000000 -0.173605 -0.060250 \n", "18 0.000497 0.211580 -0.154029 -0.173605 1.000000 0.021418 \n", "19 -0.190876 0.022674 -0.175658 -0.060250 0.021418 1.000000 " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "doc_topic = pd.DataFrame(ldamodel.doc_topic_)\n", "topic_correlations = doc_topic.corr()\n", "topic_correlations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Eine solche Tabelle lässt sich direkt als Netzwerk interpretieren: In der Netzwerktheorie ist eine quadratische Matrix eine Repräsentation der Kanten. Die Zellwerte stellen dann das Kantengewicht dar.\n", "\n", "Da in dieser Matrix jedoch alle Topics miteinander verbunden sind, ist es nützlich, zuvor etwas zu filtern. Hier werden alle negativen oder sehr schwachen Korrelationen gelöscht, die entsprechenden Topics sind im Netzwerk also nicht verbunden." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [], "source": [ "topic_correlations[topic_correlations < 0.1] = 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Die Diagonale der Korrelationsmatrix ist per Definition 1. Da im Netzwerk aber Beziehungen der Knoten zu sich selbst (sogenannte *loops*) in diesem Fall nicht sinnvoll sind, werden sie ebenfalls gelöscht.\n", "\n", "Ein `DataFrame` erlaubt dies nicht direkt, aber numpy stellt hierfür eine Funktion bereit. Sie funktioniert aber nur mit einer Matrix, nicht mit einem DataFrame. Hier hilft ein Kniff: `DataFrame.values` enthält eine Matrix-Repräsentation des DataFrame." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
012345678910111213141516171819
00.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.1452560.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.000000
10.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.3528470.0000000.0000000.1499460.0000000.0000000.2114480.0000000.0000000.1892040.000000
20.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.1418790.0000000.0000000.000000
30.0000000.0000000.0000000.0000000.1764230.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.142498
40.0000000.0000000.0000000.1764230.0000000.0000000.0000000.1227260.0000000.0000000.0000000.0000000.3699940.0000000.0000000.0000000.0000000.0000000.0000000.128961
50.0000000.0000000.0000000.0000000.0000000.0000000.1743410.0000000.0000000.0000000.0000000.0000000.0000000.0000000.1088130.0000000.0000000.0000000.0000000.000000
60.0000000.0000000.0000000.0000000.0000000.1743410.0000000.0000000.0000000.0000000.0000000.2553880.0000000.0000000.0000000.0000000.3471370.1277090.0000000.000000
70.0000000.0000000.0000000.0000000.1227260.0000000.0000000.0000000.0000000.0000000.2998510.0000000.3284260.4016120.2577650.3944030.0000000.0000000.1439920.000000
80.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.3686010.0000000.0000000.0000000.0000000.0000000.3154100.0000000.000000
90.0000000.3528470.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.000000
100.1452560.0000000.0000000.0000000.0000000.0000000.0000000.2998510.0000000.0000000.0000000.0000000.0000000.0000000.0000000.2660680.0000000.0000000.0000000.244375
110.0000000.0000000.0000000.0000000.0000000.0000000.2553880.0000000.3686010.0000000.0000000.0000000.0000000.0000000.0000000.0000000.1398410.0000000.0000000.000000
120.0000000.1499460.0000000.0000000.3699940.0000000.0000000.3284260.0000000.0000000.0000000.0000000.0000000.0000000.0000000.4881930.0000000.0000000.0000000.000000
130.0000000.0000000.0000000.0000000.0000000.0000000.0000000.4016120.0000000.0000000.0000000.0000000.0000000.0000000.1918670.0000000.0000000.0000000.0000000.000000
140.0000000.0000000.0000000.0000000.0000000.1088130.0000000.2577650.0000000.0000000.0000000.0000000.0000000.1918670.0000000.0000000.0000000.0000000.0000000.000000
150.0000000.2114480.0000000.0000000.0000000.0000000.0000000.3944030.0000000.0000000.2660680.0000000.4881930.0000000.0000000.0000000.0000000.0000000.2115800.000000
160.0000000.0000000.1418790.0000000.0000000.0000000.3471370.0000000.0000000.0000000.0000000.1398410.0000000.0000000.0000000.0000000.0000000.0000000.0000000.000000
170.0000000.0000000.0000000.0000000.0000000.0000000.1277090.0000000.3154100.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.000000
180.0000000.1892040.0000000.0000000.0000000.0000000.0000000.1439920.0000000.0000000.0000000.0000000.0000000.0000000.0000000.2115800.0000000.0000000.0000000.000000
190.0000000.0000000.0000000.1424980.1289610.0000000.0000000.0000000.0000000.0000000.2443750.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.000000
\n", "
" ], "text/plain": [ " 0 1 2 3 4 5 6 \\\n", "0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "2 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "3 0.000000 0.000000 0.000000 0.000000 0.176423 0.000000 0.000000 \n", "4 0.000000 0.000000 0.000000 0.176423 0.000000 0.000000 0.000000 \n", "5 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.174341 \n", "6 0.000000 0.000000 0.000000 0.000000 0.000000 0.174341 0.000000 \n", "7 0.000000 0.000000 0.000000 0.000000 0.122726 0.000000 0.000000 \n", "8 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "9 0.000000 0.352847 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "10 0.145256 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "11 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.255388 \n", "12 0.000000 0.149946 0.000000 0.000000 0.369994 0.000000 0.000000 \n", "13 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "14 0.000000 0.000000 0.000000 0.000000 0.000000 0.108813 0.000000 \n", "15 0.000000 0.211448 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "16 0.000000 0.000000 0.141879 0.000000 0.000000 0.000000 0.347137 \n", "17 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.127709 \n", "18 0.000000 0.189204 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "19 0.000000 0.000000 0.000000 0.142498 0.128961 0.000000 0.000000 \n", "\n", " 7 8 9 10 11 12 13 \\\n", "0 0.000000 0.000000 0.000000 0.145256 0.000000 0.000000 0.000000 \n", "1 0.000000 0.000000 0.352847 0.000000 0.000000 0.149946 0.000000 \n", "2 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "3 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "4 0.122726 0.000000 0.000000 0.000000 0.000000 0.369994 0.000000 \n", "5 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "6 0.000000 0.000000 0.000000 0.000000 0.255388 0.000000 0.000000 \n", "7 0.000000 0.000000 0.000000 0.299851 0.000000 0.328426 0.401612 \n", "8 0.000000 0.000000 0.000000 0.000000 0.368601 0.000000 0.000000 \n", "9 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "10 0.299851 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "11 0.000000 0.368601 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "12 0.328426 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "13 0.401612 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "14 0.257765 0.000000 0.000000 0.000000 0.000000 0.000000 0.191867 \n", "15 0.394403 0.000000 0.000000 0.266068 0.000000 0.488193 0.000000 \n", "16 0.000000 0.000000 0.000000 0.000000 0.139841 0.000000 0.000000 \n", "17 0.000000 0.315410 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "18 0.143992 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "19 0.000000 0.000000 0.000000 0.244375 0.000000 0.000000 0.000000 \n", "\n", " 14 15 16 17 18 19 \n", "0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "1 0.000000 0.211448 0.000000 0.000000 0.189204 0.000000 \n", "2 0.000000 0.000000 0.141879 0.000000 0.000000 0.000000 \n", "3 0.000000 0.000000 0.000000 0.000000 0.000000 0.142498 \n", "4 0.000000 0.000000 0.000000 0.000000 0.000000 0.128961 \n", "5 0.108813 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "6 0.000000 0.000000 0.347137 0.127709 0.000000 0.000000 \n", "7 0.257765 0.394403 0.000000 0.000000 0.143992 0.000000 \n", "8 0.000000 0.000000 0.000000 0.315410 0.000000 0.000000 \n", "9 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "10 0.000000 0.266068 0.000000 0.000000 0.000000 0.244375 \n", "11 0.000000 0.000000 0.139841 0.000000 0.000000 0.000000 \n", "12 0.000000 0.488193 0.000000 0.000000 0.000000 0.000000 \n", "13 0.191867 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "14 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "15 0.000000 0.000000 0.000000 0.000000 0.211580 0.000000 \n", "16 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "17 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n", "18 0.000000 0.211580 0.000000 0.000000 0.000000 0.000000 \n", "19 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "\n", "np.fill_diagonal(topic_correlations.values, 0)\n", "topic_correlations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Die solchermaßen ausgedünnte Matrix kann direkt als Netzwerk visualisiert werden." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\npwEpAedkulzkZmd3UOtEQoOGnUVCSPX2f6Veb82s5kCZwLNYuxA9Afwy4LgXbf8n0lbq+YqEkJKS\nEpKjohoMXoBcwAW8DiwC3g84HgH0jYysWbsrIi2n8BWROsKAccDPgPzObYpIt6TwFQkhSUlJFLvd\neJt5vheIree1wx4Pffr0ad/GiYQQha9ICElMTOTCYcPYUM+xYqAAa5lRJbAReB6YEnDeemBkaqru\n94q0gcJXJMRkZmWRGxdX5/Uw4A/A6UASsBj4H+CSgPNy4+PJzMrq6GaKdGua7SwSYhorstEUFdkQ\naR/q+YqEmKioKHLy8rg2OpoDLXjfAaz6zjl5eQpekTZS+IqEoOnp6Sx84AHGREezvRnnbwfGxMSw\ncMkSpqend3TzRLo9DTuLhLA1BQXMy8hgeFUVmS4Xk6m9peB6rHu8u8PCarYUFJG2U/iKhDiPx0Nh\nYSG52dns2L2bvr4h5cMeDyNTU8nMyiItLU1DzSLtSOErIjWcTmdN5ao+ffpoOZFIB1H4ioiI2EwT\nrkRERGym8BUREbGZwldERMRmCl8RERGbKXxFRERspvAVERGxmcJXRETEZgpfERERmyl8RUREbKbw\nFRERsZnCV0RExGYKXxEREZspfEVERGym8BUREbGZwldERMRmCl8RERGbKXxFRERspvAVERGxmcJX\nRETEZgpfERERmyl8RUREbKbwFRERsZnCV0RExGYKXxEREZspfEVERGym8BUREbGZwldERMRmCl8R\nERGbKXxFRERspvAVERGxmcJXRETEZgpfERERmyl8RUREbKbwFRERsZnCV0RExGYKXxEREZspfEVE\nRGym8BUREbGZwldERMRmCl8RERGbKXxFRERspvAVERGxmcJXRETEZgpfERERmyl8RUREbKbwFRER\nsZnCV0RExGYKXxEREZspfEVERGym8BUREbGZwldERMRmCl8RERGbKXxFRERspvAVERGxmcJXRETE\nZgpfERERmyl8RUREbKbwFRERsZnCV0RExGYKXxEREZspfEVERGym8BUREbGZwldERMRmCl8RERGb\n/X9yIlHA6SyxTAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "import networkx as nx\n", "\n", "topic_graph = nx.Graph(topic_correlations.values)\n", "nx.draw(topic_graph, with_labels=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Eine erste Betrachtung zeigt, dass es hier zwei untereinander kaum verbundene Cluster gibt. Betrachtet man die entsprechenden Topics, lassen sich die Cluster grob einem kulturpolitischen Feld (oben) und einem wirtschaftspolitischen Feld (unten) zurechnen.\n", "\n", "In ähnlicher Weise können auch die Korrelationen nicht von Topics, sondern von Dokumenten berechnet und visualisiert werden. Zwei Dokumente können dann als ähnlich angesehen werden, wenn sie eine ähnliche Topic-Verteilung aufweisen.\n", "\n", "Die Dokumentkorrelationen erhält man, wenn man die doc_topic-Tabelle transponiert, bevor man die Korrelationen berechnet. Das Ergebnis ist dann eine quadratische Matrix von Dokumenten." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(793, 793)" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "doc_correlations = doc_topic.transpose().corr()\n", "\n", "doc_correlations[doc_correlations < .8] = 0\n", "np.fill_diagonal(doc_correlations.values, 0)\n", "doc_correlations.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Um das Netzwerk leichter interpretieren zu können, werden die Knoten des Netzwerkes entsprechend der Dokumenttitel benannt." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import pandas as pd\n", "\n", "data = pd.read_csv(\"../Daten/Reden.csv\", parse_dates=['date'], encoding='utf-8')\n", "titles = data['title']\n", "\n", "doc_graph = nx.Graph(doc_correlations.values)\n", "doc_graph = nx.relabel_nodes(doc_graph, titles)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Das Netzwerk ist mit 793 Knoten zu groß, um es ohne weiteres mit den Möglichkeiten von networkx zu zeichnen. Für die explorative Analyse bietet sich ein Programm wie [Gephi](http://gephi.org/) an. Daher wird das Netzwerk in eine GraphML-Datei exportiert und in Gephi weiter analysiert." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [], "source": [ "nx.write_graphml(doc_graph, 'docs.graphml')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In Gephi wurden nur zwei Schritte vorgenommen: Ein Layout wurde mit dem ForceAtlas-Algorithmus berechnet, und es wurden Communities eng zusammenhängender Dokumente ermittelt. (Dieser zweite Schritt wäre ebenso mit dem Paket python-louvain möglich gewesen, das den gleichen Algorithmus implementiert. Dafür siehe die Einheit zu »Text als Netzwerk«.)\n", "\n", "Um das Ergebnis leicht im Notebook anzeigen zu können, wurde es mit dem Sigma-Plugin aus Gephi in eine HTML-Datei exportiert, die hier eingebunden wird." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.core.display import HTML\n", "\n", "HTML('')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bei Betrachtung der einzelnen Cluster zeigt sich insgesamt ein relativ deutlicher inhaltlicher Zusammenhang. So sind etwa die Dokumente des currygelben Clusters 12 (oben in der Mitte) mit Kultur und insbesondere mit Film und Filmförderung befasst, während das violette Cluster 9 (unten rechts) Themen aus der Verteidigungspolitik beinhaltet." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.4.3" } }, "nbformat": 4, "nbformat_minor": 0 }