Commit 094ca259 authored by delanoe's avatar delanoe

[FEAT] Graph visualization improved. Bridgeness score implemented.

parent 18fb1332
...@@ -15,7 +15,7 @@ from analysis.cooccurrences import do_cooc ...@@ -15,7 +15,7 @@ from analysis.cooccurrences import do_cooc
from analysis.distance import do_distance from analysis.distance import do_distance
import pandas as pd import pandas as pd
from copy import copy from copy import copy,deepcopy
import numpy as np import numpy as np
import scipy import scipy
import networkx as nx import networkx as nx
...@@ -34,6 +34,7 @@ def get_cooc(request=None, corpus=None ...@@ -34,6 +34,7 @@ def get_cooc(request=None, corpus=None
, start=None, end=None , start=None, end=None
, hapax=1 , hapax=1
, distance='conditional' , distance='conditional'
, bridgeness=5
): ):
''' '''
get_ccoc : to compute the graph. get_ccoc : to compute the graph.
...@@ -60,7 +61,6 @@ def get_cooc(request=None, corpus=None ...@@ -60,7 +61,6 @@ def get_cooc(request=None, corpus=None
G, partition, ids, weight = do_distance(cooc_id, field1="ngrams", field2="ngrams" G, partition, ids, weight = do_distance(cooc_id, field1="ngrams", field2="ngrams"
, isMonopartite=True, distance=distance) , isMonopartite=True, distance=distance)
if type == "node_link": if type == "node_link":
nodesB_dict = {} nodesB_dict = {}
for node_id in G.nodes(): for node_id in G.nodes():
...@@ -68,9 +68,9 @@ def get_cooc(request=None, corpus=None ...@@ -68,9 +68,9 @@ def get_cooc(request=None, corpus=None
#node,type(labels[node]) #node,type(labels[node])
G.node[node_id]['pk'] = ids[node_id][1] G.node[node_id]['pk'] = ids[node_id][1]
nodesB_dict [ ids[node_id][1] ] = True nodesB_dict [ ids[node_id][1] ] = True
# TODO the query below is not optimized (do it do_distance).
the_label = session.query(Ngram.terms).filter(Ngram.id==node_id).first() the_label = session.query(Ngram.terms).filter(Ngram.id==node_id).first()
the_label = ", ".join(the_label) the_label = ", ".join(the_label)
# TODO the query below is not optimized (do it do_distance).
G.node[node_id]['label'] = the_label G.node[node_id]['label'] = the_label
G.node[node_id]['size'] = weight[node_id] G.node[node_id]['size'] = weight[node_id]
...@@ -81,25 +81,62 @@ def get_cooc(request=None, corpus=None ...@@ -81,25 +81,62 @@ def get_cooc(request=None, corpus=None
pass #PrintException() pass #PrintException()
#print("error01: ",error) #print("error01: ",error)
B = json_graph.node_link_data(G)
links = [] links = []
i=1 i=1
if bridgeness > 0:
com_link = defaultdict(lambda: defaultdict(list))
com_ids = defaultdict(list)
for k, v in partition.items():
com_ids[v].append(k)
for e in G.edges_iter(): for e in G.edges_iter():
s = e[0] s = e[0]
t = e[1] t = e[1]
info = { weight = G[ids[s][1]][ids[t][1]]["weight"]
"s": ids[s][1] ,
"t": ids[t][1] , if bridgeness < 0:
"w": G[ids[s][1]][ids[t][1]]["weight"] info = {
} "s": ids[s][1] ,
# print(info) "t": ids[t][1] ,
links.append(info) "w": weight
i+=1 }
# print(B) links.append(info)
else:
if partition[s] == partition[t]:
info = {
"s": ids[s][1] ,
"t": ids[t][1] ,
"w": weight
}
links.append(info)
if bridgeness > 0:
if partition[s] < partition[t]:
com_link[partition[s]][partition[t]].append((s,t,weight))
if bridgeness > 0:
for c1 in com_link.keys():
for c2 in com_link[c1].keys():
index = round(bridgeness*len(com_link[c1][c2]) / (len(com_ids[c1]) + len(com_ids[c2])))
#print((c1,len(com_ids[c1])), (c2,len(com_ids[c2])), index)
if index > 0:
for link in sorted(com_link[c1][c2], key=lambda x: x[2], reverse=True)[:index]:
#print(c1, c2, link[2])
info = {"s": link[0], "t": link[1], "w": link[2]}
links.append(info)
B = json_graph.node_link_data(G)
B["links"] = [] B["links"] = []
B["links"] = links B["links"] = links
if field1 == field2 == 'ngrams' : if field1 == field2 == 'ngrams' :
data["nodes"] = B["nodes"] data["nodes"] = B["nodes"]
data["links"] = B["links"] data["links"] = B["links"]
......
...@@ -23,6 +23,7 @@ class Graph(APIView): ...@@ -23,6 +23,7 @@ class Graph(APIView):
type_ = request.GET.get('type', 'node_link') type_ = request.GET.get('type', 'node_link')
hapax = request.GET.get('hapax', 1) hapax = request.GET.get('hapax', 1)
distance = request.GET.get('distance', 'conditional') distance = request.GET.get('distance', 'conditional')
bridgeness = int(request.GET.get('bridgeness', -1))
corpus = session.query(Node).filter(Node.id==corpus_id).first() corpus = session.query(Node).filter(Node.id==corpus_id).first()
...@@ -39,7 +40,7 @@ class Graph(APIView): ...@@ -39,7 +40,7 @@ class Graph(APIView):
, hapax=hapax, distance=distance) , hapax=hapax, distance=distance)
else: else:
data = get_cooc(corpus=corpus,field1=field1, field2=field2 data = get_cooc(corpus=corpus,field1=field1, field2=field2
, hapax=hapax, distance = distance) , hapax=hapax, distance = distance, bridgeness=bridgeness)
if format_ == 'json': if format_ == 'json':
return JsonHttpResponse(data) return JsonHttpResponse(data)
else: else:
......
...@@ -93,6 +93,10 @@ ...@@ -93,6 +93,10 @@
<h3> Networks </h3> <h3> Networks </h3>
<ol> <ol>
<li data-url="/project/{{project.id}}/corpus/{{ corpus.id }}/explorer?field1=ngrams&amp;field2=ngrams" onclick='gotoexplorer(this)'><a>Terms</a></li> <li data-url="/project/{{project.id}}/corpus/{{ corpus.id }}/explorer?field1=ngrams&amp;field2=ngrams" onclick='gotoexplorer(this)'><a>Terms</a></li>
<ul>
<li data-url="/project/{{project.id}}/corpus/{{ corpus.id }}/explorer?field1=ngrams&amp;field2=ngrams&amp;distance=distributional&amp;bridgeness=5" onclick='gotoexplorer(this)'><a>Macro</a></li>
<li data-url="/project/{{project.id}}/corpus/{{ corpus.id }}/explorer?field1=ngrams&amp;field2=ngrams&amp;distance=conditional&amp;bridgeness=5" onclick='gotoexplorer(this)'><a>Macro</a></li>
</ul>
<li data-url="/project/{{project.id}}/corpus/{{ corpus.id }}/explorer?field1=journal&amp;field2=ngrams" onclick='gotoexplorer(this)'><a>Journals and Terms</a></li> <li data-url="/project/{{project.id}}/corpus/{{ corpus.id }}/explorer?field1=journal&amp;field2=ngrams" onclick='gotoexplorer(this)'><a>Journals and Terms</a></li>
<li>Authors and Terms</li> <li>Authors and Terms</li>
</ol> </ol>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment