source: modelado_topicos/topic_explorer/views.py @ d81e301

v1.0
Last change on this file since d81e301 was 0adbe8b, checked in by rudmanmrrod <rudman22@…>, 7 años ago

Agregado pre-procesamiento vía web

  • Propiedad mode establecida a 100755
File size: 13.3 KB
Línea 
1# -*- coding: utf-8 -*-
2"""
3Sistema de Modelado de Tópicos
4
5Copyleft (@) 2014 CENDITEL nodo Mérida - https://planificacion.cenditel.gob.ve/trac/
6"""
7## @package django_topic_explorer.topic_explorer
8#
9# Métodos de la Vista, para visualizar los tópicos
10# @author Jorge Redondo (jredondo at cenditel.gob.ve)
11# @author <a href='http://www.cenditel.gob.ve'>Centro Nacional de Desarrollo e Investigación en Tecnologías Libres
12# (CENDITEL) nodo Mérida - Venezuela</a>
13# @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
14# @version 1.3
15
16from django.shortcuts import render
17
18from django.conf import settings
19
20from django.http import HttpResponse, HttpResponseServerError
21
22import json
23
24from utils.ldac2vsm import *
25from utils.json_data import *
26#from vsm.corpus import Corpus
27#from vsm.model.ldacgsmulti import LdaCgsMulti as LCM
28from vsm.viewer.ldagibbsviewer import LDAGibbsViewer as LDAViewer
29from vsm.viewer.wrappers import doc_label_name
30
31from django.views.generic import TemplateView
32from django.core.urlresolvers import reverse
33
34from StringIO import StringIO
35import csv
36
37from django_topic_explorer.settings import FILES_PATH
38from django_topic_explorer.settings import LDA_DATA_PATH
39from django_topic_explorer.settings import LDA_CORPUS_FILE
40from django_topic_explorer.settings import LDA_VOCAB_FILE
41from django_topic_explorer.settings import LDA_CORPUS_DIR
42
43
44#path = settings.PATH
45#corpus_file = settings.CORPUS_FILE
46#context_type = settings.CONTEXT_TYPE
47context_type = 'propesta'
48#model_pattern = settings.MODEL_PATTERN
49topics = settings.TOPICS
50#corpus_name = settings.CORPUS_NAME
51
52corpus_link = settings.CORPUS_LINK
53topics_range = [int(item) for item in settings.TOPICS.split(',')]
54doc_title_format = settings.DOC_TITTLE_FORMAT
55doc_url_format = settings.DOC_URL_FORMAT
56
57global k_param
58k_param = None
59global lda_c,lda_m, lda_v
60
61# Integración LDA-c topic_explorer
62lda_c,lda_m = corpus_model(50,LDA_DATA_PATH.format(50),
63                           LDA_CORPUS_FILE,
64                           LDA_VOCAB_FILE,
65                           LDA_CORPUS_DIR)
66#lda_c = Corpus.load(corpus_file)
67#lda_c.save('/home/jredondo/tmp/corpus.npz')
68lda_v = LDAViewer(lda_c, lda_m)
69
70#lda_m = LCM.load(model_pattern.format(k))
71label = lambda x: x
72
73def dump_exception():
74    """!
75    Función para captar los errores e imprimirlos
76
77    @author Jorge Redondo (jredondo at cenditel.gob.ve)
78    @copyright GNU/GPLv2
79    @param request <b>{object}</b> Objeto que mantiene la peticion
80    @return Retorna una respuesta http con el error
81    """ 
82    import sys,traceback
83    exc_type, exc_value, exc_traceback = sys.exc_info()
84    print "*** print_tb:"
85    traceback.print_tb(exc_traceback, limit=1, file=sys.stdout)
86    print "*** print_exception:"
87    traceback.print_exception(exc_type, exc_value, exc_traceback, limit=2, file=sys.stdout)
88    return HttpResponseServerError(str(exc_value))
89
90
91def doc_topic_csv(request, doc_id):
92    """!
93    Función para retornar un documento en csv
94
95    @author Jorge Redondo (jredondo at cenditel.gob.ve)
96    @copyright GNU/GPLv2
97    @param request <b>{object}</b> Objeto que mantiene la peticion
98    @param doc_id <b>{string}</b> Recibe el número del documento
99    @return Retorna los datos del documento
100    """
101    global lda_v
102    try:
103        data = lda_v.doc_topics(doc_id)
104
105        output=StringIO()
106        writer = csv.writer(output)
107        writer.writerow(['topic','prob'])
108        writer.writerows([(t, "%6f" % p) for t,p in data])
109
110        return HttpResponse(output.getvalue())
111    except:
112        return dump_exception()
113
114def doc_csv(request, k,doc_id,threshold=0.2):
115    """!
116    Función para retornar la data de los tópicos en csv
117
118    @author Jorge Redondo (jredondo at cenditel.gob.ve)
119    @copyright GNU/GPLv2
120    @param request <b>{object}</b> Objeto que mantiene la peticion
121    @param k <b>{int}</b> Recibe el número de tópicos a mostrar
122    @param doc_id <b>{string}</b> Recibe el número de tópicos
123    @param threshold <b>{int}</b> Recibe el limite estadístico
124    @return Retorna el render de la vista
125    """
126    global k_param, lda_c, lda_m, lda_v
127    try:
128        if k != k_param:
129            k_param = k
130            lda_c,lda_m = corpus_model(k_param,LDA_DATA_PATH.format(k_param),
131                               LDA_CORPUS_FILE,
132                               LDA_VOCAB_FILE,
133                               LDA_CORPUS_DIR)
134            lda_v = LDAViewer(lda_c, lda_m)
135        data = lda_v.sim_doc_doc(doc_id)
136
137        output=StringIO()
138        writer = csv.writer(output)
139        writer.writerow(['doc','prob'])
140        writer.writerows([(d, "%6f" % p) for d,p in data if p > threshold])
141
142        return HttpResponse(output.getvalue())
143    except:
144        return dump_exception()
145
146def topic_json(request,k,topic_no, N=40):
147    """!
148    Función para retornar la data de los tópicos en json
149
150    @author Jorge Redondo (jredondo at cenditel.gob.ve)
151    @copyright GNU/GPLv2
152    @param request <b>{object}</b> Objeto que mantiene la peticion
153    @param k <b>{int}</b> Recibe el número de tópicos a mostrar
154    @param topic_no <b>{string}</b> Recibe el número de tópicos
155    @param N <b>{int}</b> Recibe la cantidad
156    @return Retorna el render de la vista
157    """
158    global k_param, lda_c, lda_m, lda_v
159    try:
160        if k != k_param:
161            k_param = k
162            lda_c,lda_m = corpus_model(k_param,LDA_DATA_PATH.format(k_param),
163                               LDA_CORPUS_FILE,
164                               LDA_VOCAB_FILE,
165                               LDA_CORPUS_DIR)
166            lda_v = LDAViewer(lda_c, lda_m)
167        try:
168            N = int(request.query.n)
169        except:
170            pass
171
172        if N > 0:
173            data = lda_v.dist_top_doc([int(topic_no)])[:N]
174        else:
175            data = lda_v.dist_top_doc([int(topic_no)])[N:]
176            data = reversed(data)
177
178        docs = [doc for doc,prob in data]
179        doc_topics_mat = lda_v.doc_topics(docs)
180
181        js = []
182        for doc_prob, topics in zip(data, doc_topics_mat):
183            doc, prob = doc_prob
184            js.append({'doc' : doc, 'label': label(doc), 'prob' : 1-prob,
185                'topics' : dict([(str(t), p) for t,p in topics])})
186        return HttpResponse(json.dumps(js))
187    except:
188        return dump_exception()
189
190def doc_topics(request,doc_id, N=40):
191    """!
192    Función para retornar la data de los documentos en json
193
194    @author Jorge Redondo (jredondo at cenditel.gob.ve)
195    @copyright GNU/GPLv2
196    @param request <b>{object}</b> Objeto que mantiene la peticion
197    @param doc_id <b>{string}</b> Recibe el número del documento
198    @param N <b>{int}</b> Recibe la cantidad
199    @return Retorna el render de la vista
200    """
201    global lda_v
202    try:
203        if lda_v == None:
204            lda_c,lda_m = corpus_model(k_param,LDA_DATA_PATH.format(k_param),
205                               LDA_CORPUS_FILE,
206                               LDA_VOCAB_FILE,
207                               LDA_CORPUS_DIR)
208            lda_v = LDAViewer(lda_c, lda_m)
209        try:
210            N = int(request.query.n)
211        except:
212            pass
213        js = doc_json(lda_v,doc_id,N)
214        return HttpResponse(json.dumps(js))
215    except:
216        return dump_exception()
217   
218   
219def topics(request):
220    """!
221    Función para servir los tópicos como un json
222
223    @author Jorge Redondo (jredondo at cenditel.gob.ve)
224    @copyright GNU/GPLv2
225    @param request <b>{object}</b> Objeto que mantiene la peticion
226    @return Retorna el objeto json
227    """ 
228    global lda_v
229    try:
230        js=populateJson(lda_v)
231        return HttpResponse(json.dumps(js))
232    except:
233        return dump_exception()
234   
235
236def docs(request):
237    """!
238    Función para servir los documentos como un json
239
240    @author Jorge Redondo (jredondo at cenditel.gob.ve)
241    @copyright GNU/GPLv2
242    @param request <b>{object}</b> Objeto que mantiene la peticion
243    @return Retorna el objeto json
244    """
245    global lda_v
246    try:
247        docs = lda_v.corpus.view_metadata(context_type)[doc_label_name(context_type)]
248        js = list()
249        for doc in docs:
250            js.append({
251                'id': doc,
252                'label' : label(doc)
253            })
254        return HttpResponse(json.dumps(js))
255    except:
256        return dump_exception()
257     
258
259def index(request):
260    """!
261    Función para visualizar el index del proyecto
262
263    @author Jorge Redondo (jredondo at cenditel.gob.ve)
264    @copyright GNU/GPLv2
265    @param request <b>{object}</b> Objeto que mantiene la peticion
266    @return Retorna el render de la vista
267    """
268    try:
269        template_name = 'topic_explorer/index.html'
270        return render(request,template_name,
271            {'filename':None,
272             'corpus_link' : corpus_link,
273             'context_type' : context_type,
274             'topics_range' : topics_range,
275             'doc_title_format' : doc_title_format,
276             'doc_url_format' : doc_url_format})
277    except:
278        return dump_exception()
279
280def visualize(request,k,filename=None,topic_no=None):
281    """!
282    Función para visualizar los tópicos
283
284    @author Jorge Redondo (jredondo at cenditel.gob.ve)
285    @copyright GNU/GPLv2
286    @param request <b>{object}</b> Objeto que mantiene la peticion
287    @param k <b>{int}</b> Recibe el número de tópicos a mostrar
288    @param filename <b>{string}</b> Recibe el nombre del  archivo
289    @param topic_no <b>{int}</b> Recibe el número de tópico
290    @return Retorna el render de la vista
291    """
292    global k_param,lda_c,lda_m,lda_v
293    try:
294        if k != k_param:
295            k_param = k
296            lda_c,lda_m = corpus_model(k_param,LDA_DATA_PATH.format(k_param),
297                               LDA_CORPUS_FILE,
298                               LDA_VOCAB_FILE,
299                               LDA_CORPUS_DIR)
300            lda_v = LDAViewer(lda_c, lda_m)
301        template_name = 'topic_explorer/index.html'
302        return render(request,template_name,
303            {'filename':filename,
304             'k_param':k_param,
305             'topic_no':topic_no,
306             'corpus_link' : corpus_link,
307             'context_type' : context_type,
308             'topics_range' : topics_range,
309             'doc_title_format' : doc_title_format,
310             'doc_url_format' : doc_url_format})
311    except:
312        return dump_exception()
313
314class IrTopic(TemplateView):
315    """!
316    Clase que permite la visualización de un archivo en particular
317    @author Rodrigo Boet (rboet at cenditel.gob.ve)
318    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
319    @date 31-07-2015
320    """
321   
322    template_name='topic_explorer/verTopico.html'
323   
324   
325    def get(self, request, propuesta = None):
326        """!
327        Metodo que permite procesar las peticiones por get, con el fin de mostrar el documento
328   
329        @author Rodrigo Boet (rboet at cenditel.gob.ve)
330        @copyright GNU/GPLv2
331        @date 31-07-2015
332        @param self <b>{object}</b> Objeto que instancia el método
333        @param request <b>{object}</b> Objeto que mantiene la peticion
334        @param propuesta <b>{int}</b> Recibe el número de la propuesta
335        @return Retorna el render de la vista
336        """
337        global lda_v
338        #Obtnener json
339        Topic_Json = populateJson(lda_v)
340        Topic_Json = json.dumps(Topic_Json)
341        topicos = json.loads(Topic_Json)
342        N = len(topicos)
343        Docs = doc_json(lda_v,propuesta,N)
344        Docs = json.dumps(Docs)
345        documentos = self.obtenerDocumento(json.loads(Docs),propuesta)
346        documentos = json.dumps(documentos)
347        mi_color = []
348        mi_color = self.obtenerValores(topicos)
349        mi_color = json.dumps(mi_color)
350        topicos = json.dumps(topicos)
351        #carga el pre-procesado del archivo en una variable
352        texto=''
353        direccion = FILES_PATH + '/'+ propuesta
354        try:
355            archivo = open(direccion,'r')
356            texto=archivo.read()
357            archivo.close()
358        except:
359            return dump_exception()
360            texto='No se encontro el documento'
361        return render(request,self.template_name,
362                      {'topicos':topicos,
363                       'propuesta':propuesta,
364                       'color':mi_color,
365                       'texto':texto,
366                       'documento':documentos})
367   
368    def obtenerValores(self,topicos):#funcion para obtener los colores del json
369        """!
370        Metodo para obtener los colores del json
371   
372        @author Rodrigo Boet (rboet at cenditel.gob.ve)
373        @copyright GNU/GPLv2
374        @date 31-07-2015
375        @param self <b>{object}</b> Objeto que instancia el método
376        @param topicos <b>{dict}</b> Recibe un diccionario con los topicos
377        @return Retorna un diccionario con los colores
378        """
379        my_topic=[]
380        for x in topicos:
381            my_topic.append(topicos[x]['color'])
382        return my_topic
383   
384    def obtenerDocumento(self,docs,propuesta):
385        """!
386        Metodo para obtener un documento
387   
388        @author Rodrigo Boet (rboet at cenditel.gob.ve)
389        @copyright GNU/GPLv2
390        @date 03-02-2016
391        @param self <b>{object}</b> Objeto que instancia el método
392        @param docs <b>{dict}</b> Recibe un diccionario con los documentos
393        @param propuesta <b>{int}</b> Recibe el número de la propuesta
394        @return Retorna un diccionario con los colores
395        """
396        for x in docs:
397            if(x['doc']==propuesta):
398                return x
Nota: Vea TracBrowser para ayuda de uso del navegador del repositorio.