{"cells": [{"cell_type": "markdown", "metadata": {}, "source": ["# 1A.2 - Deviner la langue d'un texte\n", "\n", "Comment deviner la langue d'un texte sans savoir lire la langue ? Ce notebook aborde les dictionnaires, les fichiers et les graphiques."]}, {"cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [{"data": {"text/html": ["
run previous cell, wait for 2 seconds
\n", ""], "text/plain": [""]}, "execution_count": 2, "metadata": {}, "output_type": "execute_result"}], "source": ["from jyquickhelper import add_notebook_menu\n", "add_notebook_menu()"]}, {"cell_type": "markdown", "metadata": {}, "source": ["L'objectif est de distinguer un texte anglais d'un texte fran\u00e7ais sans avoir \u00e0 le lire. Le premier r\u00e9flexe consisterait \u00e0 chercher la pr\u00e9sence de mots typiquement anglais ou fran\u00e7ais. Cette direction est sans doute un bon choix lorsque le texte consid\u00e9r\u00e9 est une oeuvre litt\u00e9raire. Mais sur Internet, les contenus m\u00e9langent fr\u00e9quemment les deux langues : la pr\u00e9sence de tel mot anglais n'est plus aussi discriminante. Il n'est plus aussi \u00e9vident d'\u00e9tiqueter un document de langue anglaise lorsque les mots anglais sont pr\u00e9sents partout.\n", "\n", "On ne cherche plus \u00e0 d\u00e9terminer la langue d'un texte mais plut\u00f4t la langue majoritaire. Il serait encore possible de compter les mots de chacune des langues \u00e0 l'aide d'un dictionnaire r\u00e9duit de mots anglais et fran\u00e7ais. La langue majoritaire correspondrait \u00e0 celle dont les mots sont les plus fr\u00e9quents. Mais construire un dictionnaire est d'abord fastidieux. Ensuite, il faudrait que celui-ci contienne des mots pr\u00e9sents dans la plupart des textes. Il faudrait aussi \u00e9tudier le probl\u00e8me des mots communs aux deux langues. Pour ces raisons, il para\u00eet pr\u00e9f\u00e9rable d'\u00e9tudier d'abord une direction plus simple quitte \u00e0 y revenir plus tard.\n", "\n", "Cette id\u00e9e plus simple consiste \u00e0 compter la fr\u00e9quence des lettres. On s'attend \u00e0 ce que certaines lettres soient plus fr\u00e9quentes dans un texte anglais que dans un texte fran\u00e7ais."]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Q1 : lire un fichier\n", "\n", "On commence par t\u00e9l\u00e9charger un texte sur le site [Gutenberg](http://www.gutenberg.org/) et on \u00e9crit un programme pour le lire."]}, {"cell_type": "code", "execution_count": 2, "metadata": {"collapsed": true}, "outputs": [], "source": ["def read_file(filename):\n", " # ...\n", " return something"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Q2 : histogramme\n", "\n", "Construire un histogramme comptant les occurrences de chaque lettre dans ce texte. C'est-\u00e0-dire \u00e9crire une fonction qui prend comme argument une cha\u00eene de caract\u00e8res et qui retourne un dictionnaire dont vous choisirez ce que seront les cl\u00e9s et les valeurs."]}, {"cell_type": "code", "execution_count": 3, "metadata": {"collapsed": true}, "outputs": [], "source": ["def histogram(texte):\n", " # ...\n", " return something"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Q3 : normalisation\n", "\n", "Un texte inconnu contient 10 lettres ``I``. Que pouvez-vous en conclure ? Pensez-vous que les fr\u00e9quences de la lettre ``I`` dans un texte long et dans un texte court soient comparables ? Ecrire une fonction qui normalise toutes les valeurs du dictionnaire \u00e0 un."]}, {"cell_type": "code", "execution_count": 4, "metadata": {"collapsed": true}, "outputs": [], "source": ["def normalize(hist):\n", " # ...\n", " return something"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Q4 : calcul\n", "\n", "Appliquer votre fonction \u00e0 un texte anglais et \u00e0 un autre fran\u00e7ais, ... Que sugg\u00e9rez-vous comme indicateur pour distinguer un texte fran\u00e7ais d'un texte anglais ? Calculer votre indicateur pour dix textes de chaque langue. On pourra prendre les dix textes suivants : [articles.zip](http://www.xavierdupre.fr/enseignement/tutoriels_data/articles.zip)."]}, {"cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [{"data": {"text/plain": ["['afp1.txt',\n", " 'afp2.txt',\n", " 'arthur_charpentier1.txt',\n", " 'arthur_charpentier2.txt',\n", " 'arthur_charpentier3.txt']"]}, "execution_count": 6, "metadata": {}, "output_type": "execute_result"}], "source": ["from pyensae.datasource import download_data\n", "texts = download_data(\"articles.zip\")\n", "texts[:5]"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Q5 : score\n", "\n", "Le score est ici un nombre unique g\u00e9n\u00e9r\u00e9 \u00e0 partir des documents. Admettons que nous disposons de deux scores, la fr\u00e9quence de la lettre ``E`` et celle de la lettre ``W``, comment les combiner pour obtenir un score meilleur que les deux pris s\u00e9par\u00e9ment ? Ce probl\u00e8me s'inscrit dans un probl\u00e8me plus g\u00e9n\u00e9ral de [classification](https://fr.wikipedia.org/wiki/Classification). Il s'agit de d\u00e9terminer un score, un indicateur num\u00e9rique capable de d\u00e9terminer automatiquement la langue d'un texte sans avoir \u00e0 le lire. Ces indicateurs ne sont pas infaillibles, il sera toujours possible de le duper particuli\u00e8rement sur des petits textes mais cela ne veut pas dire que ce score ne pourrait pas \u00eatre utilis\u00e9 pour estimer de fa\u00e7on grossi\u00e8re la quantit\u00e9 de pages internet dans chaque langue."]}, {"cell_type": "code", "execution_count": 6, "metadata": {"collapsed": true}, "outputs": [], "source": []}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1"}}, "nbformat": 4, "nbformat_minor": 2}