Commit 05f9197a authored by delanoe's avatar delanoe

[FEAT] A graph happens.

parent f64dd8ce
...@@ -38,7 +38,9 @@ urlpatterns = [ ...@@ -38,7 +38,9 @@ urlpatterns = [
url(r'^projects/(\d+)/corpora/(\d+)/documents/(\d+)/$', annotations_main_view), url(r'^projects/(\d+)/corpora/(\d+)/documents/(\d+)/$', annotations_main_view),
# Module "Graph Explorer" # Module "Graph Explorer"
url(r'^projects/(\d+)/corpora/(\d+)/explorer$', explorer) url(r'^projects/(\d+)/corpora/(\d+)/explorer$', explorer),
url(r'^projects/(\d+)/corpora/(\d+)/graph$', Graph.as_view()),
url(r'^projects/(\d+)/corpora/(\d+)/node_link.json$', Graph.as_view())
#url(r'^projects/(\d+)/corpora/(\d+)/explorer$', include(graphExplorer.urls)) #url(r'^projects/(\d+)/corpora/(\d+)/explorer$', include(graphExplorer.urls))
#url(r'^projects/(\d+)/corpora/(\d+)/explorer$', include(graphExplorer_urls)) #url(r'^projects/(\d+)/corpora/(\d+)/explorer$', include(graphExplorer_urls))
] ]
from gargantext.util.db import session from gargantext.models import Node, NodeNgram, NodeNgramNgram, \
NodeHyperdata
from gargantext.util.db import session, aliased
from graphExplorer.louvain import best_partition
from copy import copy
from collections import defaultdict from collections import defaultdict
from operator import itemgetter from math import log,sqrt
from django.db import connection, transaction #from operator import itemgetter
import math import math
from math import log,sqrt import numpy as np
import pandas as pd
import numpy as np
import pandas as pd
from copy import copy
import networkx as nx import networkx as nx
from networkx.readwrite import json_graph
from graphExplorer.louvain import best_partition, generate_dendogram, partition_at_level
from sqlalchemy.orm import aliased
def do_distance(cooc_id, field1=None, field2=None, isMonopartite=True, distance='conditional'): def do_distance(cooc_id, field1=None, field2=None, isMonopartite=True, distance='conditional'):
''' '''
...@@ -40,14 +35,14 @@ def do_distance(cooc_id, field1=None, field2=None, isMonopartite=True, distance= ...@@ -40,14 +35,14 @@ def do_distance(cooc_id, field1=None, field2=None, isMonopartite=True, distance=
query = session.query(Cooc).filter(Cooc.node_id==cooc_id).all() query = session.query(Cooc).filter(Cooc.node_id==cooc_id).all()
for cooc in query: for cooc in query:
matrix[cooc.ngramx_id][cooc.ngramy_id] = cooc.score matrix[cooc.ngram1_id][cooc.ngram2_id] = cooc.weight
matrix[cooc.ngramy_id][cooc.ngramx_id] = cooc.score matrix[cooc.ngram2_id][cooc.ngram1_id] = cooc.weight
ids[cooc.ngramx_id] = (field1, cooc.ngramx_id) ids[cooc.ngram1_id] = (field1, cooc.ngram1_id)
ids[cooc.ngramy_id] = (field2, cooc.ngramy_id) ids[cooc.ngram2_id] = (field2, cooc.ngram2_id)
weight[cooc.ngramx_id] = weight.get(cooc.ngramx_id, 0) + cooc.score weight[cooc.ngram1_id] = weight.get(cooc.ngram1_id, 0) + cooc.weight
weight[cooc.ngramy_id] = weight.get(cooc.ngramy_id, 0) + cooc.score weight[cooc.ngram2_id] = weight.get(cooc.ngram2_id, 0) + cooc.weight
x = pd.DataFrame(matrix).fillna(0) x = pd.DataFrame(matrix).fillna(0)
......
# Gargantext lib
from gargantext.util.db import session
from gargantext.util.http import JsonHttpResponse
from gargantext.models import Node, NodeNgram, NodeNgramNgram
#from gargantext.util.toolchain.ngram_coocs import compute_coocs
from graphExplorer.distance import do_distance
from graphExplorer.cooccurrences import do_cooc
# Prelude lib # Prelude lib
from copy import copy, deepcopy from copy import copy, deepcopy
from collections import defaultdict from collections import defaultdict
from sqlalchemy.orm import aliased from sqlalchemy.orm import aliased
# Math/Graph lib # Math/Graph lib
import math import math
import pandas as pd import pandas as pd
import numpy as np import numpy as np
import networkx as nx
from math import log
from networkx.readwrite import json_graph
# Gargantext lib import networkx as nx
from gargantext.util.http import JsonHttpResponse from networkx.readwrite import json_graph
from gargantext.util.toolchain.ngram_coocs import compute_coocs
from graphExplorer.distance import do_distance
def get_cooc( request=None, corpus=None def get_cooc( request=None, corpus=None
, field1='ngrams', field2='ngrams' , field1='ngrams', field2='ngrams'
, cooc_id=None , type='node_link' , cooc_id=None , type='node_link'
, start=None , end=None , start=None , end=None
, hapax=1 , threshold=1
, distance='conditional' , distance='conditional'
, size=1000 , size=1000
, bridgeness=5 , bridgeness=5
, mainList_id = None , stopList_id = None
): ):
''' '''
get_ccoc : to compute the graph. get_ccoc : to compute the graph.
''' '''
# implicit global session
data = {} data = {}
#if session.query(Node).filter(Node.type_id==type_cooc_id, Node.parent_id==corpus_id).first() is None: #if session.query(Node).filter(Node.type_id==type_cooc_id, Node.parent_id==corpus_id).first() is None:
print("Cooccurrences do not exist yet, creating it.") print("Cooccurrences do not exist yet, creating it.")
miam_id = 1
stop_id = 2 if stopList_id == None :
group_id = 3 stopList_id = (session.query(Node.id).filter(Node.typename == "STOPLIST",
Node.parent_id == corpus.id).first())
if stopList_id == None :
raise ValueError("STOPLIST node needed for mainlist creation")
if mainList_id == None :
stopList_id = (session.query(Node.id).filter(
Node.typename == "STOPLIST",
Node.parent_id == corpus.id
).first())
if not mainList_id == None :
raise ValueError("STOPLIST node needed for mainlist creation")
# compute_cooc needs group, fields etc.
# group_id = 3
SamuelFlag = False SamuelFlag = False
# if field1 == field2 == 'ngrams' : # if field1 == field2 == 'ngrams' :
...@@ -49,9 +68,17 @@ def get_cooc( request=None, corpus=None ...@@ -49,9 +68,17 @@ def get_cooc( request=None, corpus=None
# data deleted each time # data deleted each time
#cooc_id = get_or_create_node(nodetype='Cooccurrence', corpus=corpus).id #cooc_id = get_or_create_node(nodetype='Cooccurrence', corpus=corpus).id
cooc_id = compute_cooc(corpus, field1="ngrams", field2="ngrams" if corpus is None:
, miam_id=miam_id, group_id=group_id, stop_id=stop_id, limit=size corpus = session.query(Node).filter(Node.id==corpus_id).first()
, isMonopartite=True, start=start , end=end , hapax=hapax)
cooc_id = do_cooc( corpus=corpus
#, field1="ngrams", field2="ngrams"
, mainList_id=mainList_id, stopList_id=stopList_id
#, group_id=group_id
#, isMonopartite=True
, start=start , end =end
, threshold = threshold #, limit=size
)
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)
...@@ -95,21 +122,19 @@ def get_cooc( request=None, corpus=None ...@@ -95,21 +122,19 @@ def get_cooc( request=None, corpus=None
weight = G[ids[s][1]][ids[t][1]]["weight"] weight = G[ids[s][1]][ids[t][1]]["weight"]
if bridgeness < 0: if bridgeness < 0:
info = { info = { "s": ids[s][1]
"s": ids[s][1] , , "t": ids[t][1]
"t": ids[t][1] , , "w": weight
"w": weight }
}
links.append(info) links.append(info)
else: else:
if partition[s] == partition[t]: if partition[s] == partition[t]:
info = { info = { "s": ids[s][1]
"s": ids[s][1] , , "t": ids[t][1]
"t": ids[t][1] , , "w": weight
"w": weight }
}
links.append(info) links.append(info)
if bridgeness > 0: if bridgeness > 0:
......
...@@ -2,13 +2,15 @@ from gargantext.util.http import APIView, APIException, JsonHttpResponse ...@@ -2,13 +2,15 @@ from gargantext.util.http import APIView, APIException, JsonHttpResponse
#from rest_framework.authentication import SessionAuthentication, BasicAuthentication #from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from gargantext.util.db import session from gargantext.util.db import session
from gargantext.models.nodes import Node
from graphExplorer.functions import get_cooc from graphExplorer.functions import get_cooc
# TODO check authentication
class Graph(APIView): class Graph(APIView):
#authentication_classes = (SessionAuthentication, BasicAuthentication) #authentication_classes = (SessionAuthentication, BasicAuthentication)
def get(self, request, corpus_id): def get(self, request, project_id, corpus_id):
''' '''
Graph.get :: Get graph data as REST api. Graph.get :: Get graph data as REST api.
Get all the parameters first Get all the parameters first
...@@ -39,18 +41,18 @@ class Graph(APIView): ...@@ -39,18 +41,18 @@ class Graph(APIView):
if field1 in accepted_field1 : if field1 in accepted_field1 :
if field2 in accepted_field2 : if field2 in accepted_field2 :
if start is not None and end is not None : if start is not None and end is not None :
data = compute_cooc( corpus data = get_cooc( corpus=corpus
#, field1=field1 , field2=field2 #, field1=field1 , field2=field2
, start=start , end=end , start=start , end=end
, threshold=threshold , threshold =threshold , distance=distance
, distance=distance
) )
else: else:
data = compute_cooc( corpus data = get_cooc( corpus = corpus
#, field1=field1, field2=field2 #, field1=field1, field2=field2
, threshold = threshold , threshold = threshold
, distance = distance , distance = distance
, bridgeness = bridgeness) , bridgeness = bridgeness
)
if format_ == 'json': if format_ == 'json':
return JsonHttpResponse(data) return JsonHttpResponse(data)
else: else:
......
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