Construindo uma rede complexa a partir de páginas da Wikipedia

Matheus Ricardo dos Santos
5 min readAug 30, 2021

Este artigo é um guia de como criar, estilizar e disponibilizar uma rede complexa utilizando o python e o Gephi.

A rede que iremos contruir é composta pelas páginas da wikipedia e por citações entre elas. O resultado será uma rede direcionada na qual cada nó é uma página da Wikipedia e cada aresta representa uma citação que possui uma direção.

1. Construindo a rede

Para recuperarmos os nós da rede utilizaremos a api em python da wikipedia:

pip install wikipedia

Para percorrer as páginas utilizaremos a estratégia de busca conhecida como breadth first pois desta forma faremos apenas um request por página.

Antes de iniciarmos a busca precisamos escolher o primeiro nó que será o nosso nó raiz. Neste artigo utilizaremos a página Wildlife of Brazil .

SEED = "Wildlife of Brazil".title()# nós que não são muito citados mas não estão relacionados ao nó raizSTOPS = ("International Standard Serial Number","International Standard Book Number","National Diet Library","International Standard Name Identifier","International Standard Book Number (Identifier)","Pubmed Identifier","Pubmed Central","Digital Object Identifier","Arxiv","Proc Natl Acad Sci Usa","Bibcode","Library Of Congress Control Number","Jstor","Doi (Identifier)","Isbn (Identifier)","Pmid (Identifier)","Arxiv (Identifier)","Bibcode (Identifier)")

Para cada página citada pela página raiz iremos também verificar suas citações. Este processo vai até a segunda camada de nossa árvore de páginas.

print("{} nodes, {} edges".format(len(g), nx.number_of_edges(g)))# 48569 nodes, 109391 edges

Como resultado inicial obtvemos 48569 nós (páginas) e 109391 conexões (citações).

Ainda precisamos remover as páginas duplicadas pois a wikipedia costuma ter algumas variações da mesma página.

# make a copy of raw graphoriginal = g.copy()# remove self loopsg.remove_edges_from(nx.selfloop_edges(g))# identify duplicates like that: 'network' and 'networks'duplicates = [(node, node + "s") for node in g if node + "s" in g]for dup in duplicates:
g = nx.contracted_nodes(g, *dup, self_loops=False)
duplicates = [(x, y) for x, y in [(node, node.replace("-", " ")) for node in g] if x != y and y in g]for dup in duplicates:
g = nx.contracted_nodes(g, *dup, self_loops=False)
# nx.contracted creates a new node/edge attribute called contraction# the value of the attribute is a dictionary, but GraphML# does not support dictionary attributesnx.set_node_attributes(g, 0,"contraction")nx.set_edge_attributes(g, 0,"contraction")print("{} nodes, {} edges".format(len(g), nx.number_of_edges(g)))
# 48041 nodes, 108764 edges

Para diminuir a compexidade da rede podemos remover a páginas com apenas 1 citação (in-degree igual a 1). Estas páginas provavelmente não são fortemente relacionadas à página principal.

# seleciona os nós com grau maior ou igual a 2
core = [node for node, deg in dict(g.degree()).items() if deg >= 2]
# seleciona o subgrafo
gsub = nx.subgraph(g, core)
print("{} nodes, {} edges".format(len(gsub), nx.number_of_edges(gsub)))
# 15836 nodes, 76559 edges
# salva a rede em formato .graphml
nx.write_graphml(gsub, "cna.graphml")

Removidos os nós menos importantes a rede ficou com 15836 nós e 76559 conexões.

2. Analisando a rede

O objetivo da análise é encontrar os nós(páginas) mais importantes da rede, pois estes são mais relacionadas ao tema Wildlife of Brazil.

Utilizaremos as métricars de Betweenness Centrality e in-degree.

in-degree: esta métrica representa o número de vezes em que a página foi citada por outras páginas na rede. Podemos ver abaixo a lista dos nós mais citados:

  • Brazil 157
  • Amazon Basin 115
  • Pantanal 108
  • Issn (Identifier) 104
  • Wayback Machine 102
  • Dependent Territory 97
  • Brazilian Real 96

*Os nós Issn (Identifier) e Wayback Machine poderiam ter sido utilizados como pontos de parada na contrução da rede pois não são relacionados à página raiz.

Betweenness Centrality: esta métrica representa a quantidade de vezes em que um nó aparece no menor caminho entre dois nós da rede. Em outras palavras, a página com maior Betweenness Centrality está fortemente relacionado com a maioria das outras páginas da rede, sendo assim um tema muito relevante.

  • Brazil
  • Wildlife Of Brazil
  • Amazon Basin
  • Biodiversity
  • South America

3. Estilizando a rede com o Gephi

Utilizaremos o Gephi para estilizar e destacar os nós mais relevantes da rede.

Para importar o arquivo cna.graphml basta selecionar as opções arquivo>importar.

Após a importação precisamos calcular as métricas de modularidade e grau médio que serão utilizadas para definir a cor e o tamanho dos nós respectivamente:

As imagens abaixo mostram como aplicar estilos com base nestas métricas:

Tambem podemos reorganizar a localização dos nós, isto nos permite ter uma melhor visualização da relação entre cada uma das classes de modularidade. Para isso, utilizaremos o algoritmo ForceAtlas2:

Por fim, adicionaremos as labels aos nós com in-degree entre 90 e 157

Adicionados os label podemos exportar uma imagem do resultado final:

4. Disponibilizando a rede com o GitHub Pages

Este ultimo passo é bastante simples, basta exportar a rede utilizando o plugin do Gephi SigmaExporter e subir os arquivos resultantes para um repositório no GitHub.

Com o arquivos no repositório, podemos ativar o GitHub Pages:

O resultado final pode ser conferido no seguinte link: https://matheusrdsantos.github.io/wikipedia-pages/

--

--