{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "#Classificação de artigos do MediaCloud usando GMM e DPGMM\n", "\n", "Neste Notebook vamos aplicar um classificador não supervisionado a uma coleção de artigos extraída do índice do MediaCloud, usando Dirichlet Process Gaussian Mixture models, do Scikit-Learn.\n", "http://scikit-learn.org/stable/auto_examples/mixture/plot_gmm.html#example-mixture-plot-gmm-py\n", "\n", "Vamos também explorar técnicas de Deep learning usando word2vec do pacote gensim:\n", "http://radimrehurek.com/gensim/models/word2vec.html\n", "\n", "uma explicação mais detalhada da metodologia do word2vec pode ser encontrada aqui:\n", "https://code.google.com/p/word2vec/\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import json\n", "import os\n", "import gensim\n", "import pymysql\n", "import nltk # para tokenização de sentenças\n", "from pymongo import MongoClient\n", "from string import punctuation, digits\n", "import bs4\n", "from sklearn import mixture\n", "import datetime\n", "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] } ], "source": [ "%pylab inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Primeiro vamos definir uma função para busca no índice:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def sphinx_query(index_name, query=\"\", facet=None):\n", " \"\"\"\n", " Search Sphinx index using a simple match via SphinxQL\n", " :param index_name: Name of the index to search on\n", " :param query: String with the query expression\n", " :param facet: Attribute name to facet by. Must be a list\n", " :return: JSON (array of objects)\n", " \"\"\"\n", " try:\n", " assert index_name in ['mediacloud_articles', 'mediacloud_feeds', 'mediacloud_tweets']\n", " except AssertionError:\n", " return json.dumps({\"error\": \"Bad index name: {}\".format(index_name)})\n", " \n", "\n", " # Setup Sphinxsearch SphinxQL connection\n", " sphinx_conn = pymysql.connect(host='200.20.164.152', port=9306)\n", " cursor = sphinx_conn.cursor(pymysql.cursors.DictCursor)\n", "\n", " if facet is None:\n", " cursor.execute(\"SELECT * from \" + index_name + \" WHERE MATCH(%(query)s) \"\n", " \"LIMIT %(limit)s OPTION max_matches=%(limit)s\",\n", " {'query': query, 'limit': 100000})\n", " else:\n", " cursor.execute(\"SELECT * from \"+index_name+\" WHERE MATCH(%s) \" + \" \".join([\"FACET {}\".format(f) for f in facet]),\n", " (query,))\n", " results = cursor.fetchall()\n", " cursor.close()\n", " \n", " return json.dumps(results)\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2467 resultados retidos\n" ] } ], "source": [ "consulta = 'Marina silva'\n", "res = sphinx_query(\"mediacloud_articles\",'\"{}\" '.format(consulta))\n", "res = json.loads(res)\n", "# retemos apenas as entradas que contém sumários\n", "#filtramos também por datas\n", "data_ini = datetime.datetime(2014,8,10,0,0,0)\n", "data_fim = datetime.datetime(2014,8,28,0,0,0)\n", "res = [d for d in res if datetime.datetime.fromtimestamp(d['published'])> data_ini and datetime.datetime.fromtimestamp(d['published']) <= data_fim]\n", "print(\"{} resultados retidos\".format(len(res)))" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[{'id': 944080,\n", " 'summary': '
Jornal GGN - Sai na próxima semana a decisão sobre quem o PSB lançará como candidato a presidente no lugar de Eduardo Campos, morto em acidente aéreo no último dia 13. Marina Silva é a favorita pelo recall que tem junto ao eleitorado desde a eleição de 2010.
\\nMas Marina, desde que ingressou no PSB, deixou claro que esse arranjo é provisório. Dura até que a Rede Sustentabilidade saia do papel. Diante do impasse sobre o futuro da chapa em 2014, fica a pergunta: será que o PSB vai conseguir impôr todas as suas condições à Marina e se consagrar como o partido representativo da terceira via no país, ou a figura Marina Silva vai se sobressair sobre o PSB?
\\n',\n", " 'title': 'Marina Silva e PSB: quem engole quem?',\n", " 'published': 1408291270,\n", " 'db': '',\n", " 'link': 'http://jornalggn.com.br/noticia/marina-silva-e-psb-quem-engole-quem',\n", " '_id': '53f0a8d0dcccdd842bd1936c',\n", " 'collection': '',\n", " 'links': '{\"links\":[{\"href\":\"http:\\\\/\\\\/jornalggn.com.br\\\\/noticia\\\\/marina-silva-e-psb-quem-engole-quem\",\"type\":\"text\\\\/html\",\"rel\":\"alternate\"}]}',\n", " 'language': 'pt',\n", " '._id': '53f0a8d0dcccdd842bd1936c'},\n", " {'id': 985401,\n", " 'summary': 'Benedito Tadeu César* A campanha no rádio e na TV já começou há uma semana e Aécio Neves ainda não disse a que veio. Além de se apresentar ao eleitorado, não fez quase mais nada. Dá a impressão de estar paralisado diante do avanço de Marina Silva. Enquanto Aécio Neves apresenta-se com uma imagem de […]
\\nThe post E Aécio, vai descer do muro e disputar com Marina Silva? appeared first on Sul 21.
',\n", " 'title': 'E Aécio, vai descer do muro e disputar com Marina Silva?',\n", " 'published': 1409084608,\n", " 'db': '',\n", " 'link': 'http://www.sul21.com.br/jornal/e-aecio-vai-descer-do-muro-e-disputar-com-marina-silva/',\n", " '_id': '53fcc487dcccdd5969d2fd9c',\n", " 'collection': '',\n", " 'links': '{\"links\":[{\"href\":\"http:\\\\/\\\\/www.sul21.com.br\\\\/jornal\\\\/e-aecio-vai-descer-do-muro-e-disputar-com-marina-silva\\\\/\",\"type\":\"text\\\\/html\",\"rel\":\"alternate\"}]}',\n", " 'language': 'pt',\n", " '._id': '53fcc487dcccdd5969d2fd9c'},\n", " {'id': 931059,\n", " 'summary': 'O consultor político Vitor Oliveira e o cientista político Fábio Ostermann traçaram o deram entrevista ao InfoMoney e destacaram cenário para Marina Silva',\n", " 'title': '\"PSB caiu no colo de Marina Silva\"; mas será que ela tem a cara do partido?',\n", " 'published': 1408052040,\n", " 'db': '',\n", " 'link': 'http://www.infomoney.com.br//mercados/eleicoes/noticia/3515587/psb-caiu-colo-marina-silva-mas-sera-que-ela-tem',\n", " '_id': '53ed03b9dcccdd25bf76b41a',\n", " 'collection': '',\n", " 'links': '{\"links\":[{\"href\":\"http:\\\\/\\\\/www.infomoney.com.br\\\\/\\\\/mercados\\\\/eleicoes\\\\/noticia\\\\/3515587\\\\/psb-caiu-colo-marina-silva-mas-sera-que-ela-tem\",\"type\":\"text\\\\/html\",\"rel\":\"alternate\"}]}',\n", " 'language': 'pt',\n", " '._id': '53ed03b9dcccdd25bf76b41a'}]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "res[:3]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Exportando a série Temporal" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/lib/python3/dist-packages/IPython/kernel/__main__.py:1: FutureWarning: TimeSeries is deprecated. Please use Series\n", " if __name__ == '__main__':\n" ] }, { "data": { "text/plain": [ "