[GO] [Python] Ich habe ein Follow-Korrelationsdiagramm für Twitter erstellt (Gremlin-Ausgabe)

Artikelinhalt

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.

Umgebung

python:3.7 gremlinpython:3.4.6 gremlin:3.4.6

Installieren Sie Gremlin

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

Implementierung

Jetzt, da wir eine Umgebung haben, werden wir sie implementieren.

Registrieren Sie mongoDB-Daten im Gremlin

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.

MongoDB-Daten

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")
                }
        ]
}

Code

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)

Codekommentar

  1. Entscheiden Sie sich für ein Top-Konto
  2. Übergeben Sie den Kontonamen an addValueEdge
  3. Holen Sie sich Daten von MongoDB
  4. Fügen Sie dem Gremlin Scheitelpunkte hinzu, sobald Daten verfügbar sind
  5. Übergeben Sie die Kontonamen, denen Sie folgen, nacheinander (zurück zu 2.)
  6. Fügen Sie eine Kante hinzu

Auf diese Weise werden Daten und Kanten rekursiv registriert.

Erstellen Sie ein Korrelationsdiagramm

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()

Codekommentar

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.

Ergebnis

Ausführungsergebnis mutual_follow.png

Das Ergebnis war ziemlich unansehnlich, aber ich konnte ein Korrelationsdiagramm erstellen.

Korrelationsdiagramm eines anderen Musters

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.

Ergebnis

mutual_follow1.png

Zusammenfassung

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

[Python] Ich habe ein Follow-Korrelationsdiagramm für Twitter erstellt (Gremlin-Ausgabe)
Ich habe ein Passwort-Tool in Python erstellt.
Ich habe eine generische Python-Projektvorlage erstellt
Ich habe eine Python-Wörterbuchdatei für Neocomplete erstellt
Ich habe versucht, mit Python einen Twitter-Blocker für faule Mädchen zu machen
Ich habe versucht, eine Docker-Datei für die Entwicklungsumgebung von Django zu erstellen
Ein * Algorithmus (Python Edition)
Ich habe einen Twitter BOT mit GAE (Python) gemacht (mit einer Referenz)
Ich habe eine VM erstellt, auf der OpenCV für Python ausgeführt wird
[Python] Ich habe einen Klassifikator für Iris erstellt [Maschinelles Lernen]
[Python] Erstellt eine Transformations-App für Weltmeister "Mr. Satan"
[VSCode] Ich habe ein Benutzer-Snippet für Python-Druck-F-String erstellt
Erstellen Sie einen Twitter-BOT mit dem GoogleAppEngine SDK für Python
Ich habe eine Klasse in Python erstellt und versucht, Enten zu tippen
Erstellen Sie ein Korrelationsdiagramm aus dem Konversationsverlauf von Twitter
Memorandum über Korrelation [Python]
Ich habe einen Python-Text gemacht
Python> Ich habe einen Testcode für meine eigene externe Datei erstellt
Ich habe eine Python-Bibliothek erstellt, um die API von LINE WORKS aufzurufen
Erstellt eine Bibliothek für Python, die die morphologische Teilung problemlos handhaben kann
Ich habe viele Dateien für die RDP-Verbindung mit Python erstellt
Ich habe versucht, ein Gerüstwerkzeug für Python Web Framework Bottle zu erstellen
Ich habe eine Python-Wrapper-Bibliothek für die Docomo-Bilderkennungs-API erstellt.
Ich berührte PyAutoIt für einen Moment
Ich habe einen Line-Bot mit Python gemacht!
Ich habe mit Python eine Lotterie gemacht.
Erstelltes AtCoder-Testtool für Python
Zeichnen Sie ein CNN-Diagramm in Python
Ich habe mit Python einen Daemon erstellt
Ich habe einen Docker-Container erstellt, um JUMAN ++, KNP, Python (für pyKNP) zu verwenden.
ETL-Verarbeitung für eine große Anzahl von GTFS-Echtzeitdateien (Python Edition)
[Python] Ich habe einen Twitter-Bot erstellt, der freundschaftliche Tweets mit Markov-Kettenregeln generiert.
Ich habe mit DASH eine Visualisierungssite für das BIP (gesamte Inlandsproduktion) erstellt!
Ich habe versucht, mit Raspeye 4 (Python Edition) ein signalähnliches Signal zu erzeugen.