Commit 99efd658 authored by delanoe's avatar delanoe

[FEAT] A graph happens.

parent e8232f37
......@@ -38,7 +38,9 @@ urlpatterns = [
url(r'^projects/(\d+)/corpora/(\d+)/documents/(\d+)/$', annotations_main_view),
# 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))
]
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 operator import itemgetter
from django.db import connection, transaction
from math import log,sqrt
#from operator import itemgetter
import math
from math import log,sqrt
import numpy as np
import pandas as pd
from copy import copy
import numpy as np
import pandas as pd
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'):
'''
......@@ -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()
for cooc in query:
matrix[cooc.ngramx_id][cooc.ngramy_id] = cooc.score
matrix[cooc.ngramy_id][cooc.ngramx_id] = cooc.score
matrix[cooc.ngram1_id][cooc.ngram2_id] = cooc.weight
matrix[cooc.ngram2_id][cooc.ngram1_id] = cooc.weight
ids[cooc.ngramx_id] = (field1, cooc.ngramx_id)
ids[cooc.ngramy_id] = (field2, cooc.ngramy_id)
ids[cooc.ngram1_id] = (field1, cooc.ngram1_id)
ids[cooc.ngram2_id] = (field2, cooc.ngram2_id)
weight[cooc.ngramx_id] = weight.get(cooc.ngramx_id, 0) + cooc.score
weight[cooc.ngramy_id] = weight.get(cooc.ngramy_id, 0) + cooc.score
weight[cooc.ngram1_id] = weight.get(cooc.ngram1_id, 0) + cooc.weight
weight[cooc.ngram2_id] = weight.get(cooc.ngram2_id, 0) + cooc.weight
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
from copy import copy, deepcopy
from collections import defaultdict
from sqlalchemy.orm import aliased
from copy import copy, deepcopy
from collections import defaultdict
from sqlalchemy.orm import aliased
# Math/Graph lib
import math
import pandas as pd
import numpy as np
import networkx as nx
from math import log
from networkx.readwrite import json_graph
# Gargantext lib
from gargantext.util.http import JsonHttpResponse
from gargantext.util.toolchain.ngram_coocs import compute_coocs
from graphExplorer.distance import do_distance
import networkx as nx
from networkx.readwrite import json_graph
def get_cooc( request=None, corpus=None
, field1='ngrams', field2='ngrams'
, cooc_id=None , type='node_link'
, start=None , end=None
, hapax=1
, threshold=1
, distance='conditional'
, size=1000
, bridgeness=5
, mainList_id = None , stopList_id = None
):
'''
get_ccoc : to compute the graph.
'''
# implicit global session
data = {}
#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.")
miam_id = 1
stop_id = 2
group_id = 3
if stopList_id == None :
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
# if field1 == field2 == 'ngrams' :
......@@ -49,9 +68,17 @@ def get_cooc( request=None, corpus=None
# data deleted each time
#cooc_id = get_or_create_node(nodetype='Cooccurrence', corpus=corpus).id
cooc_id = compute_cooc(corpus, field1="ngrams", field2="ngrams"
, miam_id=miam_id, group_id=group_id, stop_id=stop_id, limit=size
, isMonopartite=True, start=start , end=end , hapax=hapax)
if corpus is None:
corpus = session.query(Node).filter(Node.id==corpus_id).first()
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"
, isMonopartite=True, distance=distance)
......@@ -95,21 +122,19 @@ def get_cooc( request=None, corpus=None
weight = G[ids[s][1]][ids[t][1]]["weight"]
if bridgeness < 0:
info = {
"s": ids[s][1] ,
"t": ids[t][1] ,
"w": weight
}
info = { "s": ids[s][1]
, "t": ids[t][1]
, "w": weight
}
links.append(info)
else:
if partition[s] == partition[t]:
info = {
"s": ids[s][1] ,
"t": ids[t][1] ,
"w": weight
}
info = { "s": ids[s][1]
, "t": ids[t][1]
, "w": weight
}
links.append(info)
if bridgeness > 0:
......
......@@ -2,13 +2,15 @@ from gargantext.util.http import APIView, APIException, JsonHttpResponse
#from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from gargantext.util.db import session
from gargantext.models.nodes import Node
from graphExplorer.functions import get_cooc
# TODO check authentication
class Graph(APIView):
#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.
Get all the parameters first
......@@ -39,18 +41,18 @@ class Graph(APIView):
if field1 in accepted_field1 :
if field2 in accepted_field2 :
if start is not None and end is not None :
data = compute_cooc( corpus
data = get_cooc( corpus=corpus
#, field1=field1 , field2=field2
, start=start , end=end
, threshold=threshold
, distance=distance
, start=start , end=end
, threshold =threshold , distance=distance
)
else:
data = compute_cooc( corpus
data = get_cooc( corpus = corpus
#, field1=field1, field2=field2
, threshold = threshold
, distance = distance
, bridgeness = bridgeness)
, bridgeness = bridgeness
)
if format_ == 'json':
return JsonHttpResponse(data)
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