networkx говорит, что у меня меньше узлов, чем на самом деле - PullRequest
1 голос
/ 03 июля 2019

У меня странная проблема с NetworkX.
Учитывая набор данных DS-1 , моя задача состоит в том, чтобы создать график для каждого года, который будет представлен в наборе данных. Пока проблем нет вообще. За 2013 год вот что я получаю

enter image description here

Мы могли бы сказать ... немного толпы.
Теперь вот моя странная проблема. Мое назначение гласит, что я должен с некоторой логикой выбрать верхние k-узлы каждого графа. Итак, поскольку у меня есть некоторые графы, которые имеют менее 5 узлов (и, согласно требованиям, это k будет значением в [0,5,10,50,200]), я подумал исключить в итерации те графы, чьи len (G ) <к. Итак, с учетом словаря graphsPerYear (ключ: год - значение: график) ... </p>

for x in graphsPerYear:
    G = graphsPerYear[x]
    if len(G) < k:
        print(G.nodes)
        print(G.number_of_nodes())
        print("Skipping year " + str(x) + " since it has " + str(len(G)) + " nodes which is less than the prompted k")
        continue

Это выводит следующее:

['linear matrix inequality', 'social inequality']
2
Skipping year 2013 since it has 2 nodes which is less than the prompted k

Но изображение говорит о полной противоположности. Чего мне не хватает?

РЕДАКТИРОВАТЬ

Добавление создания графика

def createGraphPerYear(dataset, year):
    insertedWords = set()
    listaAnni = set(dataset['anno'].values)
    grafi = dict()
    for anno in listaAnni:
        datasetTemporale = dataset[dataset['anno'] == anno]
        G=nx.DiGraph()
        for index, row in datasetTemporale.iterrows():
            #Reminder: ogni row è formato da anno, keyword1, keyword2, dizionario utilizzatore keywords - numero volte
            #FASE 1: AGGIUNTA DEI DUE POSSIBILI NODI
            if row.keyword1 not in G:
                G.add_node(row.keyword1)
            if row.keyword2 not in G:
                G.add_node(row.keyword2)
            if not __areNodesConnected(G,row.keyword1, row.keyword2):
                G.add_edge(row.keyword1,row.keyword2)
        grafi[anno] = G
    return grafi

def __areNodesConnected(G, nodeToCheckOne,nodeToCheckTwo):
    return nodeToCheckOne in G.neighbors(nodeToCheckTwo)

1 Ответ

0 голосов
/ 03 июля 2019

Когда вы добавляете узел в сеть, он hash определяет его уникальность. Любой узел с одинаковым hash определяется как идентичный.

By definition, a Graph is a collection of nodes (vertices) 
along with identified pairs of nodes (called edges, links, etc). 
In NetworkX, nodes can be any hashable object e.g., 
a text string, an image, an XML object, another Graph, 
a customized node object, etc.

Дважды проверьте, что элементы не являются одной и той же строкой, или что их хэш-память не эквивалентна для отдельных узлов.

...