Skip to content

Instantly share code, notes, and snippets.

@edouardklein
Created March 4, 2015 08:05
Show Gist options
  • Save edouardklein/3f3d1bbbc82f76debc8f to your computer and use it in GitHub Desktop.
Save edouardklein/3f3d1bbbc82f76debc8f to your computer and use it in GitHub Desktop.
{
"metadata": {
"name": "",
"signature": "sha256:9d075aa2b84192041a12154406b6cec23f7731d96854c8bed1b4010b96ea94cb"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# TP 'Big Data' : Newsgroup Classification\n",
"\n",
"## T\u00e9l\u00e9chargement des logiciels et donn\u00e9es n\u00e9cessaires\n",
"\n",
"Installez Python (3 de pr\u00e9f\u00e9rence). Installez les paquets suivants :\n",
"\n",
"``\n",
"Jinja2==2.7.3\n",
"MarkupSafe==0.23\n",
"Pygments==2.0.2\n",
"certifi==14.05.14\n",
"docopt==0.6.2\n",
"gnureadline==6.3.3\n",
"ipython==3.0.0\n",
"jedi==0.8.1-final0\n",
"jsonschema==2.4.0\n",
"mistune==0.5\n",
"prompt-toolkit==0.31\n",
"ptpython==0.5\n",
"pyzmq==14.5.0\n",
"scikit-learn==0.15.2\n",
"six==1.9.0\n",
"tornado==4.1\n",
"wcwidth==0.1.4\n",
"``\n",
"\n",
"Vous pouvez sauver \u00e7a dans un fichier `requirements.txt` et lancer `pip install -r requirements.txt`. Je vous sugg\u00e8re d'utiliser un environnement virtuel (c.f. e.g. http://iamzed.com/2009/05/07/a-primer-on-virtualenv/).\n",
"\n",
"Les donn\u00e9es pour ce TP peuvent se t\u00e9l\u00e9charger l\u00e0 : http://people.csail.mit.edu/jrennie/20Newsgroups/20news-bydate.tar.gz\n",
"\n",
"D\u00e9compressez l'archive et fusionnez les ensembles de test et d'entrainement :\n",
"\n",
"``\n",
"cp -R 20news-bydate-test/* 20news-bydate-train\n",
"mv 20news-bydate-train data``\n",
"\n",
"## But du TP\n",
"\n",
"Le but du TP, en langage naturel, est de trouver une technique permettant de *d\u00e9terminer le sujet du forum dont un message a \u00e9t\u00e9 extrait*.\n",
"\n",
"Nous allons pour cela faire de l'apprentissage supervis\u00e9 sur un set de donn\u00e9es issu de 20 Newsgroups Usenet.\n",
"\n",
"Il n'y a pas de difficult\u00e9s imm\u00e9diate \u00e0 ce TP. Vous devez :\n",
"* Lire les ressources propos\u00e9es\n",
"* D\u00e9terminer une expression calculable de la consigne (i.e. d\u00e9finir votre *fonction de co\u00fbt*)\n",
"* Mettre \u00e0 la suite les quelques bouts de code issus des ressources propos\u00e9es qui vous permettent de minimiser votre fonction de co\u00fbt (la connaissance de Python n'est pas n\u00e9cessaire pour ce faire, c'est principalement du copier-coller intelligent).\n",
"\n",
"C'est ensuite que l'on peut commencer \u00e0 attaquer les probl\u00e9matiques 'Big Data' et que les choses deviennent int\u00e9ressantes. Vous pouvez utiliser le langage de votre choix pour r\u00e9pondre \u00e0 ces questions. Si vous ne connaissez pas Python, il est possible, plut\u00f4t que de chercher une impl\u00e9mentation d'un classifieur dans votre langage de choix, d'interfacer le code que vous venez d'\u00e9crire en le faisant lire l'entr\u00e9e standard et \u00e9crire sur la sortie standard, et en l'appellant depuis votre langage favori.\n",
"\n",
"Lisez toutes les questions et r\u00e9pondez-y '\u00e0 la main' avant de coder quoique ce soit. Ensuite \u00e9crivez et fa\u00eetes tourner le code n\u00e9cessaire pour trouver les r\u00e9ponses, dans l'ordre que vous souhaitez, jusqu'\u00e0 ce que vous soyez \u00e0 court de temps.\n",
"\n",
"* lorsque vous d\u00e9veloppiez la r\u00e9ponse a la premi\u00e8re partie du TP, utilisiez vous le data set complet ? Pourquoi ou pourquoi pas ?\n",
"* combien de temps prend l'entra\u00eenement d'un classifieur multi classe sur toutes les donn\u00e9es disponibles ? Combien de temps prend son \u00e9valuation si toutefois il est possible de l'\u00e9valuer ?\n",
"* a partir de quelle taille de dataset arr\u00eatez vous d'essayer d'entra\u00eener le classifieur sur votre machine ? A partir de quelle taille peut on consid\u00e9rer que c'est impossible ?\n",
"* consid\u00e9rez que le dataset vous arrive petit a petit. Implemetez un algorithme d'apprentissage *online*, qui utilise les donn\u00e9es a mesure qu'elles arrivent, et mesurez ses performances au fur et a mesure. A partir de quelle quantit\u00e9 de donn\u00e9es les performances cessent de s'am\u00e9liorer ?\n",
"* scrappez des messages post\u00e9s sur Reddit, dans des sous forums correspondant aux newsgroups utilis\u00e9s pr\u00e9c\u00e9demment. Le classifieur les classifie-t-il correctement ? Quel algorithme de classification classifie le mieux ? Pourquoi ? Pouvez vous pr\u00e9 traiter les donn\u00e9es pour am\u00e9liorer les performances sur Reddit d'un classifieur entra\u00een\u00e9 sur les newsgroups ? Les performances permettent-elles d'esp\u00e9rer classifier en temps r\u00e9el tout ce qui est post\u00e9 sur reddit ? Sur quelques subreddits particuliers ?\n",
"* si vous n'aviez pas l'information de provenance des messages, pourriez vous les regrouper ? Essayez. Combien de groupes diff\u00e9rents apparaissent ? Si on ne vous pr\u00e9sente pas un groupe a l'entra\u00eenement, pouvez vous d\u00e9tecter un membre de ce groupe lorsqu'il appara\u00eet pendant les tests ?\n",
"* si on suppose que la qualit\u00e9 des d\u00e9bats \u00e9tait meilleure sur Usenet, pourriez vous utiliser ce dataset pour s\u00e9parer le bon grain de l'ivraie dans un subreddit ayant un faible ratio signal/bruit (*cough* /r/atheism *cough*) ? Trouvez manuellement un contre exemple. Auriez vous pu l'isoler automatiquement ? Comment ? (Si vous impl\u00e9mentez \u00e7a dans le temps du TP je vous offre un Kinder surprise).\n",
"* certains forums n'ont pas de cat\u00e9gories (e.g. Hacker News). Pouvez vous d\u00e9velopper un syst\u00e8me qui tagge automatiquement les posts ?\n",
"* entra\u00eenez une cha\u00eene de Markov sur le dataset et faites deviner a vos camarade si une phrase est g\u00e9n\u00e9r\u00e9e automatiquement ou si elle a \u00e9t\u00e9 post\u00e9e sur Usenet. Quel est le meilleur newsgroups pour cette t\u00e2che ? Pourquoi ?\n",
"\n",
"## Ressources\n",
"### Machine Learning\n",
"Choisir le bon algorithme :\n",
"http://scikit-learn.org/stable/tutorial/machine_learning_map/\n",
"\n",
"Travailler avec des *bag of words* (ne lisez pas toute le document, c'est inutile, suvolez le):\n",
"http://scikit-learn.org/stable/tutorial/text_analytics/working_with_text_data.html#extracting-features-from-text-files\n",
"\n",
"### Code Python basique\n",
"Si vous ne connaissez pas le Python, venez imm\u00e9diatement me poser les questions de syntaxe. Ne restez pas bloqu\u00e9s sur quelque chose d'aussi trivial que \u00e7a. Ci dessous quelques lignes que vous pouvez copier \u00e0 volont\u00e9."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import glob\n",
"\n",
"categories = ['alt.atheism', 'comp.graphics', 'comp.os.ms-windows.misc', 'comp.sys.ibm.pc.hardware', \n",
" 'comp.sys.mac.hardware', 'comp.windows.x', 'misc.forsale', 'rec.autos', 'rec.motorcycles',\n",
" 'rec.sport.baseball', 'rec.sport.hockey', 'sci.crypt', 'sci.electronics', 'sci.med', 'sci.space',\n",
" 'soc.religion.christian', 'talk.politics.guns', 'talk.politics.mideast', 'talk.politics.misc',\n",
" 'talk.religion.misc']\n",
"X_txt = []\n",
"Y = []\n",
"for post in glob.glob('data/*/*'):\n",
" categorie = categories.index(post.split('/')[1])\n",
" with open(post, 'r', encoding='utf-8') as f:\n",
" try:\n",
" txt = f.read()\n",
" except UnicodeDecodeError:\n",
" pass #We ingore the files with an non utf-8 encoding\n",
" else:\n",
" X_txt.append(txt)\n",
" Y.append(categorie)\n",
" \n",
" "
],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment