In [76]:
from SPARQLWrapper import SPARQLWrapper, JSON
import time, numpy as n

In [6]:
PREFIX="""PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX ops: <http://purl.org/socialparticipation/ops#>
PREFIX opa: <http://purl.org/socialparticipation/opa#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dc: <http://purl.org/dc/terms/>
PREFIX tsioc: <http://rdfs.org/sioc/types#>
PREFIX schema: <http://schema.org/>
"""

In [10]:
NOW=time.time()
q="SELECT ?comentario ?titulo ?texto WHERE {?comentario dc:type tsioc:Comment. OPTIONAL {?comentario dc:title ?titulo . } OPTIONAL {?comentario schema:text ?texto .}}"
sparql3 = SPARQLWrapper("http://localhost:82/participabr/query")
sparql3.setQuery(PREFIX+q)
sparql3.setReturnFormat(JSON)
results4 = sparql3.query().convert()
print("%.2f segundos para puxar todos os comentários do Participa.br"%(time.time()-NOW,))


2.41 segundos para puxar todos os comentários do Participa.br

In [92]:
# fazendo seleção das mensagens com palavras maiores e limiar mínimo de palavras
msgs=results4["results"]["bindings"]
exclude = set(string.punctuation+u'\u201c'+u'\u2018'+u'\u201d'+u'\u2022'+u'\u2013')
def atributos(__msg):
    texto=__msg["texto"]["value"]
    texto_ = ''.join(ch for ch in texto if ch not in exclude)
    palavras=texto_.split()
    tams=[]
    for palavra in palavras:
        tams.append(len(palavra))
    return len(tams), n.mean(tams), n.std(tams)

In [97]:
atrs=[]
for msg in msgs:
    atrs.append(atributos(msg))

In [98]:
atrs_=n.array(atrs)

In [117]:
max_palavras=115
min_palavras=110
n_msgs=((atrs_[:,0]>min_palavras)*(atrs_[:,0]<max_palavras)).sum()
print(u"são %i mensagens com mais de %i palavras e menos de %i"%
      (n_msgs, min_palavras, max_palavras) )


são 26 mensagens com mais de 110 palavras e menos de 115

In [127]:
import pylab as p
p.hist(atrs_[:,0],100)


Out[127]:
(array([ 1344,   397,  4173,    58, 10223,    17,     8,     9,     3,
           3,     3,     0,     3,     1,     0,     1,     3,     1,
           0,     1,     0,     0,     2,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     1,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     1,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,     1]),
 array([    0. ,    62.3,   124.6,   186.9,   249.2,   311.5,   373.8,
         436.1,   498.4,   560.7,   623. ,   685.3,   747.6,   809.9,
         872.2,   934.5,   996.8,  1059.1,  1121.4,  1183.7,  1246. ,
        1308.3,  1370.6,  1432.9,  1495.2,  1557.5,  1619.8,  1682.1,
        1744.4,  1806.7,  1869. ,  1931.3,  1993.6,  2055.9,  2118.2,
        2180.5,  2242.8,  2305.1,  2367.4,  2429.7,  2492. ,  2554.3,
        2616.6,  2678.9,  2741.2,  2803.5,  2865.8,  2928.1,  2990.4,
        3052.7,  3115. ,  3177.3,  3239.6,  3301.9,  3364.2,  3426.5,
        3488.8,  3551.1,  3613.4,  3675.7,  3738. ,  3800.3,  3862.6,
        3924.9,  3987.2,  4049.5,  4111.8,  4174.1,  4236.4,  4298.7,
        4361. ,  4423.3,  4485.6,  4547.9,  4610.2,  4672.5,  4734.8,
        4797.1,  4859.4,  4921.7,  4984. ,  5046.3,  5108.6,  5170.9,
        5233.2,  5295.5,  5357.8,  5420.1,  5482.4,  5544.7,  5607. ,
        5669.3,  5731.6,  5793.9,  5856.2,  5918.5,  5980.8,  6043.1,
        6105.4,  6167.7,  6230. ]),
 <a list of 100 Patch objects>)

In [122]:
p.show()

In [101]:
atrs[1]


Out[101]:
(256, 5.51171875, 3.6646350665377905)

In [103]:
atrs_[10]


Out[103]:
array([ 133.        ,    6.14285714,    6.6492612 ])

In [105]:
msgs[0]["texto"]["value"]


Out[105]:
u'1.1 \u2013 O Processo Seletivo para a Modalidade Teletrabalho refere-se ao recrutamento de empregados(as) que desenvolver\xe3o suas atividades laborais em seu domic\xedlio, observados os pressupostos da rela\xe7\xe3o de emprego, sem que haja distin\xe7\xe3o do trabalho realizado nas instala\xe7\xf5es da Empresa, na forma da Lei n\xba 12.551/2011.  1.2 \u2013 O recrutamento de empregados(as) para ingresso na Modalidade Teletrabalho ser\xe1 feito a partir da demanda por vagas apresentada pelo(a) titular de cada Superintend\xeancia e, posterior, efetiva\xe7\xe3o da inscri\xe7\xe3o pelo empregado(a) na forma do Anexo 1, deste edital. Comments 1  1.3 - A perman\xeancia daqueles que atualmente s\xe3o participantes da Modalidade Teletrabalho dever\xe1 ser confirmada pelo preenchimento e apresenta\xe7\xe3o do formul\xe1rio constante no Anexo 2, deste Edital, condicionada \xe0 aprova\xe7\xe3o da Chefia Imediata e do(da) Titular da Unidade.  1.4 - Todos os candidatos(as) aprovados(as) ser\xe3o capacitados para atua\xe7\xe3o na Modalidade Teletrabalho.    2 - DO P\xdaBLICO ALVO  2.1 - Empregados(as) efetivos(as) do SERPRO, ocupantes dos cargos de Analista, T\xe9cnico e Auxiliar, lotados no quadro interno da Sede, Regionais e Escrit\xf3rios, na forma do item 4.1, deste Edital.  3.2 - Ficar\xe1 a crit\xe9rio da SUPGP/GPGES o remanejamento das vagas n\xe3o preenchidas nas Regionais, Escrit\xf3rios ou na Sede.  3.3 \u2013 O Processo Seletivo ter\xe1 validade de 2 (dois) anos, a contar da data da publica\xe7\xe3o do resultado final, podendo ser prorrogado por igual per\xedodo, a crit\xe9rio da Empresa.  3.4 - Ap\xf3s o preenchimento das vagas indicadas no quadro constante no item 3.1, deste Edital, os candidatos(as) classificados(as) poder\xe3o, a crit\xe9rio da Empresa, ser convocados(as) para o preenchimento das vagas que vierem a surgir dentro do prazo de validade do Processo Seletivo. '

In [102]:
atrs[2]


Out[102]:
(256, 5.51171875, 3.6646350665377905)

In [67]:
#dados lidos, processando
NOW=time.time()
import string, nltk as k
# histograma com as palavras
palavras=string.join([i["texto"]["value"].lower() for i in results4["results"]["bindings"]])
exclude = set(string.punctuation+u'\u201c'+u'\u2018'+u'\u201d'+u'\u2022'+u'\u2013')
palavras = ''.join(ch for ch in palavras if ch not in exclude)
palavras_=palavras.split()
#fdist=k.FreqDist(palavras_)
print(u"feita lista de todas as palavras de todos os comentários em %.2f"%(time.time()-NOW,))


feita lista de todas as palavras de todos os comentários em 4.69

In [68]:
NOW=time.time()
stopwords = set(k.corpus.stopwords.words('portuguese'))
palavras__=[pp for pp in palavras_ if pp not in stopwords]
fdist_=k.FreqDist(palavras__)
print("retiradas stopwords feita contagem das palavras em %.2f"%(time.time()-NOW,))


retiradas stopwords feita contagem das palavras em 6.41

In [69]:
for fd,ii in [(fdist_[i],i) for i in fdist_.keys()[:20]]: print fd, ii


53192 deste
53114 edital
50035 modalidade
50027 teletrabalho
43887 vagas
36875 processo
34011 forma
33757 2
33675 seletivo
31359 ser
30608 critério
30606 empresa
30599 preenchimento
30597 empregadosas
29677 item
23481 titular
23480 anexo
20486 1
20412 regionais
20407 quadro

In [70]:
fdist_.keys()[:20]


Out[70]:
[u'deste',
 u'edital',
 u'modalidade',
 u'teletrabalho',
 u'vagas',
 u'processo',
 u'forma',
 u'2',
 u'seletivo',
 u'ser',
 u'crit\xe9rio',
 u'empresa',
 u'preenchimento',
 u'empregadosas',
 u'item',
 u'titular',
 u'anexo',
 u'1',
 u'regionais',
 u'quadro']

In [ ]: