# -*- coding: utf-8 -*- """ Sistema de Consulta Pública Copyleft (@) 2017 CENDITEL nodo Mérida - https://planificacion.cenditel.gob.ve/trac/wiki/ModeladoTopicos_2017 """ ## @package visualization.views # # Vistas correspondientes a la aplicación procesamiento # @author Rodrigo Boet (rboet at cenditel.gob.ve) # @author Centro Nacional de Desarrollo e Investigación en Tecnologías Libres # (CENDITEL) nodo Mérida - Venezuela # @copyright GNU Public License versión 2 (GPLv2) # @version 1.0 import json from django.shortcuts import render from django.http import JsonResponse from django.views.generic import TemplateView from base.functions import dump_exception from consulta_publica.settings import PROCESAMIENTO_PATH, BASE_DIR from procesamiento.models import Procesamiento from utils.ldac2vsm import * from utils.json_data import * from vsm.viewer.ldagibbsviewer import LDAGibbsViewer as LDAViewer def topic_json(request,id,k,topic_no, N=40): """! Función para retornar la data de los tópicos en json @author Jorge Redondo (jredondo at cenditel.gob.ve) @copyright GNU/GPLv2 @param request {object} Objeto que mantiene la peticion @param k {int} Recibe el número de tópicos a mostrar @param topic_no {string} Recibe el número de tópicos @param N {int} Recibe la cantidad @return Retorna el render de la vista """ k_param, lda_c, lda_m, lda_v = '','','','' try: if k != k_param: k_param = k lda_v = generate_topic(id,k_param,lda_c,lda_m,lda_v) try: N = int(request.query.n) except: pass if N > 0: data = lda_v.dist_top_doc([int(topic_no)])[:N] else: data = lda_v.dist_top_doc([int(topic_no)])[N:] data = reversed(data) docs = [doc for doc,prob in data] doc_topics_mat = lda_v.doc_topics(docs) js = [] for doc_prob, topics in zip(data, doc_topics_mat): doc, prob = doc_prob js.append({'doc' : doc, 'label': label(doc), 'prob' : 1-prob, 'topics' : dict([(str(t), p) for t,p in topics])}) return JsonResponse(js,safe=False) except: return dump_exception() def visualize(request,id,k,filename=None,topic_no=None): """! Función para visualizar los tópicos @author Jorge Redondo (jredondo at cenditel.gob.ve) @copyright GNU/GPLv2 @param request {object} Objeto que mantiene la peticion @param k {int} Recibe el número de tópicos a mostrar @param filename {string} Recibe el nombre del archivo @param topic_no {int} Recibe el número de tópico @return Retorna el render de la vista """ k_param, lda_c, lda_m, lda_v = '','','','' try: if k != k_param: k_param = k lda_v = generate_topic(id,k_param,lda_c,lda_m,lda_v) template_name = 'visualization.index.html' return render(request,template_name, {'k_param':k_param, 'topic_no':topic_no, 'filename':filename, 'id' : id, 'topics_range' : [10,20,30,40,50,60,70,80,90], }) except: return dump_exception() def topics(request,id,k): """! Función para servir los tópicos como un json @author Jorge Redondo (jredondo at cenditel.gob.ve) @copyright GNU/GPLv2 @param request {object} Objeto que mantiene la peticion @param id {int} Id del procesamiento @param k {int} Número de tópicos @return Retorna el objeto json """ lda_c,lda_m,lda_v = '','','' lda_v = generate_topic(id,k,lda_c,lda_m,lda_v) try: js=populateJson(lda_v) return JsonResponse(js,safe= False) except: return dump_exception() def doc_topics(request,id,k,doc_id, N=40): """! Función para retornar la data de los documentos en json @author Jorge Redondo (jredondo at cenditel.gob.ve) @copyright GNU/GPLv2 @param request {object} Objeto que mantiene la peticion @param id {int} Id del procesamiento @param doc_id {string} Recibe el número del documento @param N {int} Recibe la cantidad @return Retorna el render de la vista """ lda_c,lda_m,lda_v = '','','' try: lda_v = generate_topic(id,k,lda_c,lda_m,lda_v) try: N = int(request.query.n) except: pass js = doc_json(lda_v,doc_id,N) return JsonResponse(js,safe=False) except: return dump_exception() def generate_topic(id,k_param,lda_c,lda_m,lda_v): """! Función para generar los tópicos @author Rodrigo Boet (rboet at cenditel.gob.ve) @copyright GNU/GPLv2 @date 13-03-2017 @param id {int} Contiene el id del procesamiento @param k_param {int} Contiene la cantidad de tópicos @param lda_c {object} Objeto que perteneciente al lda @param lda_m {object} Objeto que perteneciente al lda @param lda_v {object} Objeto que perteneciente al lda """ procesamiento = Procesamiento.objects.get(pk=id) dir_consulta = "_".join(procesamiento.consulta.nombre_consulta.split(" ")) LDA_DATA_PATH = PROCESAMIENTO_PATH + '/' + dir_consulta+'/lda/'+dir_consulta+'{0}/' LDA_CORPUS_FILE = PROCESAMIENTO_PATH + '/' + dir_consulta+'/lda/corpus.dat' LDA_VOCAB_FILE = PROCESAMIENTO_PATH + '/' + dir_consulta+'/lda/vocab.txt' LDA_CORPUS_DIR = PROCESAMIENTO_PATH + '/' + dir_consulta+'/pp/' lda_c,lda_m = corpus_model(k_param,LDA_DATA_PATH.format(k_param), LDA_CORPUS_FILE, LDA_VOCAB_FILE, LDA_CORPUS_DIR) lda_v = LDAViewer(lda_c, lda_m) return lda_v class VerDocumento(TemplateView): """! Clase que permite la visualización de un archivo en particular @author Rodrigo Boet (rboet at cenditel.gob.ve) @copyright GNU Public License versión 2 (GPLv2) @date 30-03-2017 """ template_name='visualization.docs.html' def get(self, request, id, k, propuesta = None): """! Metodo que permite procesar las peticiones por get, con el fin de mostrar el documento @author Rodrigo Boet (rboet at cenditel.gob.ve) @copyright GNU/GPLv2 @date 31-07-2015 @param self {object} Objeto que instancia el método @param request {object} Objeto que mantiene la peticion @param propuesta {int} Recibe el número de la propuesta @return Retorna el render de la vista """ lda_c,lda_m,lda_v = '','','' lda_v = generate_topic(id,k,lda_c,lda_m,lda_v) #Obtnener json Topic_Json = populateJson(lda_v) Topic_Json = json.dumps(Topic_Json) topicos = json.loads(Topic_Json) N = len(topicos) Docs = doc_json(lda_v,propuesta,N) Docs = json.dumps(Docs) documentos = self.obtenerDocumento(json.loads(Docs),propuesta) documentos = json.dumps(documentos) mi_color = [] mi_color = self.obtenerValores(topicos) mi_color = json.dumps(mi_color) topicos = json.dumps(topicos) ## Se carga el perfil procesamiento = Procesamiento.objects.get(pk=id) dir_consulta = "_".join(procesamiento.consulta.nombre_consulta.split(" ")) files = PROCESAMIENTO_PATH + '/' + dir_consulta+'/noaccent/' #carga el pre-procesado del archivo en una variable texto='' direccion = files + '/'+ propuesta try: archivo = open(direccion,'r') texto=archivo.read() archivo.close() except: return dump_exception() texto='No se encontro el documento' return render(request,self.template_name, {'topicos':topicos, 'propuesta':propuesta, 'color':mi_color, 'texto':texto, 'documento':documentos}) def obtenerValores(self,topicos): """! Metodo para obtener los colores del json @author Rodrigo Boet (rboet at cenditel.gob.ve) @copyright GNU/GPLv2 @date 31-07-2015 @param self {object} Objeto que instancia el método @param topicos {dict} Recibe un diccionario con los topicos @return Retorna un diccionario con los colores """ my_topic=[] for x in topicos: my_topic.append(topicos[x]['color']) return my_topic def obtenerDocumento(self,docs,propuesta): """! Metodo para obtener un documento @author Rodrigo Boet (rboet at cenditel.gob.ve) @copyright GNU/GPLv2 @date 03-02-2016 @param self {object} Objeto que instancia el método @param docs {dict} Recibe un diccionario con los documentos @param propuesta {int} Recibe el número de la propuesta @return Retorna un diccionario con los colores """ for x in docs: if(x['doc']==propuesta): return x class ListTopics(TemplateView): """! Clase que permite la visualización de un archivo en particular @author Rodrigo Boet (rboet at cenditel.gob.ve) @copyright GNU Public License versión 2 (GPLv2) @date 30-03-2017 """ template_name='visualization.topics.list.html' def get_context_data(self,**kwargs): """! Metodo que permite cargar de nuevo valores en los datos de contexto de la vista @author Rodrigo Boet (rboet at cenditel.gob.ve) @copyright GNU/GPLv2 @date 30-03-2017 @param self {object} Objeto que instancia la clase @param kwargs {object} Objeto que contiene los datos de contexto @return Retorna los datos de contexto """ kwargs['topics_range'] = [10,20,30,40,50,60,70,80,90] kwargs['id'] = self.kwargs['id'] return super(ListTopics, self).get_context_data(**kwargs) def generate_topics(request,id,k): """! Metodo que genera una lista de los tópicos dado un párametro k @author Rodrigo Boet (rboet at cenditel.gob.ve) @copyright GNU/GPLv2 @date 30-03-2017 @param request {object} Recibe la peticion @param id {int} Id del procesamiento @param k {int} Número de tópicos @return Retorna el json con las subunidades que consiguió """ lda_c,lda_m,lda_v = '','','' if(int(k) in [10,20,30,40,50,60,70,80,90]): lda_v = generate_topic(id,k,lda_c,lda_m,lda_v) js = populateJson(lda_v) return JsonResponse(js,safe=False) return JsonResponse("El párametro k es inválido",safe=False)