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

In [262]:
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 [288]:
# fazendo seleção das mensagens com palavras maiores e limiar mínimo de palavras
msgs_=results4["results"]["bindings"]
#msgs=[mm for mm in msgs_ if ("titulo" not in mm.keys()) or ("teste de stress" not in mm["titulo"]["value"].lower())]
msgs=[mm for mm in msgs_ if ("titulo" not in mm.keys()) or (("teste de stress" not in mm["titulo"]["value"].lower())
      and ("comunidade de desenvolvedores e nesse caso, quanto mais" not in mm["texto"]["value"].lower()))]
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 [289]:
atrs=[]
for msg in msgs:
    atrs.append(atributos(msg))

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

In [291]:
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 [292]:
msgs_i=((atrs_[:,0]>min_palavras)*(atrs_[:,0]<max_palavras)).nonzero()[0]
Escolhendo os textos com média de tamanho de palavra (em caracteres) maior que 6, dentre as mensagens com número de palavras entre 110 e 115.

In [293]:
textos=[[msgs[i]["texto"]["value"] for i in msgs_i][j]
        for j in (atrs_[msgs_i][:,1]>6.).nonzero()[0]]
for texto in textos: print texto+"\n======="


1. Auxiliar na divulgação das informações jurídicas para estrangeiros por meio de projetos de longo prazo dentro no âmbito das próprias universidades (ex. immigration/refugee law clinics), estimulando-se a parceria com as instituições, organizações e programas/projetos relacionados à temática migratória;
2. Inserir na nova política migratória a capacitação/formação específica para agentes públicos (obrigatória) que atuam ou possam vir a atuar em razão de suas atribuições institucionais com migrantes, refugiados e apátridas. Nesse sentido, a experiência e contribuição da academia será fundamental do ponto de vista da expertise científica (ensino e pesquisa - colaboração para o conteúdo programático da capacitação), além de reforçar a importância do ensino do Direito Internacional e Direitos Humanos nas Universidades.

=======
ROSAS, Agostinho da Silva; MELO NETO, José Francisco de. Educação Popular: Enunciados Teóricos. João Pessoa: Editora Universitária da UFPB, 2008. 

Os autores buscam delimitar um campo da educação em que seja possível delinearem-se características que apenas à educação popular façam parte. Trata-se de um esforço de apresentação de constituintes com dimensões formadoras, tendo como aspectos centrais as experiências de vários educadores populares e as reflexões em desenvolvimento na época. Nessa perspectiva, são abordadas a experiência histórica, a cultura, o popular, a realidade, o trabalho, a autonomia, a liberdade e a igualdade como componentes fundantes para a realização de práticas em educação popular, lastreados pela dimensão ética do diálogo. 

Disponível em: 
http://www.prac.ufpb.br/copac/extelar/producao_academica/livros/pa_l_2004_educacao_popular_enunciados_teoricos.pdf
=======
Escolhendo os textos com média de tamanho de palavra (em caracteres) menor que 5, dentre as mensagens com número de palavras entre 110 e 115.

In [294]:
textos=[[msgs[i]["texto"]["value"] for i in msgs_i.nonzero()[0]][j]
        for j in (atrs_[msgs_i][:,1]<5.).nonzero()[0]]
for texto in textos: print texto+"\n======="


Este talvez seja o maior desafio que ainda os governos têm pela frente: a efetiva participação social com o acompanhamento dos projetos e dos investimentos públicos.
=======
Deve ficar clara a composição para evitar nomeações enviesadas. 
=======
É a sugestão mais completa
=======

In [295]:
atrs_[:,0].shape


Out[295]:
(1976,)

In [306]:
import pylab as p
foo=
p.hist(atrs_[:,0],100, log=True)p.hist(atrs_[:,0],100, log=True)



In [241]:
#dados lidos, processando
NOW=time.time()
import string, nltk as k
# histograma com as palavras
#msgs_=results4["results"]["bindings"]
#msgs=[mm for mm in msgs_ if ("titulo" not in mm.keys()) or ("teste de stress" not in mm["titulo"]["value"].lower())]
palavras=string.join([i["texto"]["value"].lower() for i in msgs])
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 0.54

In [242]:
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 0.71

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


3275 é
3107 desenvolvimento
3050 software
3045 modelo
3026 simples
2079 sugiro
2015 requisitos
1998 github
1716 participação
1356 são
1267 já
1256 não
1170 público
1168 bem
1148 caso
1141 apenas
1119 todas
1115 brasileiro
1104 melhor
1099 grande

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


1088 livre
1085 etc
1078 desde
1076 quanto
1069 criar
1065 muitos
1061 nesse
1049 comunidade
1048 precisa
1046 medida
1037 existe
1028 entendo
1024 portal
1020 livres
1019 bastante
1017 necessárias
1015 usar
1015 utilizado
1014 disponibilizar
1014 manter

In [246]:
len(fdist_)


Out[246]:
14663

In [247]:
# faz feture vector com elas.
# escolhendo as 200 palavras mais frequentes
palavras_escolhidas=fdist_.keys()[:200]
# outras features que podemos escolher é:
# *) número de palavras terminadas em a, o, e ou s
# *) tamanho médio das palavras utilizadas
# *) uso das stopwords

In [248]:
def document_features(documento):
    features={}
    for palavra in palavras_escolhidas:
        features["contains(%s)"%(palavra,)]=(palavra in documento)
    return features

In [254]:
msgsP= [(rr["texto"]["value"],"pos") for rr in msgs[:1000]]
msgsN=[(rr["texto"]["value"],"neg") for rr in msgs[1000:2000]]
msgsT=msgsP+msgsN
random.shuffle(msgsT)
feature_sets=[(document_features(msg[0]),msg[1]) for msg in msgsT]
train_set, test_set = feature_sets[1000:], feature_sets[:1000]
classifier = k.NaiveBayesClassifier.train(train_set)

In [256]:
# testar o classificador e aplicar

In [ ]: