source: modelado_topicos/topic_explorer/views.py @ 1a2167d

preprocesamientov1.0
Last change on this file since 1a2167d was 1a2167d, checked in by Jorge Redondo Flames <jredondo@…>, 8 años ago

Primera versión funcional de integración con lda-c

  • Propiedad mode establecida a 100755
File size: 7.3 KB
Línea 
1# coding: utf-8
2
3from django.shortcuts import render
4
5from django.conf import settings
6
7from django.http import HttpResponse, HttpResponseRedirect, HttpResponseServerError, StreamingHttpResponse
8
9import json
10
11from utils import colorlib
12from ldac2vsm import *
13import itertools
14from vsm.corpus import Corpus
15from vsm.model.ldacgsmulti import LdaCgsMulti as LCM
16from vsm.viewer.ldagibbsviewer import LDAGibbsViewer as LDAViewer
17from vsm.viewer.wrappers import doc_label_name
18from django.core import serializers
19
20from django.views.generic import TemplateView
21from django.core.urlresolvers import reverse
22
23from StringIO import StringIO
24import csv
25
26from django_topic_explorer.settings import URL_COMUN
27from django.utils.safestring import mark_safe
28from django_topic_explorer.settings import FILES_PATH
29
30#path = settings.PATH
31corpus_file = settings.CORPUS_FILE
32#context_type = settings.CONTEXT_TYPE
33context_type = 'propesta'
34#model_pattern = settings.MODEL_PATTERN
35topics = settings.TOPICS
36#corpus_name = settings.CORPUS_NAME
37icons = settings.ICONS
38
39corpus_link = settings.CORPUS_LINK
40topics_range = [int(item) for item in settings.TOPICS.split(',')]
41doc_title_format = settings.DOC_TITTLE_FORMAT
42doc_url_format = settings.DOC_URL_FORMAT
43
44#global lda_m, lda_v
45
46# Integración LDA-c topic_explorer
47lda_c,lda_m = corpus_model()
48#lda_c = Corpus.load(corpus_file)
49#lda_c.save('/home/jredondo/tmp/corpus.npz')
50lda_v = LDAViewer(lda_c, lda_m)
51
52#lda_m = LCM.load(model_pattern.format(k))
53label = lambda x: x
54
55def dump_exception():
56    import sys,traceback
57    exc_type, exc_value, exc_traceback = sys.exc_info()
58    print "*** print_tb:"
59    traceback.print_tb(exc_traceback, limit=1, file=sys.stdout)
60    print "*** print_exception:"
61    traceback.print_exception(exc_type, exc_value, exc_traceback, limit=2, file=sys.stdout)
62    return HttpResponseServerError(str(exc_value))
63
64
65def doc_topic_csv(request, doc_id):
66    data = lda_v.doc_topics(doc_id)
67
68    output=StringIO()
69    writer = csv.writer(output)
70    writer.writerow(['topic','prob'])
71    writer.writerows([(t, "%6f" % p) for t,p in data])
72
73    return HttpResponse(output.getvalue())
74
75def doc_csv(request, k_param,doc_id,threshold=0.2):
76    #lda_m = LCM.load(model_pattern.format(k_param))
77    #lda_v = LDAViewer(lda_c, lda_m)
78    data = lda_v.sim_doc_doc(doc_id)
79
80    output=StringIO()
81    writer = csv.writer(output)
82    writer.writerow(['doc','prob'])
83    writer.writerows([(d, "%6f" % p) for d,p in data if p > threshold])
84
85    return HttpResponse(output.getvalue())
86
87def topic_json(request,k_param,topic_no, N=40):
88    #global lda_v
89    #lda_m = LCM.load(model_pattern.format(k_param))
90    #lda_v = LDAViewer(lda_c, lda_m)
91    try:
92        N = int(request.query.n)
93    except:
94        pass
95
96    if N > 0:
97        data = lda_v.dist_top_doc([int(topic_no)])[:N]
98    else:
99        data = lda_v.dist_top_doc([int(topic_no)])[N:]
100        data = reversed(data)
101
102    docs = [doc for doc,prob in data]
103    doc_topics_mat = lda_v.doc_topics(docs)
104
105    js = []
106    for doc_prob, topics in zip(data, doc_topics_mat):
107        doc, prob = doc_prob
108        js.append({'doc' : doc, 'label': label(doc), 'prob' : 1-prob,
109            'topics' : dict([(str(t), p) for t,p in topics])})
110    return HttpResponse(json.dumps(js))
111
112def doc_topics(request,doc_id, N=40):
113    try:
114        try:
115            N = int(request.query.n)
116        except:
117            pass
118        if N > 0:
119            data = lda_v.dist_doc_doc(doc_id)[:N]
120        else:
121            data = lda_v.dist_doc_doc(doc_id)[N:]
122            data = reversed(data)
123
124        docs = [doc for doc,prob in data]
125        doc_topics_mat = lda_v.doc_topics(docs)
126
127        js = []
128        for doc_prob, topics in zip(data, doc_topics_mat):
129            doc, prob = doc_prob
130            js.append({'doc' : doc, 'label': label(doc), 'prob' : 1-prob,
131                'topics' : dict([(str(t), p) for t,p in topics])})
132        return HttpResponse(json.dumps(js))
133    except:
134        return dump_exception()
135
136def topics(request):
137    try:
138        js=populateJson()
139        return HttpResponse(json.dumps(js))
140    except:
141        return dump_exception()
142   
143def populateJson():
144    # populate entropy values
145    data = lda_v.topic_oscillations()
146
147    colors = [itertools.cycle(cs) for cs in zip(*colorlib.brew(3,n_cls=4))]
148    factor = len(data) / len(colors)
149
150    js = {}
151    for rank,topic_H in enumerate(data):
152        topic, H = topic_H
153        js[str(topic)] = {
154            "H" : H,
155            "color" : colors[min(rank / factor, len(colors)-1)].next()
156        }
157
158    # populate word values
159    data = lda_v.topics()
160    for i,topic in enumerate(data):
161        js[str(i)].update({'words' : dict([(w.decode('unicode-escape'), p) for w,p in topic[:20]])})
162    return js
163
164
165def docs(request):
166    try:
167        docs = lda_v.corpus.view_metadata(context_type)[doc_label_name(context_type)]
168        js = list()
169        for doc in docs:
170            js.append({
171                'id': doc,
172                'label' : label(doc)
173            })
174
175        return HttpResponse(json.dumps(js))
176    except:
177        return dump_exception()
178
179def index(request):
180    global lda_m,lda_v
181    #lda_m = LCM.load(model_pattern.format(10))
182    #lda_v = LDAViewer(lda_c, lda_m)
183    template_name = 'topic_explorer/index.html'
184    return render(request,template_name,
185        {'filename':None,
186         #'corpus_name' : corpus_name,
187         'corpus_link' : corpus_link,
188         'context_type' : context_type,
189         'topics_range' : topics_range,
190         'doc_title_format' : doc_title_format,
191         'doc_url_format' : doc_url_format})
192
193def visualize(request,k_param,filename=None,topic_no=None):
194    global lda_m,lda_v
195    #lda_m = LCM.load(model_pattern.format(k_param))
196    #lda_v = LDAViewer(lda_c, lda_m)
197    template_name = 'topic_explorer/index.html'
198    return render(request,template_name,
199        {'filename':filename,
200         'k_param':k_param,
201         'topic_no':topic_no,
202         #'corpus_name' : corpus_name,
203         'corpus_link' : corpus_link,
204         'context_type' : context_type,
205         'topics_range' : topics_range,
206         'doc_title_format' : doc_title_format,
207         'doc_url_format' : doc_url_format})
208
209class IrTopic(TemplateView):
210    template_name='topic_explorer/verTopico.html'
211    def post(self, request, *args, **kwargs):
212        propuesta = request.POST['nombre_propuesta']
213        #url = reverse('verTopicos')
214        #Obtnener json
215        Topic_Json = populateJson()
216        Topic_Json = json.dumps(Topic_Json)
217        topicos = json.loads(Topic_Json)
218        mi_color = []
219        mi_color = self.obtenerValores(topicos)
220        mi_color = json.dumps(mi_color)
221        topicos = json.dumps(topicos)
222        #print topicos
223        #carga el pre-procesado del archivo en una variable
224        texto=''
225        direccion = FILES_PATH + '/'+ propuesta
226        try:
227            archivo = open(direccion,'r')
228            texto=archivo.read()
229            archivo.close()
230        except:
231            return dump_exception()
232            texto='No se encontro el documento'
233        return render(request,self.template_name,
234                      {'topicos':topicos,
235                       'propuesta':propuesta,
236                       'color':mi_color,
237                       'texto':texto})
238   
239    def obtenerValores(self,topicos):#funcion para obtener los colores del json
240        my_topic=[]
241        for x in topicos:
242            my_topic.append(topicos[x]['color'])
243        return my_topic
Nota: Vea TracBrowser para ayuda de uso del navegador del repositorio.