Neulich habe ich einen Artikel geschrieben, um ein Follow-Korrelationsdiagramm für Twitter zu erstellen.
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
Holen Sie sich im obigen Artikel die folgenden Kontoinformationen mit der Twitter-API und registrieren Sie sie in mongoDB. Danach bestand die Logik darin, die Daten von mongoDB abzurufen und in das Diagramm zu zeichnen, während überprüft wurde, ob sie einander folgen.
Ich habe gelernt, dass die Verwendung von GraphDB für die Netzwerkanalyse praktisch ist, daher habe ich auch GraphDB verwendet.
python:3.7 gremlinpython:3.4.6 gremlin:3.4.6
Ich habe die Umgebung unter Windows erstellt. Sie können die Tools für Windows wie folgt herunterladen.
https://downloads.apache.org/tinkerpop/3.4.6/
Es ist "Server" zum Herunterladen. Es ist praktisch, eine "Konsole" zu haben, aber ich werde sie in diesem Artikel nicht verwenden.
Entpacken Sie nach dem Herunterladen einfach die ZIP-Datei, legen Sie sie in einem beliebigen Ordner ab und führen Sie bat unter dem Ordner bin aus.
gremlinpython Es kann mit dem Befehl pip installiert werden.
pip install gremlinpython
Jetzt, da wir eine Umgebung haben, werden wir sie implementieren.
Gremlin ist eine Datenbank, die Datenmodelle vom Typ Graph verarbeiten kann. Da mongoDB die Beziehung zwischen Daten nicht verwalten konnte, werden wir die Beziehung der Daten registrieren, während wir die Daten im Gremlin registrieren.
Die Daten von mongoDB sind wie folgt. Eine Liste der Twitter-Konten und der Konten, denen sie folgen, wird registriert. Viele der folgenden Daten sind registriert.
{
"_id" : ObjectId("5e6c52a475646eb49cfbd62b"),
"screen_name" : "yurinaNECOPLA",
"followers_info" : [
{
"screen_name" : "Task_fuuka",
"id" : NumberLong("784604847710605312")
},
(Weggelassen)
{
"screen_name" : "nemui_oyasumi_y",
"id" : NumberLong("811491671560974336")
}
]
}
from gremlin_python import statics
from gremlin_python.structure.graph import Graph
from gremlin_python.process.graph_traversal import __
from gremlin_python.process.traversal import TraversalSideEffects
from gremlin_python.driver.driver_remote_connection import DriverRemoteConnection
from mongo_dao import MongoDAO
mongo = MongoDAO("db", "followers_info")
graph = Graph()
# Gremlin-Verbindung herstellen
g = graph.traversal().withRemote(DriverRemoteConnection('ws://localhost:8182/gremlin','g'))
start_name = 'yurinaNECOPLA'
def addValueEdge(parent_name, depth):
if depth == 0:
return False
print(parent_name)
result = mongo.find_one(filter={'screen_name': parent_name})
if result == None or len(result) == 0:
return False
# Scheitelpunkte hinzufügen
g.addV(parent_name).property('screen_name', parent_name).toSet()
p = g.V().has('screen_name', parent_name).toList()[0]
for follower in result['followers_info']:
if addValueEdge(follower['screen_name'], depth-1):
cList = g.V().has('screen_name', follower['screen_name']).toList()
if len(cList) != 0:
# Kante hinzufügen
g.addE('follow').from_(p).to(cList[0]).toSet()
return True
addValueEdge(start_name, 3)
Auf diese Weise werden Daten und Kanten rekursiv registriert.
Die Grundkonstruktion ist die gleiche wie bei der Datenerfassung von mongoDB.
import json
import networkx as nx
import matplotlib.pyplot as plt
from gremlin_python import statics
from gremlin_python.structure.graph import Graph
from gremlin_python.process.graph_traversal import __
from gremlin_python.process.traversal import TraversalSideEffects
from gremlin_python.driver.driver_remote_connection import DriverRemoteConnection
start_screen_name = 'yurinaNECOPLA'
graph = Graph()
# Gremlin-Verbindung herstellen
g = graph.traversal().withRemote(DriverRemoteConnection('ws://localhost:8182/gremlin','g'))
# Erstellen Sie ein neues Diagramm
G = nx.Graph()
# Knoten hinzufügen
G.add_node(start_screen_name)
def add_edge(screen_name, depth):
if depth == 0:
return
name = g.V().has('screen_name', screen_name).toList()[0]
follows_list = g.V(name).both().valueMap().toList()
for follow in follows_list:
print(follow['screen_name'][0])
G.add_edge(screen_name, follow['screen_name'][0])
add_edge(follow['screen_name'][0], depth-1)
add_edge(start_screen_name, 3)
# Diagramm erstellen. figsize ist die Größe der Figur
plt.figure(figsize=(10, 8))
# Bestimmen Sie das Layout der Figur. Je kleiner der Wert von k ist, desto dichter ist die Zahl
pos = nx.spring_layout(G, k=0.8)
# Zeichnen von Knoten und Kanten
# _color: Geben Sie die Farbe an
# Alpha: Transparenz festlegen
nx.draw_networkx_edges(G, pos, edge_color='y')
nx.draw_networkx_nodes(G, pos, node_color='r', alpha=0.5)
# Knotennamen hinzufügen
nx.draw_networkx_labels(G, pos, font_size=10)
# Einstellung, dass die X-Achse und die Y-Achse nicht angezeigt werden
plt.axis('off')
plt.savefig("mutual_follow.png ")
# Zeichnen Sie ein Diagramm
plt.show()
Die wichtigsten Punkte sind wie folgt.
name = g.V().has('screen_name', screen_name).toList()[0]
follows_list = g.V(name).both().valueMap().toList()
for follow in follows_list:
print(follow['screen_name'][0])
G.add_edge(screen_name, follow['screen_name'][0])
add_edge(follow['screen_name'][0], depth-1)
In der ersten Zeile werden die Follower-Informationen vom Gremlin abgerufen. Sie können die Kanteninformationen der in der zweiten Zeile erhaltenen Informationen abrufen. Da es sich bei diesen Daten um eine Diktatliste handelt, können Sie den Kontonamen abrufen, indem Sie einen nach dem anderen und den Bildschirmnamen abrufen.
Ausführungsergebnis
Das Ergebnis war ziemlich unansehnlich, aber ich konnte ein Korrelationsdiagramm erstellen.
Das obige Korrelationsdiagramm zeigt auch die zyklischen Beziehungen wie Konto A → Konto B, Konto B → Konto C und Konto C → Konto A.
Wenn Sie nicht zirkulieren möchten, können Sie durch Hinzufügen einer Steuerung erkennen, dass die Daten, die zum Zeitpunkt der Registrierung im Gremlin bereits registriert sind, nicht hinzugefügt werden.
def registCheck(screen_name):
check = g.V().has('screen_name', screen_name).toList()
if len(check) == 0:
return False
else:
return True
def addValueEdge(parent_name, depth):
if depth == 0 or registCheck(parent_name):
return False
print(parent_name)
result = mongo.find_one(filter={'screen_name': parent_name})
if result == None or len(result) == 0:
return False
# Scheitelpunkte hinzufügen
g.addV(parent_name).property('screen_name', parent_name).toSet()
p = g.V().has('screen_name', parent_name).toList()[0]
for follower in result['followers_info']:
if addValueEdge(follower['screen_name'], depth-1):
cList = g.V().has('screen_name', follower['screen_name']).toList()
if len(cList) != 0:
# Kante hinzufügen
g.addE('follow').from_(p).to(cList[0]).toSet()
return True
Durch Hinzufügen eines registerCheck, um zu überprüfen, ob die Daten im Gremlin registriert sind, kann die zirkuläre Beziehung ausgeschlossen werden.
In der Abbildung mit Auflage werden die eng miteinander verbundenen Konten zusammen ausgegeben. In der Abbildung ohne Umlauf wird das Konto, dem das Startkonto folgt, in der Nähe ausgegeben. Da die Logik jedoch rekursiv aufgebaut ist, wird das Konto, das mit Konto A aufeinander folgt, an einer entfernten Position ausgegeben. Einige sind. Es scheint, dass wir noch überlegen müssen, wie wir die Kante setzen sollen.
Das Registrieren von Datenbeziehungen ähnelt RDB, aber ich hatte den Eindruck, dass es sehr schwierig ist, mit Gremlin-Python intuitiv umzugehen. Wenn Sie das Dokument lesen und den Mechanismus bis zu einem gewissen Grad verstehen können, ist es für die Netzwerkanalyse hilfreich.
Recommended Posts